SET DEFINE OFF;

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_INVENT(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPrecoInicial         IN DATE,
    p_cab_dataPrecoFinal           IN DATE,
    p_item_personalizacao          IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_precoSeNaoEncontrar          IN NUMBER,
    p_gerandoInventario            IN NUMBER,
    p_tipoPreco                    IN CHAR) -- F precoCustoUltimaFormacao, P precoCustoUltimaCompra, U precoUnitarioUltimaCompra
  RETURN NUMBER
IS
  v_preco NUMBER;
BEGIN
  WITH ESTABELECIMENTOS AS (
    SELECT DISTINCT a.estabelecimento
    FROM (
      SELECT est.estabelecimento
      FROM PAESTABELECIMENTOS est
      WHERE est.estabelecimento = p_cab_estabelecimento
      UNION ALL
      SELECT est2.estabelecimento
      FROM PAESTABELECIMENTOS est
      JOIN PAESTABELECIMENTOS est2
      ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
      WHERE est.estabelecimento = p_cab_estabelecimento
      AND est.pessoaEstabelecimento > 0
      AND est2.ativo = 1
      UNION ALL
      SELECT est2.estabelecimento
      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 p_config_209_filtrarGrupoEcon = 1
      AND est.estabelecimento = p_cab_estabelecimento
      AND est.pessoaEstabelecimento > 0
      AND pessEst.grupoEconomico > 0
      AND est2.ativo = 1) a)
  SELECT
    COALESCE(MAX(a.preco),0)
  INTO
    v_preco
  FROM (
    SELECT 
      ROW_NUMBER() OVER (
        ORDER BY
          invEst.data Desc,
          invEst.inventarioEstoque Desc) ordenacao,
      CASE p_tipoPreco
        WHEN 'F'
        THEN itemEst.precoCustoUltimaFormacao
        WHEN 'P'
        THEN itemEst.precoCustoUltimaCompra
        WHEN 'U'
        THEN itemEst.precoUnitarioUltimaCompra
        ELSE 0
      END preco
    FROM MOINVENTARIOESTOQUEXITENS itemEst
    JOIN MOINVENTARIOSESTOQUE invEst
    ON invEst.inventarioEstoque = itemEst.inventarioEstoque
    JOIN ESTABELECIMENTOS est
    ON est.estabelecimento = invEst.estabelecimento
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = itemEst.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE invEst.data >= COALESCE(TRUNC(p_cab_dataPrecoInicial),TO_DATE ('01/01/1900','DD/MM/YYYY'))
    AND invEst.data < TRUNC(p_cab_dataPrecoFinal)
    + CASE
        WHEN p_gerandoInventario = 0
          AND invEst.motivoInventarioEstoque = '01'
        THEN 1
        ELSE 0
      END
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_item_personalizacao = 0
      OR itemEst.personalizacao = p_item_personalizacao)
    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)) a
  WHERE a.ordenacao = 1;
  IF v_preco = 0
    OR v_preco IS NULL
  THEN
    v_preco := p_precoSeNaoEncontrar;
  END IF;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPrecoInicial         IN DATE,
    p_cab_dataPrecoFinal           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_gerandoInventario            IN NUMBER)
  RETURN NUMBER
IS 
  v_data  DATE;
  v_preco NUMBER;
BEGIN
  WITH ESTABELECIMENTOS AS (
    SELECT DISTINCT a.estabelecimento
    FROM (
      SELECT est.estabelecimento
      FROM PAESTABELECIMENTOS est
      WHERE est.estabelecimento = p_cab_estabelecimento
      UNION ALL
      SELECT est2.estabelecimento
      FROM PAESTABELECIMENTOS est
      JOIN PAESTABELECIMENTOS est2
      ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
      WHERE est.estabelecimento = p_cab_estabelecimento
      AND est.pessoaEstabelecimento > 0
      AND est2.ativo = 1
      UNION ALL
      SELECT est2.estabelecimento
      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 p_config_209_filtrarGrupoEcon = 1
      AND est.estabelecimento = p_cab_estabelecimento
      AND est.pessoaEstabelecimento > 0
      AND pessEst.grupoEconomico > 0
      AND est2.ativo = 1) a)
  SELECT
    MAX(a.data),
    COALESCE(MAX(a.preco),0)
  INTO
    v_data,
    v_preco
  FROM (
    SELECT 
      ROW_NUMBER() OVER (
        ORDER BY
          TRUNC(a.dataEntradaSaida) Desc,
          a.preco Desc) ordenacao,
      TRUNC(a.dataEntradaSaida) data,
      a.preco
    FROM (
      SELECT
        doc.dataEntradaSaida,
        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
      JOIN ESTABELECIMENTOS est
      ON est.estabelecimento = doc.estabelecimento
      WHERE item.cancelado = 0
      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_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 >= COALESCE(TRUNC(p_cab_dataPrecoInicial),TO_DATE ('01/01/1900','DD/MM/YYYY'))
      AND doc.dataEntradaSaida < TRUNC(p_cab_dataPrecoFinal) + 1
      AND grad.produto = p_gradProd_produto
      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)
      GROUP BY
        doc.dataEntradaSaida,
        item.idDocumentoFiscal
      UNION ALL
      SELECT
        doc.dataEntradaSaida,
        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
      JOIN ESTABELECIMENTOS est
      ON est.estabelecimento = doc.estabelecimento
      WHERE item.cancelado = 0
      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_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 >= COALESCE(TRUNC(p_cab_dataPrecoInicial),TO_DATE ('01/01/1900','DD/MM/YYYY'))
      AND doc.dataEntradaSaida < TRUNC(p_cab_dataPrecoFinal) + 1
      AND grad.produto = p_gradProd_produto
      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)
      GROUP BY
        doc.dataEntradaSaida,
        item.preDocumento) a) a
  WHERE a.ordenacao = 1;
  v_preco := FUNC_ADD_BUSCA_PRECO_INVENT(
    p_config_209_filtrarGrupoEcon,
    p_config_362_calcCustoPorGrade,
    p_cab_estabelecimento,
    COALESCE(v_data,COALESCE(TRUNC(p_cab_dataPrecoInicial),TO_DATE ('01/01/1900','DD/MM/YYYY'))),
    TRUNC(p_cab_dataPrecoFinal),
    p_item_personalizacao,
    p_gradProd_produto,
    p_gradProd_cor,
    p_gradProd_tamanho,
    v_preco,
    p_gerandoInventario,
    'U');
  IF v_preco = 0
    AND (p_cab_dataPrecoInicial IS NULL
      OR p_cab_dataPrecoInicial = TO_DATE ('01/01/1900','DD/MM/YYYY'))
  THEN
    v_preco := FUNC_ADD_BUSCA_PRECO_PRODXEST(
      p_config_209_filtrarGrupoEcon,
      p_cab_estabelecimento,
      p_gradProd_produto,
      'U');
  END IF;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_ULT_CUSTO(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPrecoInicial         IN DATE,
    p_cab_dataPrecoFinal           IN DATE,
    p_item_personalizacao          IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_locEst_indicadorPropPosseIt  IN CHAR,
    p_gerandoInventario            IN NUMBER)
  RETURN NUMBER
IS 
  v_data  DATE;
  v_preco NUMBER;
BEGIN
  WITH ESTABELECIMENTOS AS (
    SELECT DISTINCT a.estabelecimento
    FROM (
      SELECT est.estabelecimento
      FROM PAESTABELECIMENTOS est
      WHERE est.estabelecimento = p_cab_estabelecimento
      UNION ALL
      SELECT est2.estabelecimento
      FROM PAESTABELECIMENTOS est
      JOIN PAESTABELECIMENTOS est2
      ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
      WHERE est.estabelecimento = p_cab_estabelecimento
      AND est.pessoaEstabelecimento > 0
      AND est2.ativo = 1
      UNION ALL
      SELECT est2.estabelecimento
      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 p_config_209_filtrarGrupoEcon = 1
      AND est.estabelecimento = p_cab_estabelecimento
      AND est.pessoaEstabelecimento > 0
      AND pessEst.grupoEconomico > 0
      AND est2.ativo = 1) a)
  SELECT
    MAX(a.data),
    COALESCE(MAX(a.preco),0)
  INTO
    v_data,
    v_preco
  FROM (
    SELECT 
      ROW_NUMBER() OVER (
        ORDER BY
          TRUNC(a.data) Desc,
          a.preco Desc) ordenacao,
      TRUNC(a.data) data,
      a.preco
    FROM (
      SELECT 
        itemEst.data,
        CASE
          WHEN COUNT (1) = 1
            OR SUM(itemEst.quantidade) = 0
          THEN MAX(itemEst.precoCustoOperacao)
          ELSE ROUND((SUM (itemEst.totalCustoOperacao) / SUM(itemEst.quantidade)),7)
        END preco
      FROM MOESTOQUES itemEst
      JOIN ESTABELECIMENTOS est
      ON est.estabelecimento = itemEst.estabelecimento
      JOIN CAGRADESPRODUTO grad
      ON grad.gradeProduto = itemEst.gradeProduto
      LEFT JOIN MOPREDOCUMXESTOQUE preXEst
      ON preXEst.idEstoque = itemEst.idEstoque
      LEFT JOIN MOPREDOCUMXITENS itemPre
      ON itemPre.idItemPreDocumento = preXEst.idItemPreDocumento
      LEFT JOIN MODOCFISCALXESTOQUE docXEst
      ON docXEst.idEstoque = itemEst.idEstoque
      LEFT JOIN MODOCFISCALXITENS itemDoc
      ON itemDoc.idItemDocFiscal = docXEst.idItemDocFiscal
      WHERE itemEst.entradaSaida = 'E'
      AND itemEst.atualizaUltimaCompra = 1
      AND itemEst.indicadorPropriedadePosseItem = p_locEst_indicadorPropPosseIt
      AND itemEst.pessoaParticipante = p_item_pessoaParticipante
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_item_personalizacao = 0
        OR itemEst.personalizacao = p_item_personalizacao)
      AND itemEst.data >= COALESCE(TRUNC(p_cab_dataPrecoInicial),TO_DATE ('01/01/1900','DD/MM/YYYY'))
      AND itemEst.data < TRUNC(p_cab_dataPrecoFinal) + 1
      AND grad.produto = p_gradProd_produto
      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)
      GROUP BY
        itemEst.data,
        CASE
          WHEN NOT (docXEst.id IS NULL)
          THEN 'D' || LPAD(itemDoc.idDocumentoFiscal,14,'0')
          WHEN NOT (preXEst.id IS NULL)
          THEN 'P' || LPAD(itemPre.preDocumento,14,'0')
          ELSE 'M' || LPAD(itemEst.idEstoque,14,'0')
        END) a) a
  WHERE a.ordenacao = 1;
  v_preco := FUNC_ADD_BUSCA_PRECO_INVENT(
    p_config_209_filtrarGrupoEcon,
    p_config_362_calcCustoPorGrade,
    p_cab_estabelecimento,
    COALESCE(v_data,COALESCE(TRUNC(p_cab_dataPrecoInicial),TO_DATE ('01/01/1900','DD/MM/YYYY'))),
    TRUNC(p_cab_dataPrecoFinal),
    p_item_personalizacao,
    p_gradProd_produto,
    p_gradProd_cor,
    p_gradProd_tamanho,
    v_preco,
    p_gerandoInventario,
    'P');
  IF v_preco = 0
    AND (p_cab_dataPrecoInicial IS NULL
      OR p_cab_dataPrecoInicial = TO_DATE ('01/01/1900','DD/MM/YYYY'))
  THEN
    v_preco := FUNC_ADD_BUSCA_PRECO_PRODXEST(
      p_config_209_filtrarGrupoEcon,
      p_cab_estabelecimento,
      p_gradProd_produto,
      'P');
  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_cab_estabelecimento          IN NUMBER,
    p_cab_dataPrecoInicial         IN DATE,
    p_cab_dataPrecoFinal           IN DATE,
    p_item_personalizacao          IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_gerandoInventario            IN NUMBER)
  RETURN NUMBER
IS
  v_data  DATE;
  v_preco NUMBER;
BEGIN
  SELECT
    MAX(a.data),
    COALESCE(MAX(a.novoPrecoCusto),0)
  INTO
    v_data,
    v_preco
  FROM (
    SELECT 
      ROW_NUMBER() OVER (
        ORDER BY
          data Desc,
          novoPrecoCusto Desc) ordenacao,
      data,
      novoPrecoCusto
    FROM CAPRODUTOXCUSTOS
    WHERE produto = p_gradProd_produto
    AND ativo = 1
    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 >= COALESCE(TRUNC(p_cab_dataPrecoInicial),TO_DATE ('01/01/1900','DD/MM/YYYY'))
    AND data < TRUNC(p_cab_dataPrecoFinal) + 1) a
  WHERE a.ordenacao = 1;
  v_preco := FUNC_ADD_BUSCA_PRECO_INVENT(
    p_config_209_filtrarGrupoEcon,
    p_config_362_calcCustoPorGrade,
    p_cab_estabelecimento,
    COALESCE(v_data,COALESCE(TRUNC(p_cab_dataPrecoInicial),TO_DATE ('01/01/1900','DD/MM/YYYY'))),
    TRUNC(p_cab_dataPrecoFinal),
    p_item_personalizacao,
    p_gradProd_produto,
    p_gradProd_cor,
    p_gradProd_tamanho,
    v_preco,
    p_gerandoInventario,
    'F');
  IF v_preco = 0
    AND (p_cab_dataPrecoInicial IS NULL
      OR p_cab_dataPrecoInicial = TO_DATE ('01/01/1900','DD/MM/YYYY'))
  THEN
    v_preco := FUNC_ADD_BUSCA_PRECO_PRODXEST(
      p_config_209_filtrarGrupoEcon,
      p_cab_estabelecimento,
      p_gradProd_produto,
      'P');
  END IF;
  IF v_preco = 0 THEN
    v_preco := FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_cab_estabelecimento,
      p_cab_dataPrecoInicial,
      p_cab_dataPrecoFinal,
      p_item_personalizacao,
      p_gradProd_produto,
      p_gradProd_cor,
      p_gradProd_tamanho,
      0, --p_retornarPrecoBruto
      p_gerandoInventario);
  END IF;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_MEDIO_FIS(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPrecoFinal           IN DATE,
    p_item_pessoaParticipante      IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_locEst_indicadorPropPosseIt  IN CHAR,
    p_gerandoInventario            IN NUMBER)
  RETURN NUMBER
IS
  v_quebra             CHAR(9);
  v_quantidade         NUMBER;
  v_preco              NUMBER;
  v_total              NUMBER;
  v_dataInventario     DATE;
  v_dataEstoqueInicial DATE;
BEGIN
  v_quebra     := '000000000';
  v_quantidade := 0;
  v_preco      := 0;
  v_total      := 0;
  SELECT MAX(TRUNC(invEst.data))
  INTO v_dataInventario
  FROM MOINVENTARIOSESTOQUE invEst
  WHERE invEst.data < TRUNC(p_cab_dataPrecoFinal)
    + CASE
        WHEN p_gerandoInventario = 0
        THEN 1
        ELSE 0
      END
  AND (invEst.estabelecimento = p_cab_estabelecimento
    OR EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN PAESTABELECIMENTOS est2
      ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
      WHERE est.estabelecimento = invEst.estabelecimento
      AND est.ativo = 1
      AND est.pessoaEstabelecimento > 0
      AND est2.estabelecimento = p_cab_estabelecimento)
    OR EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      JOIN CAPESSOAS pessEst2
      ON pessEst2.grupoEconomico = pessEst.grupoEconomico
      JOIN PAESTABELECIMENTOS est2
      ON est2.pessoaEstabelecimento = pessEst2.pessoa
      WHERE p_config_209_filtrarGrupoEcon = 1
      AND est.estabelecimento = invEst.estabelecimento
      AND est.ativo = 1
      AND est.pessoaEstabelecimento > 0
      AND pessEst.grupoEconomico > 0
      AND est2.estabelecimento = p_cab_estabelecimento))
  AND (invEst.motivoInventarioEstoque = '01'
    OR invEst.data < TRUNC(p_cab_dataPrecoFinal)
    AND EXISTS(
      SELECT 1
      FROM MOINVENTARIOESTOQUEXFISC itemInv
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = itemInv.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      WHERE itemInv.inventarioEstoque = invEst.inventarioEstoque
      AND gradProd.produto = p_gradProd_produto
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gerandoInventario = 0
        AND p_gradProd_cor = 0
        OR gradProd.cor = p_gradProd_cor)
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gerandoInventario = 0
        AND (p_gradProd_tamanho = ''
          OR p_gradProd_tamanho = ' ')
        OR gradProd.tamanho = p_gradProd_tamanho)
      AND prod.controleEstoque NOT IN (2,3,4,21,99)
      AND prod.tipoProduto IN ('00','01','02','03','04','05','06','10','99')));
  SELECT MAX(TRUNC(mov.data))
  INTO v_dataEstoqueInicial
  FROM MOESTOQUES mov
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = mov.gradeProduto
  JOIN CAPRODUTOS prod
  ON prod.produto = gradProd.produto
  WHERE mov.operacaoInternaEstoque = 1
  AND mov.data >= CASE WHEN v_dataInventario IS NULL THEN TO_DATE ('01/01/1900','DD/MM/YYYY') ELSE v_dataInventario + 1 END
  AND mov.data < TO_DATE('' || TO_CHAR(p_cab_dataPrecoFinal, 'DD/MM/YYYY') || '', 'DD/MM/YYYY') + 1
  AND (mov.estabelecimento = p_cab_estabelecimento
    OR EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN PAESTABELECIMENTOS est2
      ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
      WHERE est.estabelecimento = mov.estabelecimento
      AND est.ativo = 1
      AND est.pessoaEstabelecimento > 0
      AND est2.estabelecimento = p_cab_estabelecimento)
    OR EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      JOIN CAPESSOAS pessEst2
      ON pessEst2.grupoEconomico = pessEst.grupoEconomico
      JOIN PAESTABELECIMENTOS est2
      ON est2.pessoaEstabelecimento = pessEst2.pessoa
      WHERE p_config_209_filtrarGrupoEcon = 1
      AND est.estabelecimento = mov.estabelecimento
      AND est.ativo = 1
      AND est.pessoaEstabelecimento > 0
      AND pessEst.grupoEconomico > 0
      AND est2.estabelecimento = p_cab_estabelecimento))
  AND gradProd.produto = p_gradProd_produto
  AND (p_config_362_calcCustoPorGrade = 0
    OR p_gerandoInventario = 0
    AND p_gradProd_cor = 0
    OR gradProd.cor = p_gradProd_cor)
  AND (p_config_362_calcCustoPorGrade = 0
    OR p_gerandoInventario = 0
    AND (p_gradProd_tamanho = ''
      OR p_gradProd_tamanho = ' ')
    OR gradProd.tamanho = p_gradProd_tamanho)
  AND prod.controleEstoque NOT IN (2,3,4,21,99)
  AND prod.tipoProduto IN ('00','01','02','03','04','05','06','10','99');
  FOR a IN (
    SELECT
      TRUNC(a.data) data,
      a.operacao,
      TO_CHAR (a.data,'HH24MISS') tora,
      a.tabelaSistema,
      a.id,
      a.entradaSaida,
      a.quantidade,
      a.total
    FROM (
      SELECT
        invEst.data,
        4 operacao,
        'MOINVENTARIOESTOQUEXFISC' tabelaSistema,
        itemInv.id,
        'E' entradaSaida,
        itemInv.quantidade,
        ROUND(itemInv.quantidade * itemInv.precoUnitarioCMV,2) total
      FROM MOINVENTARIOESTOQUEXFISC itemInv
      JOIN MOINVENTARIOSESTOQUE invEst
      ON invEst.inventarioEstoque = invEst.inventarioEstoque
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = itemInv.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      WHERE v_dataEstoqueInicial IS NULL
      AND invEst.data >= v_dataInventario
      AND invEst.data < v_dataInventario + 1
      AND (invEst.estabelecimento = p_cab_estabelecimento
        OR EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN PAESTABELECIMENTOS est2
          ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
          WHERE est.estabelecimento = invEst.estabelecimento
          AND est.ativo = 1
          AND est.pessoaEstabelecimento > 0
          AND est2.estabelecimento = p_cab_estabelecimento)
        OR EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN CAPESSOAS pessEst
          ON pessEst.pessoa = est.pessoaEstabelecimento
          JOIN CAPESSOAS pessEst2
          ON pessEst2.grupoEconomico = pessEst.grupoEconomico
          JOIN PAESTABELECIMENTOS est2
          ON est2.pessoaEstabelecimento = pessEst2.pessoa
          WHERE p_config_209_filtrarGrupoEcon = 1
          AND est.estabelecimento = invEst.estabelecimento
          AND est.ativo = 1
          AND est.pessoaEstabelecimento > 0
          AND pessEst.grupoEconomico > 0
          AND est2.estabelecimento = p_cab_estabelecimento))
      AND gradProd.produto = p_gradProd_produto
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gerandoInventario = 0
        AND p_gradProd_cor = 0
        OR gradProd.cor = p_gradProd_cor)
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gerandoInventario = 0
        AND (p_gradProd_tamanho = ''
          OR p_gradProd_tamanho = ' ')
        OR gradProd.tamanho = p_gradProd_tamanho)
      AND prod.controleEstoque NOT IN (2,3,4,21,99)
      AND prod.tipoProduto IN ('00','01','02','03','04','05','06','10','99')
      AND invEst.inventarioEstoque = (
        SELECT MAX(invEst2.inventarioEstoque)
        FROM MOINVENTARIOSESTOQUE invEst2
        WHERE invEst2.estabelecimento = invEst.estabelecimento
        AND invEst2.data >= v_dataInventario
        AND invEst2.data < v_dataInventario + 1
        AND (invEst2.motivoInventarioEstoque = '01'
          OR invEst2.data < TRUNC(p_cab_dataPrecoFinal)
          AND EXISTS(
            SELECT 1
            FROM MOINVENTARIOESTOQUEXFISC itemInv2
            JOIN CAGRADESPRODUTO gradProd2
            ON gradProd2.gradeProduto = itemInv2.gradeProduto
            JOIN CAPRODUTOS prod2
            ON prod2.produto = gradProd2.produto
            WHERE itemInv2.inventarioEstoque = invEst2.inventarioEstoque
            AND gradProd2.produto = p_gradProd_produto
            AND (p_config_362_calcCustoPorGrade = 0
              OR p_gerandoInventario = 0
              AND p_gradProd_cor = 0
              OR gradProd2.cor = p_gradProd_cor)
            AND (p_config_362_calcCustoPorGrade = 0
              OR p_gerandoInventario = 0
              AND (p_gradProd_tamanho = ''
                OR p_gradProd_tamanho = ' ')
              OR gradProd2.tamanho = p_gradProd_tamanho)
            AND prod2.controleEstoque NOT IN (2,3,4,21,99)
            AND prod2.tipoProduto IN ('00','01','02','03','04','05','06','10','99'))))
      UNION ALL
      SELECT
        mov.data,
        CASE
          WHEN mov.operacaoInternaEstoque = 1
          THEN 1
          WHEN mov.atualizaCustoMedio = 1
          THEN 2
          ELSE 3
        END operacao,
        'MOESTOQUES' tabelaSistema,
        mov.idEstoque id,
        mov.entradaSaida,
        mov.quantidade,
        mov.totalCustoOperacao total
      FROM MOESTOQUES mov
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = mov.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      WHERE mov.operacaoInternaEstoque IN (101,900)
      AND mov.indicadorPropriedadePosseItem = p_locEst_indicadorPropPosseIt
      AND mov.pessoaParticipante = p_item_pessoaParticipante
      AND mov.data >=
        CASE
          WHEN NOT(v_dataEstoqueInicial IS NULL)
          THEN v_dataEstoqueInicial
          WHEN NOT(v_dataInventario IS NULL)
          THEN v_dataInventario + 1
          ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
        END
      AND mov.data < TRUNC(p_cab_dataPrecoFinal) + 1
      AND (mov.estabelecimento = p_cab_estabelecimento
        OR EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN PAESTABELECIMENTOS est2
          ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
          WHERE est.estabelecimento = mov.estabelecimento
          AND est.ativo = 1
          AND est.pessoaEstabelecimento > 0
          AND est2.estabelecimento = p_cab_estabelecimento)
        OR EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN CAPESSOAS pessEst
          ON pessEst.pessoa = est.pessoaEstabelecimento
          JOIN CAPESSOAS pessEst2
          ON pessEst2.grupoEconomico = pessEst.grupoEconomico
          JOIN PAESTABELECIMENTOS est2
          ON est2.pessoaEstabelecimento = pessEst2.pessoa
          WHERE p_config_209_filtrarGrupoEcon = 1
          AND est.estabelecimento = mov.estabelecimento
          AND est.ativo = 1
          AND est.pessoaEstabelecimento > 0
          AND pessEst.grupoEconomico > 0
          AND est2.estabelecimento = p_cab_estabelecimento))
      AND gradProd.produto = p_gradProd_produto
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gerandoInventario = 0
        AND p_gradProd_cor = 0
        OR gradProd.cor = p_gradProd_cor)
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gerandoInventario = 0
        AND (p_gradProd_tamanho = ''
          OR p_gradProd_tamanho = ' ')
        OR gradProd.tamanho = p_gradProd_tamanho)
      AND prod.controleEstoque NOT IN (2,3,4,21,99)
      AND prod.tipoProduto IN ('00','01','02','03','04','05','06','10','99')
      UNION ALL
      SELECT
        cabDoc.dataEntradaSaida data,
        CASE
          WHEN modDoc.operacaoInternaEstoque = 1
          THEN 1
          WHEN cabDoc.atualizaCustoMedio = 1
          THEN 2
          ELSE 3
        END operacao,
        'MODOCFISCALXITENS' tabelaSistema,
        itemDoc.idItemDocFiscal id,
        cabDoc.entradaSaida,
        itemDoc.quantidade,
        itemDoc.valorCustoOperacao total
      FROM MODOCFISCALXITENS itemDoc
      JOIN MODOCUMENTOSFISCAIS cabDoc
      ON cabDoc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
      JOIN PAMODELOSDOCUMENTO modDoc
      ON modDoc.modeloDocumento = itemDoc.modeloDocumento
      JOIN PALOCAISESTOQUE locEst
      ON locEst.localEstoque = itemDoc.localEstoque
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = itemDoc.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      WHERE itemDoc.cancelado = 0
      AND itemDoc.movimentaEstoqueFiscal = 1
      AND itemDoc.pessoaParticipante = p_item_pessoaParticipante
      AND cabDoc.situacaoDocumentoFiscal BETWEEN 21 AND 23
      AND cabDoc.dataEntradaSaida >= 
        CASE
          WHEN NOT(v_dataEstoqueInicial IS NULL)
          THEN v_dataEstoqueInicial
          WHEN NOT(v_dataInventario IS NULL)
          THEN v_dataInventario + 1
          ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
        END
      AND cabDoc.dataEntradaSaida < TRUNC(p_cab_dataPrecoFinal) + 1
      AND (cabDoc.estabelecimento = p_cab_estabelecimento
        OR EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN PAESTABELECIMENTOS est2
          ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
          WHERE est.estabelecimento = cabDoc.estabelecimento
          AND est.ativo = 1
          AND est.pessoaEstabelecimento > 0
          AND est2.estabelecimento = p_cab_estabelecimento)
        OR EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN CAPESSOAS pessEst
          ON pessEst.pessoa = est.pessoaEstabelecimento
          JOIN CAPESSOAS pessEst2
          ON pessEst2.grupoEconomico = pessEst.grupoEconomico
          JOIN PAESTABELECIMENTOS est2
          ON est2.pessoaEstabelecimento = pessEst2.pessoa
          WHERE p_config_209_filtrarGrupoEcon = 1
          AND est.estabelecimento = cabDoc.estabelecimento
          AND est.ativo = 1
          AND est.pessoaEstabelecimento > 0
          AND pessEst.grupoEconomico > 0
          AND est2.estabelecimento = p_cab_estabelecimento))
      AND locEst.indicadorPropriedadePosseItem = p_locEst_indicadorPropPosseIt
      AND gradProd.produto = p_gradProd_produto
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gerandoInventario = 0
        AND p_gradProd_cor = 0
        OR gradProd.cor = p_gradProd_cor)
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gerandoInventario = 0
        AND (p_gradProd_tamanho = ''
          OR p_gradProd_tamanho = ' ')
        OR gradProd.tamanho = p_gradProd_tamanho)
      AND prod.controleEstoque NOT IN (2,3,4,21,99)
      AND prod.tipoProduto IN ('00','01','02','03','04','05','06','10','99')
      AND NOT(EXISTS(
        SELECT 1
        FROM MODOCFISCALXPRODUTOFILHO filhoDoc
        WHERE filhoDoc.idItemDocFiscal = itemDoc.idItemDocFiscal))
      UNION ALL
      SELECT
        cabDoc.dataEntradaSaida data,
        CASE
          WHEN modDoc.operacaoInternaEstoque = 1
          THEN 1
          WHEN cabDoc.atualizaCustoMedio = 1
          THEN 2
          ELSE 3
        END operacao,
        'MODOCFISCALXPRODUTOFILHO' tabelaSistema,
        filhoDoc.id,
        cabDoc.entradaSaida,
        filhoDoc.quantidade,
        filhoDoc.totalCustoOperacao total
      FROM MODOCFISCALXPRODUTOFILHO filhoDoc
      JOIN MODOCFISCALXITENS itemDoc
      ON itemDoc.idItemDocFiscal = filhoDoc.idItemDocFiscal
      JOIN MODOCUMENTOSFISCAIS cabDoc
      ON cabDoc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
      JOIN PAMODELOSDOCUMENTO modDoc
      ON modDoc.modeloDocumento = itemDoc.modeloDocumento
      JOIN PALOCAISESTOQUE locEst
      ON locEst.localEstoque = itemDoc.localEstoque
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = filhoDoc.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      WHERE itemDoc.cancelado = 0
      AND itemDoc.movimentaEstoqueFiscal = 1
      AND itemDoc.pessoaParticipante = p_item_pessoaParticipante
      AND cabDoc.situacaoDocumentoFiscal BETWEEN 21 AND 23
      AND cabDoc.dataEntradaSaida >= 
        CASE
          WHEN NOT(v_dataEstoqueInicial IS NULL)
          THEN v_dataEstoqueInicial
          WHEN NOT(v_dataInventario IS NULL)
          THEN v_dataInventario + 1
          ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
        END
      AND cabDoc.dataEntradaSaida < TRUNC(p_cab_dataPrecoFinal) + 1
      AND (cabDoc.estabelecimento = p_cab_estabelecimento
        OR EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN PAESTABELECIMENTOS est2
          ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
          WHERE est.estabelecimento = cabDoc.estabelecimento
          AND est.ativo = 1
          AND est.pessoaEstabelecimento > 0
          AND est2.estabelecimento = p_cab_estabelecimento)
        OR EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN CAPESSOAS pessEst
          ON pessEst.pessoa = est.pessoaEstabelecimento
          JOIN CAPESSOAS pessEst2
          ON pessEst2.grupoEconomico = pessEst.grupoEconomico
          JOIN PAESTABELECIMENTOS est2
          ON est2.pessoaEstabelecimento = pessEst2.pessoa
          WHERE p_config_209_filtrarGrupoEcon = 1
          AND est.estabelecimento = cabDoc.estabelecimento
          AND est.ativo = 1
          AND est.pessoaEstabelecimento > 0
          AND pessEst.grupoEconomico > 0
          AND est2.estabelecimento = p_cab_estabelecimento))
      AND locEst.indicadorPropriedadePosseItem = p_locEst_indicadorPropPosseIt
      AND gradProd.produto = p_gradProd_produto
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gerandoInventario = 0
        AND p_gradProd_cor = 0
        OR gradProd.cor = p_gradProd_cor)
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gerandoInventario = 0
        AND (p_gradProd_tamanho = ''
          OR p_gradProd_tamanho = ' ')
        OR gradProd.tamanho = p_gradProd_tamanho)
      AND prod.controleEstoque NOT IN (2,3,4,21,99)
      AND prod.tipoProduto IN ('00','01','02','03','04','05','06','10','99')) a
    ORDER BY
      TRUNC(a.data),
      a.operacao,
      TO_CHAR (a.data,'HH24MISS'),
      a.tabelaSistema,
      a.id)
  LOOP
    IF v_quebra < TO_CHAR(a.data,'YYYYMMDD') || TO_CHAR(a.operacao) THEN
      v_quebra := TO_CHAR(a.data,'YYYYMMDD') || TO_CHAR(a.operacao);
      -- 1 = Saldo Inicial / 4 = Inventário Estoque
      IF a.operacao IN (1,4) THEN
        v_quantidade := 0;
        v_preco := 0;
        v_total := 0;
      END IF;
    END IF;
    -- 1 = Saldo Inicial / 2 = Atualiza Custo Médio / 4 = Inventário Estoque
    IF a.operacao IN (1,2,4) THEN
      IF a.entradaSaida = 'E' THEN
        v_quantidade := v_quantidade + a.quantidade;
        IF v_quantidade <= 0 THEN
          v_total := 0;
        ELSIF v_quantidade > a.quantidade THEN
          IF v_total + a.total > 9999999999999.99 THEN
             v_total := 9999999999999.99;
          ELSE
             v_total := v_total + a.total;
          END IF;
        ELSIF ROUND ((a.total * v_quantidade / a.quantidade),2) > 9999999999999.99 THEN
           v_total := 9999999999999.99;
        ELSE
           v_total := ROUND ((a.total * v_quantidade / a.quantidade),2);
        END IF;
     ELSE
        v_quantidade := v_quantidade - a.quantidade;
        v_total := v_total - a.total;
        IF v_total < 0 OR v_quantidade <= 0 THEN
          v_total := 0;
        END IF;
      END IF;
      IF v_total > 0 AND v_quantidade >= 0 AND ROUND(v_total / CASE WHEN v_quantidade = 0 THEN 1 ELSE v_quantidade END, 7) > 99999999.9999999 THEN
        v_preco := 99999999.9999999;
      ELSIF v_total > 0 AND v_quantidade >= 0 THEN
        v_preco := ROUND(v_total / CASE WHEN v_quantidade = 0 THEN 1 ELSE v_quantidade END, 7);
      END IF;
    -- Operação = 3 Não atualiza custo médio
    ELSIF a.entradaSaida = 'E' THEN
      v_quantidade := v_quantidade + a.quantidade;
      IF v_quantidade <= 0 THEN
        v_total := 0;
      ELSIF v_quantidade > a.quantidade THEN
        IF v_total + ROUND((a.quantidade * v_preco),2) > 9999999999999.99 THEN
           v_total := 9999999999999.99;
        ELSE
           v_total := v_total + a.total;
        END IF;
      ELSIF ROUND((v_quantidade * v_preco),2) > 9999999999999.99 THEN
         v_total := 9999999999999.99;
      ELSE
         v_total := ROUND((v_quantidade * v_preco),2);
      END IF;
    ELSE
      v_quantidade := v_quantidade - a.quantidade;
      v_total := v_total - a.quantidade * v_preco;
      IF v_total < 0 OR v_quantidade <= 0 THEN
        v_total := 0;
      END IF;
    END IF;
  END LOOP;
  IF v_preco = 0 THEN
    v_preco := FUNC_ADD_BUSCA_PRECO_PRODXEST(
      p_config_209_filtrarGrupoEcon,
      p_cab_estabelecimento,
      p_gradProd_produto,
      'C');
  END IF;
  RETURN v_preco;  
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_MEDIO_GER(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPrecoFinal           IN DATE,
    p_item_personalizacao          IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_locEst_indicadorPropPosseIt  IN CHAR,
    p_gerandoInventario            IN NUMBER)
  RETURN NUMBER
IS
  v_quebra             CHAR(9);
  v_quantidade         NUMBER;
  v_preco              NUMBER;
  v_total              NUMBER;
  v_dataInventario     DATE;
  v_dataEstoqueInicial DATE;
BEGIN
  v_quebra     := '000000000';
  v_quantidade := 0;
  v_preco      := 0;
  v_total      := 0;
  SELECT MAX(TRUNC(invEst.data))
  INTO v_dataInventario
  FROM MOINVENTARIOSESTOQUE invEst
  WHERE invEst.data < TRUNC(p_cab_dataPrecoFinal)
    + CASE
        WHEN p_gerandoInventario = 0
        THEN 1
        ELSE 0
      END
  AND (invEst.estabelecimento = p_cab_estabelecimento
    OR EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN PAESTABELECIMENTOS est2
      ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
      WHERE est.estabelecimento = invEst.estabelecimento
      AND est.ativo = 1
      AND est.pessoaEstabelecimento > 0
      AND est2.estabelecimento = p_cab_estabelecimento)
    OR EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      JOIN CAPESSOAS pessEst2
      ON pessEst2.grupoEconomico = pessEst.grupoEconomico
      JOIN PAESTABELECIMENTOS est2
      ON est2.pessoaEstabelecimento = pessEst2.pessoa
      WHERE p_config_209_filtrarGrupoEcon = 1
      AND est.estabelecimento = invEst.estabelecimento
      AND est.ativo = 1
      AND est.pessoaEstabelecimento > 0
      AND pessEst.grupoEconomico > 0
      AND est2.estabelecimento = p_cab_estabelecimento))
  AND (invEst.motivoInventarioEstoque = '01'
    OR invEst.data < TRUNC(p_cab_dataPrecoFinal)
    AND EXISTS(
      SELECT 1
      FROM MOINVENTARIOESTOQUEXITENS itemInv
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = itemInv.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      WHERE itemInv.inventarioEstoque = invEst.inventarioEstoque
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gerandoInventario = 0
        AND p_item_personalizacao = 0
        OR itemInv.personalizacao = p_item_personalizacao)
      AND gradProd.produto = p_gradProd_produto
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gerandoInventario = 0
        AND p_gradProd_cor = 0
        OR gradProd.cor = p_gradProd_cor)
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gerandoInventario = 0
        AND (p_gradProd_tamanho = ''
          OR p_gradProd_tamanho = ' ')
        OR gradProd.tamanho = p_gradProd_tamanho)
      AND prod.controleEstoque NOT IN (2,3,4,21,99)
      AND prod.tipoProduto IN ('00','01','02','03','04','05','06','10','99')));
  SELECT MAX(TRUNC(mov.data))
  INTO v_dataEstoqueInicial
  FROM MOESTOQUES mov
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = mov.gradeProduto
  JOIN CAPRODUTOS prod
  ON prod.produto = gradProd.produto
  WHERE mov.operacaoInternaEstoque = 1
  AND (p_config_362_calcCustoPorGrade = 0
    OR p_gerandoInventario = 0
    AND p_item_personalizacao = 0
    OR mov.personalizacao = p_item_personalizacao)
  AND mov.data >= CASE WHEN v_dataInventario IS NULL THEN TO_DATE ('01/01/1900','DD/MM/YYYY') ELSE v_dataInventario + 1 END
  AND mov.data < TO_DATE('' || TO_CHAR(p_cab_dataPrecoFinal, 'DD/MM/YYYY') || '', 'DD/MM/YYYY') + 1
AND (mov.estabelecimento = p_cab_estabelecimento
  OR EXISTS (
    SELECT 1
    FROM PAESTABELECIMENTOS est
    JOIN PAESTABELECIMENTOS est2
    ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
    WHERE est.estabelecimento = mov.estabelecimento
    AND est.ativo = 1
    AND est.pessoaEstabelecimento > 0
    AND est2.estabelecimento = p_cab_estabelecimento)
  OR EXISTS (
    SELECT 1
    FROM PAESTABELECIMENTOS est
    JOIN CAPESSOAS pessEst
    ON pessEst.pessoa = est.pessoaEstabelecimento
    JOIN CAPESSOAS pessEst2
    ON pessEst2.grupoEconomico = pessEst.grupoEconomico
    JOIN PAESTABELECIMENTOS est2
    ON est2.pessoaEstabelecimento = pessEst2.pessoa
    WHERE p_config_209_filtrarGrupoEcon = 1
    AND est.estabelecimento = mov.estabelecimento
    AND est.ativo = 1
    AND est.pessoaEstabelecimento > 0
    AND pessEst.grupoEconomico > 0
    AND est2.estabelecimento = p_cab_estabelecimento))
  AND gradProd.produto = p_gradProd_produto
  AND (p_config_362_calcCustoPorGrade = 0
    OR p_gerandoInventario = 0
    AND p_gradProd_cor = 0
    OR gradProd.cor = p_gradProd_cor)
  AND (p_config_362_calcCustoPorGrade = 0
    OR p_gerandoInventario = 0
    AND (p_gradProd_tamanho = ''
      OR p_gradProd_tamanho = ' ')
    OR gradProd.tamanho = p_gradProd_tamanho)
  AND prod.controleEstoque NOT IN (2,3,4,21,99)
  AND prod.tipoProduto IN ('00','01','02','03','04','05','06','10','99');
  FOR a IN (
    SELECT
      TRUNC(a.data) data,
      a.operacao,
      TO_CHAR (a.data,'HH24MISS') tora,
      a.tabelaSistema,
      a.id,
      a.entradaSaida,
      a.quantidade,
      a.total
    FROM (
      SELECT
        invEst.data,
        4 operacao,
        'MOINVENTARIOESTOQUEXITENS' tabelaSistema,
        itemInv.idItemInventarioEstoque id,
        'E' entradaSaida,
        itemInv.quantidade,
        ROUND(itemInv.quantidade * itemInv.precoUnitarioCMV,2) total
      FROM MOINVENTARIOESTOQUEXITENS itemInv
      JOIN MOINVENTARIOSESTOQUE invEst
      ON invEst.inventarioEstoque = invEst.inventarioEstoque
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = itemInv.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      WHERE v_dataEstoqueInicial IS NULL
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gerandoInventario = 0
        AND p_item_personalizacao = 0
        OR itemInv.personalizacao = p_item_personalizacao)
      AND invEst.data >= v_dataInventario
      AND invEst.data < v_dataInventario + 1
      AND (invEst.estabelecimento = p_cab_estabelecimento
        OR EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN PAESTABELECIMENTOS est2
          ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
          WHERE est.estabelecimento = invEst.estabelecimento
          AND est.ativo = 1
          AND est.pessoaEstabelecimento > 0
          AND est2.estabelecimento = p_cab_estabelecimento)
        OR EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN CAPESSOAS pessEst
          ON pessEst.pessoa = est.pessoaEstabelecimento
          JOIN CAPESSOAS pessEst2
          ON pessEst2.grupoEconomico = pessEst.grupoEconomico
          JOIN PAESTABELECIMENTOS est2
          ON est2.pessoaEstabelecimento = pessEst2.pessoa
          WHERE p_config_209_filtrarGrupoEcon = 1
          AND est.estabelecimento = invEst.estabelecimento
          AND est.ativo = 1
          AND est.pessoaEstabelecimento > 0
          AND pessEst.grupoEconomico > 0
          AND est2.estabelecimento = p_cab_estabelecimento))
      AND gradProd.produto = p_gradProd_produto
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gerandoInventario = 0
        AND p_gradProd_cor = 0
        OR gradProd.cor = p_gradProd_cor)
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gerandoInventario = 0
        AND (p_gradProd_tamanho = ''
          OR p_gradProd_tamanho = ' ')
        OR gradProd.tamanho = p_gradProd_tamanho)
      AND prod.controleEstoque NOT IN (2,3,4,21,99)
      AND prod.tipoProduto IN ('00','01','02','03','04','05','06','10','99')
      AND invEst.inventarioEstoque = (
        SELECT MAX(invEst2.inventarioEstoque)
        FROM MOINVENTARIOSESTOQUE invEst2
        WHERE invEst2.estabelecimento = invEst.estabelecimento
        AND invEst2.data >= v_dataInventario
        AND invEst2.data < v_dataInventario + 1
        AND (invEst2.motivoInventarioEstoque = '01'
          OR invEst2.data < TRUNC(p_cab_dataPrecoFinal)
          AND EXISTS(
            SELECT 1
            FROM MOINVENTARIOESTOQUEXITENS itemInv2
            JOIN CAGRADESPRODUTO gradProd2
            ON gradProd2.gradeProduto = itemInv2.gradeProduto
            JOIN CAPRODUTOS prod2
            ON prod2.produto = gradProd2.produto
            WHERE itemInv2.inventarioEstoque = invEst2.inventarioEstoque
            AND (p_config_362_calcCustoPorGrade = 0
              OR p_gerandoInventario = 0
              AND p_item_personalizacao = 0
              OR itemInv2.personalizacao = p_item_personalizacao)
            AND gradProd2.produto = p_gradProd_produto
            AND (p_config_362_calcCustoPorGrade = 0
              OR p_gerandoInventario = 0
              AND p_gradProd_cor = 0
              OR gradProd2.cor = p_gradProd_cor)
            AND (p_config_362_calcCustoPorGrade = 0
              OR p_gerandoInventario = 0
              AND (p_gradProd_tamanho = ''
                OR p_gradProd_tamanho = ' ')
              OR gradProd2.tamanho = p_gradProd_tamanho)
            AND prod2.controleEstoque NOT IN (2,3,4,21,99)
            AND prod2.tipoProduto IN ('00','01','02','03','04','05','06','10','99'))))
      UNION ALL
      SELECT
        mov.data,
        CASE
          WHEN mov.operacaoInternaEstoque = 1
          THEN 1
          WHEN mov.atualizaCustoMedio = 1
          THEN 2
          ELSE 3
        END operacao,
        'MOESTOQUES' tabelaSistema,
        mov.idEstoque id,
        mov.entradaSaida,
        mov.quantidade,
        mov.totalCustoOperacao total
      FROM MOESTOQUES mov
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = mov.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      WHERE mov.indicadorPropriedadePosseItem = p_locEst_indicadorPropPosseIt
      AND mov.pessoaParticipante = p_item_pessoaParticipante
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gerandoInventario = 0
        AND p_item_personalizacao = 0
        OR mov.personalizacao = p_item_personalizacao)
      AND mov.data >=
        CASE
          WHEN NOT(v_dataEstoqueInicial IS NULL)
          THEN v_dataEstoqueInicial
          WHEN NOT(v_dataInventario IS NULL)
          THEN v_dataInventario + 1
          ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
        END
      AND mov.data < TRUNC(p_cab_dataPrecoFinal) + 1
      AND (mov.estabelecimento = p_cab_estabelecimento
        OR EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN PAESTABELECIMENTOS est2
          ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
          WHERE est.estabelecimento = mov.estabelecimento
          AND est.ativo = 1
          AND est.pessoaEstabelecimento > 0
          AND est2.estabelecimento = p_cab_estabelecimento)
        OR EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN CAPESSOAS pessEst
          ON pessEst.pessoa = est.pessoaEstabelecimento
          JOIN CAPESSOAS pessEst2
          ON pessEst2.grupoEconomico = pessEst.grupoEconomico
          JOIN PAESTABELECIMENTOS est2
          ON est2.pessoaEstabelecimento = pessEst2.pessoa
          WHERE p_config_209_filtrarGrupoEcon = 1
          AND est.estabelecimento = mov.estabelecimento
          AND est.ativo = 1
          AND est.pessoaEstabelecimento > 0
          AND pessEst.grupoEconomico > 0
          AND est2.estabelecimento = p_cab_estabelecimento))
      AND gradProd.produto = p_gradProd_produto
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gerandoInventario = 0
        AND p_gradProd_cor = 0
        OR gradProd.cor = p_gradProd_cor)
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gerandoInventario = 0
        AND (p_gradProd_tamanho = ''
          OR p_gradProd_tamanho = ' ')
        OR gradProd.tamanho = p_gradProd_tamanho)
      AND prod.controleEstoque NOT IN (2,3,4,21,99)
      AND prod.tipoProduto IN ('00','01','02','03','04','05','06','10','99')) a
    ORDER BY
      TRUNC(a.data),
      a.operacao,
      TO_CHAR (a.data,'HH24MISS'),
      a.tabelaSistema,
      a.id)
  LOOP
    IF v_quebra < TO_CHAR(a.data,'YYYYMMDD') || TO_CHAR(a.operacao) THEN
      v_quebra := TO_CHAR(a.data,'YYYYMMDD') || TO_CHAR(a.operacao);
      -- 1 = Saldo Inicial / 4 = Inventário Estoque
      IF a.operacao IN (1,4) THEN
        v_quantidade := 0;
        v_preco := 0;
        v_total := 0;
      END IF;
    END IF;
    -- 1 = Saldo Inicial / 2 = Atualiza Custo Médio / 4 = Inventário Estoque
    IF a.operacao IN (1,2,4) THEN
      IF a.entradaSaida = 'E' THEN
        v_quantidade := v_quantidade + a.quantidade;
        IF v_quantidade <= 0 THEN
          v_total := 0;
        ELSIF v_quantidade > a.quantidade THEN
          IF v_total + a.total > 9999999999999.99 THEN
             v_total := 9999999999999.99;
          ELSE
             v_total := v_total + a.total;
          END IF;
        ELSIF ROUND ((a.total * v_quantidade / a.quantidade),2) > 9999999999999.99 THEN
           v_total := 9999999999999.99;
        ELSE
           v_total := ROUND ((a.total * v_quantidade / a.quantidade),2);
        END IF;
     ELSE
        v_quantidade := v_quantidade - a.quantidade;
        v_total := v_total - a.total;
        IF v_total < 0 OR v_quantidade <= 0 THEN
          v_total := 0;
        END IF;
      END IF;
      IF v_total > 0 AND v_quantidade >= 0 AND ROUND(v_total / CASE WHEN v_quantidade = 0 THEN 1 ELSE v_quantidade END, 7) > 99999999.9999999 THEN
        v_preco := 99999999.9999999;
      ELSIF v_total > 0 AND v_quantidade >= 0 THEN
        v_preco := ROUND(v_total / CASE WHEN v_quantidade = 0 THEN 1 ELSE v_quantidade END, 7);
      END IF;
    -- Operação = 3 Não atualiza custo médio
    ELSIF a.entradaSaida = 'E' THEN
      v_quantidade := v_quantidade + a.quantidade;
      IF v_quantidade <= 0 THEN
        v_total := 0;
      ELSIF v_quantidade > a.quantidade THEN
        IF v_total + ROUND((a.quantidade * v_preco),2) > 9999999999999.99 THEN
           v_total := 9999999999999.99;
        ELSE
           v_total := v_total + a.total;
        END IF;
      ELSIF ROUND((v_quantidade * v_preco),2) > 9999999999999.99 THEN
         v_total := 9999999999999.99;
      ELSE
         v_total := ROUND((v_quantidade * v_preco),2);
      END IF;
    ELSE
      v_quantidade := v_quantidade - a.quantidade;
      v_total := v_total - a.quantidade * v_preco;
      IF v_total < 0 OR v_quantidade <= 0 THEN
        v_total := 0;
      END IF;
    END IF;
  END LOOP;
  IF v_preco = 0 THEN
    v_preco := FUNC_ADD_BUSCA_PRECO_PRODXEST(
      p_config_209_filtrarGrupoEcon,
      p_cab_estabelecimento,
      p_gradProd_produto,
      'C');
  END IF;
  RETURN v_preco;  
END;

/

DROP FUNCTION FUNC_ADD_BUSCA_PRECO_MEDIO;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_KIT(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_perfilUsuarioLogado          IN NUMBER,
    p_usuarioLogado                IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_devolucaoAnulacaoRetorno IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPrecoInicial         IN DATE,
    p_cab_dataPrecoFinal           IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_modDoc_capituloNaturezaFisc  IN NUMBER,
    p_endPessEst_uf                IN CHAR,
    p_endPess_uf                   IN CHAR,
    p_item_vendedor                IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_locEst_indicadorPropPosseIt  IN CHAR,
    p_manterPreco                  IN NUMBER,
    p_tipoPreco                    IN CHAR,
    p_tabelaPreco                  IN VARCHAR
  )
  RETURN NUMBER
IS 
  v_preco      NUMBER;
  v_precoFilho NUMBER;
BEGIN
  v_preco := 0;
  FOR kit IN (
    SELECT 
      kit.quantidade,
      gradProdFilho.produto,
      gradProdFilho.cor,
      gradProdFilho.tamanho,
      prodFilho.controleEstoque
    FROM CAGRADEPRODUTOXKITSCOMBOS kit
    JOIN CAGRADESPRODUTO gradProdPai
    ON gradProdPai.gradeProduto = kit.gradeProduto
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = kit.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    WHERE gradProdPai.produto = p_gradProd_produto
    AND kit.gradeProdutoFilho > 0
    AND kit.ativo = 1
    AND kit.quantidade > 0
    AND kit.gradeProduto <> kit.gradeProdutoFilho)
  LOOP
    v_precoFilho := 0;
    -- A Tabela de Preço Anterior
    IF p_tipoPreco = 'A' THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_ANTERIOR(
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        kit.quantidade * p_item_quantidade,
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_manterPreco,
        p_tabelaPreco);
    -- C Custo Médio da Venda (CMV)
    ELSIF p_tipoPreco = 'C' AND NOT(kit.controleEstoque IN (3,4)) THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_MEDIO_FIS(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_item_pessoaParticipante,
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_locEst_indicadorPropPosseIt,
        0); --p_gerandoInventario
    -- F Formação Preço (Custo)
    ELSIF p_tipoPreco = 'F' THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_FORMACAO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        kit.produto,
        kit.cor,
        kit.tamanho,
        0); --p_gerandoInventario
    -- G Custo Médio da Venda Gerencial (CMV)
    ELSIF p_tipoPreco = 'G' AND NOT(kit.controleEstoque IN (3,4)) THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_MEDIO_GER(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        p_item_pessoaParticipante,
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_locEst_indicadorPropPosseIt,
        0); --p_gerandoInventario
    -- P Preço de Custo (Último Custo)
    ELSIF p_tipoPreco = 'P' THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_ULT_CUSTO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        p_item_pessoaParticipante,
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_locEst_indicadorPropPosseIt,
        0); --p_gerandoInventario
    -- T Tabela de Preço
    ELSIF p_tipoPreco = 'T' THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_TABELA(
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        kit.quantidade * p_item_quantidade,
        kit.produto,
        kit.cor,
        kit.tamanho,
        p_manterPreco,
        p_tabelaPreco);
    -- U Última Compra
    ELSIF p_tipoPreco = 'U' THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        kit.produto,
        kit.cor,
        kit.tamanho,
        0, --p_retornarPrecoBruto
        0); --p_gerandoInventario
    -- 2 Última Compra Bruto
    ELSIF p_tipoPreco = '2' THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        kit.produto,
        kit.cor,
        kit.tamanho,
        1, --p_retornarPrecoBruto
        0); --p_gerandoInventario
    END IF;
    -- 3 = Combo / 4 = Kit
    IF v_precoFilho = 0 AND kit.controleEstoque IN (3,4) THEN
      v_precoFilho := FUNC_ADD_BUSCA_PRECO_KIT(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        kit.quantidade * p_item_quantidade,
        kit.produto,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco);
    END IF;
    IF v_precoFilho <> 0 THEN
      v_preco := v_preco + kit.quantidade * v_precoFilho;
    ELSE
      v_preco := 0;
    END IF;        
    EXIT WHEN v_preco = 0;
  END LOOP;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_PROTIN(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_perfilUsuarioLogado          IN NUMBER,
    p_usuarioLogado                IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_devolucaoAnulacaoRetorno IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPrecoInicial         IN DATE,
    p_cab_dataPrecoFinal           IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_modDoc_capituloNaturezaFisc  IN NUMBER,
    p_endPessEst_uf                IN CHAR,
    p_endPess_uf                   IN CHAR,
    p_item_vendedor                IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_locEst_indicadorPropPosseIt  IN CHAR,
    p_manterPreco                  IN NUMBER,
    p_tipoPreco                    IN CHAR,
    p_tabelaPreco                  IN VARCHAR,
    p_tinta_gradeProduto           IN NUMBER,
    p_tinta_quantidade             IN NUMBER,
    p_ini_preco                    IN NUMBER
  )
  RETURN NUMBER
IS
  v_preco      NUMBER;
  v_precoTinta NUMBER;
BEGIN
  v_preco := p_ini_preco;
  FOR a IN (
    SELECT 
      gradProd.produto,
      gradProd.cor,
      gradProd.tamanho,
      prod.controleEstoque
    FROM CAGRADESPRODUTO gradProd
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE gradProd.gradeProduto = p_tinta_gradeProduto)
  LOOP
    v_precoTinta := 0;
    -- A Tabela de Preço Anterior
    IF p_tipoPreco = 'A' THEN
      v_precoTinta := FUNC_ADD_BUSCA_PRECO_ANTERIOR(
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_tinta_quantidade * p_item_quantidade,
        a.produto,
        a.cor,
        a.tamanho,
        p_manterPreco,
        p_tabelaPreco);
    -- C Custo Médio da Venda (CMV)
    ELSIF p_tipoPreco = 'C' AND NOT(a.controleEstoque IN (3,4)) THEN
      v_precoTinta := FUNC_ADD_BUSCA_PRECO_MEDIO_FIS(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_item_pessoaParticipante,
        a.produto,
        a.cor,
        a.tamanho,
        p_locEst_indicadorPropPosseIt,
        0); --p_gerandoInventario
    -- F Formação Preço (Custo)
    ELSIF p_tipoPreco = 'F' THEN
      v_precoTinta := FUNC_ADD_BUSCA_PRECO_FORMACAO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        a.produto,
        a.cor,
        a.tamanho,
        0); --p_gerandoInventario
    -- G Custo Médio da Venda Gerencial (CMV)
    ELSIF p_tipoPreco = 'G' AND NOT(a.controleEstoque IN (3,4)) THEN
      v_precoTinta := FUNC_ADD_BUSCA_PRECO_MEDIO_GER(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        p_item_pessoaParticipante,
        a.produto,
        a.cor,
        a.tamanho,
        p_locEst_indicadorPropPosseIt,
        0); --p_gerandoInventario
    -- P Preço de Custo (Último Custo)
    ELSIF p_tipoPreco = 'P' THEN
      v_precoTinta := FUNC_ADD_BUSCA_PRECO_ULT_CUSTO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        p_item_pessoaParticipante,
        a.produto,
        a.cor,
        a.tamanho,
        p_locEst_indicadorPropPosseIt,
        0); --p_gerandoInventario
    -- T Tabela de Preço
    ELSIF p_tipoPreco = 'T' THEN
      v_precoTinta := FUNC_ADD_BUSCA_PRECO_TABELA(
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_tinta_quantidade * p_item_quantidade,
        a.produto,
        a.cor,
        a.tamanho,
        p_manterPreco,
        p_tabelaPreco);
    -- U Última Compra
    ELSIF p_tipoPreco = 'U' THEN
      v_precoTinta := FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        a.produto,
        a.cor,
        a.tamanho,
        0, --p_retornarPrecoBruto
        0); --p_gerandoInventario
    -- 2 Última Compra Bruto
    ELSIF p_tipoPreco = '2' THEN
      v_precoTinta := FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, -- p_item_personalizacao
        a.produto,
        a.cor,
        a.tamanho,
        1, --p_retornarPrecoBruto
        0); --p_gerandoInventario
    END IF;
    -- 3 = Combo / 4 = Kit
    IF v_precoTinta = 0 AND a.controleEstoque IN (3,4) THEN
      v_precoTinta := FUNC_ADD_BUSCA_PRECO_KIT(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_tinta_quantidade * p_item_quantidade,
        a.produto,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco);
    END IF;
    v_preco := v_preco + p_tinta_quantidade * v_precoTinta;
  END LOOP;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_TINTA(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_perfilUsuarioLogado          IN NUMBER,
    p_usuarioLogado                IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_devolucaoAnulacaoRetorno IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPrecoInicial         IN DATE,
    p_cab_dataPrecoFinal           IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_modDoc_capituloNaturezaFisc  IN NUMBER,
    p_endPessEst_uf                IN CHAR,
    p_endPess_uf                   IN CHAR,
    p_item_vendedor                IN NUMBER,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_locEst_indicadorPropPosseIt  IN CHAR,
    p_manterPreco                  IN NUMBER,
    p_tipoPreco                    IN CHAR,
    p_tabelaPreco                  IN VARCHAR)
  RETURN NUMBER
IS
  v_preco NUMBER;
BEGIN
  v_preco := 0;
  FOR a IN (
    SELECT 
      a.idBaseTinta,
      base.gradeProduto,
      a.idColoranteTintaA,
      a.quantidadeA,
      colA.gradeProduto gradeProdutoA,
      a.idColoranteTintaB,
      a.quantidadeB,
      colB.gradeProduto gradeProdutoB,
      a.idColoranteTintaC,
      a.quantidadeC,
      colC.gradeProduto gradeProdutoC,
      a.idColoranteTintaD,
      a.quantidadeD,
      colD.gradeProduto gradeProdutoD,
      a.idColoranteTintaE,
      a.quantidadeE,
      colE.gradeProduto gradeProdutoE,
      a.idColoranteTintaF,
      a.quantidadeF,
      colF.gradeProduto gradeProdutoF,
      a.idColoranteTintaG,
      a.quantidadeG,
      colG.gradeProduto gradeProdutoG,
      a.idColoranteTintaH,
      a.quantidadeH,
      colH.gradeProduto gradeProdutoH,
      a.idColoranteTintaI,
      a.quantidadeI,
      colI.gradeProduto gradeProdutoI,
      a.idColoranteTintaJ,
      a.quantidadeJ,
      colJ.gradeProduto gradeProdutoJ,
      a.idColoranteTintaK,
      a.quantidadeK,
      colK.gradeProduto gradeProdutoK,
      a.idColoranteTintaL,
      a.quantidadeL,
      colL.gradeProduto gradeProdutoL,
      a.idColoranteTintaM,
      a.quantidadeM,
      colM.gradeProduto gradeProdutoM,
      a.idColoranteTintaN,
      a.quantidadeN,
      colN.gradeProduto gradeProdutoN,
      a.idColoranteTintaO,
      a.quantidadeO,
      colO.gradeProduto gradeProdutoO
    FROM CAFORMULASTINTAS a 
    JOIN CABASESTINTAS base
    ON base.idBaseTinta = a.idBaseTinta
    JOIN CACOLORANTESTINTAS colA
    ON colA.idColoranteTinta = a.idColoranteTintaA
    JOIN CACOLORANTESTINTAS colB
    ON colB.idColoranteTinta = a.idColoranteTintaB
    JOIN CACOLORANTESTINTAS colC
    ON colC.idColoranteTinta = a.idColoranteTintaC
    JOIN CACOLORANTESTINTAS colD
    ON colD.idColoranteTinta = a.idColoranteTintaD
    JOIN CACOLORANTESTINTAS colE
    ON colE.idColoranteTinta = a.idColoranteTintaE
    JOIN CACOLORANTESTINTAS colF
    ON colF.idColoranteTinta = a.idColoranteTintaF
    JOIN CACOLORANTESTINTAS colG
    ON colG.idColoranteTinta = a.idColoranteTintaG
    JOIN CACOLORANTESTINTAS colH
    ON colH.idColoranteTinta = a.idColoranteTintaH
    JOIN CACOLORANTESTINTAS colI
    ON colI.idColoranteTinta = a.idColoranteTintaI
    JOIN CACOLORANTESTINTAS colJ
    ON colJ.idColoranteTinta = a.idColoranteTintaJ
    JOIN CACOLORANTESTINTAS colK
    ON colK.idColoranteTinta = a.idColoranteTintaK
    JOIN CACOLORANTESTINTAS colL
    ON colL.idColoranteTinta = a.idColoranteTintaL
    JOIN CACOLORANTESTINTAS colM
    ON colM.idColoranteTinta = a.idColoranteTintaM
    JOIN CACOLORANTESTINTAS colN
    ON colN.idColoranteTinta = a.idColoranteTintaN
    JOIN CACOLORANTESTINTAS colO
    ON colO.idColoranteTinta = a.idColoranteTintaO
    WHERE a.idFormulaTinta = p_item_idFormulaTinta
    AND a.idBaseTinta > 0
    AND base.gradeProduto > 0)
  LOOP
    v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_perfilUsuarioLogado,
      p_usuarioLogado,
      p_cab_entradaSaida,
      p_cab_devolucaoAnulacaoRetorno,
      p_cab_estabelecimento,
      p_cab_dataPrecoInicial,
      p_cab_dataPrecoFinal,
      p_cab_pessoa,
      p_modDoc_capituloNaturezaFisc,
      p_endPessEst_uf,
      p_endPess_uf,
      p_item_vendedor,
      p_item_personalizacao,
      p_item_localEstoque,
      p_item_pessoaParticipante,
      p_item_quantidade,
      p_locEst_indicadorPropPosseIt,
      p_manterPreco,
      p_tipoPreco,
      p_tabelaPreco,
      a.gradeProduto,
      1, --p_tinta_quantidade
      v_preco);
    IF a.idColoranteTintaA > 0
      AND a.gradeProdutoA > 0
      AND a.quantidadeA > 0
    THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoA,
        a.quantidadeA / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaB > 0
      AND a.gradeProdutoB > 0
      AND a.quantidadeB > 0
    THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoB,
        a.quantidadeB / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaC > 0
      AND a.gradeProdutoC > 0
      AND a.quantidadeC > 0
    THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoC,
        a.quantidadeC / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaD > 0
      AND a.gradeProdutoD > 0
      AND a.quantidadeD > 0
    THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoD,
        a.quantidadeD / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaE > 0
      AND a.gradeProdutoE > 0
      AND a.quantidadeE > 0
    THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoE,
        a.quantidadeE / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaF > 0
      AND a.gradeProdutoF > 0
      AND a.quantidadeF > 0
    THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoF,
        a.quantidadeF / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaG > 0
      AND a.gradeProdutoG > 0
      AND a.quantidadeG > 0
    THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoG,
        a.quantidadeG / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaH > 0
      AND a.gradeProdutoH > 0
      AND a.quantidadeH > 0
    THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoH,
        a.quantidadeH / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaI > 0
      AND a.gradeProdutoI > 0
      AND a.quantidadeI > 0
    THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoI,
        a.quantidadeI / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaJ > 0
      AND a.gradeProdutoJ > 0
      AND a.quantidadeJ > 0
    THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoJ,
        a.quantidadeJ / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaK > 0
      AND a.gradeProdutoK > 0
      AND a.quantidadeK > 0
    THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoK,
        a.quantidadeK / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaL > 0
      AND a.gradeProdutoL > 0
      AND a.quantidadeL > 0
    THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoL,
        a.quantidadeL / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaM > 0
      AND a.gradeProdutoM > 0
      AND a.quantidadeM > 0
    THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoM,
        a.quantidadeM / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaN > 0
      AND a.gradeProdutoN > 0
      AND a.quantidadeN > 0
    THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoN,
        a.quantidadeN / 900, --p_tinta_quantidade
        v_preco);
    END IF;
    IF a.idColoranteTintaO > 0
      AND a.gradeProdutoO > 0
      AND a.quantidadeO > 0
    THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoO,
        a.quantidadeO / 900, --p_tinta_quantidade
        v_preco);
    END IF;
  END LOOP;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO(
    p_config_64_casasDecSaidas     IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_perfilUsuarioLogado          IN NUMBER,
    p_usuarioLogado                IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPrecoFinal           IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_endPessEst_uf                IN CHAR,
    p_endPess_uf                   IN CHAR,
    p_item_vendedor                IN NUMBER,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_prod_controleEstoque         IN NUMBER,
    p_tipoPreco                    IN CHAR,
    p_tabelaPreco                  IN VARCHAR
  )
  RETURN NUMBER
IS 
  v_preco NUMBER;
BEGIN
  v_preco := 0;
  IF p_gradProd_produto > 0 AND p_tipoPreco <> 'I' THEN
    IF p_prod_controleEstoque = 12 AND p_item_idFormulaTinta > 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        'S', --p_cab_entradaSaida
        0, --p_cab_devolucaoAnulacaoRetorno
        p_cab_estabelecimento,
        TO_DATE ('01/01/1900','DD/MM/YYYY'), -- p_cab_dataPrecoFinalInicial
        p_cab_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
        p_cab_pessoa,
        1, --p_modDoc_capituloNaturezaFisc
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_idFormulaTinta,
        0, --p_item_personalizacao
        0, --p_item_localEstoque
        0, --p_item_pessoaParticipante
        1, --p_quantidade
        '0', --p_locEst_indicadorPropPosseiT
        CASE WHEN (p_tipoPreco= '' OR p_tipoPreco= ' ' OR p_tipoPreco= 'T' AND (p_tabelaPreco = '' OR p_tabelaPreco = ' ')) THEN 0 ELSE 1 END,
        p_tipoPreco,
        p_tabelaPreco);
    ELSE
      -- A Tabela de Preço Anterior
      IF p_tipoPreco = 'A' THEN
        v_preco := FUNC_ADD_BUSCA_PRECO_ANTERIOR(
          p_perfilUsuarioLogado,
          p_usuarioLogado,
          'S', --p_cab_entradaSaida
          0, --p_cab_devolucaoAnulacaoRetorno
          p_cab_estabelecimento,
          p_cab_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
          p_cab_pessoa,
          1, --p_modDoc_capituloNaturezaFisc
          p_endPessEst_uf,
          p_endPess_uf,
          p_item_vendedor,
          0, --p_item_personalizacao
          0, --p_item_localEstoque
          1, --p_quantidade
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          CASE WHEN (p_tipoPreco= '' OR p_tipoPreco= ' ' OR p_tipoPreco= 'T' AND (p_tabelaPreco = '' OR p_tabelaPreco = ' ')) THEN 0 ELSE 1 END,
          p_tabelaPreco);
      -- C Custo Médio da Venda (CMV)
      ELSIF p_tipoPreco = 'C' AND NOT(p_prod_controleEstoque IN (3,4)) THEN
        v_preco := FUNC_ADD_BUSCA_PRECO_MEDIO_FIS(
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          p_cab_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
          0, --p_item_pessoaParticipante
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          '0', --p_locEst_indicadorPropPosseIt
          0); --p_gerandoInventario
      -- F Formação Preço (Custo)
      ELSIF p_tipoPreco = 'F' THEN
        v_preco := FUNC_ADD_BUSCA_PRECO_FORMACAO(
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          TO_DATE ('01/01/1900','DD/MM/YYYY'), -- p_cab_dataPrecoFinalInicial
          p_cab_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
          p_item_personalizacao,
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          0); --p_gerandoInventario
      -- G Custo Médio da Venda Gerencial (CMV)
      ELSIF p_tipoPreco = 'G' AND NOT(p_prod_controleEstoque IN (3,4)) THEN
        v_preco := FUNC_ADD_BUSCA_PRECO_MEDIO_GER(
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          p_cab_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
          p_item_personalizacao,
          0, --p_item_pessoaParticipante
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          '0', --p_locEst_indicadorPropPosseIt
          0); --p_gerandoInventario
      -- P Preço de Custo (Último Custo)
      ELSIF p_tipoPreco = 'P' THEN
        v_preco := FUNC_ADD_BUSCA_PRECO_ULT_CUSTO(
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          TO_DATE ('01/01/1900','DD/MM/YYYY'), -- p_cab_dataPrecoFinalInicial
          p_cab_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
          p_item_personalizacao,
          0, --p_item_pessoaParticipante
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          '0', --p_locEst_indicadorPropPosseIt
          0); --p_gerandoInventario
      -- T Tabela de Preço
      ELSIF p_tipoPreco = 'T' THEN
        v_preco := FUNC_ADD_BUSCA_PRECO_TABELA(
          p_perfilUsuarioLogado,
          p_usuarioLogado,
          'S', --p_cab_entradaSaida
          0, --p_cab_devolucaoAnulacaoRetorno
          p_cab_estabelecimento,
          p_cab_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
          p_cab_pessoa,
          1, --p_modDoc_capituloNaturezaFisc
          p_endPessEst_uf,
          p_endPess_uf,
          p_item_vendedor,
          0, --p_item_personalizacao
          0, --p_item_localEstoque
          1, --p_quantidade
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          CASE WHEN (p_tipoPreco= '' OR p_tipoPreco= ' ' OR p_tipoPreco= 'T' AND (p_tabelaPreco = '' OR p_tabelaPreco = ' ')) THEN 0 ELSE 1 END,
          p_tabelaPreco);
      -- U Última Compra
      ELSIF p_tipoPreco = 'U' THEN
        v_preco := FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          TO_DATE ('01/01/1900','DD/MM/YYYY'), -- p_cab_dataPrecoFinalInicial
          p_cab_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
          p_item_personalizacao,
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          0, --p_retornarPrecoBruto
          0); --p_gerandoInventario
      -- 2 Última Compra Bruto
      ELSIF p_tipoPreco = '2' THEN
        v_preco := FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          TO_DATE ('01/01/1900','DD/MM/YYYY'), -- p_cab_dataPrecoFinalInicial
          p_cab_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
          p_item_personalizacao,
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          1, --p_retornarPrecoBruto
          0); --p_gerandoInventario
      END IF;
      -- 3 = Combo / 4 = Kit
      IF v_preco = 0 AND p_prod_controleEstoque IN (3,4) THEN
        v_preco := FUNC_ADD_BUSCA_PRECO_KIT(
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_perfilUsuarioLogado,
          p_usuarioLogado,
          'S', --p_cab_entradaSaida
          0, --p_cab_devolucaoAnulacaoRetorno
          p_cab_estabelecimento,
          TO_DATE ('01/01/1900','DD/MM/YYYY'), -- p_cab_dataPrecoFinalInicial
          p_cab_dataPrecoFinal, --p_cab_dataPrecoFinalFinal
          p_cab_pessoa,
          1, --p_modDoc_capituloNaturezaFisc
          p_endPessEst_uf,
          p_endPess_uf,
          p_item_vendedor,
          0, --p_item_personalizacao
          0, --p_item_localEstoque
          0, --p_item_pessoaParticipante
          1, --p_quantidade
          p_gradProd_produto,
          '0', --p_locEst_indicadorPropPosseiT
          CASE WHEN (p_tipoPreco= '' OR p_tipoPreco= ' ' OR p_tipoPreco= 'T' AND (p_tabelaPreco = '' OR p_tabelaPreco = ' ')) THEN 0 ELSE 1 END,
          p_tipoPreco,
          p_tabelaPreco);
      END IF;
    END IF;
    -- Efetua arredondamento de preço
    v_preco := ROUND (v_preco, TO_NUMBER(p_config_64_casasDecSaidas));
  END IF;
  RETURN v_preco;
END;

/

create or replace PROCEDURE ADD_BUSCA_PRECO_INTERNO_KIT(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_perfilUsuarioLogado          IN NUMBER,
    p_usuarioLogado                IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_devolucaoAnulacaoRetorno IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPrecoInicial         IN DATE,
    p_cab_dataPrecoFinal           IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_modDoc_capituloNaturezaFisc  IN NUMBER,
    p_endPessEst_uf                IN CHAR,
    p_endPess_uf                   IN CHAR,
    p_item_vendedor                IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_locEst_indicadorPropPosseIt  IN CHAR,
    p_manterPreco                  IN NUMBER,
    p_tipoPreco                    IN CHAR,
    p_tabelaPreco                  IN VARCHAR,
    r_tabelaPreco                  OUT VARCHAR,
    r_precoSugestaoAPrazo          OUT NUMBER,
    r_precoSugestaoAVista          OUT NUMBER,
    r_precoDesconto                OUT NUMBER,
    r_precoMinimo                  OUT NUMBER,
    r_informarPrecoManualmente     OUT NUMBER,
    r_precoAPrazo                  OUT NUMBER,
    r_precoAVista                  OUT NUMBER,
    r_promocao                     OUT NUMBER,
    r_precoPromocaoAPrazo          OUT NUMBER,
    r_precoPromocaoAVista          OUT NUMBER,
    r_precoIndexadoAPrazo          OUT NUMBER,
    r_precoIndexadoAVista          OUT NUMBER)
IS
  v_tabelaPreco              VARCHAR (10);
  v_precoSugestaoAPrazo      NUMBER;
  v_precoSugestaoAVista      NUMBER;
  v_precoDesconto            NUMBER;
  v_precoMinimo              NUMBER;
  v_informarPrecoManualmente NUMBER;
  v_precoAPrazo              NUMBER;
  v_precoAVista              NUMBER;
  v_promocao                 NUMBER;
  v_precoPromocaoAPrazo      NUMBER;
  v_precoPromocaoAVista      NUMBER;
  v_precoIndexadoAPrazo      NUMBER;
  v_precoIndexadoAVista      NUMBER;
BEGIN
  r_tabelaPreco := ' ';
  r_precoSugestaoAPrazo := 0;
  r_precoSugestaoAVista := 0;
  r_precoDesconto := 0;
  r_precoMinimo := 0;
  r_informarPrecoManualmente := 0;
  r_precoAPrazo := 0;
  r_precoAVista := 0;
  r_promocao := 0;
  r_precoPromocaoAPrazo := 0;
  r_precoPromocaoAVista := 0;
  r_precoIndexadoAPrazo := 0;
  r_precoIndexadoAVista := 0;
  FOR a IN (
    SELECT 
      a.quantidade,
      gradProdFilho.produto,
      gradProdFilho.cor,
      gradProdFilho.tamanho,
      prodFilho.controleEstoque
    FROM CAGRADEPRODUTOXKITSCOMBOS a
    JOIN CAGRADESPRODUTO gradProdPai
    ON gradProdPai.gradeProduto = a.gradeProduto
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = a.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    WHERE gradProdPai.produto = p_gradProd_produto
    AND a.gradeProdutoFilho > 0
    AND a.ativo = 1
    AND a.quantidade > 0
    AND a.gradeProduto <> a.gradeProdutoFilho)
  LOOP
    v_tabelaPreco              := ' ';
    v_precoSugestaoAPrazo      := 0;
    v_precoSugestaoAVista      := 0;
    v_precoDesconto            := 0;
    v_precoMinimo              := 0;
    v_informarPrecoManualmente := 0;
    v_precoAPrazo              := 0;
    v_precoAVista              := 0;
    v_promocao                 := 0;
    v_precoPromocaoAPrazo      := 0;
    v_precoPromocaoAVista      := 0;
    v_precoIndexadoAPrazo      := 0;
    v_precoIndexadoAVista      := 0;
    -- A Tabela de Preço Anterior
    IF p_tipoPreco = 'A' THEN
      ADD_BUSCA_PRECO_INTERNO_ANTER(
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        a.quantidade * p_item_quantidade,
        a.produto,
        a.cor,
        a.tamanho,
        p_manterPreco,
        0, --p_precoSugestaoAPrazoOriginal,
        0, --p_precoSugestaoAVistaOriginal,
        p_tabelaPreco,
        v_tabelaPreco,
        v_precoSugestaoAPrazo,
        v_precoSugestaoAVista,
        v_precoDesconto,
        v_precoMinimo,
        v_informarPrecoManualmente,
        v_precoAPrazo,
        v_precoAVista,
        v_promocao,
        v_precoPromocaoAPrazo,
        v_precoPromocaoAVista,
        v_precoIndexadoAPrazo,
        v_precoIndexadoAVista);
    -- C Custo Médio da Venda (CMV)
    ELSIF p_tipoPreco = 'C' AND NOT(a.controleEstoque IN (3,4)) THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_MEDIO_FIS(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        a.produto,
        a.cor,
        a.tamanho,
        p_locEst_indicadorPropPosseIt,
        p_item_pessoaParticipante,
        0); --p_gerandoInventario
    -- F Formação Preço (Custo)
    ELSIF p_tipoPreco = 'F' THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_FORMACAO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        a.produto,
        a.cor,
        a.tamanho,
        0); --p_gerandoInventario
    -- G Custo Médio da Venda Gerencial (CMV)
    ELSIF p_tipoPreco = 'G' AND NOT(a.controleEstoque IN (3,4)) THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_MEDIO_GER(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        a.produto,
        a.cor,
        a.tamanho,
        p_locEst_indicadorPropPosseIt,
        p_item_pessoaParticipante,
        0); --p_gerandoInventario
    -- P Preço de Custo (Último Custo)
    ELSIF p_tipoPreco = 'P' THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_CUSTO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        p_item_pessoaParticipante,
        a.produto,
        a.cor,
        a.tamanho,
        p_locEst_indicadorPropPosseIt,
        0); --p_gerandoInventario
    -- T Tabela de Preço
    ELSIF p_tipoPreco = 'T' THEN
      ADD_BUSCA_PRECO_INTERNO_TABELA(
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        a.quantidade * p_item_quantidade,
        a.produto,
        a.cor,
        a.tamanho,
        p_manterPreco,
        0, --p_precoSugestaoAPrazoOriginal,
        0, --p_precoSugestaoAVistaOriginal,
        p_tabelaPreco,
        v_tabelaPreco,
        v_precoSugestaoAPrazo,
        v_precoSugestaoAVista,
        v_precoDesconto,
        v_precoMinimo,
        v_informarPrecoManualmente,
        v_precoAPrazo,
        v_precoAVista,
        v_promocao,
        v_precoPromocaoAPrazo,
        v_precoPromocaoAVista,
        v_precoIndexadoAPrazo,
        v_precoIndexadoAVista);
    -- U Última Compra
    ELSIF p_tipoPreco = 'U' THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        a.produto,
        a.cor,
        a.tamanho,
        0, --p_retornarPrecoBruto
        0); --p_gerandoInventario
    -- 2 Última Compra Bruto
    ELSIF p_tipoPreco = '2' THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        a.produto,
        a.cor,
        a.tamanho,
        1, --p_retornarPrecoBruto
        0); --p_gerandoInventario
    END IF;
    IF NOT(p_tipoPreco IN ('A','T')) THEN
      v_tabelaPreco              := ' ';
      v_precoSugestaoAVista      := v_precoSugestaoAPrazo;
      v_precoDesconto            := 0;
      v_precoMinimo              := 0;
      v_informarPrecoManualmente := 0;
      v_precoAPrazo              := v_precoSugestaoAPrazo;
      v_precoAVista              := v_precoSugestaoAPrazo;
      v_promocao                 := 0;
      v_precoPromocaoAPrazo      := v_precoSugestaoAPrazo;
      v_precoPromocaoAVista      := v_precoSugestaoAPrazo;
      v_precoIndexadoAPrazo      := v_precoSugestaoAPrazo;
      v_precoIndexadoAVista      := v_precoSugestaoAPrazo;
    END IF;  
    -- 3 = Combo / 4 = Kit
    IF v_precoSugestaoAPrazo = 0 AND a.controleEstoque IN (3,4) THEN
      ADD_BUSCA_PRECO_INTERNO_KIT(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidade * p_item_quantidade,
        a.produto,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        v_tabelaPreco,
        v_precoSugestaoAPrazo,
        v_precoSugestaoAVista,
        v_precoDesconto,
        v_precoMinimo,
        v_informarPrecoManualmente,
        v_precoAPrazo,
        v_precoAVista,
        v_promocao,
        v_precoPromocaoAPrazo,
        v_precoPromocaoAVista,
        v_precoIndexadoAPrazo,
        v_precoIndexadoAVista);
    END IF;
    IF v_precoSugestaoAPrazo <> 0 THEN
      r_tabelaPreco         := v_tabelaPreco;
      r_precoSugestaoAPrazo := r_precoSugestaoAPrazo + a.quantidade * v_precoSugestaoAPrazo;
      r_precoSugestaoAVista := r_precoSugestaoAVista + a.quantidade * v_precoSugestaoAVista;
      r_precoDesconto       := r_precoDesconto       + a.quantidade * v_precoDesconto;
      r_precoMinimo         := r_precoMinimo         + a.quantidade * v_precoMinimo;
      r_precoAPrazo         := r_precoAPrazo         + a.quantidade * v_precoAPrazo;
      r_precoAVista         := r_precoAVista         + a.quantidade * v_precoAVista;
      IF v_promocao = 1 THEN
        r_promocao          := 1;
      END IF;  
      r_precoPromocaoAPrazo := r_precoPromocaoAPrazo + a.quantidade * v_precoPromocaoAPrazo;
      r_precoPromocaoAVista := r_precoPromocaoAVista + a.quantidade * v_precoPromocaoAVista;
      r_precoIndexadoAPrazo := r_precoIndexadoAPrazo + a.quantidade * v_precoIndexadoAPrazo;
      r_precoIndexadoAVista := r_precoIndexadoAVista + a.quantidade * v_precoIndexadoAVista;
    ELSE
      r_tabelaPreco         := ' ';
      r_precoSugestaoAPrazo := 0;
      r_precoSugestaoAVista := 0;
      r_precoDesconto       := 0;
      r_precoMinimo         := 0;
      r_precoAPrazo         := 0;
      r_precoAVista         := 0;
      r_promocao            := 0;
      r_precoPromocaoAPrazo := 0;
      r_precoPromocaoAVista := 0;
      r_precoIndexadoAPrazo := 0;
      r_precoIndexadoAVista := 0;
    END IF;        
    EXIT WHEN r_precoSugestaoAPrazo = 0;
  END LOOP;
END ADD_BUSCA_PRECO_INTERNO_KIT;

/

create or replace PROCEDURE ADD_BUSCA_PRECO_INTERNO_PROTIN(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_perfilUsuarioLogado          IN NUMBER,
    p_usuarioLogado                IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_devolucaoAnulacaoRetorno IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPrecoInicial         IN DATE,
    p_cab_dataPrecoFinal           IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_modDoc_capituloNaturezaFisc  IN NUMBER,
    p_endPessEst_uf                IN CHAR,
    p_endPess_uf                   IN CHAR,
    p_item_vendedor                IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_locEst_indicadorPropPosseIt  IN CHAR,
    p_manterPreco                  IN NUMBER,
    p_tipoPreco                    IN CHAR,
    p_tabelaPreco                  IN VARCHAR,
    p_tinta_gradeProduto           IN NUMBER,
    p_tinta_quantidade             IN NUMBER,
    p_ini_tabelaPreco              IN VARCHAR,
    p_ini_precoSugestaoAPrazo      IN NUMBER,
    p_ini_precoSugestaoAVista      IN NUMBER,
    p_ini_precoDesconto            IN NUMBER,
    p_ini_precoMinimo              IN NUMBER,
    p_ini_informarPrecoManualmente IN NUMBER,
    p_ini_precoAPrazo              IN NUMBER,
    p_ini_precoAVista              IN NUMBER,
    p_ini_promocao                 IN NUMBER,
    p_ini_precoPromocaoAPrazo      IN NUMBER,
    p_ini_precoPromocaoAVista      IN NUMBER,
    p_ini_precoIndexadoAPrazo      IN NUMBER,
    p_ini_precoIndexadoAVista      IN NUMBER,
    r_tabelaPreco                  OUT VARCHAR,
    r_precoSugestaoAPrazo          OUT NUMBER,
    r_precoSugestaoAVista          OUT NUMBER,
    r_precoDesconto                OUT NUMBER,
    r_precoMinimo                  OUT NUMBER,
    r_informarPrecoManualmente     OUT NUMBER,
    r_precoAPrazo                  OUT NUMBER,
    r_precoAVista                  OUT NUMBER,
    r_promocao                     OUT NUMBER,
    r_precoPromocaoAPrazo          OUT NUMBER,
    r_precoPromocaoAVista          OUT NUMBER,
    r_precoIndexadoAPrazo          OUT NUMBER,
    r_precoIndexadoAVista          OUT NUMBER)
IS
  v_tabelaPreco              VARCHAR (10);
  v_precoSugestaoAPrazo      NUMBER;
  v_precoSugestaoAVista      NUMBER;
  v_precoDesconto            NUMBER;
  v_precoMinimo              NUMBER;
  v_informarPrecoManualmente NUMBER;
  v_precoAPrazo              NUMBER;
  v_precoAVista              NUMBER;
  v_promocao                 NUMBER;
  v_precoPromocaoAPrazo      NUMBER;
  v_precoPromocaoAVista      NUMBER;
  v_precoIndexadoAPrazo      NUMBER;
  v_precoIndexadoAVista      NUMBER;
BEGIN
  r_tabelaPreco              := p_ini_tabelaPreco;
  r_precoSugestaoAPrazo      := p_ini_precoSugestaoAPrazo;
  r_precoSugestaoAVista      := p_ini_precoSugestaoAVista;
  r_precoDesconto            := p_ini_precoDesconto;
  r_precoMinimo              := p_ini_precoMinimo;
  r_informarPrecoManualmente := p_ini_informarPrecoManualmente;
  r_precoAPrazo              := p_ini_precoAPrazo;
  r_precoAVista              := p_ini_precoAVista;
  r_promocao                 := p_ini_promocao;
  r_precoPromocaoAPrazo      := p_ini_precoPromocaoAPrazo;
  r_precoPromocaoAVista      := p_ini_precoPromocaoAVista;
  r_precoIndexadoAPrazo      := p_ini_precoIndexadoAPrazo;
  r_precoIndexadoAVista      := p_ini_precoIndexadoAVista;
  FOR a IN (
    SELECT 
      gradProd.produto,
      gradProd.cor,
      gradProd.tamanho,
      prod.controleEstoque
    FROM CAGRADESPRODUTO gradProd
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE gradProd.gradeProduto = p_tinta_gradeProduto)
  LOOP
    v_tabelaPreco              := ' ';
    v_precoSugestaoAPrazo      := 0;
    v_precoSugestaoAVista      := 0;
    v_precoDesconto            := 0;
    v_precoMinimo              := 0;
    v_informarPrecoManualmente := 0;
    v_precoAPrazo              := 0;
    v_precoAVista              := 0;
    v_promocao                 := 0;
    v_precoPromocaoAPrazo      := 0;
    v_precoPromocaoAVista      := 0;
    v_precoIndexadoAPrazo      := 0;
    v_precoIndexadoAVista      := 0;
    -- A Tabela de Preço Anterior
    IF p_tipoPreco = 'A' THEN
      ADD_BUSCA_PRECO_INTERNO_ANTER(
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_tinta_quantidade * p_item_quantidade,
        a.produto,
        a.cor,
        a.tamanho,
        p_manterPreco,
        0, --p_precoSugestaoAPrazoOriginal,
        0, --p_precoSugestaoAVistaOriginal,
        p_tabelaPreco,
        v_tabelaPreco,
        v_precoSugestaoAPrazo,
        v_precoSugestaoAVista,
        v_precoDesconto,
        v_precoMinimo,
        v_informarPrecoManualmente,
        v_precoAPrazo,
        v_precoAVista,
        v_promocao,
        v_precoPromocaoAPrazo,
        v_precoPromocaoAVista,
        v_precoIndexadoAPrazo,
        v_precoIndexadoAVista);
    -- C Custo Médio da Venda (CMV)
    ELSIF p_tipoPreco = 'C' AND NOT(a.controleEstoque IN (3,4)) THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_MEDIO_FIS(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        a.produto,
        a.cor,
        a.tamanho,
        p_locEst_indicadorPropPosseIt,
        p_item_pessoaParticipante,
        0); --p_gerandoInventario
    -- F Formação Preço (Custo)
    ELSIF p_tipoPreco = 'F' THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_FORMACAO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        a.produto,
        a.cor,
        a.tamanho,
        0); --p_gerandoInventario
    -- G Custo Médio da Venda Gerencial (CMV)
    ELSIF p_tipoPreco = 'G' AND NOT(a.controleEstoque IN (3,4)) THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_MEDIO_GER(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        a.produto,
        a.cor,
        a.tamanho,
        p_locEst_indicadorPropPosseIt,
        p_item_pessoaParticipante,
        0); --p_gerandoInventario
    -- P Preço de Custo (Último Custo)
    ELSIF p_tipoPreco = 'P' THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_CUSTO(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        p_item_pessoaParticipante,
        a.produto,
        a.cor,
        a.tamanho,
        p_locEst_indicadorPropPosseIt,
        0); --p_gerandoInventario
    -- T Tabela de Preço
    ELSIF p_tipoPreco = 'T' THEN
      ADD_BUSCA_PRECO_INTERNO_TABELA(
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_tinta_quantidade * p_item_quantidade,
        a.produto,
        a.cor,
        a.tamanho,
        p_manterPreco,
        0, --p_precoSugestaoAPrazoOriginal,
        0, --p_precoSugestaoAVistaOriginal,
        p_tabelaPreco,
        v_tabelaPreco,
        v_precoSugestaoAPrazo,
        v_precoSugestaoAVista,
        v_precoDesconto,
        v_precoMinimo,
        v_informarPrecoManualmente,
        v_precoAPrazo,
        v_precoAVista,
        v_promocao,
        v_precoPromocaoAPrazo,
        v_precoPromocaoAVista,
        v_precoIndexadoAPrazo,
        v_precoIndexadoAVista);
    -- U Última Compra
    ELSIF p_tipoPreco = 'U' THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        a.produto,
        a.cor,
        a.tamanho,
        0, --p_retornarPrecoBruto
        0); --p_gerandoInventario
    -- 2 Última Compra Bruto
    ELSIF p_tipoPreco = '2' THEN
      v_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        0, --p_item_personalizacao
        a.produto,
        a.cor,
        a.tamanho,
        1, --p_retornarPrecoBruto
        0); --p_gerandoInventario
    END IF;
    IF NOT(p_tipoPreco IN ('A','T')) THEN
      v_tabelaPreco              := ' ';
      v_precoSugestaoAVista      := v_precoSugestaoAPrazo;
      v_precoDesconto            := 0;
      v_precoMinimo              := 0;
      v_informarPrecoManualmente := 0;
      v_precoAPrazo              := v_precoSugestaoAPrazo;
      v_precoAVista              := v_precoSugestaoAPrazo;
      v_promocao                 := 0;
      v_precoPromocaoAPrazo      := v_precoSugestaoAPrazo;
      v_precoPromocaoAVista      := v_precoSugestaoAPrazo;
      v_precoIndexadoAPrazo      := v_precoSugestaoAPrazo;
      v_precoIndexadoAVista      := v_precoSugestaoAPrazo;
    END IF;  
    -- 3 = Combo / 4 = Kit
    IF v_precoSugestaoAPrazo = 0 AND a.controleEstoque IN (3,4) THEN
      ADD_BUSCA_PRECO_INTERNO_KIT(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_tinta_quantidade * p_item_quantidade,
        a.produto,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        v_tabelaPreco,
        v_precoSugestaoAPrazo,
        v_precoSugestaoAVista,
        v_precoDesconto,
        v_precoMinimo,
        v_informarPrecoManualmente,
        v_precoAPrazo,
        v_precoAVista,
        v_promocao,
        v_precoPromocaoAPrazo,
        v_precoPromocaoAVista,
        v_precoIndexadoAPrazo,
        v_precoIndexadoAVista);
    END IF;
    IF v_tabelaPreco <> ' ' THEN
      r_tabelaPreco       := v_tabelaPreco;
    END IF;
    r_precoSugestaoAPrazo := r_precoSugestaoAPrazo + p_tinta_quantidade * v_precoSugestaoAPrazo;
    r_precoSugestaoAVista := r_precoSugestaoAVista + p_tinta_quantidade * v_precoSugestaoAVista;
    r_precoDesconto       := r_precoDesconto       + p_tinta_quantidade * v_precoDesconto;
    r_precoMinimo         := r_precoMinimo         + p_tinta_quantidade * v_precoMinimo;
    r_precoAPrazo         := r_precoAPrazo         + p_tinta_quantidade * v_precoAPrazo;
    r_precoAVista         := r_precoAVista         + p_tinta_quantidade * v_precoAVista;
    IF v_promocao = 1 THEN
      r_promocao          := 1;
    END IF;
    r_precoPromocaoAPrazo := r_precoPromocaoAPrazo + p_tinta_quantidade * v_precoPromocaoAPrazo;
    r_precoPromocaoAVista := r_precoPromocaoAVista + p_tinta_quantidade * v_precoPromocaoAVista;
    r_precoIndexadoAPrazo := r_precoIndexadoAPrazo + p_tinta_quantidade * v_precoIndexadoAPrazo;
    r_precoIndexadoAVista := r_precoIndexadoAVista + p_tinta_quantidade * v_precoIndexadoAVista;
  END LOOP;
END ADD_BUSCA_PRECO_INTERNO_PROTIN;

/

create or replace PROCEDURE ADD_BUSCA_PRECO_INTERNO_TINTA(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_perfilUsuarioLogado          IN NUMBER,
    p_usuarioLogado                IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_devolucaoAnulacaoRetorno IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPrecoInicial         IN DATE,
    p_cab_dataPrecoFinal           IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_modDoc_capituloNaturezaFisc  IN NUMBER,
    p_endPessEst_uf                IN CHAR,
    p_endPess_uf                   IN CHAR,
    p_item_vendedor                IN NUMBER,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_locEst_indicadorPropPosseIt  IN CHAR,
    p_manterPreco                  IN NUMBER,
    p_tipoPreco                    IN CHAR,
    p_tabelaPreco                  IN VARCHAR,
    r_tabelaPreco                  OUT VARCHAR,
    r_precoSugestaoAPrazo          OUT NUMBER,
    r_precoSugestaoAVista          OUT NUMBER,
    r_precoDesconto                OUT NUMBER,
    r_precoMinimo                  OUT NUMBER,
    r_informarPrecoManualmente     OUT NUMBER,
    r_precoAPrazo                  OUT NUMBER,
    r_precoAVista                  OUT NUMBER,
    r_promocao                     OUT NUMBER,
    r_precoPromocaoAPrazo          OUT NUMBER,
    r_precoPromocaoAVista          OUT NUMBER,
    r_precoIndexadoAPrazo          OUT NUMBER,
    r_precoIndexadoAVista          OUT NUMBER)
IS
BEGIN
  r_tabelaPreco              := ' ';
  r_precoSugestaoAPrazo      := 0;
  r_precoSugestaoAVista      := 0;
  r_precoDesconto            := 0;
  r_precoMinimo              := 0;
  r_informarPrecoManualmente := 0;
  r_precoAPrazo              := 0;
  r_precoAVista              := 0;
  r_promocao                 := 0;
  r_precoPromocaoAPrazo      := 0;
  r_precoPromocaoAVista      := 0;
  r_precoIndexadoAPrazo      := 0;
  r_precoIndexadoAVista      := 0;
  FOR a IN (
    SELECT 
      a.idBaseTinta,
      base.gradeProduto,
      a.idColoranteTintaA,
      a.quantidadeA,
      colA.gradeProduto gradeProdutoA,
      a.idColoranteTintaB,
      a.quantidadeB,
      colB.gradeProduto gradeProdutoB,
      a.idColoranteTintaC,
      a.quantidadeC,
      colC.gradeProduto gradeProdutoC,
      a.idColoranteTintaD,
      a.quantidadeD,
      colD.gradeProduto gradeProdutoD,
      a.idColoranteTintaE,
      a.quantidadeE,
      colE.gradeProduto gradeProdutoE,
      a.idColoranteTintaF,
      a.quantidadeF,
      colF.gradeProduto gradeProdutoF,
      a.idColoranteTintaG,
      a.quantidadeG,
      colG.gradeProduto gradeProdutoG,
      a.idColoranteTintaH,
      a.quantidadeH,
      colH.gradeProduto gradeProdutoH,
      a.idColoranteTintaI,
      a.quantidadeI,
      colI.gradeProduto gradeProdutoI,
      a.idColoranteTintaJ,
      a.quantidadeJ,
      colJ.gradeProduto gradeProdutoJ,
      a.idColoranteTintaK,
      a.quantidadeK,
      colK.gradeProduto gradeProdutoK,
      a.idColoranteTintaL,
      a.quantidadeL,
      colL.gradeProduto gradeProdutoL,
      a.idColoranteTintaM,
      a.quantidadeM,
      colM.gradeProduto gradeProdutoM,
      a.idColoranteTintaN,
      a.quantidadeN,
      colN.gradeProduto gradeProdutoN,
      a.idColoranteTintaO,
      a.quantidadeO,
      colO.gradeProduto gradeProdutoO
    FROM CAFORMULASTINTAS a
    JOIN CABASESTINTAS base
    ON base.idBaseTinta = a.idBaseTinta
    JOIN CACOLORANTESTINTAS colA
    ON colA.idColoranteTinta = a.idColoranteTintaA
    JOIN CACOLORANTESTINTAS colB
    ON colB.idColoranteTinta = a.idColoranteTintaB
    JOIN CACOLORANTESTINTAS colC
    ON colC.idColoranteTinta = a.idColoranteTintaC
    JOIN CACOLORANTESTINTAS colD
    ON colD.idColoranteTinta = a.idColoranteTintaD
    JOIN CACOLORANTESTINTAS colE
    ON colE.idColoranteTinta = a.idColoranteTintaE
    JOIN CACOLORANTESTINTAS colF
    ON colF.idColoranteTinta = a.idColoranteTintaF
    JOIN CACOLORANTESTINTAS colG
    ON colG.idColoranteTinta = a.idColoranteTintaG
    JOIN CACOLORANTESTINTAS colH
    ON colH.idColoranteTinta = a.idColoranteTintaH
    JOIN CACOLORANTESTINTAS colI
    ON colI.idColoranteTinta = a.idColoranteTintaI
    JOIN CACOLORANTESTINTAS colJ
    ON colJ.idColoranteTinta = a.idColoranteTintaJ
    JOIN CACOLORANTESTINTAS colK
    ON colK.idColoranteTinta = a.idColoranteTintaK
    JOIN CACOLORANTESTINTAS colL
    ON colL.idColoranteTinta = a.idColoranteTintaL
    JOIN CACOLORANTESTINTAS colM
    ON colM.idColoranteTinta = a.idColoranteTintaM
    JOIN CACOLORANTESTINTAS colN
    ON colN.idColoranteTinta = a.idColoranteTintaN
    JOIN CACOLORANTESTINTAS colO
    ON colO.idColoranteTinta = a.idColoranteTintaO
    WHERE a.idFormulaTinta = p_item_idFormulaTinta
    AND a.idBaseTinta > 0
    AND base.gradeProduto > 0)
  LOOP
    ADD_BUSCA_PRECO_INTERNO_PROTIN(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_perfilUsuarioLogado,
      p_usuarioLogado,
      p_cab_entradaSaida,
      p_cab_devolucaoAnulacaoRetorno,
      p_cab_estabelecimento,
      p_cab_dataPrecoInicial,
      p_cab_dataPrecoFinal,
      p_cab_pessoa,
      p_modDoc_capituloNaturezaFisc,
      p_endPessEst_uf,
      p_endPess_uf,
      p_item_vendedor,
      p_item_personalizacao,
      p_item_localEstoque,
      p_item_pessoaParticipante,
      p_item_quantidade,
      p_locEst_indicadorPropPosseIt,
      p_manterPreco,
      p_tipoPreco,
      p_tabelaPreco,
      a.gradeProduto,
      1, --p_tinta_quantidade
      r_tabelaPreco,
      r_precoSugestaoAPrazo,
      r_precoSugestaoAVista,
      r_precoDesconto,
      r_precoMinimo,
      r_informarPrecoManualmente,
      r_precoAPrazo,
      r_precoAVista,
      r_promocao,
      r_precoPromocaoAPrazo,
      r_precoPromocaoAVista,
      r_precoIndexadoAPrazo,
      r_precoIndexadoAVista,
      r_tabelaPreco,
      r_precoSugestaoAPrazo,
      r_precoSugestaoAVista,
      r_precoDesconto,
      r_precoMinimo,
      r_informarPrecoManualmente,
      r_precoAPrazo,
      r_precoAVista,
      r_promocao,
      r_precoPromocaoAPrazo,
      r_precoPromocaoAVista,
      r_precoIndexadoAPrazo,
      r_precoIndexadoAVista);
    IF a.idColoranteTintaA > 0
      AND a.gradeProdutoA > 0
      AND a.quantidadeA > 0
    THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoA,
        a.quantidadeA / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF a.idColoranteTintaB > 0
      AND a.gradeProdutoB > 0
      AND a.quantidadeB > 0
    THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoB,
        a.quantidadeB / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF a.idColoranteTintaC > 0
      AND a.gradeProdutoC > 0
      AND a.quantidadeC > 0
    THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoC,
        a.quantidadeC / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF a.idColoranteTintaD > 0
      AND a.gradeProdutoD > 0
      AND a.quantidadeD > 0
    THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoD,
        a.quantidadeD / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF a.idColoranteTintaE > 0
      AND a.gradeProdutoE > 0
      AND a.quantidadeE > 0
    THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoE,
        a.quantidadeE / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF a.idColoranteTintaF > 0
      AND a.gradeProdutoF > 0
      AND a.quantidadeF > 0
    THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoF,
        a.quantidadeF / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF a.idColoranteTintaG > 0
      AND a.gradeProdutoG > 0
      AND a.quantidadeG > 0
    THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoG,
        a.quantidadeG / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF a.idColoranteTintaH > 0
      AND a.gradeProdutoH > 0
      AND a.quantidadeH > 0
    THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoH,
        a.quantidadeH / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF a.idColoranteTintaI > 0
      AND a.gradeProdutoI > 0
      AND a.quantidadeI > 0
    THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoI,
        a.quantidadeI / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF a.idColoranteTintaJ > 0
      AND a.gradeProdutoJ > 0
      AND a.quantidadeJ > 0
    THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoJ,
        a.quantidadeJ / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF a.idColoranteTintaK > 0
      AND a.gradeProdutoK > 0
      AND a.quantidadeK > 0
    THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoK,
        a.quantidadeK / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF a.idColoranteTintaL > 0
      AND a.gradeProdutoL > 0
      AND a.quantidadeL > 0
    THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoL,
        a.quantidadeL / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF a.idColoranteTintaM > 0
      AND a.gradeProdutoM > 0
      AND a.quantidadeM > 0
    THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoM,
        a.quantidadeM / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF a.idColoranteTintaN > 0
      AND a.gradeProdutoN > 0
      AND a.quantidadeN > 0
    THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoN,
        a.quantidadeN / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
    IF a.idColoranteTintaO > 0
      AND a.gradeProdutoO > 0
      AND a.quantidadeO > 0
    THEN
      ADD_BUSCA_PRECO_INTERNO_PROTIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        p_cab_devolucaoAnulacaoRetorno,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_cab_pessoa,
        p_modDoc_capituloNaturezaFisc,
        p_endPessEst_uf,
        p_endPess_uf,
        p_item_vendedor,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_locEst_indicadorPropPosseIt,
        p_manterPreco,
        p_tipoPreco,
        p_tabelaPreco,
        a.gradeProdutoO,
        a.quantidadeO / 900, --p_tinta_quantidade
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista,
        r_tabelaPreco,
        r_precoSugestaoAPrazo,
        r_precoSugestaoAVista,
        r_precoDesconto,
        r_precoMinimo,
        r_informarPrecoManualmente,
        r_precoAPrazo,
        r_precoAVista,
        r_promocao,
        r_precoPromocaoAPrazo,
        r_precoPromocaoAVista,
        r_precoIndexadoAPrazo,
        r_precoIndexadoAVista);
    END IF;
  END LOOP;
END ADD_BUSCA_PRECO_INTERNO_TINTA;

/

create or replace PROCEDURE ADD_BUSCA_PRECO(
    p_config_64_casasDecSaidas     IN CHAR,
    p_config_65_casasDecEntrada    IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_perfilUsuarioLogado          IN NUMBER,
    p_usuarioLogado                IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_devolucaoAnulacaoRetorno IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPrecoInicial         IN DATE,
    p_cab_dataPrecoFinal           IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_modDoc_capituloNaturezaFisc  IN NUMBER,
    p_modDoc_tipoPreco             IN CHAR,
    p_modDoc_tabelaPreco           IN VARCHAR,
    p_modDoc_fatorMultiplicador    IN NUMBER,
    p_modDoc_tipoPrecoB            IN CHAR,
    p_modDoc_tabelaPrecoB          IN VARCHAR,
    p_modDoc_fatorMultiplicadorB   IN NUMBER,
    p_endPessEst_uf                IN CHAR,
    p_endPess_uf                   IN CHAR,
    p_item_vendedor                IN NUMBER,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_prod_controleEstoque         IN NUMBER,
    p_locEst_indicadorPropPosseIt  IN CHAR,
    p_manterPreco                  IN NUMBER,
    p_precoSugestaoAPrazoOriginal  IN NUMBER,
    p_precoSugestaoAVistaOriginal  IN NUMBER,
    p_tipoPreco                    IN CHAR,
    p_tabelaPreco                  IN VARCHAR,
    r_tipoPreco                    OUT CHAR,
    r_tabelaPreco                  OUT VARCHAR,
    r_precoSugestaoAPrazo          OUT NUMBER,
    r_precoSugestaoAVista          OUT NUMBER,
    r_precoDesconto                OUT NUMBER,
    r_precoMinimo                  OUT NUMBER,
    r_informarPrecoManualmente     OUT NUMBER,
    r_precoAPrazo                  OUT NUMBER,
    r_precoAVista                  OUT NUMBER,
    r_promocao                     OUT NUMBER,
    r_precoPromocaoAPrazo          OUT NUMBER,
    r_precoPromocaoAVista          OUT NUMBER,
    r_precoIndexadoAPrazo          OUT NUMBER,
    r_precoIndexadoAVista          OUT NUMBER)
IS
BEGIN
  r_tipoPreco                := ' ';
  r_tabelaPreco              := ' ';
  r_precoSugestaoAPrazo      := 0;
  r_precoSugestaoAVista      := 0;
  r_precoDesconto            := 0;
  r_precoMinimo              := 0;
  r_informarPrecoManualmente := 0;
  r_precoAPrazo              := 0;
  r_precoAVista              := 0;
  r_promocao                 := 0;
  r_precoPromocaoAPrazo      := 0;
  r_precoPromocaoAVista      := 0;
  r_precoIndexadoAPrazo      := 0;
  r_precoIndexadoAVista      := 0;
  IF p_gradProd_produto > 0 THEN
    IF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END = 'I' THEN
      r_tipoPreco := 'I';
    ELSE
      IF p_prod_controleEstoque = 12 AND p_item_idFormulaTinta > 0 THEN
        ADD_BUSCA_PRECO_INTERNO_TINTA(
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_perfilUsuarioLogado,
          p_usuarioLogado,
          p_cab_entradaSaida,
          p_cab_devolucaoAnulacaoRetorno,
          p_cab_estabelecimento,
          p_cab_dataPrecoInicial,
          p_cab_dataPrecoFinal,
          p_cab_pessoa,
          p_modDoc_capituloNaturezaFisc,
          p_endPessEst_uf,
          p_endPess_uf,
          p_item_vendedor,
          p_item_idFormulaTinta,
          p_item_personalizacao,
          p_item_localEstoque,
          p_item_pessoaParticipante,
          p_item_quantidade,
          p_locEst_indicadorPropPosseIt,
          p_manterPreco,
          CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END, --p_tipoPreco
          CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE p_modDoc_tabelaPreco END, --p_tabelaPreco
          r_tabelaPreco,
          r_precoSugestaoAPrazo,
          r_precoSugestaoAVista,
          r_precoDesconto,
          r_precoMinimo,
          r_informarPrecoManualmente,
          r_precoAPrazo,
          r_precoAVista,
          r_promocao,
          r_precoPromocaoAPrazo,
          r_precoPromocaoAVista,
          r_precoIndexadoAPrazo,
          r_precoIndexadoAVista);
      ELSE
        -- A Tabela de Preço Anterior
        IF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END = 'A' THEN
          ADD_BUSCA_PRECO_INTERNO_ANTER(
            p_perfilUsuarioLogado,
            p_usuarioLogado,
            p_cab_entradaSaida,
            p_cab_devolucaoAnulacaoRetorno,
            p_cab_estabelecimento,
            p_cab_dataPrecoFinal,
            p_cab_pessoa,
            p_modDoc_capituloNaturezaFisc,
            p_endPessEst_uf,
            p_endPess_uf,
            p_item_vendedor,
            p_item_personalizacao,
            p_item_localEstoque,
            p_item_quantidade,
            p_gradProd_produto,
            p_gradProd_cor,
            p_gradProd_tamanho,
            p_manterPreco,
            p_precoSugestaoAPrazoOriginal,
            p_precoSugestaoAVistaOriginal,
            CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE p_modDoc_tabelaPreco END,
            r_tabelaPreco,
            r_precoSugestaoAPrazo,
            r_precoSugestaoAVista,
            r_precoDesconto,
            r_precoMinimo,
            r_informarPrecoManualmente,
            r_precoAPrazo,
            r_precoAVista,
            r_promocao,
            r_precoPromocaoAPrazo,
            r_precoPromocaoAVista,
            r_precoIndexadoAPrazo,
            r_precoIndexadoAVista);
        -- C Custo Médio da Venda (CMV)
        ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END = 'C' AND NOT(p_prod_controleEstoque IN (3,4)) THEN
          r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_MEDIO_FIS(
            p_config_209_filtrarGrupoEcon,
            p_config_362_calcCustoPorGrade,
            p_cab_estabelecimento,
            p_cab_dataPrecoFinal,
            p_item_pessoaParticipante,
            p_gradProd_produto,
            p_gradProd_cor,
            p_gradProd_tamanho,
            p_locEst_indicadorPropPosseIt,
            0); --p_gerandoInventario
        -- F Formação Preço (Custo)
        ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END = 'F' THEN
          r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_FORMACAO(
            p_config_209_filtrarGrupoEcon,
            p_config_362_calcCustoPorGrade,
            p_cab_estabelecimento,
            p_cab_dataPrecoInicial,
            p_cab_dataPrecoFinal,
            p_item_personalizacao,
            p_gradProd_produto,
            p_gradProd_cor,
            p_gradProd_tamanho,
            0); --p_gerandoInventario
        -- G Custo Médio da Venda Gerencial (CMV)
        ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END = 'G' AND NOT(p_prod_controleEstoque IN (3,4)) THEN
          r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_MEDIO_GER(
            p_config_209_filtrarGrupoEcon,
            p_config_362_calcCustoPorGrade,
            p_cab_estabelecimento,
            p_cab_dataPrecoFinal,
            p_item_personalizacao,
            p_item_pessoaParticipante,
            p_gradProd_produto,
            p_gradProd_cor,
            p_gradProd_tamanho,
            p_locEst_indicadorPropPosseIt,
            0); --p_gerandoInventario
        -- P Preço de Custo (Último Custo)
        ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END = 'P' THEN
          r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_CUSTO(
            p_config_209_filtrarGrupoEcon,
            p_config_362_calcCustoPorGrade,
            p_cab_estabelecimento,
            p_cab_dataPrecoInicial,
            p_cab_dataPrecoFinal,
            p_item_personalizacao,
            p_item_pessoaParticipante,
            p_gradProd_produto,
            p_gradProd_cor,
            p_gradProd_tamanho,
            p_locEst_indicadorPropPosseIt,
            0); --p_gerandoInventario
        -- T Tabela de Preço
        ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END = 'T' THEN
          ADD_BUSCA_PRECO_INTERNO_TABELA(
            p_perfilUsuarioLogado,
            p_usuarioLogado,
            p_cab_entradaSaida,
            p_cab_devolucaoAnulacaoRetorno,
            p_cab_estabelecimento,
            p_cab_dataPrecoFinal,
            p_cab_pessoa,
            p_modDoc_capituloNaturezaFisc,
            p_endPessEst_uf,
            p_endPess_uf,
            p_item_vendedor,
            p_item_personalizacao,
            p_item_localEstoque,
            p_item_quantidade,
            p_gradProd_produto,
            p_gradProd_cor,
            p_gradProd_tamanho,
            p_manterPreco,
            p_precoSugestaoAPrazoOriginal,
            p_precoSugestaoAVistaOriginal,
            CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE p_modDoc_tabelaPreco END,
            r_tabelaPreco,
            r_precoSugestaoAPrazo,
            r_precoSugestaoAVista,
            r_precoDesconto,
            r_precoMinimo,
            r_informarPrecoManualmente,
            r_precoAPrazo,
            r_precoAVista,
            r_promocao,
            r_precoPromocaoAPrazo,
            r_precoPromocaoAVista,
            r_precoIndexadoAPrazo,
            r_precoIndexadoAVista);
        -- U Última Compra
        ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END = 'U' THEN
          r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
            p_config_209_filtrarGrupoEcon,
            p_config_362_calcCustoPorGrade,
            p_cab_estabelecimento,
            p_cab_dataPrecoInicial,
            p_cab_dataPrecoFinal,
            p_item_personalizacao,
            p_gradProd_produto,
            p_gradProd_cor,
            p_gradProd_tamanho,
            0, --p_retornarPrecoBruto
            0); --p_gerandoInventario
        -- 2 Última Compra Bruto
        ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END = '2' THEN
          r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
            p_config_209_filtrarGrupoEcon,
            p_config_362_calcCustoPorGrade,
            p_cab_estabelecimento,
            p_cab_dataPrecoInicial,
            p_cab_dataPrecoFinal,
            p_item_personalizacao,
            p_gradProd_produto,
            p_gradProd_cor,
            p_gradProd_tamanho,
            1, --p_retornarPrecoBruto
            0); --p_gerandoInventario
        END IF;
        IF NOT(CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END IN ('A','T')) THEN
          r_tabelaPreco              := ' ';
          r_precoSugestaoAVista      := r_precoSugestaoAPrazo;
          r_precoDesconto            := 0;
          r_precoMinimo              := 0;
          r_informarPrecoManualmente := 0;
          r_precoAPrazo              := r_precoSugestaoAPrazo;
          r_precoAVista              := r_precoSugestaoAPrazo;
          r_promocao                 := 0;
          r_precoPromocaoAPrazo      := r_precoSugestaoAPrazo;
          r_precoPromocaoAVista      := r_precoSugestaoAPrazo;
          r_precoIndexadoAPrazo      := r_precoSugestaoAPrazo;
          r_precoIndexadoAVista      := r_precoSugestaoAPrazo;
        END IF;
        -- 3 = Combo / 4 = Kit
        IF r_tabelaPreco = ' ' AND r_precoSugestaoAPrazo = 0 AND p_prod_controleEstoque IN (3,4) THEN
          ADD_BUSCA_PRECO_INTERNO_KIT(
            p_config_209_filtrarGrupoEcon,
            p_config_362_calcCustoPorGrade,
            p_perfilUsuarioLogado,
            p_usuarioLogado,
            p_cab_entradaSaida,
            p_cab_devolucaoAnulacaoRetorno,
            p_cab_estabelecimento,
            p_cab_dataPrecoInicial,
            p_cab_dataPrecoFinal,
            p_cab_pessoa,
            p_modDoc_capituloNaturezaFisc,
            p_endPessEst_uf,
            p_endPess_uf,
            p_item_vendedor,
            p_item_personalizacao,
            p_item_localEstoque,
            p_item_pessoaParticipante,
            p_item_quantidade,
            p_gradProd_produto,
            p_locEst_indicadorPropPosseIt,
            p_manterPreco,
            CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END,
            CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE p_modDoc_tabelaPreco END,
            r_tabelaPreco,
            r_precoSugestaoAPrazo,
            r_precoSugestaoAVista,
            r_precoDesconto,
            r_precoMinimo,
            r_informarPrecoManualmente,
            r_precoAPrazo,
            r_precoAVista,
            r_promocao,
            r_precoPromocaoAPrazo,
            r_precoPromocaoAVista,
            r_precoIndexadoAPrazo,
            r_precoIndexadoAVista);
        END IF;
      END IF;
      -- Se encontrou preço
      IF r_tabelaPreco <> ' ' OR r_precoSugestaoAPrazo <> 0 OR r_precoSugestaoAVista <> 0 OR r_precoDesconto <> 0 OR r_precoMinimo <> 0 OR r_informarPrecoManualmente <> 0 OR r_precoAPrazo <> 0 OR r_precoAVista <> 0 OR r_precoPromocaoAPrazo <> 0 OR r_precoPromocaoAVista <> 0 OR r_precoIndexadoAPrazo <> 0 OR r_precoIndexadoAVista <> 0 OR CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END = 'I' THEN
        r_tipoPreco := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE p_modDoc_tipoPreco END;
        IF NOT (p_modDoc_fatorMultiplicador IN (0,1)) AND (p_manterPreco = 0 OR p_tipoPreco = p_modDoc_tipoPreco AND p_tabelaPreco = p_modDoc_tabelaPreco) THEN
          r_precoSugestaoAPrazo := r_precoSugestaoAPrazo * p_modDoc_fatorMultiplicador;
          r_precoSugestaoAVista := r_precoSugestaoAVista * p_modDoc_fatorMultiplicador;
          r_precoDesconto       := r_precoDesconto       * p_modDoc_fatorMultiplicador;
          r_precoMinimo         := r_precoMinimo         * p_modDoc_fatorMultiplicador;
          r_precoAPrazo         := r_precoAPrazo         * p_modDoc_fatorMultiplicador;
          r_precoAVista         := r_precoAVista         * p_modDoc_fatorMultiplicador;
          r_precoPromocaoAPrazo := r_precoPromocaoAPrazo * p_modDoc_fatorMultiplicador;
          r_precoPromocaoAVista := r_precoPromocaoAVista * p_modDoc_fatorMultiplicador;
          r_precoIndexadoAPrazo := r_precoIndexadoAPrazo * p_modDoc_fatorMultiplicador;
          r_precoIndexadoAVista := r_precoIndexadoAVista * p_modDoc_fatorMultiplicador;
        END IF;
      -- Se não encontrou preço, não mantém o atual e existe regra de preço B
      ELSIF p_manterPreco = 0 AND p_modDoc_tipoPrecoB <> ' ' THEN
        ADD_BUSCA_PRECO(
          p_config_64_casasDecSaidas,
          p_config_65_casasDecEntrada,
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_perfilUsuarioLogado,
          p_usuarioLogado,
          p_cab_entradaSaida,
          p_cab_devolucaoAnulacaoRetorno,
          p_cab_estabelecimento,
          p_cab_dataPrecoInicial,
          p_cab_dataPrecoFinal,
          p_cab_pessoa,
          p_modDoc_capituloNaturezaFisc,
          p_modDoc_tipoPrecoB,
          p_modDoc_tabelaPrecoB,
          p_modDoc_fatorMultiplicadorB,
          ' ', --p_modDoc_tipoPrecoB
          ' ', --p_modDoc_tabelaPrecoB
          0, --p_modDoc_fatorMultiplicadorB
          p_endPessEst_uf,
          p_endPess_uf,
          p_item_vendedor,
          p_item_idFormulaTinta,
          p_item_personalizacao,
          p_item_localEstoque,
          p_item_pessoaParticipante,
          p_item_quantidade,
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          p_prod_controleEstoque,
          p_locEst_indicadorPropPosseIt,
          0, --p_manterPreco
          p_precoSugestaoAPrazoOriginal,
          p_precoSugestaoAVistaOriginal,
          p_modDoc_tipoPrecoB,
          p_modDoc_tabelaPrecoB,
          r_tipoPreco,
          r_tabelaPreco,
          r_precoSugestaoAPrazo,
          r_precoSugestaoAVista,
          r_precoDesconto,
          r_precoMinimo,
          r_informarPrecoManualmente,
          r_precoAPrazo,
          r_precoAVista,
          r_promocao,
          r_precoPromocaoAPrazo,
          r_precoPromocaoAVista,
          r_precoIndexadoAPrazo,
          r_precoIndexadoAVista);
        -- Se não encontrou preço B, devolve tipo preço e tabela atual
        IF r_precoSugestaoAPrazo = 0 AND r_precoSugestaoAVista = 0 AND r_precoDesconto = 0 AND r_precoMinimo = 0 AND r_informarPrecoManualmente = 0 AND r_precoAPrazo = 0 AND r_precoAVista = 0 AND r_precoPromocaoAPrazo = 0 AND r_precoPromocaoAVista = 0 AND r_precoIndexadoAPrazo = 0 AND r_precoIndexadoAVista = 0 AND p_modDoc_tipoPrecoB <> 'I' THEN
          r_tipoPreco   := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco   ELSE p_modDoc_tipoPreco   END;
          r_tabelaPreco := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE p_modDoc_tabelaPreco END;
        END IF;
      -- Se não encontrou e não usa regra B, devolve tipo preço e tabela atual
      ELSE
        r_tipoPreco   := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco   ELSE p_modDoc_tipoPreco   END;
        r_tabelaPreco := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE p_modDoc_tabelaPreco END;
      END IF;
      -- Efetua arredondamento de preço
      r_precoSugestaoAPrazo := ROUND (r_precoSugestaoAPrazo, TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
      r_precoSugestaoAVista := ROUND (r_precoSugestaoAVista, TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
      r_precoDesconto       := ROUND (r_precoDesconto      , TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
      r_precoMinimo         := ROUND (r_precoMinimo        , TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
      r_precoAPrazo         := ROUND (r_precoAPrazo        , TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
      r_precoAVista         := ROUND (r_precoAVista        , TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
      r_precoPromocaoAPrazo := ROUND (r_precoPromocaoAPrazo, TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
      r_precoPromocaoAVista := ROUND (r_precoPromocaoAVista, TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
      r_precoIndexadoAPrazo := ROUND (r_precoIndexadoAPrazo, TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
      r_precoIndexadoAVista := ROUND (r_precoIndexadoAVista, TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
    END IF;
  END IF;
END ADD_BUSCA_PRECO;

/

create or replace FUNCTION FUNC_ADD_BUSCA_STRING_PRECO(
    p_config_64_casasDecSaidas     IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_perfilUsuarioLogado          IN NUMBER,
    p_usuarioLogado                IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPrecoFinal           IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_endPessEst_uf                IN CHAR,
    p_endPess_uf                   IN CHAR,
    p_item_vendedor                IN NUMBER,
    p_item_idFormulaTinta          IN NUMBER,
    p_grade_produto                IN NUMBER,
    p_grade_cor                    IN NUMBER,
    p_grade_tamanho                IN VARCHAR,
    p_prod_controleEstoque         IN NUMBER,
    p_tipoPreco                    IN CHAR,
    p_tabelaPreco                  IN VARCHAR
  )
  RETURN CHAR
IS
  v_tipoPreco                  CHAR(1);
  v_tabelaPreco                CHAR(10);
  v_precoSugestaoAPrazo        CHAR(20);
  v_precoSugestaoAVista        CHAR(20);
  v_precoDesconto              CHAR(20);
  v_precoMinimo                CHAR(20);
  v_informarPrecoManualmente   CHAR(1);
  v_precoAPrazo                CHAR(20);
  v_precoAVista                CHAR(20);
  v_promocao                   CHAR(1);
  v_precoPromocaoAPrazo        CHAR(20);
  v_precoPromocaoAVista        CHAR(20);
  v_precoIndexadoAPrazo        CHAR(20);
  v_precoIndexadoAVista        CHAR(20);
BEGIN
  ADD_BUSCA_PRECO (
    p_config_64_casasDecSaidas,
    p_config_64_casasDecSaidas,
    p_config_209_filtrarGrupoEcon,
    p_config_362_calcCustoPorGrade,
    p_perfilUsuarioLogado,
    p_usuarioLogado,
    'S',
    0,
    p_cab_estabelecimento,
    TO_DATE ('01/01/1900','DD/MM/YYYY'),
    p_cab_dataPrecoFinal,
    p_cab_pessoa,
    1,
    p_tipoPreco,
    p_tabelaPreco,
    1,
    ' ',
    ' ',
    0,
    p_endPessEst_uf,
    p_endPess_uf,
    p_item_vendedor,
    p_item_idFormulaTinta,
    0,
    0,
    0,
    1,
    p_grade_produto,
    p_grade_cor,
    p_grade_tamanho,
    p_prod_controleEstoque,
    '0',
    CASE WHEN (p_tipoPreco= '' OR p_tipoPreco= ' ' OR p_tipoPreco= 'T' AND (p_tabelaPreco = '' OR p_tabelaPreco = ' ')) THEN 0 ELSE 1 END,
    0,
    0,
    p_tipoPreco,
    p_tabelaPreco,
    v_tipoPreco,
    v_tabelaPreco,
    v_precoSugestaoAPrazo,
    v_precoSugestaoAVista,
    v_precoDesconto,
    v_precoMinimo,
    v_informarPrecoManualmente,
    v_precoAPrazo,
    v_precoAVista,
    v_promocao,
    v_precoPromocaoAPrazo,
    v_precoPromocaoAVista,
    v_precoIndexadoAPrazo,
    v_precoIndexadoAVista
  );
  RETURN COALESCE(v_tipoPreco,' ')
    || '|' || v_tabelaPreco
    || '|' || v_precoSugestaoAPrazo
    || '|' || v_precoSugestaoAVista
    || '|' || v_precoDesconto
    || '|' || v_precoMinimo
    || '|' || v_informarPrecoManualmente
    || '|' || v_precoAVista
    || '|' || v_precoAPrazo
    || '|' || v_promocao
    || '|' || v_precoPromocaoAVista
    || '|' || v_precoPromocaoAPrazo;
END;

/

create or replace FUNCTION FUNC_ADD_CALC_MARGEM_CONTRIB (
    p_config_65_casasDecEntrada    IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_regMarg_tipoPreco            CHAR,
    p_regMarg_tabelaPreco          VARCHAR2,
    p_regMarg_fatorMultiplicador   NUMBER,
    p_regMarg_tipoPrecoB           CHAR,
    p_regMarg_tabelaPrecoB         VARCHAR2,
    p_regMarg_fatorMultiplicadorB  NUMBER,
    p_regMarg_reduzirImpostos      NUMBER,
    p_regMarg_reduzirTarifaCartao  NUMBER,
    p_regMarg_taxaCapitacaoCustoFi NUMBER,
    p_regMarg_exibImagemMargemItem NUMBER,
    p_regMarg_regraImagemItem      NUMBER,
    p_cab_estabelecimento          NUMBER,
    p_cab_dataPrecoFinal           DATE,
    p_cab_prazoMedioPonderado      NUMBER,
    p_cab_valorLiquidoItem         NUMBER,
    p_cab_valorTarifaCartao        NUMBER,
    p_munEndEst_uf                 IN CHAR,
    p_item_idFormulaTinta          NUMBER,
    p_item_personalizacao          NUMBER,
    p_item_localEstoque            NUMBER,
    p_item_pessoaParticipante      NUMBER,
    p_item_quantidade              NUMBER,
    p_item_valorFreteTotal         NUMBER,
    p_item_valorSeguroTotal        NUMBER,
    p_item_valorAdicFreteMarTotal  NUMBER,
    p_item_valorDespesasAduanTotal NUMBER,
    p_item_valorII                 NUMBER,
    p_item_valorIOF                NUMBER,
    p_item_valorIPI                NUMBER,
    p_item_valorIPIDevolucao       NUMBER,
    p_item_valorPIS                NUMBER,
    p_item_valorPISST              NUMBER,
    p_item_valorCOFINS             NUMBER,
    p_item_valorCOFINSST           NUMBER,
    p_item_valorCreditoSimplesNac  NUMBER,
    p_item_valorICMSOperacao       NUMBER,
    p_item_valorICMSDiferido       NUMBER,
    p_item_valorICMS               NUMBER,
    p_item_valorICMSDesoneracao    NUMBER,
    p_item_valorICMSST             NUMBER,
    p_item_valorICMSSTAnteriorment NUMBER,
    p_item_valorICMSUFDestinatario NUMBER,
    p_item_valorICMSUFRemetente    NUMBER,
    p_item_valorFCP                NUMBER,
    p_item_valorFCPST              NUMBER,
    p_item_valorFCPSTAnteriormente NUMBER,
    p_item_valorFCPUFDestinatario  NUMBER,
    p_item_valorLiquidoItem        NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_prod_controleEstoque         IN NUMBER,
    p_locEst_indicadorPropPosseIt  IN CHAR)
  RETURN VARCHAR2
IS
    v_valorLiquidoSemFreteSeguro   NUMBER;
    v_valorCaptacao                NUMBER;
    v_valorTarifaCartao            NUMBER;
    v_valorImpostos                NUMBER;
    v_precoCusto                   NUMBER;
    v_valorCusto                   NUMBER;
    v_valorMargem                  NUMBER;
    v_percentualMargem             NUMBER;
BEGIN
  ADD_CALCULA_MARGEM_CONTRIB (
    p_config_65_casasDecEntrada,
    p_config_209_filtrarGrupoEcon,
    p_config_362_calcCustoPorGrade,
    p_regMarg_tipoPreco,
    p_regMarg_tabelaPreco,
    p_regMarg_fatorMultiplicador,
    p_regMarg_tipoPrecoB,
    p_regMarg_tabelaPrecoB,
    p_regMarg_fatorMultiplicadorB,
    p_regMarg_reduzirImpostos,
    p_regMarg_reduzirTarifaCartao,
    p_regMarg_taxaCapitacaoCustoFi,
    p_regMarg_exibImagemMargemItem,
    p_regMarg_regraImagemItem,
    p_cab_estabelecimento,
    p_cab_dataPrecoFinal,
    p_cab_prazoMedioPonderado,
    p_cab_valorLiquidoItem,
    p_cab_valorTarifaCartao,
    p_munEndEst_uf,
    p_item_idFormulaTinta,
    p_item_personalizacao,
    p_item_localEstoque,
    p_item_pessoaParticipante,
    p_item_quantidade,
    p_item_valorFreteTotal,
    p_item_valorSeguroTotal,
    p_item_valorAdicFreteMarTotal,
    p_item_valorDespesasAduanTotal,
    p_item_valorII,
    p_item_valorIOF,
    p_item_valorIPI,
    p_item_valorIPIDevolucao,
    p_item_valorPIS,
    p_item_valorPISST,
    p_item_valorCOFINS,
    p_item_valorCOFINSST,
    p_item_valorCreditoSimplesNac,
    p_item_valorICMSOperacao,
    p_item_valorICMSDiferido,
    p_item_valorICMS,
    p_item_valorICMSDesoneracao,
    p_item_valorICMSST,
    p_item_valorICMSSTAnteriorment,
    p_item_valorICMSUFDestinatario,
    p_item_valorICMSUFRemetente,
    p_item_valorFCP,
    p_item_valorFCPST,
    p_item_valorFCPSTAnteriormente,
    p_item_valorFCPUFDestinatario,
    p_item_valorLiquidoItem,
    p_gradProd_produto,
    p_gradProd_cor,
    p_gradProd_tamanho,
    p_prod_controleEstoque,
    p_locEst_indicadorPropPosseIt,
    /* Retornos */
    v_valorLiquidoSemFreteSeguro,
    v_valorCaptacao,
    v_valorTarifaCartao,
    v_valorImpostos,
    v_precoCusto,
    v_valorCusto,
    v_valorMargem,
    v_percentualMargem);
  RETURN (
    v_valorLiquidoSemFreteSeguro || '|' || 
    v_valorCaptacao || '|' || 
    v_valorTarifaCartao || '|' || 
    v_valorImpostos || '|' || 
    v_precoCusto || '|' || 
    v_valorCusto || '|' || 
    v_valorMargem || '|' || 
    v_percentualMargem);
END;

/

create or replace PROCEDURE ADD_BUSCA_ICMS_ST_ANTERIOR (
    p_config_64_casasDecSaidas     IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEntradaSaida         IN DATE,
    p_item_personalizacao          IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_calcularICMSSTAnterEfetivo   IN NUMBER,
    p_calcularFCP                  IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_prod_controleEstoque         IN NUMBER,
    /* Retornos */
    r_item_baseICMSSTAnteriormente OUT NUMBER,
    r_item_valorICMSSTAnteriorment OUT NUMBER,
    r_item_valorICMSProprioSubstit OUT NUMBER,
    r_item_baseFCPSTAnteriormente  OUT NUMBER,
    r_item_valorFCPSTAnteriormente OUT NUMBER)
IS
  v_ufOrigDest_aliquotaIcms NUMBER;
BEGIN
  r_item_baseICMSSTAnteriormente := 0;
  r_item_valorICMSSTAnteriorment := 0;
  r_item_valorICMSProprioSubstit := 0;
  r_item_baseFCPSTAnteriormente := 0;
  r_item_valorFCPSTAnteriormente := 0;
  FOR a IN (
    SELECT
      a.ordenacao,
      a.quantidade,
      a.baseICMSST,
      a.valorICMSST,
      a.baseICMSSTEscrituracao,
      a.valorICMSSTEscrituracao,
      a.baseICMSSTAnteriormente,
      a.valorICMSSTAnteriormente,
      a.valorICMS,
      a.baseFCPST,
      a.valorFCPST,
      a.nfFornecedor
    FROM (
      SELECT
        ROW_NUMBER() OVER (
          ORDER BY
            cab.dataEntradaSaida desc,
            item.iditemDocFiscal desc) ordenacao,
        item.quantidade,
        item.baseICMSST,
        item.valorICMSST,
        item.baseICMSSTEscrituracao,
        item.valorICMSSTEscrituracao,
        item.baseICMSSTAnteriormente,
        item.valorICMSSTAnteriormente,
        item.valorICMS,
        item.baseFCPST,
        item.valorFCPST,
        cab.nfFornecedor
      FROM CAGRADESPRODUTO gradProd
      JOIN MODOCFISCALXITENS item
      ON item.gradeProduto = gradProd.gradeProduto
      JOIN MODOCUMENTOSFISCAIS cab
      ON cab.idDocumentoFiscal = item.idDocumentoFiscal
      WHERE gradProd.produto = p_gradProd_produto
      AND item.cancelado = 0
      AND item.quantidade > 0
      AND (cab.nfFornecedor = 1
        AND item.baseICMSSTEscrituracao > 0
        AND item.valorICMSSTEscrituracao > 0
        OR item.baseICMSST > 0
        AND item.valorICMSST > 0
        OR item.baseICMSSTAnteriormente > 0
        AND item.valorICMSSTAnteriormente > 0
        OR item.valorICMS > 0)
      AND cab.entradaSaida = 'E'
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND TRUNC (cab.dataEntradaSaida) <= CASE WHEN p_cab_dataEntradaSaida IS NULL THEN TRUNC(SYSDATE) ELSE p_cab_dataEntradaSaida END
      AND (p_cab_estabelecimento = 0
        OR p_cab_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 = cab.estabelecimento
          AND (est.estabelecimento = p_cab_estabelecimento
            OR est2.estabelecimento = p_cab_estabelecimento))
        OR p_cab_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 = cab.estabelecimento
          AND (est.estabelecimento = p_cab_estabelecimento
            OR est2.estabelecimento = p_cab_estabelecimento)))) a
    WHERE a.ordenacao = 1)
  LOOP
    IF p_calcularICMSSTAnterEfetivo = 1 THEN
      IF a.nfFornecedor = 1 AND a.baseICMSSTEscrituracao > 0 AND a.valorICMSSTEscrituracao > 0 THEN
        r_item_baseICMSSTAnteriormente := ROUND ((a.baseICMSSTEscrituracao * p_item_quantidade / a.quantidade), 2);
        r_item_valorICMSSTAnteriorment := ROUND ((a.valorICMSSTEscrituracao * p_item_quantidade / a.quantidade), 2);
      ELSIF a.baseICMSST > 0 AND a.valorICMSST > 0 THEN
        r_item_baseICMSSTAnteriormente := ROUND ((a.baseICMSST * p_item_quantidade / a.quantidade), 2);
        r_item_valorICMSSTAnteriorment := ROUND ((a.valorICMSST * p_item_quantidade / a.quantidade), 2);
      ELSE
        r_item_baseICMSSTAnteriormente := ROUND ((a.baseICMSSTAnteriormente * p_item_quantidade / a.quantidade), 2);
        r_item_valorICMSSTAnteriorment := ROUND ((a.valorICMSSTAnteriormente * p_item_quantidade / a.quantidade), 2);
      END IF;
      r_item_valorICMSProprioSubstit := ROUND ((a.valorICMS * p_item_quantidade / a.quantidade), 2);
    END IF;
    IF p_calcularFCP = 1 THEN
      r_item_baseFCPSTAnteriormente := ROUND ((a.baseFCPST * p_item_quantidade / a.quantidade), 2);
      r_item_valorFCPSTAnteriormente := ROUND ((a.valorFCPST * p_item_quantidade / a.quantidade), 2);
    END IF;
    IF p_calcularICMSSTAnterEfetivo = 1 AND r_item_baseICMSSTAnteriormente = 0 AND r_item_valorICMSSTAnteriorment = 0 AND r_item_valorICMSProprioSubstit = 0 THEN
      r_item_baseICMSSTAnteriormente := ROUND ((p_item_quantidade *
        FUNC_ADD_BUSCA_PRECO(
          p_config_64_casasDecSaidas,
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          0,
          0,
          p_cab_estabelecimento,
          CASE WHEN p_cab_dataEntradaSaida IS NULL THEN TRUNC(SYSDATE) ELSE p_cab_dataEntradaSaida END,
          0,
          ' ',
          ' ',
          0,
          0,
          p_item_personalizacao,
          p_gradProd_produto,
          p_gradProd_cor,
          p_gradProd_tamanho,
          p_prod_controleEstoque,
          'U',
          ' '
        )), 2);
      SELECT
        COALESCE((
          SELECT ufOrigDest.aliquotaIcms
          FROM PAESTABELECIMENTOS est
          JOIN CAENDERECOSPESSOA endEst
          ON endEst.pessoa = est.pessoaEstabelecimento
          JOIN SIMUNICIPIOS munEst
          ON munEst.municipio = endEst.municipio
          JOIN PAUFORIGEMXUFDESTINO ufOrigDest
          ON ufOrigDest.ufOrigem = munEst.uf
          AND ufOrigDest.ufDestino = munEst.uf
          WHERE est.estabelecimento = p_cab_estabelecimento
          AND endEst.ativo = 1
          AND endEst.principal = 1),0)
      INTO v_ufOrigDest_aliquotaIcms
      FROM DUAL;
      r_item_valorICMSSTAnteriorment := ROUND (r_item_baseICMSSTAnteriormente * v_ufOrigDest_aliquotaIcms / 100, 2);
    END IF;
  END LOOP;
END ADD_BUSCA_ICMS_ST_ANTERIOR;

/

create or replace PROCEDURE ADD_CALCULA_MARGEM_CONTRIB (
    p_config_65_casasDecEntrada    IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_regMarg_tipoPreco            IN CHAR,
    p_regMarg_tabelaPreco          IN VARCHAR2,
    p_regMarg_fatorMultiplicador   IN NUMBER,
    p_regMarg_tipoPrecoB           IN CHAR,
    p_regMarg_tabelaPrecoB         IN VARCHAR2,
    p_regMarg_fatorMultiplicadorB  IN NUMBER,
    p_regMarg_reduzirImpostos      IN NUMBER,
    p_regMarg_reduzirTarifaCartao  IN NUMBER,
    p_regMarg_taxaCapitacaoCustoFi IN NUMBER,
    p_regMarg_exibImagemMargemItem IN NUMBER,
    p_regMarg_regraImagemItem      IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPreco                IN DATE,
    p_cab_prazoMedioPonderado      IN NUMBER,
    p_cab_valorLiquidoItem         IN NUMBER,
    p_cab_valorTarifaCartao        IN NUMBER,
    p_munEndEst_uf                 IN CHAR,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_item_valorFreteTotal         IN NUMBER,
    p_item_valorSeguroTotal        IN NUMBER,
    p_item_valorAdicFreteMarTotal  IN NUMBER,
    p_item_valorDespesasAduanTotal IN NUMBER,
    p_item_valorII                 IN NUMBER,
    p_item_valorIOF                IN NUMBER,
    p_item_valorIPI                IN NUMBER,
    p_item_valorIPIDevolucao       IN NUMBER,
    p_item_valorPIS                IN NUMBER,
    p_item_valorPISST              IN NUMBER,
    p_item_valorCOFINS             IN NUMBER,
    p_item_valorCOFINSST           IN NUMBER,
    p_item_valorCreditoSimplesNac  IN NUMBER,
    p_item_valorICMSOperacao       IN NUMBER,
    p_item_valorICMSDiferido       IN NUMBER,
    p_item_valorICMS               IN NUMBER,
    p_item_valorICMSDesoneracao    IN NUMBER,
    p_item_valorICMSST             IN NUMBER,
    p_item_valorICMSSTAnteriorment IN NUMBER,
    p_item_valorICMSUFDestinatario IN NUMBER,
    p_item_valorICMSUFRemetente    IN NUMBER,
    p_item_valorFCP                IN NUMBER,
    p_item_valorFCPST              IN NUMBER,
    p_item_valorFCPSTAnteriormente IN NUMBER,
    p_item_valorFCPUFDestinatario  IN NUMBER,
    p_item_valorLiquidoItem        IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_prod_controleEstoque         IN NUMBER,
    p_locEst_indicadorPropPosseIt  IN CHAR,
    /* Retornos */
    r_valorLiquidoSemFreteSeguro   OUT NUMBER,
    r_valorCaptacao                OUT NUMBER,
    r_valorTarifaCartao            OUT NUMBER,
    r_valorImpostos                OUT NUMBER,
    r_precoCusto                   OUT NUMBER,
    r_valorCusto                   OUT NUMBER,
    r_valorMargem                  OUT NUMBER,
    r_percentualMargem             OUT NUMBER)
IS
    v_auxNumber NUMBER;
    v_auxVarchar VARCHAR2(256);    
BEGIN
  r_valorLiquidoSemFreteSeguro := p_item_valorLiquidoItem - p_item_valorFreteTotal - p_item_valorSeguroTotal - p_item_valorAdicFreteMarTotal - p_item_valorDespesasAduanTotal;
  r_valorCaptacao := FUNC_ADD_CALC_VALOR_CAPTACAO(p_cab_prazoMedioPonderado,p_regMarg_taxaCapitacaoCustoFi,r_valorLiquidoSemFreteSeguro);
  IF (p_regMarg_reduzirTarifaCartao = 1 AND p_cab_valorLiquidoItem <> 0) THEN
    r_valorTarifaCartao := CASE WHEN p_cab_valorLiquidoItem = 0 THEN 0 ELSE ROUND ((p_cab_valorTarifaCartao * p_item_valorLiquidoItem / p_cab_valorLiquidoItem), 2) END;
  ELSE
    r_valorTarifaCartao := 0;
  END IF;
  IF p_regMarg_reduzirImpostos = 1 THEN
    r_valorImpostos :=
      p_item_valorII
      + p_item_valorIOF
      + p_item_valorIPI
      + p_item_valorIPIDevolucao
      + p_item_valorPIS
      + p_item_valorPISST
      + p_item_valorCOFINS
      + p_item_valorCOFINSST
      + p_item_valorCreditoSimplesNac
      + p_item_valorICMSOperacao
      + p_item_valorICMSDiferido
      + p_item_valorICMS
      + p_item_valorICMSDesoneracao
      + p_item_valorICMSST
      + p_item_valorICMSSTAnteriorment
      + p_item_valorICMSUFDestinatario
      + p_item_valorICMSUFRemetente
      + p_item_valorFCP
      + p_item_valorFCPST
      + p_item_valorFCPSTAnteriormente
      + p_item_valorFCPUFDestinatario;
  ELSE
    r_valorImpostos := 0;
  END IF;
  ADD_BUSCA_PRECO (
    p_config_65_casasDecEntrada, -- p_config_64_casasDecSaidas
    p_config_65_casasDecEntrada,
    p_config_209_filtrarGrupoEcon,
    p_config_362_calcCustoPorGrade,
    0, -- p_perfilUsuarioLogado
    0, -- p_usuarioLogado
    'E', -- p_cab_entradaSaida
    0, -- p_cab_devolucaoAnulacaoRetorno
    p_cab_estabelecimento,
    TO_DATE('01/01/1900','DD/MM/YYYY'), -- p_cab_dataPrecoInicial
    p_cab_dataPreco, -- p_cab_dataPrecoFinal
    0, -- p_cab_pessoa
    0, -- p_modDoc_capituloNaturezaFisc
    p_regMarg_tipoPreco,
    p_regMarg_tabelaPreco,
    p_regMarg_fatorMultiplicador,
    p_regMarg_tipoPrecoB,
    p_regMarg_tabelaPrecoB,
    p_regMarg_fatorMultiplicadorB,
    p_munEndEst_uf, -- p_endPessEst_uf
    p_munEndEst_uf, -- p_endPess_uf
    0, -- p_item_vendedor
    p_item_idFormulaTinta,
    p_item_personalizacao,
    p_item_localEstoque,
    p_item_pessoaParticipante,
    p_item_quantidade,
    p_gradProd_produto,
    p_gradProd_cor,
    p_gradProd_tamanho,
    p_prod_controleEstoque,
    p_locEst_indicadorPropPosseIt,
    0, -- p_manterPreco
    0, -- p_precoSugestaoAPrazoOriginal
    0, -- p_precoSugestaoAVistaOriginal
    ' ', -- p_tipoPreco
    ' ', -- p_tabelaPreco
    /* Retornos */
    v_auxVarchar, -- r_tipoPreco
    v_auxVarchar, -- r_tabelaPreco
    r_precoCusto,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber);
  -- CUSTOMIZAÇÃO CENTERLUZ
  -- r_valorImpostos      := ROUND ((r_valorLiquidoSemFreteSeguro * 0.3),2);
  -- r_valorTarifaCartao  := ROUND ((p_cab_valorLiquidoItem * 0.005),2);
  r_valorCusto         := ROUND ((p_item_quantidade * r_precoCusto),2);
  r_valorMargem        := r_valorLiquidoSemFreteSeguro - r_valorCaptacao - r_valorImpostos - r_valorTarifaCartao - r_valorCusto;
  r_percentualMargem   := CASE WHEN r_valorLiquidoSemFreteSeguro = 0 THEN 0 ELSE ROUND ((100 * r_valorMargem / r_valorLiquidoSemFreteSeguro), 8) END;
END ADD_CALCULA_MARGEM_CONTRIB;

/

create or replace PROCEDURE ADD_CALCULA_IMPOSTOS_ITEM (
    p_config_64_casasDecSaidas     IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_devolucaoAnulacaoRetorno IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_nfFornecedor             IN NUMBER,
    p_cab_dataEntradaSaida         IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_cab_localDestinoOperacao     IN CHAR,
    p_cab_indicadorConsumidorFinal IN CHAR,
    p_cab_tipoPagamentoFrete       IN CHAR,
    p_pess_indicadorInscricaoEstad IN CHAR,
    p_personalizacao               IN NUMBER,
    p_quantidade                   IN NUMBER,
    p_precoPautaTabelado           IN NUMBER,
    p_valorProdutoServico          IN NUMBER,
    p_valorFreteTotal              IN NUMBER,
    p_valorSeguroTotal             IN NUMBER,
    p_valorDescontoTotal           IN NUMBER,
    p_valorOutrasDespesasTotal     IN NUMBER,
    p_valorAdicFreteMarinMerTotal  IN NUMBER,
    p_valorDespesasAduaneirasTotal IN NUMBER,
    p_cfop                         IN NUMBER,
    p_calcularISSQN                IN NUMBER,
    p_indicadorISSQN               IN CHAR,
    p_aliquotaISSQN                IN NUMBER,
    p_baseISSQN                    IN NUMBER,
    p_valorISSQN                   IN NUMBER,
    p_calcularIRRF                 IN NUMBER,
    p_aliquotaIRRF                 IN NUMBER,
    p_baseIRRF                     IN NUMBER,
    p_valorIRRF                    IN NUMBER,
    p_calcularINSS                 IN NUMBER,
    p_aliquotaINSS                 IN NUMBER,
    p_baseINSS                     IN NUMBER,
    p_valorINSS                    IN NUMBER,
    p_calcularRetencaoPIS          IN NUMBER,
    p_retencaoPIS                  IN NUMBER,
    p_baseRetPIS                   IN NUMBER,
    p_valorRetPIS                  IN NUMBER,
    p_calcularRetencaoCOFINS       IN NUMBER,
    p_retencaoCOFINS               IN NUMBER,
    p_baseRetCOFINS                IN NUMBER,
    p_valorRetCOFINS               IN NUMBER,
    p_calcularRetencaoCSLL         IN NUMBER,
    p_retencaoCSLL                 IN NUMBER,
    p_baseRetCSLL                  IN NUMBER,
    p_valorRetCSLL                 IN NUMBER,
    p_calcularII                   IN NUMBER,
    p_aliquotaII                   IN NUMBER,
    p_baseII                       IN NUMBER,
    p_valorII                      IN NUMBER,
    p_calcularIOF                  IN NUMBER,
    p_aliquotaIOF                  IN NUMBER,
    p_baseIOF                      IN NUMBER,
    p_valorIOF                     IN NUMBER,
    p_calcularIPI                  IN NUMBER,
    p_aliquotaIPI                  IN NUMBER,
    p_valorAliquotaIPI             IN NUMBER,
    p_baseIPI                      IN NUMBER,
    p_valorIPI                     IN NUMBER,
    p_valorIPIDevolucao            IN NUMBER,
    p_calcularPIS                  IN NUMBER,
    p_aliquotaPIS                  IN NUMBER,
    p_valorAliquotaPIS             IN NUMBER,
    p_basePIS                      IN NUMBER,
    p_valorPIS                     IN NUMBER,
    p_calcularPISST                IN NUMBER,
    p_aliquotaPISST                IN NUMBER,
    p_valorAliquotaPISST           IN NUMBER,
    p_basePISST                    IN NUMBER,
    p_valorPISST                   IN NUMBER,
    p_calcularCOFINS               IN NUMBER,
    p_aliquotaCOFINS               IN NUMBER,
    p_valorAliquotaCOFINS          IN NUMBER,
    p_baseCOFINS                   IN NUMBER,
    p_valorCOFINS                  IN NUMBER,
    p_calcularCOFINSST             IN NUMBER,
    p_aliquotaCOFINSST             IN NUMBER,
    p_valorAliquotaCOFINSST        IN NUMBER,
    p_baseCOFINSST                 IN NUMBER,
    p_valorCOFINSST                IN NUMBER,
    p_calcularSimplesNacional      IN NUMBER,
    p_stSimplesNacional            IN CHAR,
    p_creditoSimplesNacional       IN NUMBER,
    p_baseCreditoSimplesNacional   IN NUMBER,
    p_valorCreditoSimplesNacional  IN NUMBER,
    p_calcularICMS                 IN NUMBER,
    p_stICMS                       IN CHAR,
    p_modalidadeBaseCalcICMS       IN CHAR,
    p_reducaoBaseICMS              IN NUMBER,
    p_aliquotaICMS                 IN NUMBER,
    p_diferimentoICMS              IN NUMBER,
    p_baseICMS                     IN NUMBER,
    p_valorICMSOperacao            IN NUMBER,
    p_valorICMSDiferido            IN NUMBER,
    p_valorICMS                    IN NUMBER,
    p_valorICMSDesoneracao         IN NUMBER,
    p_calcularICMSST               IN NUMBER,
    p_modalidadeBaseCalcICMSST     IN CHAR,
    p_margemValorAdicionadoST      IN NUMBER,
    p_reducaoBaseST                IN NUMBER,
    p_aliquotaICMSST               IN NUMBER,
    p_baseICMSST                   IN NUMBER,
    p_valorICMSST                  IN NUMBER,
    p_calcularICMSSTAnterEfetivo   IN NUMBER,
    p_baseICMSSTAnteriormente      IN NUMBER,
    p_valorICMSSTAnteriormente     IN NUMBER,
    p_valorICMSProprioSubstituto   IN NUMBER,
    p_reducaoBaseICMSEfetivo       IN NUMBER,
    p_aliquotaICMSEfetivo          IN NUMBER,
    p_baseICMSEfetivo              IN NUMBER,
    p_valorICMSEfetivo             IN NUMBER,
    p_calcularICMSEscrituracao     IN NUMBER,
    p_stICMSEscrituracao           IN CHAR,
    p_reducaoBaseICMSEscrituracao  IN NUMBER,
    p_aliquotaICMSEscrituracao     IN NUMBER,
    p_baseICMSEscrituracao         IN NUMBER,
    p_valorICMSEscrituracao        IN NUMBER,
    p_valorICMSDesonEscrituracao   IN NUMBER,
    p_calcularICMSSTEscrituracao   IN NUMBER,
    p_margemValorAdicSTEscriturac  IN NUMBER,
    p_reducaoBaseSTEscrituracao    IN NUMBER,
    p_aliquotaICMSSTEscrituracao   IN NUMBER,
    p_baseICMSSTEscrituracao       IN NUMBER,
    p_valorICMSSTEscrituracao      IN NUMBER,
    p_calcularDIFAL                IN NUMBER,
    p_aliquotaICMSUFDestinatario   IN NUMBER,
    p_aliquotaICMSInterestadual    IN NUMBER,
    p_partilhaICMSInterestadual    IN NUMBER,
    p_baseICMSUFDestinatario       IN NUMBER,
    p_valorICMSUFDestinatario      IN NUMBER,
    p_baseICMSUFRemetente          IN NUMBER,
    p_valorICMSUFRemetente         IN NUMBER,
    p_calcularFCP                  IN NUMBER,
    p_aliquotaFCP                  IN NUMBER,
    p_baseFCP                      IN NUMBER,
    p_valorFCP                     IN NUMBER,
    p_aliquotaFCPST                IN NUMBER,
    p_baseFCPST                    IN NUMBER,
    p_valorFCPST                   IN NUMBER,
    p_aliquotaFCPSTAnteriormente   IN NUMBER,
    p_baseFCPSTAnteriormente       IN NUMBER,
    p_valorFCPSTAnteriormente      IN NUMBER,
    p_aliquotaFCPUFDestinatario    IN NUMBER,
    p_baseFCPUFDestinatario        IN NUMBER,
    p_valorFCPUFDestinatario       IN NUMBER,
    p_calcularImpostosEstimados    IN NUMBER,
    p_aliquotaEstImpFederais       IN NUMBER,
    p_aliquotaEstImpEstaduais      IN NUMBER,
    p_aliquotaEstImpMunicipais     IN NUMBER,
    p_baseEstimadaImpostos         IN NUMBER,
    p_valorEstimadoImpFederais     IN NUMBER,
    p_valorEstimadoImpEstaduais    IN NUMBER,
    p_valorEstimadoImpMunicipais   IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_prod_controleEstoque         IN NUMBER,
    p_prod_tipoProduto             IN CHAR,
    /* Retornos */
    r_baseISSQN                    OUT NUMBER,
    r_valorISSQN                   OUT NUMBER,
    r_baseIRRF                     OUT NUMBER,
    r_valorIRRF                    OUT NUMBER,
    r_baseINSS                     OUT NUMBER,
    r_valorINSS                    OUT NUMBER,
    r_baseRetPIS                   OUT NUMBER,
    r_valorRetPIS                  OUT NUMBER,
    r_baseRetCOFINS                OUT NUMBER,
    r_valorRetCOFINS               OUT NUMBER,
    r_baseRetCSLL                  OUT NUMBER,
    r_valorRetCSLL                 OUT NUMBER,
    r_baseII                       OUT NUMBER,
    r_valorII                      OUT NUMBER,
    r_baseIOF                      OUT NUMBER,
    r_valorIOF                     OUT NUMBER,
    r_baseIPI                      OUT NUMBER,
    r_valorIPI                     OUT NUMBER,
    r_basePIS                      OUT NUMBER,
    r_valorPIS                     OUT NUMBER,
    r_basePISST                    OUT NUMBER,
    r_valorPISST                   OUT NUMBER,
    r_baseCOFINS                   OUT NUMBER,
    r_valorCOFINS                  OUT NUMBER,
    r_baseCOFINSST                 OUT NUMBER,
    r_valorCOFINSST                OUT NUMBER,
    r_baseCreditoSimplesNacional   OUT NUMBER,
    r_valorCreditoSimplesNacional  OUT NUMBER,
    r_baseICMS                     OUT NUMBER,
    r_valorICMSOperacao            OUT NUMBER,
    r_valorICMSDiferido            OUT NUMBER,
    r_valorICMS                    OUT NUMBER,
    r_valorICMSDesoneracao         OUT NUMBER,
    r_baseICMSST                   OUT NUMBER,
    r_valorICMSST                  OUT NUMBER,
    r_baseICMSSTAnteriormente      OUT NUMBER,
    r_valorICMSSTAnteriormente     OUT NUMBER,
    r_valorICMSProprioSubstituto   OUT NUMBER,
    r_baseICMSEfetivo              OUT NUMBER,
    r_valorICMSEfetivo             OUT NUMBER,
    r_baseICMSEscrituracao         OUT NUMBER,
    r_valorICMSEscrituracao        OUT NUMBER,
    r_valorICMSDesonEscrituracao   OUT NUMBER,
    r_baseICMSSTEscrituracao       OUT NUMBER,
    r_valorICMSSTEscrituracao      OUT NUMBER,
    r_baseICMSUFDestinatario       OUT NUMBER,
    r_valorICMSUFDestinatario      OUT NUMBER,
    r_baseICMSUFRemetente          OUT NUMBER,
    r_valorICMSUFRemetente         OUT NUMBER,
    r_baseFCP                      OUT NUMBER,
    r_valorFCP                     OUT NUMBER,
    r_baseFCPST                    OUT NUMBER,
    r_valorFCPST                   OUT NUMBER,
    r_baseFCPSTAnteriormente       OUT NUMBER,
    r_valorFCPSTAnteriormente      OUT NUMBER,
    r_baseFCPUFDestinatario        OUT NUMBER,
    r_valorFCPUFDestinatario       OUT NUMBER,
    r_baseEstimadaImpostos         OUT NUMBER,
    r_valorEstimadoImpFederais     OUT NUMBER,
    r_valorEstimadoImpEstaduais    OUT NUMBER,
    r_valorEstimadoImpMunicipais    OUT NUMBER)
IS
    v_baseICMSSTAnteriormente      NUMBER;
    v_valorICMSSTAnteriormente     NUMBER;
    v_valorICMSProprioSubstituto   NUMBER;
    v_baseFCPSTAnteriormente       NUMBER;
    v_valorFCPSTAnteriormente      NUMBER;
BEGIN
  /* Inicia retornos com paramentros */
  r_baseISSQN                   := p_baseISSQN;
  r_valorISSQN                  := p_valorISSQN;
  r_baseIRRF                    := p_baseIRRF;
  r_valorIRRF                   := p_valorIRRF;
  r_baseINSS                    := p_baseINSS;
  r_valorINSS                   := p_valorINSS;
  r_baseRetPIS                  := p_baseRetPIS;
  r_valorRetPIS                 := p_valorRetPIS;
  r_baseRetCOFINS               := p_baseRetCOFINS;
  r_valorRetCOFINS              := p_valorRetCOFINS;
  r_baseRetCSLL                 := p_baseRetCSLL;
  r_valorRetCSLL                := p_valorRetCSLL;
  r_baseII                      := p_baseII;
  r_valorII                     := p_valorII;
  r_baseIOF                     := p_baseIOF;
  r_valorIOF                    := p_valorIOF;
  r_baseIPI                     := p_baseIPI;
  r_valorIPI                    := p_valorIPI;
  r_basePIS                     := p_basePIS;
  r_valorPIS                    := p_valorPIS;
  r_basePISST                   := p_basePISST;
  r_valorPISST                  := p_valorPISST;
  r_baseCOFINS                  := p_baseCOFINS;
  r_valorCOFINS                 := p_valorCOFINS;
  r_baseCOFINSST                := p_baseCOFINSST;
  r_valorCOFINSST               := p_valorCOFINSST;
  r_baseCreditoSimplesNacional  := p_baseCreditoSimplesNacional;
  r_valorCreditoSimplesNacional := p_valorCreditoSimplesNacional;
  r_baseICMS                    := p_baseICMS;
  r_valorICMSOperacao           := p_valorICMSOperacao;
  r_valorICMSDiferido           := p_valorICMSDiferido;
  r_valorICMS                   := p_valorICMS;
  r_valorICMSDesoneracao        := p_valorICMSDesoneracao;
  r_baseICMSST                  := p_baseICMSST;
  r_valorICMSST                 := p_valorICMSST;
  r_baseICMSSTAnteriormente     := p_baseICMSSTAnteriormente;
  r_valorICMSSTAnteriormente    := p_valorICMSSTAnteriormente;
  r_valorICMSProprioSubstituto  := p_valorICMSProprioSubstituto;
  r_baseICMSEfetivo             := p_baseICMSEfetivo;
  r_valorICMSEfetivo            := p_valorICMSEfetivo;
  r_baseICMSEscrituracao        := p_baseICMSEscrituracao;
  r_valorICMSEscrituracao       := p_valorICMSEscrituracao;
  r_valorICMSDesonEscrituracao  := p_valorICMSDesonEscrituracao;
  r_baseICMSSTEscrituracao      := p_baseICMSSTEscrituracao;
  r_valorICMSSTEscrituracao     := p_valorICMSSTEscrituracao;
  r_baseICMSUFDestinatario      := p_baseICMSUFDestinatario;
  r_valorICMSUFDestinatario     := p_valorICMSUFDestinatario;
  r_baseICMSUFRemetente         := p_baseICMSUFRemetente;
  r_valorICMSUFRemetente        := p_valorICMSUFRemetente;
  r_baseFCP                     := p_baseFCP;
  r_valorFCP                    := p_valorFCP;
  r_baseFCPST                   := p_baseFCPST;
  r_valorFCPST                  := p_valorFCPST;
  r_baseFCPSTAnteriormente      := p_baseFCPSTAnteriormente;
  r_valorFCPSTAnteriormente     := p_valorFCPSTAnteriormente;
  r_baseFCPUFDestinatario       := p_baseFCPUFDestinatario;
  r_valorFCPUFDestinatario      := p_valorFCPUFDestinatario;
  r_baseEstimadaImpostos        := p_baseEstimadaImpostos;
  r_valorEstimadoImpFederais    := p_valorEstimadoImpFederais;
  r_valorEstimadoImpEstaduais   := p_valorEstimadoImpEstaduais;
  r_valorEstimadoImpMunicipais  := p_valorEstimadoImpMunicipais;
  /* ISSQN */
  IF p_calcularISSQN = 1 THEN
    IF p_indicadorISSQN = '1' THEN
      r_baseISSQN := p_valorProdutoServico - p_valorDescontoTotal + p_valorOutrasDespesasTotal;
      r_valorISSQN := ROUND ((r_baseISSQN * p_aliquotaISSQN / 100), 2);
    ELSE
      r_baseISSQN := 0;
      r_valorISSQN := 0;
    END IF;
  END IF;
  /* IRRF */
  IF p_calcularIRRF = 1 THEN
    IF p_aliquotaIRRF > 0 THEN
      r_baseIRRF := p_valorProdutoServico - p_valorDescontoTotal + p_valorOutrasDespesasTotal;
      r_valorIRRF := ROUND ((r_baseIRRF * p_aliquotaIRRF / 100), 2);
    ELSE
      r_baseIRRF := 0;
      r_valorIRRF := 0;
    END IF;
  END IF;
  /* INSS */
  IF p_calcularINSS = 1 THEN
    IF p_aliquotaINSS > 0 THEN
      r_baseINSS := p_valorProdutoServico - p_valorDescontoTotal + p_valorOutrasDespesasTotal;
      r_valorINSS := ROUND ((r_baseINSS * p_aliquotaINSS / 100), 2);
    ELSE
      r_baseINSS := 0;
      r_valorINSS := 0;
    END IF;
  END IF;
  /* Retenção PIS */
  IF p_calcularRetencaoPIS = 1 THEN
    IF p_retencaoPIS > 0 THEN
      r_baseRetPIS := p_valorProdutoServico - p_valorDescontoTotal + p_valorOutrasDespesasTotal;
      r_valorRetPIS := ROUND ((r_baseRetPIS * p_retencaoPIS / 100), 2);
    ELSE
      r_baseRetPIS := 0;
      r_valorRetPIS := 0;
    END IF;
  END IF;
  /* Retenção COFINS */
  IF p_calcularRetencaoCOFINS = 1 THEN
    IF p_retencaoCOFINS > 0 THEN
      r_baseRetCOFINS := p_valorProdutoServico - p_valorDescontoTotal + p_valorOutrasDespesasTotal;
      r_valorRetCOFINS := ROUND ((r_baseRetCOFINS * p_retencaoCOFINS / 100), 2);
    ELSE
      r_baseRetCOFINS := 0;
      r_valorRetCOFINS := 0;
    END IF;
  END IF;
  /* Retenção CSLL */
  IF p_calcularRetencaoCSLL = 1 THEN
    IF p_retencaoCSLL > 0 THEN
      r_baseRetCSLL := p_valorProdutoServico - p_valorDescontoTotal + p_valorOutrasDespesasTotal;
      r_valorRetCSLL := ROUND ((r_baseRetCSLL * p_retencaoCSLL / 100), 2);
    ELSE
      r_baseRetCSLL := 0;
      r_valorRetCSLL := 0;
    END IF;
  END IF;
  /* II */
  IF p_calcularII = 1 THEN
    IF p_aliquotaII > 0 THEN
      r_baseII :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal;
      r_valorII := ROUND ((r_baseII * p_aliquotaII / 100), 2);
    ELSE
      r_baseII := 0;
      r_valorII := 0;
    END IF;
  END IF;
  /* IOF */
  IF p_calcularIOF = 1 THEN
    IF p_aliquotaIOF > 0 THEN
      r_baseIOF := 
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal;
      r_valorIOF := ROUND ((r_baseIOF * p_aliquotaIOF / 100), 2);
    ELSE
      r_baseIOF := 0;
      r_valorIOF := 0;
    END IF;
  END IF;
  /* IPI */
  IF p_calcularIPI = 1 THEN
    IF p_aliquotaIPI > 0 THEN
      r_baseIPI :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF;
      r_valorIPI := ROUND ((r_baseIPI * p_aliquotaIPI / 100), 2);
    ELSE
      r_baseIPI := 0;
      r_valorIPI := 0;
    END IF;
    IF p_valorAliquotaIPI > 0 THEN
      r_valorIPI := ROUND ((r_valorIPI + (p_quantidade * p_valorAliquotaIPI)), 2);
    END IF;
  END IF;
  /* Simples Nacional */
  IF p_calcularSimplesNacional = 1 THEN
    IF p_stSimplesNacional IN('101','102','201','202','900') AND p_creditoSimplesNacional > 0 THEN
      r_baseCreditoSimplesNacional :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        + CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END AND p_prod_tipoProduto IN ('07','08') OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END AND (p_cab_indicadorConsumidorFinal = '0' OR p_pess_indicadorInscricaoEstad = '9') THEN r_valorIPI + p_valorIPIDevolucao ELSE 0 END;
      r_valorCreditoSimplesNacional := ROUND ((r_baseCreditoSimplesNacional * p_creditoSimplesNacional / 100), 2);
    ELSE
      r_baseCreditoSimplesNacional := 0;
      r_valorCreditoSimplesNacional := 0;
    END IF;
  END IF;
  /* ICMS */
  IF p_calcularICMS = 1 THEN
      r_baseICMS := 0;
      r_valorICMSOperacao := 0;
      r_valorICMSDiferido := 0;
      r_valorICMS := 0;
      r_valorICMSDesoneracao := 0;
    IF p_aliquotaICMS > 0 AND (p_stSimplesNacional IS NULL OR p_stSimplesNacional = '   ') AND p_stICMS IN ('40','41','50') THEN
      r_valorICMSDesoneracao := ROUND (((
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        + CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END AND p_prod_tipoProduto IN ('07','08') OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END AND (p_cab_indicadorConsumidorFinal = '0' OR p_pess_indicadorInscricaoEstad = '9') THEN r_valorIPI + p_valorIPIDevolucao ELSE 0 END
      ) * p_aliquotaICMS / 100), 2);
    ELSIF p_aliquotaICMS > 0 AND (p_stSimplesNacional IS NULL OR p_stSimplesNacional = '   ') AND (p_stICMS IN ('00','10','20','51','70') OR p_stICMS = '90' AND p_aliquotaICMS > 0) OR p_stSimplesNacional = '900' AND p_aliquotaICMS > 0 THEN
      r_baseICMS :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        + CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END AND p_prod_tipoProduto IN ('07','08') OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END AND (p_cab_indicadorConsumidorFinal = '0' OR p_pess_indicadorInscricaoEstad = '9') THEN r_valorIPI + p_valorIPIDevolucao ELSE 0 END;
      IF p_precoPautaTabelado > 0 AND (p_modalidadeBaseCalcICMS = '1' OR p_modalidadeBaseCalcICMS = '2' AND r_baseICMS > p_quantidade * p_precoPautaTabelado) THEN
        r_baseICMS := ROUND ((p_quantidade * p_precoPautaTabelado), 2);
      END IF;
      r_valorICMS := ROUND ((r_baseICMS * p_aliquotaICMS / 100), 2);
      IF ((p_stSimplesNacional IS NULL OR p_stSimplesNacional = '   ') AND p_stICMS IN ('20','70','90') OR p_stSimplesNacional = '900') AND p_reducaoBaseICMS > 0 THEN
        r_valorICMSDesoneracao := ROUND ((r_baseICMS * p_aliquotaICMS / 100), 2);
        r_baseICMS := ROUND ((r_baseICMS * (1 - p_reducaoBaseICMS / 100)), 2);
        r_valorICMS := ROUND ((r_baseICMS * p_aliquotaICMS / 100), 2);
        r_valorICMSDesoneracao := r_valorICMSDesoneracao - r_valorICMS;
      ELSE
        IF (p_stSimplesNacional IS NULL OR p_stSimplesNacional = '   ') AND p_stICMS = '51' AND p_reducaoBaseICMS > 0 AND p_reducaoBaseICMS <> p_diferimentoICMS THEN
          r_baseICMS := ROUND ((r_baseICMS * (1 - p_reducaoBaseICMS / 100)), 2);
          r_valorICMS := ROUND ((r_baseICMS * p_aliquotaICMS / 100), 2);
        END IF;
        r_valorICMSDesoneracao := 0;
      END IF;
      IF (p_stSimplesNacional IS NULL OR p_stSimplesNacional = '   ') AND p_stICMS = '51' THEN
        r_valorICMSOperacao := r_valorICMS;
        r_valorICMSDiferido := ROUND ((r_valorICMSOperacao * p_diferimentoICMS / 100), 2);
        r_valorICMS := r_valorICMSOperacao - r_valorICMSDiferido;
        IF r_valorICMS < 0 THEN
          r_valorICMS := 0;
        END IF;
      ELSE
        r_valorICMSOperacao := 0;
        r_valorICMSDiferido := 0;
      END IF;
    END IF;
  END IF;
  /* ICMS ST */
  IF p_calcularICMSST = 1 THEN
    IF (p_stSimplesNacional IS NULL OR p_stSimplesNacional = '   ') AND (p_stICMS IN ('10','30','70') OR p_stICMS = '90' AND p_aliquotaICMSST > 0) OR p_stSimplesNacional IN ('201','202') OR p_stSimplesNacional = '900' AND p_aliquotaICMSST > 0 THEN
      r_baseICMSST :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        + r_valorIPI
        + p_valorIPIDevolucao;
      IF p_precoPautaTabelado > 0 AND (p_modalidadeBaseCalcICMSST = '5' OR p_modalidadeBaseCalcICMSST = '0' AND r_baseICMSST > p_quantidade * p_precoPautaTabelado) AND ((p_stSimplesNacional IS NULL OR p_stSimplesNacional = '   ') AND p_stICMS IN ('10','30','70','90') OR p_stSimplesNacional IN ('201','202','900')) THEN
        r_baseICMSST := ROUND ((p_quantidade * p_precoPautaTabelado), 2);
      END IF;
      IF p_modalidadeBaseCalcICMSST = '4' OR (p_stSimplesNacional IS NULL OR p_stSimplesNacional = '   ') AND p_stICMS = '60' OR p_stSimplesNacional = '500' THEN
        r_baseICMSST := ROUND ((r_baseICMSST * (1 + p_margemValorAdicionadoST / 100)), 2);
      END IF;
      r_baseICMSST := ROUND ((r_baseICMSST * (1 - p_reducaoBaseST / 100)), 2);
      r_valorICMSST := ROUND (((r_baseICMSST * p_aliquotaICMSST / 100) - r_valorICMS), 2);
      IF r_valorICMSST <= 0 THEN
        r_baseICMSST := 0;
        r_valorICMSST := 0;
      END IF;
    ELSE
      r_baseICMSST := 0;
      r_valorICMSST := 0;
    END IF;
  END IF;
  /* Busca dados apenas quando precisa. */
  v_baseICMSSTAnteriormente := 0;
  v_valorICMSSTAnteriormente := 0;
  v_valorICMSProprioSubstituto := 0;
  v_baseFCPSTAnteriormente := 0;
  v_valorFCPSTAnteriormente := 0;
  IF (p_calcularICMSSTAnterEfetivo = 1 OR p_calcularFCP = 1) 
      AND ((p_stSimplesNacional IS NULL OR p_stSimplesNacional = '   ') AND p_stICMS='60' OR p_stSimplesNacional='500') 
      AND p_cab_indicadorConsumidorFinal = '0' 
      AND (p_cab_entradaSaida = 'S'
      OR p_cfop IN (1201,1202,1203,1204,1208,1209,1410,1411,1503,1504,1505,1506,1553,1660,1661,1662,1918,1919)
      OR p_cfop IN (2201,2202,2203,2204,2208,2209,2410,2411,2503,2504,2505,2506,2553,2660,2661,2662,2918,2919)
      OR p_cfop IN (3201,3202,3211,3503,3553)) THEN
    ADD_BUSCA_ICMS_ST_ANTERIOR (
      p_config_64_casasDecSaidas,
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_cab_estabelecimento,
      p_cab_dataEntradaSaida,
      p_personalizacao,
      p_quantidade,
      p_calcularICMSSTAnterEfetivo,
      p_calcularFCP,
      p_gradProd_produto,
      p_gradProd_cor,
      p_gradProd_tamanho,
      p_prod_controleEstoque,
      v_baseICMSSTAnteriormente,
      v_valorICMSSTAnteriormente,
      v_valorICMSProprioSubstituto,
      v_baseFCPSTAnteriormente,
      v_valorFCPSTAnteriormente
    );
  END IF;
  /* ICMS ST Retido Anteriormente / Efetivo */
  IF p_calcularICMSSTAnterEfetivo = 1 THEN
    r_baseICMSSTAnteriormente := v_baseICMSSTAnteriormente;
    r_valorICMSSTAnteriormente := v_valorICMSSTAnteriormente;
    r_valorICMSProprioSubstituto := v_valorICMSProprioSubstituto;
    IF ((p_stSimplesNacional IS NULL OR p_stSimplesNacional = '   ') AND p_stICMS = '60' OR p_stSimplesNacional = '500') AND p_aliquotaICMSEfetivo <> 0 THEN
      r_baseICMSEfetivo :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        + CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END AND p_prod_tipoProduto IN ('07','08') OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END AND (p_cab_indicadorConsumidorFinal = '0' OR p_pess_indicadorInscricaoEstad = '9') THEN r_valorIPI + p_valorIPIDevolucao ELSE 0 END;
      r_baseICMSEfetivo := ROUND ((r_baseICMSEfetivo * (1 - p_reducaoBaseICMSEfetivo / 100)), 2);
      r_valorICMSEfetivo := ROUND ((r_baseICMSEfetivo * p_aliquotaICMSEfetivo / 100), 2);
    ELSE
      r_baseICMSEfetivo := 0;
      r_valorICMSEfetivo := 0;
    END IF;
  END IF;
  /* ICMS Escrituracao */
  IF p_calcularICMSEscrituracao = 1 THEN
    IF p_stICMSEscrituracao = p_stICMS
      AND p_aliquotaICMSEscrituracao = p_aliquotaICMS
      AND p_reducaoBaseICMSEscrituracao = p_reducaoBaseICMS
    THEN
      IF p_cab_nfFornecedor = 1 AND p_stICMSEscrituracao = '51' AND p_diferimentoICMS <> 0 AND p_diferimentoICMS <> p_reducaoBaseICMS THEN
        r_baseICMSEscrituracao := ROUND ((r_baseICMS * (1 - p_diferimentoICMS / 100)), 2);
      ELSE
        r_baseICMSEscrituracao := r_baseICMS;
      END IF;
      r_valorICMSEscrituracao := r_valorICMS;
      r_valorICMSDesonEscrituracao := r_valorICMS;
    ELSE
      r_baseICMSEscrituracao := 0;
      r_valorICMSEscrituracao := 0;
      r_valorICMSDesonEscrituracao := 0;
      IF p_aliquotaICMSEscrituracao > 0 AND p_stICMSEscrituracao IN ('40','41','50') THEN
        r_valorICMSDesonEscrituracao := ROUND (((
          p_valorProdutoServico
          + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
          - p_valorDescontoTotal
          + p_valorOutrasDespesasTotal
          + p_valorAdicFreteMarinMerTotal
          + p_valorDespesasAduaneirasTotal
          + r_valorII
          + r_valorIOF
          + CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END AND p_prod_tipoProduto IN ('07','08') OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END AND (p_cab_indicadorConsumidorFinal = '0' OR p_pess_indicadorInscricaoEstad = '9') THEN r_valorIPI + p_valorIPIDevolucao ELSE 0 END
        ) * p_aliquotaICMSEscrituracao / 100), 2);
      ELSIF p_aliquotaICMSEscrituracao > 0 AND (p_stICMSEscrituracao IN ('00','10','20','51','70') OR p_stICMSEscrituracao = '90' AND p_aliquotaICMSEscrituracao > 0) THEN
        r_baseICMSEscrituracao :=
          p_valorProdutoServico
          + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
          - p_valorDescontoTotal
          + p_valorOutrasDespesasTotal
          + p_valorAdicFreteMarinMerTotal
          + p_valorDespesasAduaneirasTotal
          + r_valorII
          + r_valorIOF
          + CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END AND p_prod_tipoProduto IN ('07','08') OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END AND (p_cab_indicadorConsumidorFinal = '0' OR p_pess_indicadorInscricaoEstad = '9') THEN r_valorIPI + p_valorIPIDevolucao ELSE 0 END;
        r_valorICMSEscrituracao := ROUND ((r_baseICMSEscrituracao * p_aliquotaICMSEscrituracao / 100), 2);
        IF p_stICMSEscrituracao IN ('20','70','90') AND p_reducaoBaseICMSEscrituracao > 0 THEN
          r_valorICMSDesonEscrituracao := ROUND ((r_baseICMSEscrituracao * p_aliquotaICMSEscrituracao / 100), 2);
          r_baseICMSEscrituracao := ROUND ((r_baseICMSEscrituracao * (1 - p_reducaoBaseICMSEscrituracao / 100)), 2);
          r_valorICMSEscrituracao := ROUND ((r_baseICMSEscrituracao * p_aliquotaICMSEscrituracao / 100), 2);
          r_valorICMSDesonEscrituracao := r_valorICMSDesonEscrituracao - r_valorICMSEscrituracao;
        ELSIF p_stICMSEscrituracao = '51' AND p_reducaoBaseICMSEscrituracao > 0 AND p_reducaoBaseICMSEscrituracao <> p_diferimentoICMS THEN
            r_baseICMSEscrituracao := ROUND ((r_baseICMSEscrituracao * (1 - p_reducaoBaseICMSEscrituracao / 100)), 2);
            r_valorICMSEscrituracao := ROUND ((r_baseICMSEscrituracao * p_aliquotaICMSEscrituracao / 100), 2);
            r_valorICMSDesonEscrituracao := 0;
        ELSE
          r_valorICMSDesonEscrituracao := 0;
        END IF;
        IF p_stICMSEscrituracao = '51' THEN
          r_valorICMSEscrituracao := r_valorICMSEscrituracao - ROUND ((r_valorICMSEscrituracao * p_diferimentoICMS / 100), 2);
          IF p_cab_nfFornecedor = 1 THEN
            r_baseICMSEscrituracao := ROUND ((r_baseICMSEscrituracao * (1 - p_diferimentoICMS / 100)), 2);
          END IF;
          IF r_valorICMSEscrituracao < 0 THEN
            r_valorICMSEscrituracao := 0;
          END IF;
        END IF;
      END IF;
    END IF;
  END IF;
  /* ICMS ST Escrituracao */
  IF p_calcularICMSSTEscrituracao = 1 THEN
    IF p_stICMSEscrituracao = p_stICMS
      AND p_aliquotaICMSEscrituracao = p_aliquotaICMS
      AND p_reducaoBaseICMSEscrituracao = p_reducaoBaseICMS
      AND p_margemValorAdicSTEscriturac = p_margemValorAdicionadoST
      AND p_reducaoBaseSTEscrituracao = p_reducaoBaseST
      AND p_aliquotaICMSSTEscrituracao = p_aliquotaICMSST
    THEN
      r_baseICMSSTEscrituracao := r_baseICMSST;
      r_valorICMSSTEscrituracao := r_valorICMSST;
    ELSIF p_stICMSEscrituracao IN ('10','30','70') OR p_stICMSEscrituracao = '90' AND p_aliquotaICMSSTEscrituracao > 0 THEN
      r_baseICMSSTEscrituracao := ROUND ((ROUND (((
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        + CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END AND p_prod_tipoProduto IN ('07','08') OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END AND (p_cab_indicadorConsumidorFinal = '0' OR p_pess_indicadorInscricaoEstad = '9') THEN r_valorIPI + p_valorIPIDevolucao ELSE 0 END
      ) * (1 + p_margemValorAdicSTEscriturac / 100)), 2) * (1 - p_reducaoBaseSTEscrituracao / 100)), 2);
      r_valorICMSSTEscrituracao := ROUND (((r_baseICMSSTEscrituracao * p_aliquotaICMSSTEscrituracao / 100) - r_valorICMSEscrituracao), 2);
      IF r_valorICMSSTEscrituracao <= 0 THEN
        r_baseICMSSTEscrituracao := 0;
        r_valorICMSSTEscrituracao := 0;
      END IF;
    ELSE
      r_baseICMSSTEscrituracao := 0;
      r_valorICMSSTEscrituracao := 0;
    END IF;
  END IF;
  /* DIFAL */
  IF p_calcularDIFAL = 1 THEN
    IF p_cab_localDestinoOperacao = '2' AND (p_cab_entradaSaida = 'E' OR p_cab_indicadorConsumidorFinal = '1' OR p_pess_indicadorInscricaoEstad = '9') AND p_aliquotaICMSUFDestinatario <> 0 AND p_aliquotaICMSInterestadual <> 0 THEN
      IF (p_stSimplesNacional IS NULL OR p_stSimplesNacional = '   ') AND r_baseICMS = 0 OR p_stSimplesNacional IS NOT NULL AND p_stSimplesNacional <> '   ' AND r_baseCreditoSimplesNacional = 0 THEN
        r_baseICMSUFDestinatario :=
          p_valorProdutoServico
          + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
          - p_valorDescontoTotal
          + p_valorOutrasDespesasTotal
          + p_valorAdicFreteMarinMerTotal
          + p_valorDespesasAduaneirasTotal
          + r_valorII
          + r_valorIOF
          + CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END AND p_prod_tipoProduto IN ('07','08') OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END AND (p_cab_indicadorConsumidorFinal = '0' OR p_pess_indicadorInscricaoEstad = '9') THEN r_valorIPI + p_valorIPIDevolucao ELSE 0 END;
      ELSE
        r_baseICMSUFDestinatario := CASE WHEN (p_stSimplesNacional IS NULL OR p_stSimplesNacional = '   ') THEN r_baseICMS ELSE r_baseCreditoSimplesNacional END;
      END IF;
      r_baseICMSUFRemetente := r_baseICMSUFDestinatario;
      r_valorICMSUFDestinatario := ROUND ((r_baseICMSUFDestinatario * ((p_aliquotaICMSUFDestinatario - p_aliquotaICMSInterestadual) / 100) * (p_partilhaICMSInterestadual / 100)), 2);
      r_valorICMSUFRemetente := ROUND ((r_baseICMSUFRemetente * ((p_aliquotaICMSUFDestinatario - p_aliquotaICMSInterestadual) / 100) * (1 - p_partilhaICMSInterestadual / 100)), 2);
    ELSE
      r_baseICMSUFDestinatario := 0;
      r_valorICMSUFDestinatario := 0;
      r_baseICMSUFRemetente := 0;
      r_valorICMSUFRemetente := 0;
    END IF;
  END IF;
  /* Fundo de Combate a Pobreza */
  IF p_calcularFCP = 1 THEN
    IF r_baseCreditoSimplesNacional <> 0 AND p_aliquotaFCP <> 0 THEN
      r_baseFCP := r_baseCreditoSimplesNacional;
      r_valorFCP := ROUND ((r_baseFCP * p_aliquotaFCP / 100), 2);
    ELSIF (p_stSimplesNacional IS NULL OR p_stSimplesNacional = '   ') AND p_stICMS IN ('00','20','51','90') AND r_baseICMS <> 0 AND p_aliquotaFCP <> 0 THEN
      r_baseFCP := r_baseICMS;
      r_valorFCP := ROUND ((r_baseFCP * p_aliquotaFCP / 100), 2);
    ELSE
      r_baseFCP := 0;
      r_valorFCP := 0;
    END IF;
    /* Fundo de Combate a Pobreza ST */
    IF r_baseICMSST <> 0 AND p_aliquotaFCPST <> 0 THEN
      r_baseFCPST := r_baseICMSST;
      r_valorFCPST := ROUND ((r_baseFCPST * p_aliquotaFCPST / 100), 2);
    ELSE
      r_baseFCPST := 0;
      r_valorFCPST := 0;
    END IF;
    /* Fundo de Combate a Pobreza ICMS ST Retido Anteriormente */
    r_baseFCPSTAnteriormente := v_baseFCPSTAnteriormente;
    r_valorFCPSTAnteriormente := v_valorFCPSTAnteriormente;
    /* Fundo de Combate a Pobreza DIFAL */
    IF p_cab_localDestinoOperacao = '2' AND (p_cab_entradaSaida = 'E' OR p_cab_indicadorConsumidorFinal = '1' OR p_pess_indicadorInscricaoEstad = '9') AND r_baseICMSUFDestinatario <> 0 AND p_aliquotaFCPUFDestinatario <> 0 THEN
      r_baseFCPUFDestinatario := r_baseICMSUFDestinatario;
      r_valorFCPUFDestinatario := ROUND ((r_baseFCPUFDestinatario * p_aliquotaFCPUFDestinatario / 100), 2);
    ELSE
      r_baseFCPUFDestinatario := 0;
      r_valorFCPUFDestinatario := 0;
    END IF;
  END IF;
  /* PIS */
  IF p_calcularPIS = 1 THEN
    IF p_aliquotaPIS > 0 THEN
      r_basePIS :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        - r_valorICMS;
      r_valorPIS := ROUND ((r_basePIS * p_aliquotaPIS / 100), 2);
    ELSE
      r_basePIS := 0;
      r_valorPIS := 0;
    END IF;
    IF p_valorAliquotaPIS > 0 THEN
      r_valorPIS := ROUND ((r_valorPIS + (p_quantidade * p_valorAliquotaPIS)), 2);
    END IF;
  END IF;
  /* PIS ST */
  IF p_calcularPISST = 1 THEN
    IF p_aliquotaPISST > 0 THEN
      r_basePISST :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        - r_valorICMS;
      r_valorPISST := ROUND ((r_basePISST * p_aliquotaPISST / 100), 2);
    ELSE
      r_basePISST := 0;
      r_valorPISST := 0;
    END IF;
    IF p_valorAliquotaPISST > 0 THEN
      r_valorPISST := ROUND ((r_valorPISST + (p_quantidade * p_valorAliquotaPISST)), 2);
    END IF;
  END IF;
  /* COFINS */
  IF p_calcularCOFINS = 1 THEN
    IF p_aliquotaCOFINS > 0 THEN
      r_baseCOFINS :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        - r_valorICMS;
      r_valorCOFINS := ROUND ((r_baseCOFINS * p_aliquotaCOFINS / 100), 2);
    ELSE
      r_baseCOFINS := 0;
      r_valorCOFINS := 0;
    END IF;
    IF p_valorAliquotaCOFINS > 0 THEN
      r_valorCOFINS := ROUND ((r_valorCOFINS + (p_quantidade * p_valorAliquotaCOFINS)), 2);
    END IF;
  END IF;
  /* COFINS ST */
  IF p_calcularCOFINSST = 1 THEN
    IF p_aliquotaCOFINSST > 0 THEN
      r_baseCOFINSST :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        - r_valorICMS;
      r_valorCOFINSST := ROUND ((r_baseCOFINSST * p_aliquotaCOFINSST / 100), 2);
    ELSE
      r_baseCOFINSST := 0;
      r_valorCOFINSST := 0;
    END IF;
    IF p_valorAliquotaCOFINSST > 0 THEN
      r_valorCOFINSST := ROUND ((r_valorCOFINSST + (p_quantidade * p_valorAliquotaCOFINSST)), 2);
    END IF;
  END IF;
  /* Impostos Estimados */
  IF p_calcularImpostosEstimados = 1 THEN
    IF p_aliquotaEstImpFederais > 0 OR p_aliquotaEstImpEstaduais > 0 OR p_aliquotaEstImpMunicipais > 0 THEN
      r_baseEstimadaImpostos :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal;
      r_valorEstimadoImpFederais := ROUND ((r_baseEstimadaImpostos * p_aliquotaEstImpFederais / 100), 2);
      r_valorEstimadoImpEstaduais := ROUND ((r_baseEstimadaImpostos * p_aliquotaEstImpEstaduais / 100), 2);
      r_valorEstimadoImpMunicipais := ROUND ((r_baseEstimadaImpostos * p_aliquotaEstImpMunicipais / 100), 2);
    ELSE
      r_baseEstimadaImpostos := 0;
      r_valorEstimadoImpFederais := 0;
      r_valorEstimadoImpEstaduais := 0;
      r_valorEstimadoImpMunicipais := 0;
    END IF;
  END IF;
END ADD_CALCULA_IMPOSTOS_ITEM;

/

create or replace PROCEDURE ADD_TEMP_MARGEM_ITEM_GRAVA (
    p_uniqueMachineID              IN VARCHAR2,
    p_config_65_casasDecEntrada    IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_regMarg_tipoPreco            IN CHAR,
    p_regMarg_tabelaPreco          IN VARCHAR2,
    p_regMarg_fatorMultiplicador   IN NUMBER,
    p_regMarg_tipoPrecoB           IN CHAR,
    p_regMarg_tabelaPrecoB         IN VARCHAR2,
    p_regMarg_fatorMultiplicadorB  IN NUMBER,
    p_regMarg_reduzirImpostos      IN NUMBER,
    p_regMarg_reduzirTarifaCartao  IN NUMBER,
    p_regMarg_taxaCapitacaoCustoFi IN NUMBER,
    p_regMarg_exibImagemMargemCab  IN NUMBER,
    p_regMarg_regraImagemCab       IN NUMBER,
    p_regMarg_exibImagemMargemItem IN NUMBER,
    p_regMarg_regraImagemItem      IN NUMBER,
    p_DocFiscal_PreDoc_Orcamento   IN CHAR,
    p_cab_id                       IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPreco                IN DATE,
    p_cab_prazoMedioPonderado      IN NUMBER,
    p_cab_valorFreteTotal          IN NUMBER,
    p_cab_valorSeguroTotal         IN NUMBER,
    p_cab_valorAdicFreteMarTotal   IN NUMBER,
    p_cab_valorDespesasAduanTotal  IN NUMBER,
    p_cab_valorLiquidoItem         IN NUMBER,
    p_cab_valorTarifaCartao        IN NUMBER,
    p_cab_valorMargem              IN NUMBER,
    p_munEndEst_uf                 IN CHAR,
    p_item_sequencia               IN NUMBER,
    p_item_ini_cancelado           IN NUMBER,
    p_item_cancelado               IN NUMBER,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_item_valorFreteTotal         IN NUMBER,
    p_item_valorSeguroTotal        IN NUMBER,
    p_item_valorAdicFreteMarTotal  IN NUMBER,
    p_item_valorDespesasAduanTotal IN NUMBER,
    p_item_valorII                 IN NUMBER,
    p_item_valorIOF                IN NUMBER,
    p_item_valorIPI                IN NUMBER,
    p_item_valorIPIDevolucao       IN NUMBER,
    p_item_valorPIS                IN NUMBER,
    p_item_valorPISST              IN NUMBER,
    p_item_valorCOFINS             IN NUMBER,
    p_item_valorCOFINSST           IN NUMBER,
    p_item_valorCreditoSimplesNac  IN NUMBER,
    p_item_valorICMSOperacao       IN NUMBER,
    p_item_valorICMSDiferido       IN NUMBER,
    p_item_valorICMS               IN NUMBER,
    p_item_valorICMSDesoneracao    IN NUMBER,
    p_item_valorICMSST             IN NUMBER,
    p_item_valorICMSSTAnteriorm    IN NUMBER,
    p_item_valorICMSUFDestinatario IN NUMBER,
    p_item_valorICMSUFRemetente    IN NUMBER,
    p_item_valorFCP                IN NUMBER,
    p_item_valorFCPST              IN NUMBER,
    p_item_valorFCPSTAnteriormente IN NUMBER,
    p_item_valorFCPUFDestinatario  IN NUMBER,
    p_item_valorLiquidoItem        IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_prod_controleEstoque         IN NUMBER,
    p_locEst_indicadorPropPosseIt  IN CHAR,
    /* Retornos */
    r_cab_valorMargem              OUT NUMBER,
    r_cab_percentualMargem         OUT NUMBER,
    r_cab_imagemMargem             OUT VARCHAR2,
    r_item_valorLiquidoSemFreteSeg OUT NUMBER,
    r_item_valorCaptacao           OUT NUMBER,
    r_item_valorTarifaCartao       OUT NUMBER,
    r_item_valorImpostos           OUT NUMBER,
    r_item_precoCusto              OUT NUMBER,
    r_item_valorCusto              OUT NUMBER,
    r_item_valorMargem             OUT NUMBER,
    r_item_percentualMargem        OUT NUMBER,
    r_item_imagemMargem            OUT VARCHAR2)
IS
BEGIN
  SELECT COALESCE (MAX (temp.valorMargem), 0)
  INTO r_item_valorMargem
  FROM TEMPMARGEMCONTRIBUICAO temp
  WHERE temp.uniqueMachineID = p_uniqueMachineID
  AND temp.orcamentoPredocumentoDocumento = p_DocFiscal_PreDoc_Orcamento
  AND temp.idCabecalho = p_cab_id
  AND temp.sequencia = p_item_sequencia;
  r_cab_valorMargem := p_cab_valorMargem;
  IF p_item_ini_cancelado = 0 THEN
    r_cab_valorMargem := r_cab_valorMargem - r_item_valorMargem;
  END IF;
  ADD_CALCULA_MARGEM_CONTRIB (
    p_config_65_casasDecEntrada,
    p_config_209_filtrarGrupoEcon,
    p_config_362_calcCustoPorGrade,
    p_regMarg_tipoPreco,
    p_regMarg_tabelaPreco,
    p_regMarg_fatorMultiplicador,
    p_regMarg_tipoPrecoB,
    p_regMarg_tabelaPrecoB,
    p_regMarg_fatorMultiplicadorB,
    p_regMarg_reduzirImpostos,
    p_regMarg_reduzirTarifaCartao,
    p_regMarg_taxaCapitacaoCustoFi,
    p_regMarg_exibImagemMargemItem,
    p_regMarg_regraImagemItem,
    p_cab_estabelecimento,
    p_cab_dataPreco,
    p_cab_prazoMedioPonderado,
    p_cab_valorLiquidoItem,
    p_cab_valorTarifaCartao,
    p_munEndEst_uf,
    p_item_idFormulaTinta,
    p_item_personalizacao,
    p_item_localEstoque,
    p_item_pessoaParticipante,
    p_item_quantidade,
    p_item_valorFreteTotal,
    p_item_valorSeguroTotal,
    p_item_valorAdicFreteMarTotal,
    p_item_valorDespesasAduanTotal,
    p_item_valorII,
    p_item_valorIOF,
    p_item_valorIPI,
    p_item_valorIPIDevolucao,
    p_item_valorPIS,
    p_item_valorPISST,
    p_item_valorCOFINS,
    p_item_valorCOFINSST,
    p_item_valorCreditoSimplesNac,
    p_item_valorICMSOperacao,
    p_item_valorICMSDiferido,
    p_item_valorICMS,
    p_item_valorICMSDesoneracao,
    p_item_valorICMSST,
    p_item_valorICMSSTAnteriorm,
    p_item_valorICMSUFDestinatario,
    p_item_valorICMSUFRemetente,
    p_item_valorFCP,
    p_item_valorFCPST,
    p_item_valorFCPSTAnteriormente,
    p_item_valorFCPUFDestinatario,
    p_item_valorLiquidoItem,
    p_gradProd_produto,
    p_gradProd_cor,
    p_gradProd_tamanho,
    p_prod_controleEstoque,
    p_locEst_indicadorPropPosseIt,
    /* Retornos */
    r_item_valorLiquidoSemFreteSeg,
    r_item_valorCaptacao,
    r_item_valorTarifaCartao,
    r_item_valorImpostos,
    r_item_precoCusto,
    r_item_valorCusto,
    r_item_valorMargem,
    r_item_percentualMargem);
  IF p_regMarg_exibImagemMargemItem = 1 AND p_regMarg_regraImagemItem <> 0 THEN
    r_item_imagemMargem := FUNC_ADD_BUSCA_IMAGEM_FAIXA (p_regMarg_regraImagemItem, r_item_percentualMargem);
  ELSE
    r_item_imagemMargem := ' ';
  END IF;
  IF p_item_cancelado = 0 THEN
    r_cab_valorMargem := r_cab_valorMargem + r_item_valorMargem;
  END IF;
  r_cab_percentualMargem := 
    CASE
      WHEN p_cab_valorLiquidoItem - p_cab_valorFreteTotal - p_cab_valorSeguroTotal - p_cab_valorAdicFreteMarTotal - p_cab_valorDespesasAduanTotal <= 0
      THEN 0
      ELSE ROUND ((100 * r_cab_valorMargem / (p_cab_valorLiquidoItem - p_cab_valorFreteTotal - p_cab_valorSeguroTotal - p_cab_valorAdicFreteMarTotal - p_cab_valorDespesasAduanTotal)), 8)
    END;
  IF p_regMarg_exibImagemMargemCab = 1 AND p_regMarg_regraImagemCab <> 0 THEN
    r_cab_imagemMargem := FUNC_ADD_BUSCA_IMAGEM_FAIXA (p_regMarg_regraImagemCab, r_cab_valorMargem);
  ELSE
    r_cab_imagemMargem := ' ';
  END IF;
  MERGE INTO TEMPMARGEMCONTRIBUICAO a 
  USING (
    SELECT
      p_uniqueMachineID              uniqueMachineID,
      p_DocFiscal_PreDoc_Orcamento   orcamentoPredocumentoDocumento,
      p_cab_id                       idCabecalho,
      p_item_sequencia               sequencia,
      r_item_valorLiquidoSemFreteSeg valorLiquidoSemFreteSeguro,
      r_item_valorCaptacao           valorCaptacao,
      r_item_valorTarifaCartao       valorTarifaCartao,
      r_item_valorImpostos           valorImpostos,
      r_item_precoCusto              precoCusto,
      r_item_valorCusto              valorCusto,
      r_item_valorMargem             valorMargem,
      r_item_percentualMargem        percentualMargem,
      r_item_imagemMargem            imagemMargem
    FROM DUAL
  ) b ON (
    a.uniqueMachineID = b.uniqueMachineID 
    AND a.orcamentoPredocumentoDocumento = b.orcamentoPredocumentoDocumento
    AND a.idCabecalho = b.idCabecalho
    AND a.sequencia = b.sequencia)
  WHEN MATCHED THEN UPDATE SET
    a.valorLiquidoSemFreteSeguro     = b.valorLiquidoSemFreteSeguro,
    a.valorCaptacao                  = b.valorCaptacao,
    a.valorTarifaCartao              = b.valorTarifaCartao,
    a.valorImpostos                  = b.valorImpostos,
    a.precoCusto                     = b.precoCusto,
    a.valorCusto                     = b.valorCusto,
    a.valorMargem                    = b.valorMargem,
    a.percentualMargem               = b.percentualMargem,
    a.imagemMargem                   = b.imagemMargem
  WHEN NOT MATCHED THEN INSERT (
    uniqueMachineID,
    orcamentoPredocumentoDocumento,
    idCabecalho,
    sequencia,
    valorLiquidoSemFreteSeguro,
    valorCaptacao,
    valorTarifaCartao,
    valorImpostos,
    precoCusto,
    valorCusto,
    valorMargem,
    percentualMargem,
    imagemMargem
  ) VALUES (
    b.uniqueMachineID,
    b.orcamentoPredocumentoDocumento,
    b.idCabecalho,
    b.sequencia,
    b.valorLiquidoSemFreteSeguro,
    b.valorCaptacao,
    b.valorTarifaCartao,
    b.valorImpostos,
    b.precoCusto,
    b.valorCusto,
    b.valorMargem,
    b.percentualMargem,
    b.imagemMargem);
END ADD_TEMP_MARGEM_ITEM_GRAVA;

/

create or replace PROCEDURE ADD_ESTOQUE_KIT(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_bufferIdEstoque              IN VARCHAR2,
    p_estabelecimentoAtivo         IN NUMBER,
    p_cab_modeloDocumento          IN NUMBER,
    p_cab_operacaoInternaEstoque   IN NUMBER,
    p_cab_atualizaCustoMedio       IN NUMBER,
    p_cab_atualizaUltimaCompra     IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEmissao              IN DATE,
    p_cab_dataEntradaSaida         IN DATE,
    p_modDoc_geraTransferencia     IN NUMBER,
    p_modDoc_geraOperacaoEmTransit IN NUMBER,
    p_modDoc_transitoLocalEstoque  IN NUMBER,
    p_locEstTransito_indicProprPos IN CHAR,
    p_item_gradeProduto            IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_item_valorCustoOperacao      IN NUMBER,
    p_item_observacoes             IN VARCHAR2,
    p_idEnderecoEstoque            IN NUMBER,
    p_locEst_indicProprPosseItem   IN CHAR,
    p_idItemPreDocumento           IN NUMBER,
    p_idItemDocFiscal              IN NUMBER,
    p_idItemSeparacao              IN NUMBER,
    p_divergenciaBalanco           IN NUMBER,
    p_idItemDocTransferencia       IN NUMBER,
    p_docTransf_estabelecEntrada   IN NUMBER,
    p_docTransf_estabelecSaida     IN NUMBER,
    r_bufferIdEstoque              OUT VARCHAR2)
IS
  v_quantidadeRateioTotal NUMBER;
  v_quantSaldoRateioTotal NUMBER;
  v_valorSaldoRateioTotal NUMBER;
  v_valorCustoManter      NUMBER;
  v_precoCustoKit         NUMBER;
  v_valorCustoKit         NUMBER;
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  IF p_cab_atualizaCustoMedio = 1 THEN
    SELECT COALESCE(SUM(ROUND(p_item_quantidade * kit.quantidade, uniFilho.casasDecimaisUnidadeMedida)),0)
    INTO v_quantidadeRateioTotal
    FROM CAGRADEPRODUTOXKITSCOMBOS kit 
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = kit.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE kit.gradeProduto = p_item_gradeProduto
    AND kit.ativo = 1
    AND kit.manterUltimoCusto = 0
    AND kit.gradeProduto <> kit.gradeProdutoFilho;
    SELECT ROUND((COALESCE(SUM(ROUND(p_item_quantidade * kit.quantidade, uniFilho.casasDecimaisUnidadeMedida)
      * FUNC_ADD_BUSCA_PRECO_ULT_CUSTO(
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          TO_DATE ('01/01/1900','DD/MM/YYYY'), --p_cab_dataPrecoInicial
          CASE
            WHEN p_cab_dataEntradaSaida IS NULL
              OR p_cab_dataEntradaSaida < p_cab_dataEmissao
            THEN p_cab_dataEmissao
            ELSE p_cab_dataEntradaSaida
          END, --p_cab_dataPrecoFinal
          0, -- p_item_personalizacao
          p_item_pessoaParticipante,
          gradProdFilho.produto,
          gradProdFilho.cor,
          gradProdFilho.tamanho,
          p_locEst_indicProprPosseItem,
          0) --p_gerandoInventario
          ),0)),2)
    INTO v_valorCustoManter
    FROM CAGRADEPRODUTOXKITSCOMBOS kit 
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = kit.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE kit.gradeProduto = p_item_gradeProduto
    AND kit.ativo = 1
    AND kit.manterUltimoCusto = 1
    AND kit.gradeProduto <> kit.gradeProdutoFilho;
  ELSE
    v_quantidadeRateioTotal := 0;
    v_valorCustoManter      := 0;
  END IF;
  v_quantSaldoRateioTotal := v_quantidadeRateioTotal;
  v_valorSaldoRateioTotal := p_item_valorCustoOperacao - v_valorCustoManter;
  FOR a IN (
    SELECT 
      kit.gradeProdutoFilho,
      kit.manterUltimoCusto,
      gradProdFilho.produto,
      gradProdFilho.cor,
      gradProdFilho.tamanho,
      prodFilho.controleEstoque,
      ROUND(p_item_quantidade * kit.quantidade, uniFilho.casasDecimaisUnidadeMedida) quantidade
    FROM CAGRADEPRODUTOXKITSCOMBOS kit 
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = kit.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE kit.gradeProduto = p_item_gradeProduto
    AND kit.ativo = 1
    AND kit.gradeProduto <> kit.gradeProdutoFilho
    AND ROUND(p_item_quantidade * kit.quantidade, uniFilho.casasDecimaisUnidadeMedida) > 0)
  LOOP
    IF p_cab_atualizaCustoMedio = 1 AND a.manterUltimoCusto = 1 THEN
      v_precoCustoKit := FUNC_ADD_BUSCA_PRECO_ULT_CUSTO(
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          TO_DATE ('01/01/1900','DD/MM/YYYY'), --p_cab_dataPrecoInicial
          CASE
            WHEN p_cab_dataEntradaSaida IS NULL
              OR p_cab_dataEntradaSaida < p_cab_dataEmissao
            THEN p_cab_dataEmissao
            ELSE p_cab_dataEntradaSaida
          END, --p_cab_dataPrecoFinal
          0, -- p_item_personalizacao
          p_item_pessoaParticipante,
          a.produto,
          a.cor,
          a.tamanho,
          p_locEst_indicProprPosseItem,
          0); --p_gerandoInventario
      v_valorCustoKit := ROUND (a.quantidade * v_precoCustoKit,2);
    ELSIF p_cab_atualizaCustoMedio = 1 AND p_item_valorCustoOperacao > v_valorCustoManter AND v_quantSaldoRateioTotal > a.quantidade THEN
      v_valorCustoKit := ROUND((p_item_valorCustoOperacao - v_valorCustoManter) * a.quantidade / v_quantidadeRateioTotal,2);
      v_precoCustoKit := ROUND(v_valorCustoKit / a.quantidade,7);
      v_quantSaldoRateioTotal := v_quantSaldoRateioTotal - a.quantidade;
      v_valorSaldoRateioTotal := v_valorSaldoRateioTotal - v_valorCustoKit;
    ELSIF p_cab_atualizaCustoMedio = 1 AND v_valorSaldoRateioTotal > 0 THEN
      v_valorCustoKit := v_valorSaldoRateioTotal;
      v_precoCustoKit := ROUND(v_valorCustoKit / a.quantidade,7);
      v_quantSaldoRateioTotal := 0;
      v_valorSaldoRateioTotal := 0;
    ELSE
      v_precoCustoKit := 0;
      v_valorCustoKit := 0;
    END IF;
    IF a.controleEstoque IN (3,4) THEN
      ADD_ESTOQUE_KIT(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        a.gradeProdutoFilho,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidade,
        v_valorCustoKit,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        r_bufferIdEstoque);
    ELSIF a.controleEstoque IN(1,5,11,12) THEN
      ADD_ESTOQUE_INSERE(
        r_bufferIdEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_estabelecimento,
        CASE
          WHEN p_cab_dataEntradaSaida IS NULL
            OR p_cab_dataEntradaSaida < p_cab_dataEmissao
          THEN p_cab_dataEmissao
          ELSE p_cab_dataEntradaSaida
        END, --p_data
        a.gradeProdutoFilho,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_locEst_indicProprPosseItem,
        p_item_pessoaParticipante,
        p_item_localEstoque,
        0, -- p_personalizacao
        0, -- p_idLoteEstoque
        p_idEnderecoEstoque,
        0, -- p_idNumeroSerie
        a.quantidade,
        v_precoCustoKit, -- p_precoCustoOperacao
        v_valorCustoKit, -- p_totalCustoOperacao
        0, -- p_precoCMV
        0, -- p_valorCMV
        p_item_observacoes,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        r_bufferIdEstoque);
      IF p_modDoc_geraTransferencia = 1
        AND p_modDoc_geraOperacaoEmTransit = 1
        AND p_modDoc_transitoLocalEstoque > 0
        AND p_docTransf_estabelecEntrada > 0
        AND p_docTransf_estabelecSaida > 0
      THEN
        ADD_ESTOQUE_INSERE(
          r_bufferIdEstoque, 
          p_estabelecimentoAtivo, 
          p_docTransf_estabelecSaida,
          CASE
            WHEN p_cab_dataEntradaSaida IS NULL
              OR p_cab_dataEntradaSaida < p_cab_dataEmissao
            THEN p_cab_dataEmissao
            ELSE p_cab_dataEntradaSaida
          END, --p_data
          a.gradeProdutoFilho,
          p_cab_modeloDocumento,
          900, --p__operacaoInternaEstoque
          0, --p_atualizaCustoMedio
          0, --p_atualizaUltimaCompra
          CASE
            WHEN p_cab_entradaSaida = 'S'
            THEN 'E'
            ELSE 'S'
          END, --p_entradaSaida
          p_locEstTransito_indicProprPos,
          p_item_pessoaParticipante,
          p_modDoc_transitoLocalEstoque,
          0, -- p_personalizacao
          0, -- p_idLoteEstoque
          p_idEnderecoEstoque,
          0, -- p_idNumeroSerie
          a.quantidade,
          v_precoCustoKit, -- p_precoCustoOperacao
          v_valorCustoKit, -- p_totalCustoOperacao
          0, -- p_precoCMV
          0, -- p_valorCMV
          p_item_observacoes,
          p_idItemPreDocumento,
          p_idItemDocFiscal,
          p_idItemSeparacao,
          p_divergenciaBalanco,
          p_idItemDocTransferencia,
          r_bufferIdEstoque);
      END IF;    
    END IF;
  END LOOP;
END ADD_ESTOQUE_KIT;

/

create or replace PROCEDURE ADD_ESTOQUE_PRODUTO_TINTA(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_bufferIdEstoque              IN VARCHAR2,
    p_estabelecimentoAtivo         IN NUMBER,
    p_cab_modeloDocumento          IN NUMBER,
    p_cab_operacaoInternaEstoque   IN NUMBER,
    p_cab_atualizaCustoMedio       IN NUMBER,
    p_cab_atualizaUltimaCompra     IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEmissao              IN DATE,
    p_cab_dataEntradaSaida         IN DATE,
    p_modDoc_geraTransferencia     IN NUMBER,
    p_modDoc_geraOperacaoEmTransit IN NUMBER,
    p_modDoc_transitoLocalEstoque  IN NUMBER,
    p_locEstTransito_indicProprPos IN CHAR,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_item_observacoes             IN VARCHAR2,
    p_idEnderecoEstoque            IN NUMBER,
    p_locEst_indicProprPosseItem   IN CHAR,
    p_idItemPreDocumento           IN NUMBER,
    p_idItemDocFiscal              IN NUMBER,
    p_idItemSeparacao              IN NUMBER,
    p_divergenciaBalanco           IN NUMBER,
    p_idItemDocTransferencia       IN NUMBER,
    p_docTransf_estabelecEntrada   IN NUMBER,
    p_docTransf_estabelecSaida     IN NUMBER,
    p_tinta_gradeProduto           IN NUMBER,
    p_tinta_quantidade             IN NUMBER,
    r_bufferIdEstoque              OUT VARCHAR2)
IS
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR a IN (
    SELECT 
      prod.controleEstoque,
      ROUND(p_item_quantidade * p_tinta_quantidade / 900, uniMed.casasDecimaisUnidadeMedida) quantidade
    FROM CAGRADESPRODUTO gradProd 
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN SIUNIDADESMEDIDA uniMed
    ON uniMed.unidadeMedida = prod.unidadeMedida
    WHERE gradProd.gradeProduto = p_tinta_gradeProduto
    AND ROUND(p_item_quantidade * p_tinta_quantidade / 900, uniMed.casasDecimaisUnidadeMedida) > 0)
  LOOP
    IF a.controleEstoque IN (3,4) THEN
      ADD_ESTOQUE_KIT(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_tinta_gradeProduto,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidade,
        0, --p_item_valorCustoOperacao
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        r_bufferIdEstoque);
    ELSIF a.controleEstoque IN(1,5,11,12) THEN
      ADD_ESTOQUE_INSERE(
        r_bufferIdEstoque,
        p_estabelecimentoAtivo, 
        p_cab_estabelecimento,
        CASE
          WHEN p_cab_dataEntradaSaida IS NULL
            OR p_cab_dataEntradaSaida < p_cab_dataEmissao
          THEN p_cab_dataEmissao
          ELSE p_cab_dataEntradaSaida
        END, --p_data
        p_tinta_gradeProduto,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_locEst_indicProprPosseItem,
        p_item_pessoaParticipante,
        p_item_localEstoque,
        0, -- p_personalizacao
        0, -- p_idLoteEstoque
        p_idEnderecoEstoque,
        0, -- p_idNumeroSerie
        a.quantidade,
        0, -- p_precoCustoOperacao,
        0, -- p_totalCustoOperacao,
        0, -- p_precoCMV,
        0, -- p_valorCMV,
        p_item_observacoes,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        r_bufferIdEstoque);
      IF p_modDoc_geraTransferencia = 1
        AND p_modDoc_geraOperacaoEmTransit = 1
        AND p_modDoc_transitoLocalEstoque > 0
        AND p_docTransf_estabelecEntrada > 0
        AND p_docTransf_estabelecSaida > 0
      THEN
        ADD_ESTOQUE_INSERE(
          r_bufferIdEstoque,
          p_estabelecimentoAtivo, 
          p_docTransf_estabelecSaida,
          CASE
            WHEN p_cab_dataEntradaSaida IS NULL
              OR p_cab_dataEntradaSaida < p_cab_dataEmissao
            THEN p_cab_dataEmissao
            ELSE p_cab_dataEntradaSaida
          END, --p_data
          p_tinta_gradeProduto,
          p_cab_modeloDocumento,
          900, --p_operacaoInternaEstoque
          0, --p_atualizaCustoMedio
          0, --p_atualizaUltimaCompra
          CASE
            WHEN p_cab_entradaSaida = 'S'
            THEN 'E'
            ELSE 'S'
          END, --p_entradaSaida
          p_locEstTransito_indicProprPos,
          p_item_pessoaParticipante,
          p_modDoc_transitoLocalEstoque,
          0, -- p_personalizacao
          0, -- p_idLoteEstoque
          p_idEnderecoEstoque,
          0, -- p_idNumeroSerie
          a.quantidade,
          0, -- p_precoCustoOperacao,
          0, -- p_totalCustoOperacao,
          0, -- p_precoCMV,
          0, -- p_valorCMV,
          p_item_observacoes,
          p_idItemPreDocumento,
          p_idItemDocFiscal,
          p_idItemSeparacao,
          p_divergenciaBalanco,
          p_idItemDocTransferencia,
          r_bufferIdEstoque);
      END IF;
    END IF;    
  END LOOP;
END ADD_ESTOQUE_PRODUTO_TINTA;

/

create or replace PROCEDURE ADD_ESTOQUE_FORMULA_TINTA(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_bufferIdEstoque              IN VARCHAR2,
    p_estabelecimentoAtivo         IN NUMBER,
    p_cab_modeloDocumento          IN NUMBER,
    p_cab_operacaoInternaEstoque   IN NUMBER,
    p_cab_atualizaCustoMedio       IN NUMBER,
    p_cab_atualizaUltimaCompra     IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEmissao              IN DATE,
    p_cab_dataEntradaSaida         IN DATE,
    p_modDoc_geraTransferencia     IN NUMBER,
    p_modDoc_geraOperacaoEmTransit IN NUMBER,
    p_modDoc_transitoLocalEstoque  IN NUMBER,
    p_locEstTransito_indicProprPos IN CHAR,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_item_observacoes             IN VARCHAR2,
    p_idEnderecoEstoque            IN NUMBER,
    p_locEst_indicProprPosseItem   IN CHAR,
    p_idItemPreDocumento           IN NUMBER,
    p_idItemDocFiscal              IN NUMBER,
    p_idItemSeparacao              IN NUMBER,
    p_divergenciaBalanco           IN NUMBER,
    p_idItemDocTransferencia       IN NUMBER,
    p_docTransf_estabelecEntrada   IN NUMBER,
    p_docTransf_estabelecSaida     IN NUMBER,
    r_bufferIdEstoque              OUT VARCHAR2)
IS
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR a IN (
    SELECT 
      a.idBaseTinta,
      baseTinta.gradeProduto,
      a.idColoranteTintaA,
      a.quantidadeA,
      COALESCE(colTintaA.gradeProduto,0) gradeProdutoA,
      a.idColoranteTintaB,
      a.quantidadeB,
      COALESCE(colTintaB.gradeProduto,0) gradeProdutoB,
      a.idColoranteTintaC,
      a.quantidadeC,
      COALESCE(colTintaC.gradeProduto,0) gradeProdutoC,
      a.idColoranteTintaD,
      a.quantidadeD,
      COALESCE(colTintaD.gradeProduto,0) gradeProdutoD,
      a.idColoranteTintaE,
      a.quantidadeE,
      COALESCE(colTintaE.gradeProduto,0) gradeProdutoE,
      a.idColoranteTintaF,
      a.quantidadeF,
      COALESCE(colTintaF.gradeProduto,0) gradeProdutoF,
      a.idColoranteTintaG,
      a.quantidadeG,
      COALESCE(colTintaG.gradeProduto,0) gradeProdutoG,
      a.idColoranteTintaH,
      a.quantidadeH,
      COALESCE(colTintaH.gradeProduto,0) gradeProdutoH,
      a.idColoranteTintaI,
      a.quantidadeI,
      COALESCE(colTintaI.gradeProduto,0) gradeProdutoI,
      a.idColoranteTintaJ,
      a.quantidadeJ,
      COALESCE(colTintaJ.gradeProduto,0) gradeProdutoJ,
      a.idColoranteTintaK,
      a.quantidadeK,
      COALESCE(colTintaK.gradeProduto,0) gradeProdutoK,
      a.idColoranteTintaL,
      a.quantidadeL,
      COALESCE(colTintaL.gradeProduto,0) gradeProdutoL,
      a.idColoranteTintaM,
      a.quantidadeM,
      COALESCE(colTintaM.gradeProduto,0) gradeProdutoM,
      a.idColoranteTintaN,
      a.quantidadeN,
      COALESCE(colTintaN.gradeProduto,0) gradeProdutoN,
      a.idColoranteTintaO,
      a.quantidadeO,
      COALESCE(colTintaO.gradeProduto,0) gradeProdutoO
    FROM CAFORMULASTINTAS a
    JOIN CABASESTINTAS baseTinta
    ON baseTinta.idBaseTinta = a.idBaseTinta
    JOIN CACOLORANTESTINTAS colTintaA
    ON colTintaA.idColoranteTinta = a.idColoranteTintaA
    JOIN CACOLORANTESTINTAS colTintaB
    ON colTintaB.idColoranteTinta = a.idColoranteTintaB
    JOIN CACOLORANTESTINTAS colTintaC
    ON colTintaC.idColoranteTinta = a.idColoranteTintaC
    JOIN CACOLORANTESTINTAS colTintaD
    ON colTintaD.idColoranteTinta = a.idColoranteTintaD
    JOIN CACOLORANTESTINTAS colTintaE
    ON colTintaE.idColoranteTinta = a.idColoranteTintaE
    JOIN CACOLORANTESTINTAS colTintaF
    ON colTintaF.idColoranteTinta = a.idColoranteTintaF
    JOIN CACOLORANTESTINTAS colTintaG
    ON colTintaG.idColoranteTinta = a.idColoranteTintaG
    JOIN CACOLORANTESTINTAS colTintaH
    ON colTintaH.idColoranteTinta = a.idColoranteTintaH
    JOIN CACOLORANTESTINTAS colTintaI
    ON colTintaI.idColoranteTinta = a.idColoranteTintaI
    JOIN CACOLORANTESTINTAS colTintaJ
    ON colTintaJ.idColoranteTinta = a.idColoranteTintaJ
    JOIN CACOLORANTESTINTAS colTintaK
    ON colTintaK.idColoranteTinta = a.idColoranteTintaK
    JOIN CACOLORANTESTINTAS colTintaL
    ON colTintaL.idColoranteTinta = a.idColoranteTintaL
    JOIN CACOLORANTESTINTAS colTintaM
    ON colTintaM.idColoranteTinta = a.idColoranteTintaM
    JOIN CACOLORANTESTINTAS colTintaN
    ON colTintaN.idColoranteTinta = a.idColoranteTintaN
    JOIN CACOLORANTESTINTAS colTintaO
    ON colTintaO.idColoranteTinta = a.idColoranteTintaO
    WHERE a.idFormulaTinta = p_item_idFormulaTinta
    AND a.idBaseTinta > 0
    AND baseTinta.gradeProduto > 0)
  LOOP
    ADD_ESTOQUE_PRODUTO_TINTA(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      r_bufferIdEstoque,
      p_estabelecimentoAtivo,
      p_cab_modeloDocumento,
      p_cab_operacaoInternaEstoque,
      p_cab_atualizaCustoMedio,
      p_cab_atualizaUltimaCompra,
      p_cab_entradaSaida,
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_cab_dataEntradaSaida,
      p_modDoc_geraTransferencia,
      p_modDoc_geraOperacaoEmTransit,
      p_modDoc_transitoLocalEstoque,
      p_locEstTransito_indicProprPos,
      p_item_localEstoque,
      p_item_pessoaParticipante,
      p_item_quantidade,
      p_item_observacoes,
      p_idEnderecoEstoque,
      p_locEst_indicProprPosseItem,
      p_idItemPreDocumento,
      p_idItemDocFiscal,
      p_idItemSeparacao,
      p_divergenciaBalanco,
      p_idItemDocTransferencia,
      p_docTransf_estabelecEntrada,
      p_docTransf_estabelecSaida,
      a.gradeProduto,
      900, -- p_quantidade,
      r_bufferIdEstoque);    
    IF a.idColoranteTintaA > 0
      AND a.gradeProdutoA > 0
      AND a.quantidadeA > 0
    THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        a.gradeProdutoA,
        a.quantidadeA,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaB > 0
      AND a.gradeProdutoB > 0
      AND a.quantidadeB > 0
    THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        a.gradeProdutoB,
        a.quantidadeB,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaC > 0
      AND a.gradeProdutoC > 0
      AND a.quantidadeC > 0
    THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        a.gradeProdutoC,
        a.quantidadeC,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaD > 0
      AND a.gradeProdutoD > 0
      AND a.quantidadeD > 0
    THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        a.gradeProdutoD,
        a.quantidadeD,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaE > 0
      AND a.gradeProdutoE > 0
      AND a.quantidadeE > 0
    THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        a.gradeProdutoE,
        a.quantidadeE,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaF > 0
      AND a.gradeProdutoF > 0
      AND a.quantidadeF > 0
    THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        a.gradeProdutoF,
        a.quantidadeF,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaG > 0
      AND a.gradeProdutoG > 0
      AND a.quantidadeG > 0
    THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        a.gradeProdutoG,
        a.quantidadeG,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaH > 0
      AND a.gradeProdutoH > 0
      AND a.quantidadeH > 0
    THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        a.gradeProdutoH,
        a.quantidadeH,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaI > 0
      AND a.gradeProdutoI > 0
      AND a.quantidadeI > 0
    THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        a.gradeProdutoI,
        a.quantidadeI,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaJ > 0
      AND a.gradeProdutoJ > 0
      AND a.quantidadeJ > 0
    THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        a.gradeProdutoJ,
        a.quantidadeJ,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaK > 0
      AND a.gradeProdutoK > 0
      AND a.quantidadeK > 0
    THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        a.gradeProdutoK,
        a.quantidadeK,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaL > 0
      AND a.gradeProdutoL > 0
      AND a.quantidadeL > 0
    THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        a.gradeProdutoL,
        a.quantidadeL,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaM > 0
      AND a.gradeProdutoM > 0
      AND a.quantidadeM > 0
    THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        a.gradeProdutoM,
        a.quantidadeM,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaN > 0
      AND a.gradeProdutoN > 0
      AND a.quantidadeN > 0
    THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        a.gradeProdutoN,
        a.quantidadeN,
        r_bufferIdEstoque);
    END IF;
    IF a.idColoranteTintaO > 0
      AND a.gradeProdutoO > 0
      AND a.quantidadeO > 0
    THEN
      ADD_ESTOQUE_PRODUTO_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_operacaoInternaEstoque,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_idItemPreDocumento,
        p_idItemDocFiscal,
        p_idItemSeparacao,
        p_divergenciaBalanco,
        p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        a.gradeProdutoO,
        a.quantidadeO,
        r_bufferIdEstoque);
    END IF;
  END LOOP;
END ADD_ESTOQUE_FORMULA_TINTA;

/

create or replace PROCEDURE ADD_SEPARACAO_ITEM_EST_ENDEREC(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_bufferIdEstoque              IN VARCHAR2,
    p_estabelecimentoAtivo         IN NUMBER,
    p_entradaSaida                 IN CHAR,
    p_cab_modeloDocumento          IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEmissao              IN DATE,
    p_cab_dataEntradaSaida         IN DATE,
    p_item_idItemSeparacao         IN NUMBER,
    p_item_gradeProduto            IN NUMBER,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_idLoteEstoque           IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_item_precoCustoOperacao      IN NUMBER,
    p_item_valorCustoOperacao      IN NUMBER,
    p_item_precoCMV                IN NUMBER,
    p_item_valorCMV                IN NUMBER,
    p_item_observacoes             IN VARCHAR2,
    p_prod_controlaNumeroSerie     IN NUMBER,
    p_prod_controleEstoque         IN NUMBER,
    p_locEst_indicProprPosseItem   IN CHAR,
    r_bufferIdEstoque              OUT VARCHAR2,
    r_quantidadeEnderecoEstoque    OUT NUMBER)
IS
  v_quantidadeNumerosSerie NUMBER (14,0);
BEGIN
  r_bufferIdEstoque           := p_bufferIdEstoque;
  r_quantidadeEnderecoEstoque := 0;
  FOR a IN (
    SELECT idEnderecoEstoque,
      idEnderecoEstoqueSeparacao,
      quantidade 
    FROM MOSEPARACAOXENDERECOESTOQ
    WHERE idItemSeparacao = p_item_idItemSeparacao
    AND quantidade > 0)
  LOOP
    r_quantidadeEnderecoEstoque := r_quantidadeEnderecoEstoque + a.quantidade;
    IF p_prod_controleEstoque = 12 AND p_item_idFormulaTinta > 0 THEN
      ADD_ESTOQUE_FORMULA_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_modeloDocumento,
        104, -- p_cab_operacaoInternaEstoque
        0, -- p_cab_atualizaCustoMedio,
        0, -- p_cab_atualizaUltimaCompra,
        p_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        0, -- p_modDoc_geraTransferencia,
        0, -- p_modDoc_geraOperacaoEmTransit,
        0, -- p_modDoc_transitoLocalEstoque,
        ' ', -- p_locEstTransito_indicProprPos,
        p_item_idFormulaTinta,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidade,
        p_item_observacoes,
        a.idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        0, -- p_idItemPreDocumento,
        0, -- p_idItemDocFiscal,
        p_item_idItemSeparacao,
        0, -- p_divergenciaBalanco,
        0, -- p_idItemDocTransferencia,
        0, -- p_docTransf_estabelecEntrada,
        0, -- p_docTransf_estabelecSaida,
        r_bufferIdEstoque);
    ELSIF p_prod_controleEstoque IN (3,4) THEN
      ADD_SEPARACAO_ITEM_EST_KIT(
        r_bufferIdEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_modeloDocumento,
        p_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_item_idItemSeparacao,
        p_item_gradeProduto,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidade,
        p_item_observacoes,
        a.idEnderecoEstoqueSeparacao,
        a.idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        r_bufferIdEstoque);
    ELSIF p_prod_controleEstoque IN (1,5,11,12) THEN  
      v_quantidadeNumerosSerie := 0;
      IF p_prod_controlaNumeroSerie > 0 THEN
        ADD_SEPARACAO_ITEM_EST_N_SERIE(
          r_bufferIdEstoque,
          p_estabelecimentoAtivo,
          p_entradaSaida,
          p_cab_modeloDocumento,
          p_cab_estabelecimento,
          p_cab_dataEmissao,
          p_cab_dataEntradaSaida,
          p_item_idItemSeparacao,
          p_item_gradeProduto,
          p_item_idFormulaTinta,
          p_item_personalizacao,
          p_item_idLoteEstoque,
          p_item_localEstoque,
          p_item_pessoaParticipante,
          p_item_precoCustoOperacao,
          p_item_precoCMV,
          p_item_observacoes,
          a.idEnderecoEstoqueSeparacao,
          a.idEnderecoEstoque,
          p_locEst_indicProprPosseItem,
          r_bufferIdEstoque,
          v_quantidadeNumerosSerie);
      END IF;
      IF a.quantidade > v_quantidadeNumerosSerie THEN
        ADD_ESTOQUE_INSERE(
          r_bufferIdEstoque, 
          p_estabelecimentoAtivo, 
          p_cab_estabelecimento,
          CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, -- p_data
          p_item_gradeProduto,
          p_cab_modeloDocumento,
          104, -- p_cab_operacaoInternaEstoque
          0, -- p_cab_atualizaCustoMedio,
          0, -- p_cab_atualizaUltimaCompra,
          p_entradaSaida,
          p_locEst_indicProprPosseItem,
          p_item_pessoaParticipante,
          p_item_localEstoque,
          p_item_personalizacao,
          p_item_idLoteEstoque,
          a.idEnderecoEstoque,
          0, -- p_idNumeroSerie,
          a.quantidade - v_quantidadeNumerosSerie,
          p_item_precoCustoOperacao,
          CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCustoOperacao * (a.quantidade - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
          p_item_precoCMV,
          CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCMV * (a.quantidade - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
          p_item_observacoes,
          0, -- p_idItemPreDocumento,
          0, -- p_idItemDocFiscal,
          p_item_idItemSeparacao,
          0, -- p_divergenciaBalanco,
          0, -- p_idItemDocTransferencia,
          r_bufferIdEstoque);    
      END IF;
    END IF;
  END LOOP;
END ADD_SEPARACAO_ITEM_EST_ENDEREC;

/

create or replace PROCEDURE ADD_SEPARACAO_ITEM_EST_GRAVA(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_bufferIdEstoque              IN VARCHAR2,
    p_estabelecimentoAtivo         IN NUMBER,
    p_cab_modeloDocumento          IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEmissao              IN DATE,
    p_cab_dataEntradaSaida         IN DATE,
    p_item_idItemSeparacao         IN NUMBER,
    p_item_gradeProduto            IN NUMBER,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_idLoteEstoque           IN NUMBER,
    p_item_localEstoqueSaida       IN NUMBER,
    p_item_pessoaParticipanteSaida IN NUMBER,
    p_item_localEstoqueEntrada     IN NUMBER,
    p_item_pessoaParticipanteEntra IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_item_precoCustoOperacao      IN NUMBER,
    p_item_valorCustoOperacao      IN NUMBER,
    p_item_precoCMV                IN NUMBER,
    p_item_valorCMV                IN NUMBER,
    p_item_observacoes             IN VARCHAR2,
    p_prod_controlaNumeroSerie     IN NUMBER,
    p_prod_controleEstoque         IN NUMBER,
    p_locEst_indicProprPosseSaida  IN CHAR,
    p_estXLoc_solicitaEnderSaida   IN NUMBER,
    p_locEst_indicProprPosseEntrad IN CHAR,
    p_estXLoc_solicitaEnderEntrada IN NUMBER,
    r_bufferIdEstoque              OUT VARCHAR2)
IS
  v_quantidadeEnderecoEstoque NUMBER (14,0);
  v_quantidadeNumerosSerie    NUMBER (14,0);
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  v_quantidadeEnderecoEstoque := 0;
  v_quantidadeNumerosSerie    := 0;
  IF p_estXLoc_solicitaEnderSaida = 1 AND p_prod_controleEstoque IN (1,3,4,5,11,12) THEN
    ADD_SEPARACAO_ITEM_EST_ENDEREC(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      r_bufferIdEstoque,
      p_estabelecimentoAtivo,
      'S', -- p_entradaSaida,
      p_cab_modeloDocumento,
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_cab_dataEntradaSaida,
      p_item_idItemSeparacao,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_localEstoqueSaida,
      p_item_pessoaParticipanteSaida,
      p_item_quantidade,
      p_item_precoCustoOperacao,
      p_item_valorCustoOperacao,
      p_item_precoCMV,
      p_item_valorCMV,
      p_item_observacoes,
      p_prod_controlaNumeroSerie,
      p_prod_controleEstoque,
      p_locEst_indicProprPosseSaida,
      r_bufferIdEstoque,
      v_quantidadeEnderecoEstoque);
  END IF;
  IF p_item_quantidade > v_quantidadeEnderecoEstoque THEN
    IF p_prod_controleEstoque = 12 AND p_item_idFormulaTinta > 0 THEN
      ADD_ESTOQUE_FORMULA_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_modeloDocumento,
        104, -- p_cab_operacaoInternaEstoque
        0, -- p_cab_atualizaCustoMedio,
        0, -- p_cab_atualizaUltimaCompra,
        'S', -- p_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        0, -- p_modDoc_geraTransferencia,
        0, -- p_modDoc_geraOperacaoEmTransit,
        0, -- p_modDoc_transitoLocalEstoque,
        ' ', -- p_locEstTransito_indicProprPos,
        p_item_idFormulaTinta,
        p_item_localEstoqueSaida,
        p_item_pessoaParticipanteSaida,
        p_item_quantidade,
        p_item_observacoes,
        0, -- p_idEnderecoEstoque,
        p_locEst_indicProprPosseSaida,
        0, -- p_idItemPreDocumento,
        0, -- p_idItemDocFiscal,
        p_item_idItemSeparacao,
        0, -- p_divergenciaBalanco,
        0, -- p_idItemDocTransferencia,
        0, -- p_docTransf_estabelecEntrada,
        0, -- p_docTransf_estabelecSaida,
        r_bufferIdEstoque);
    ELSIF p_prod_controleEstoque IN (3,4) THEN
      ADD_SEPARACAO_ITEM_EST_KIT(
        r_bufferIdEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_modeloDocumento,
        'S', -- p_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_item_idItemSeparacao,
        p_item_gradeProduto,
        p_item_localEstoqueSaida,
        p_item_pessoaParticipanteSaida,
        p_item_quantidade,
        p_item_observacoes,
        0, -- p_endEst_idEnderecoEstoqueSep,
        0, -- p_idEnderecoEstoque,
        p_locEst_indicProprPosseSaida,
        r_bufferIdEstoque);
    ELSIF p_prod_controleEstoque IN (1,5,11,12) THEN  
      v_quantidadeNumerosSerie := 0;
      IF p_prod_controlaNumeroSerie > 0 THEN
        ADD_SEPARACAO_ITEM_EST_N_SERIE(
          r_bufferIdEstoque,
          p_estabelecimentoAtivo,
          'S', -- p_entradaSaida,
          p_cab_modeloDocumento,
          p_cab_estabelecimento,
          p_cab_dataEmissao,
          p_cab_dataEntradaSaida,
          p_item_idItemSeparacao,
          p_item_gradeProduto,
          p_item_idFormulaTinta,
          p_item_personalizacao,
          p_item_idLoteEstoque,
          p_item_localEstoqueSaida,
          p_item_pessoaParticipanteSaida,
          p_item_precoCustoOperacao,
          p_item_precoCMV,
          p_item_observacoes,
          0, -- p_endEst_idEnderecoEstoqueSep,
          0, -- p_idEnderecoEstoque,
          p_locEst_indicProprPosseSaida,
          r_bufferIdEstoque,
          v_quantidadeNumerosSerie);
      END IF;
      IF p_item_quantidade > v_quantidadeNumerosSerie THEN
        ADD_ESTOQUE_INSERE(
          r_bufferIdEstoque, 
          p_estabelecimentoAtivo, 
          p_cab_estabelecimento,
          CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, -- p_data
          p_item_gradeProduto,
          p_cab_modeloDocumento,
          104, -- p_cab_operacaoInternaEstoque
          0, -- p_cab_atualizaCustoMedio,
          0, -- p_cab_atualizaUltimaCompra,
          'S', -- p_entradaSaida,
          p_locEst_indicProprPosseSaida,
          p_item_pessoaParticipanteSaida,
          p_item_localEstoqueSaida,
          p_item_personalizacao,
          p_item_idLoteEstoque,
          0, -- p_idEnderecoEstoque,
          0, -- p_idNumeroSerie,
          p_item_quantidade - v_quantidadeNumerosSerie,
          p_item_precoCustoOperacao,
          CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCustoOperacao * (p_item_quantidade - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
          p_item_precoCMV,
          CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCMV * (p_item_quantidade - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
          p_item_observacoes,
          0, -- p_idItemPreDocumento,
          0, -- p_idItemDocFiscal,
          p_item_idItemSeparacao,
          0, -- p_divergenciaBalanco,
          0, -- p_idItemDocTransferencia,
          r_bufferIdEstoque);    
      END IF;
    END IF;
  END IF;
  v_quantidadeEnderecoEstoque := 0;
  v_quantidadeNumerosSerie    := 0;
  IF p_estXLoc_solicitaEnderEntrada = 1 AND p_prod_controleEstoque IN (1,3,4,5,11,12) THEN
    ADD_SEPARACAO_ITEM_EST_ENDEREC(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      r_bufferIdEstoque,
      p_estabelecimentoAtivo,
      'E', -- p_entradaSaida,
      p_cab_modeloDocumento,
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_cab_dataEntradaSaida,
      p_item_idItemSeparacao,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_localEstoqueEntrada,
      p_item_pessoaParticipanteEntra,
      p_item_quantidade,
      p_item_precoCustoOperacao,
      p_item_valorCustoOperacao,
      p_item_precoCMV,
      p_item_valorCMV,
      p_item_observacoes,
      p_prod_controlaNumeroSerie,
      p_prod_controleEstoque,
      p_locEst_indicProprPosseEntrad,
      r_bufferIdEstoque,
      v_quantidadeEnderecoEstoque);
  END IF;
  IF p_item_quantidade > v_quantidadeEnderecoEstoque THEN
    IF p_prod_controleEstoque = 12 AND p_item_idFormulaTinta > 0 THEN
      ADD_ESTOQUE_FORMULA_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_modeloDocumento,
        104, -- p_cab_operacaoInternaEstoque
        0, -- p_cab_atualizaCustoMedio,
        0, -- p_cab_atualizaUltimaCompra,
        'E', -- p_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        0, -- p_modDoc_geraTransferencia,
        0, -- p_modDoc_geraOperacaoEmTransit,
        0, -- p_modDoc_transitoLocalEstoque,
        ' ', -- p_locEstTransito_indicProprPos,
        p_item_idFormulaTinta,
        p_item_localEstoqueEntrada,
        p_item_pessoaParticipanteEntra,
        p_item_quantidade,
        p_item_observacoes,
        0, -- p_idEnderecoEstoque,
        p_locEst_indicProprPosseEntrad,
        0, -- p_idItemPreDocumento,
        0, -- p_idItemDocFiscal,
        p_item_idItemSeparacao,
        0, -- p_divergenciaBalanco,
        0, -- p_idItemDocTransferencia,
        0, -- p_docTransf_estabelecEntrada,
        0, -- p_docTransf_estabelecSaida,
        r_bufferIdEstoque);
    ELSIF p_prod_controleEstoque IN (3,4) THEN
      ADD_SEPARACAO_ITEM_EST_KIT(
        r_bufferIdEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_modeloDocumento,
        'E', -- p_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_item_idItemSeparacao,
        p_item_gradeProduto,
        p_item_localEstoqueEntrada,
        p_item_pessoaParticipanteEntra,
        p_item_quantidade,
        p_item_observacoes,
        0, -- p_endEst_idEnderecoEstoqueSep,
        0, -- p_idEnderecoEstoque,
        p_locEst_indicProprPosseEntrad,
        r_bufferIdEstoque);
    ELSIF p_prod_controleEstoque IN (1,5,11,12) THEN  
      v_quantidadeNumerosSerie := 0;
      IF p_prod_controlaNumeroSerie > 0 THEN
        ADD_SEPARACAO_ITEM_EST_N_SERIE(
          r_bufferIdEstoque,
          p_estabelecimentoAtivo,
          'E', -- p_entradaSaida,
          p_cab_modeloDocumento,
          p_cab_estabelecimento,
          p_cab_dataEmissao,
          p_cab_dataEntradaSaida,
          p_item_idItemSeparacao,
          p_item_gradeProduto,
          p_item_idFormulaTinta,
          p_item_personalizacao,
          p_item_idLoteEstoque,
          p_item_localEstoqueEntrada,
          p_item_pessoaParticipanteEntra,
          p_item_precoCustoOperacao,
          p_item_precoCMV,
          p_item_observacoes,
          0, -- p_endEst_idEnderecoEstoqueSep,
          0, -- p_idEnderecoEstoque,
          p_locEst_indicProprPosseEntrad,
          r_bufferIdEstoque,
          v_quantidadeNumerosSerie);
      END IF;
      IF p_item_quantidade > v_quantidadeNumerosSerie THEN
        ADD_ESTOQUE_INSERE(
          r_bufferIdEstoque, 
          p_estabelecimentoAtivo, 
          p_cab_estabelecimento,
          CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, -- p_data
          p_item_gradeProduto,
          p_cab_modeloDocumento,
          104, -- p_cab_operacaoInternaEstoque
          0, -- p_cab_atualizaCustoMedio,
          0, -- p_cab_atualizaUltimaCompra,
          'E', -- p_entradaSaida,
          p_locEst_indicProprPosseEntrad,
          p_item_pessoaParticipanteEntra,
          p_item_localEstoqueEntrada,
          p_item_personalizacao,
          p_item_idLoteEstoque,
          0, -- p_idEnderecoEstoque,
          0, -- p_idNumeroSerie,
          p_item_quantidade - v_quantidadeNumerosSerie,
          p_item_precoCustoOperacao,
          CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCustoOperacao * (p_item_quantidade - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
          p_item_precoCMV,
          CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCMV * (p_item_quantidade - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
          p_item_observacoes,
          0, -- p_idItemPreDocumento,
          0, -- p_idItemDocFiscal,
          p_item_idItemSeparacao,
          0, -- p_divergenciaBalanco,
          0, -- p_idItemDocTransferencia,
          r_bufferIdEstoque);    
      END IF;
    END IF;
  END IF;
END ADD_SEPARACAO_ITEM_EST_GRAVA;

/

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 := '';
  FOR a IN (
    SELECT a.idEstoque
    FROM MOESTOQUES a
    JOIN MOSEPARACAOXESTOQUE b
    ON b.idEstoque = a.idEstoque
    WHERE b.idItemSeparacao = p_idItemSeparacao
    ORDER BY a.idEstoque)
  LOOP
    v_bufferIdEstoque :=
      CASE
        WHEN v_bufferIdEstoque IS NULL
          OR v_bufferIdEstoque = ''
          OR v_bufferIdEstoque = ' '
        THEN ''
        ELSE RTRIM (v_bufferIdEstoque) || ';'
      END
      || TO_CHAR (LPAD(a.idEstoque,14,'0'));
    ADD_MOESTOQUES_EXCLUI (a.idEstoque);
  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.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 a.idEstoque
    FROM MOESTOQUES a
    JOIN MOSEPARACAOXESTOQUE b
    ON b.idEstoque = a.idEstoque
    JOIN MOSEPARACAOXITENS c
    ON c.idItemSeparacao = b.idItemSeparacao
    WHERE c.separacao = p_separacao
    ORDER BY a.idEstoque)
  LOOP
    v_bufferIdEstoque :=
      CASE
        WHEN v_bufferIdEstoque IS NULL
          OR v_bufferIdEstoque = ''
          OR v_bufferIdEstoque = ' '
        THEN ''
        ELSE RTRIM (v_bufferIdEstoque) || ';'
      END
      || TO_CHAR (LPAD(a.idEstoque,14,'0'));
    ADD_MOESTOQUES_EXCLUI (a.idEstoque);
  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_ORCAMENTO_ITEM_INSERE_COMB (
    p_uniqueMachineID              IN VARCHAR2,
    p_usuarioLogado                IN NUMBER,
    p_perfilUsuarioLogado          IN NUMBER,
    p_estabelecimentoAtivo         IN NUMBER,
    p_config_64_casasDecSaidas     IN CHAR,
    p_config_65_casasDecEntrada    IN CHAR,
    p_config_198_obs_add_referenc  IN NUMBER,
    p_config_199_obs_add_caractA   IN NUMBER,
    p_config_200_obs_add_caractB   IN NUMBER,
    p_config_201_obs_add_caractC   IN NUMBER,
    p_config_202_obs_add_caractD   IN NUMBER,
    p_config_203_obs_add_caractE   IN NUMBER,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_config_378_calcularVolumes   IN NUMBER,
    p_cab_orcamento                IN NUMBER,
    p_cab_origemDocumento          IN NUMBER,
    p_cab_tipoDocumento            IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_finalidadeNota           IN CHAR,
    p_cab_atualizaCustoMedio       IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEmissao              IN DATE,
    p_cab_dataPreco                IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_cab_dataEntrega              IN DATE,
    p_cab_enderecoEntregaPessoa    IN NUMBER,
    p_cab_municipioFatoGerador     IN NUMBER,
    p_cab_localDestinoOperacao     IN CHAR,
    p_cab_indicadorConsumidorFinal IN CHAR,
    p_cab_tipoPagamentoFrete       IN CHAR,
    p_cab_quantidadeVolume         IN NUMBER,
    p_cab_quantidade               IN NUMBER,
    p_cab_pesoLiquido              IN NUMBER,
    p_cab_pesoBruto                IN NUMBER,
    p_cab_valorProdutosBruto       IN NUMBER,
    p_cab_valorProdutos            IN NUMBER,
    p_cab_valorDescontoProdutos    IN NUMBER,
    p_cab_valorAcrescimoProdutos   IN NUMBER,
    p_cab_valorServicosBruto       IN NUMBER,
    p_cab_valorServicos            IN NUMBER,
    p_cab_valorDescontoServicos    IN NUMBER,
    p_cab_valorAcrescimoServicos   IN NUMBER,
    p_cab_prazoMedioPonderado      IN NUMBER,
    p_cab_valorBasePagamento       IN NUMBER,
    p_cab_valorAVistaMinimo        IN NUMBER,
    p_cab_valorDescontoTotal       IN NUMBER,
    p_cab_valorOutrasDespTotal     IN NUMBER,
    p_cab_valorFreteTotal          IN NUMBER,
    p_cab_valorSeguroTotal         IN NUMBER,
    p_cab_valorAdicFreteMarTotal   IN NUMBER,
    p_cab_valorDespesasAduanTotal  IN NUMBER,
    p_cab_valorImpostosSomaPag     IN NUMBER,
    p_cab_valorImpostosDiminuiPag  IN NUMBER,
    p_cab_valorLiquidoItem         IN NUMBER,
    p_est_grupoFiscal              IN NUMBER,
    p_pessEst_regimeTributario     IN CHAR,
    p_munEndEst_uf                 IN CHAR,
    p_pess_indicadorInscricaoEstad IN CHAR,
    p_endPess_enderecoPessoa       IN NUMBER,
    p_munEndPess_uf                IN CHAR,
    p_munEndEntr_uf                IN CHAR,
    p_etOrc_situacaoOrcamento      IN NUMBER,
    p_item_modeloDocumento         IN NUMBER,
    p_item_estabelecimentoOriginal IN NUMBER,
    p_item_vendedor                IN NUMBER,
    p_item_gradeProduto            IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_dataEntrega             IN DATE,
    p_item_quantidade              IN NUMBER,
    p_item_controleEntrega         IN NUMBER,
    p_item_usarPrecoAVista         IN NUMBER,
    p_item_percDescontoItem        IN NUMBER,
    p_item_percAcrescimoItem       IN NUMBER,
    p_item_observacoesDigitadas    IN VARCHAR2,
    p_idEnderecoEstoque            IN NUMBER,
    p_item_ambiente                IN NUMBER,
    p_item_amb_observacoes         IN VARCHAR2,
    p_modDoc_capituloNatFiscal     IN NUMBER,
    p_modDoc_movimentaEstoque      IN NUMBER,
    p_modDoc_geraFinanceiro        IN NUMBER,
    p_modDoc_habilitaAmbiente      IN NUMBER,
    p_modDoc_tipoPreco             IN CHAR,
    p_modDoc_tabelaPreco           IN VARCHAR2,
    p_modDoc_fatorMultipPreco      IN NUMBER,
    p_modDoc_tipoPrecoB            IN CHAR,
    p_modDoc_tabelaPrecoB          IN VARCHAR2,
    p_modDoc_fatorMultipPrecoB     IN NUMBER,
    p_modDoc_diminuiDescontoPrUnit IN NUMBER,
    p_modDoc_somaAcrescimosPrUnit  IN NUMBER,
    p_modDoc_somaFreteSeguroPrUnit IN NUMBER,
    p_idItemOrcamentoReferenciado  IN NUMBER,
    p_idItemDocTransferencia       IN NUMBER,
    p_buffer_idItemOrcamento       IN VARCHAR2,
    /* Retornos */
    r_cab_quantidadeVolume         OUT NUMBER,
    r_cab_quantidade               OUT NUMBER,
    r_cab_pesoLiquido              OUT NUMBER,
    r_cab_pesoBruto                OUT NUMBER,
    r_cab_valorProdutosBruto       OUT NUMBER,
    r_cab_valorProdutos            OUT NUMBER,
    r_cab_valorDescontoProdutos    OUT NUMBER,
    r_cab_valorAcrescimoProdutos   OUT NUMBER,
    r_cab_valorServicosBruto       OUT NUMBER,
    r_cab_valorServicos            OUT NUMBER,
    r_cab_valorDescontoServicos    OUT NUMBER,
    r_cab_valorAcrescimoServicos   OUT NUMBER,
    r_cab_valorBasePagamento       OUT NUMBER,
    r_cab_valorAVistaMinimo        OUT NUMBER,
    r_cab_valorDescontoTotal       OUT NUMBER,
    r_cab_valorOutrasDespTotal     OUT NUMBER,
    r_cab_valorImpostosSomaPag     OUT NUMBER,
    r_cab_valorImpostosDiminuiPag  OUT NUMBER,
    r_cab_valorLiquidoItem         OUT NUMBER,
    r_buffer_idItemOrcamento       OUT VARCHAR2,
    r_item_valorTotalItem          OUT NUMBER)
IS
    v_auxNumber                    NUMBER;
    v_auxVarchar                   VARCHAR2(256);
    v_item_idItemOrcamento         NUMBER;
    v_item_sequencia               NUMBER;
    v_item_servico                 NUMBER;
    v_item_operacaoFiscal          NUMBER;
    v_item_movimentaEstoque        NUMBER;
    v_item_geraFinanceiro          NUMBER;
    v_item_controleQuantidade      NUMBER;
    v_item_unidadeMedidaConversao  VARCHAR2(6);
    v_item_conversorQuantidade     NUMBER;
    v_item_loteMinimo              NUMBER;
    v_item_loteMultiplo            NUMBER;
    v_item_altura                  NUMBER;
    v_item_largura                 NUMBER;
    v_item_comprimento             NUMBER;
    v_item_pecas                   NUMBER;
    v_item_quantidade              NUMBER;
    v_item_quantidadeConvertida    NUMBER;
    v_item_pesoLiquido             NUMBER;
    v_item_pesoBruto               NUMBER;
    v_item_tipoPreco               CHAR(1);
    v_item_tabelaPreco             VARCHAR2(10);
    v_item_precoSugestaoAPrazo     NUMBER;
    v_item_precoSugestaoAVista     NUMBER;
    v_item_precoDesconto           NUMBER;
    v_item_precoMinimo             NUMBER;
    v_item_precoPautaTabelado      NUMBER;
    v_item_precoUnitarioBruto      NUMBER;
    v_item_precoUnitario           NUMBER;
    v_item_precoUnitarioConvertido NUMBER;
    v_item_valorProdutoServicoBrut NUMBER;
    v_item_valorProdutoServico     NUMBER;
    v_item_valorDescontoItem       NUMBER;
    v_item_valorAcrescimoItem      NUMBER;
    v_item_valorBasePagamento      NUMBER;
    v_item_valorTotalItem          NUMBER;
    v_item_valorDescontoTotal      NUMBER;
    v_item_valorOutrasDespTotal    NUMBER;
    v_item_cfop                    NUMBER;
    v_item_indicadorISSQN          CHAR(1);
    v_item_aliquotaISSQN           NUMBER;
    v_item_baseISSQN               NUMBER;
    v_item_valorISSQN              NUMBER;
    v_item_aliquotaIRRF            NUMBER;
    v_item_baseIRRF                NUMBER;
    v_item_valorIRRF               NUMBER;
    v_item_aliquotaINSS            NUMBER;
    v_item_baseINSS                NUMBER;
    v_item_valorINSS               NUMBER;
    v_item_retencaoPIS             NUMBER;
    v_item_baseRetPIS              NUMBER;
    v_item_valorRetPIS             NUMBER;
    v_item_retencaoCOFINS          NUMBER;
    v_item_baseRetCOFINS           NUMBER;
    v_item_valorRetCOFINS          NUMBER;
    v_item_retencaoCSLL            NUMBER;
    v_item_baseRetCSLL             NUMBER;
    v_item_valorRetCSLL            NUMBER;
    v_item_aliquotaII              NUMBER;
    v_item_baseII                  NUMBER;
    v_item_valorII                 NUMBER;
    v_item_aliquotaIOF             NUMBER;
    v_item_baseIOF                 NUMBER;
    v_item_valorIOF                NUMBER;
    v_item_codigoEnquadramentoIPI  NUMBER;
    v_item_stIPI                   CHAR(2);
    v_item_aliquotaIPI             NUMBER;
    v_item_valorAliquotaIPI        NUMBER;
    v_item_baseIPI                 NUMBER;
    v_item_valorIPI                NUMBER;
    v_item_stPIS                   CHAR(2);
    v_item_aliquotaPIS             NUMBER;
    v_item_valorAliquotaPIS        NUMBER;
    v_item_basePIS                 NUMBER;
    v_item_valorPIS                NUMBER;
    v_item_aliquotaPISST           NUMBER;
    v_item_valorAliquotaPISST      NUMBER;
    v_item_basePISST               NUMBER;
    v_item_valorPISST              NUMBER;
    v_item_stCOFINS                CHAR(2);
    v_item_aliquotaCOFINS          NUMBER;
    v_item_valorAliquotaCOFINS     NUMBER;
    v_item_baseCOFINS              NUMBER;
    v_item_valorCOFINS             NUMBER;
    v_item_aliquotaCOFINSST        NUMBER;
    v_item_valorAliquotaCOFINSST   NUMBER;
    v_item_baseCOFINSST            NUMBER;
    v_item_valorCOFINSST           NUMBER;
    v_item_stSimplesNacional       CHAR(3);
    v_item_creditoSimplesNacional  NUMBER;
    v_item_baseCreditoSimplesNac   NUMBER;
    v_item_valorCreditoSimplesNac  NUMBER;
    v_item_stICMS                  CHAR(2);
    v_item_modalBaseCalcICMS       CHAR(1);
    v_item_reducaoBaseICMS         NUMBER;
    v_item_aliquotaICMS            NUMBER;
    v_item_diferimentoICMS         NUMBER;
    v_item_motivoDesoneracaoICMS   CHAR(2);
    v_item_baseICMS                NUMBER;
    v_item_valorICMSOperacao       NUMBER;
    v_item_valorICMSDiferido       NUMBER;
    v_item_valorICMS               NUMBER;
    v_item_valorICMSDesoneracao    NUMBER;
    v_item_modalBaseCalcICMSST     CHAR(1);
    v_item_margemValorAdicST       NUMBER;
    v_item_reducaoBaseST           NUMBER;
    v_item_aliquotaICMSST          NUMBER;
    v_item_aliquotaSTSuportConsFin NUMBER;
    v_item_reducaoBaseICMSEfetivo  NUMBER;
    v_item_baseICMSST              NUMBER;
    v_item_valorICMSST             NUMBER;
    v_item_baseICMSSTAnteriormente NUMBER;
    v_item_valorICMSSTAnteriorment NUMBER;
    v_item_valorICMSProprioSubstit NUMBER;
    v_item_aliquotaICMSEfetivo     NUMBER;
    v_item_baseICMSEfetivo         NUMBER;
    v_item_valorICMSEfetivo        NUMBER;
    v_item_aliquotaICMSUFDestinat  NUMBER;
    v_item_aliquotaICMSInterestad  NUMBER;
    v_item_partilhaICMSInterestad  NUMBER;
    v_item_baseICMSUFDestinatario  NUMBER;
    v_item_valorICMSUFDestinatario NUMBER;
    v_item_baseICMSUFRemetente     NUMBER;
    v_item_valorICMSUFRemetente    NUMBER;
    v_item_aliquotaFCP             NUMBER;
    v_item_baseFCP                 NUMBER;
    v_item_valorFCP                NUMBER;
    v_item_aliquotaFCPST           NUMBER;
    v_item_baseFCPST               NUMBER;
    v_item_valorFCPST              NUMBER;
    v_item_aliquotaFCPSTAnteriorm  NUMBER;
    v_item_aliquotaFCPUFDestinat   NUMBER;
    v_item_baseFCPSTAnteriormente  NUMBER;
    v_item_valorFCPSTAnteriormente NUMBER;
    v_item_baseFCPUFDestinatario   NUMBER;
    v_item_valorFCPUFDestinatario  NUMBER;
    v_item_aliquotaEstImpFederais  NUMBER;
    v_item_aliquotaEstImpEstaduais NUMBER;
    v_item_aliquotaEstImpMunicipai NUMBER;
    v_item_baseEstimadaImpostos    NUMBER;
    v_item_valorEstImpFederais     NUMBER;
    v_item_valorEstImpEstaduais    NUMBER;
    v_item_valorEstImpMunicipais   NUMBER;
    v_item_valorImpostosSomaPag    NUMBER;
    v_item_valorImpostosDiminuiPag NUMBER;
    v_item_valorLiquidoItem        NUMBER;
    v_locEst_indicadorPropPosseIt CHAR(1);    
BEGIN
  r_cab_quantidadeVolume         := p_cab_quantidadeVolume;
  r_cab_quantidade               := p_cab_quantidade;
  r_cab_pesoLiquido              := p_cab_pesoLiquido;
  r_cab_pesoBruto                := p_cab_pesoBruto;
  r_cab_valorProdutosBruto       := p_cab_valorProdutosBruto;
  r_cab_valorProdutos            := p_cab_valorProdutos;
  r_cab_valorDescontoProdutos    := p_cab_valorDescontoProdutos;
  r_cab_valorAcrescimoProdutos   := p_cab_valorAcrescimoProdutos;
  r_cab_valorServicosBruto       := p_cab_valorServicosBruto;
  r_cab_valorServicos            := p_cab_valorServicos;
  r_cab_valorDescontoServicos    := p_cab_valorDescontoServicos;
  r_cab_valorAcrescimoServicos   := p_cab_valorAcrescimoServicos;
  r_cab_valorBasePagamento       := p_cab_valorBasePagamento;
  r_cab_valorAVistaMinimo        := p_cab_valorAVistaMinimo;
  r_cab_valorDescontoTotal       := p_cab_valorDescontoTotal;
  r_cab_valorOutrasDespTotal     := p_cab_valorOutrasDespTotal;
  r_cab_valorImpostosSomaPag     := p_cab_valorImpostosSomaPag;
  r_cab_valorImpostosDiminuiPag  := p_cab_valorImpostosDiminuiPag;
  r_cab_valorLiquidoItem         := p_cab_valorLiquidoItem;
  r_buffer_idItemOrcamento       := p_buffer_idItemOrcamento;
  r_item_valorTotalItem          := 0;
  SELECT locEst.indicadorPropriedadePosseItem
  INTO v_locEst_indicadorPropPosseIt
  FROM PALOCAISESTOQUE locEst
  WHERE locEst.localEstoque = p_item_localEstoque;
  FOR a IN (
      SELECT
        a.gradeProdutoFilho,
        a.quantidade,
        gradProd.produto,
        gradProd.cor,
        gradProd.tamanho,
        prod.controleEstoque,
        prod.unidadeMedida,
        prod.controleQuantidadeVenda,
        prod.unidadeMedidaVenda,
        prod.conversorQuantidadeVenda,
        prod.loteMinimoVenda,
        prod.loteMultiploVenda,
        prod.pesoLiquido,
        prod.pesoBruto,
        prod.altura,
        prod.largura,
        prod.comprimento,
        prod.tipoProduto,
        prod.origemMercadoria,
        prod.idNcm,
        prod.listaServicos,
        prod.precoPautaTabelado,
        unMed.casasDecimaisUnidadeMedida
      FROM CAGRADEPRODUTOXKITSCOMBOS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProdutoFilho
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN SIUNIDADESMEDIDA unMed
      ON unMed.unidadeMedida = prod.unidadeMedida
      WHERE a.gradeProduto = p_item_gradeProduto
      AND a.ativo = 1
      AND a.gradeProduto <> a.gradeProdutoFilho)
  LOOP
    v_item_quantidade := ROUND (p_item_quantidade * a.quantidade, a.casasDecimaisUnidadeMedida);
    IF a.controleEstoque = 3 THEN
      ADD_ORCAMENTO_ITEM_INSERE_COMB (
        p_uniqueMachineID,
        p_usuarioLogado,
        p_perfilUsuarioLogado,
        p_estabelecimentoAtivo,
        p_config_64_casasDecSaidas,
        p_config_65_casasDecEntrada,
        p_config_198_obs_add_referenc,
        p_config_199_obs_add_caractA,
        p_config_200_obs_add_caractB,
        p_config_201_obs_add_caractC,
        p_config_202_obs_add_caractD,
        p_config_203_obs_add_caractE,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_config_378_calcularVolumes,
        p_cab_orcamento,
        p_cab_origemDocumento,
        p_cab_tipoDocumento,
        p_cab_entradaSaida,
        p_cab_finalidadeNota,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataPreco,
        p_cab_pessoa,
        p_cab_dataEntrega,
        p_cab_enderecoEntregaPessoa,
        p_cab_municipioFatoGerador,
        p_cab_localDestinoOperacao,
        p_cab_indicadorConsumidorFinal,
        p_cab_tipoPagamentoFrete,
        r_cab_quantidadeVolume,
        r_cab_quantidade,
        r_cab_pesoLiquido,
        r_cab_pesoBruto,
        r_cab_valorProdutosBruto,
        r_cab_valorProdutos,
        r_cab_valorDescontoProdutos,
        r_cab_valorAcrescimoProdutos,
        r_cab_valorServicosBruto,
        r_cab_valorServicos,
        r_cab_valorDescontoServicos,
        r_cab_valorAcrescimoServicos,
        p_cab_prazoMedioPonderado,
        r_cab_valorBasePagamento,
        r_cab_valorAVistaMinimo,
        r_cab_valorDescontoTotal,
        r_cab_valorOutrasDespTotal,
        p_cab_valorFreteTotal,
        p_cab_valorSeguroTotal,
        p_cab_valorAdicFreteMarTotal,
        p_cab_valorDespesasAduanTotal,
        r_cab_valorImpostosSomaPag,
        r_cab_valorImpostosDiminuiPag,
        r_cab_valorLiquidoItem,
        p_est_grupoFiscal,
        p_pessEst_regimeTributario,
        p_munEndEst_uf,
        p_pess_indicadorInscricaoEstad,
        p_endPess_enderecoPessoa,
        p_munEndPess_uf,
        p_munEndEntr_uf,
        p_etOrc_situacaoOrcamento,
        p_item_modeloDocumento,
        p_item_estabelecimentoOriginal,
        p_item_vendedor,
        a.gradeProdutoFilho,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_dataEntrega,
        v_item_quantidade,
        p_item_controleEntrega,
        p_item_usarPrecoAVista,
        p_item_percDescontoItem,
        p_item_percAcrescimoItem,
        p_item_observacoesDigitadas,
        p_idEnderecoEstoque,
        p_item_ambiente,
        p_item_amb_observacoes,
        p_modDoc_capituloNatFiscal,
        p_modDoc_movimentaEstoque,
        p_modDoc_geraFinanceiro,
        p_modDoc_habilitaAmbiente,
        p_modDoc_tipoPreco,
        p_modDoc_tabelaPreco,
        p_modDoc_fatorMultipPreco,
        p_modDoc_tipoPrecoB,
        p_modDoc_tabelaPrecoB,
        p_modDoc_fatorMultipPrecoB,
        p_modDoc_diminuiDescontoPrUnit,
        p_modDoc_somaAcrescimosPrUnit,
        p_modDoc_somaFreteSeguroPrUnit,
        p_idItemOrcamentoReferenciado,
        p_idItemDocTransferencia,
        r_buffer_idItemOrcamento,
        /* Retornos */
        r_cab_quantidadeVolume,
        r_cab_quantidade,
        r_cab_pesoLiquido,
        r_cab_pesoBruto,
        r_cab_valorProdutosBruto,
        r_cab_valorProdutos,
        r_cab_valorDescontoProdutos,
        r_cab_valorAcrescimoProdutos,
        r_cab_valorServicosBruto,
        r_cab_valorServicos,
        r_cab_valorDescontoServicos,
        r_cab_valorAcrescimoServicos,
        r_cab_valorBasePagamento,
        r_cab_valorAVistaMinimo,
        r_cab_valorDescontoTotal,
        r_cab_valorOutrasDespTotal,
        r_cab_valorImpostosSomaPag,
        r_cab_valorImpostosDiminuiPag,
        r_cab_valorLiquidoItem,
        r_buffer_idItemOrcamento,
        v_item_valorTotalItem);
      r_item_valorTotalItem := r_item_valorTotalItem + v_item_valorTotalItem;
    ELSE
      v_item_idItemOrcamento := 0;
      ADD_ITEM_PROD_DADOS_BUSCA (
        p_cab_entradaSaida,
        0,
        p_cab_pessoa,
        v_item_quantidade,
        a.produto,
        a.unidadeMedida,
        a.controleQuantidadeVenda,
        a.unidadeMedidaVenda,
        a.conversorQuantidadeVenda,
        a.loteMinimoVenda,
        a.loteMultiploVenda,
        a.pesoLiquido,
        a.pesoBruto,
        a.altura,
        a.largura,
        a.comprimento,
        a.tipoProduto,
        a.precoPautaTabelado,
        a.casasDecimaisUnidadeMedida,
        /* Retornos */
        v_item_servico,
        v_item_controleQuantidade,
        v_item_unidadeMedidaConversao,
        v_item_conversorQuantidade,
        v_item_loteMinimo,
        v_item_loteMultiplo,
        v_item_altura,
        v_item_largura,
        v_item_comprimento,
        v_item_pecas,
        v_item_quantidadeConvertida,
        v_item_pesoLiquido,
        v_item_pesoBruto,
        v_item_precoPautaTabelado);
      ADD_BUSCA_PRECO (
        p_config_64_casasDecSaidas,
        p_config_65_casasDecEntrada,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        0,
        p_cab_estabelecimento,
        NULL,
        p_cab_dataPreco,
        p_cab_pessoa,
        p_modDoc_capituloNatFiscal,
        p_modDoc_tipoPreco,
        p_modDoc_tabelaPreco,
        p_modDoc_fatorMultipPreco,
        p_modDoc_tipoPrecoB,
        p_modDoc_tabelaPrecoB,
        p_modDoc_fatorMultipPrecoB,
        p_munEndEst_uf,
        p_munEndPess_uf,
        p_item_vendedor,
        0,
        0,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        v_item_quantidade,
        a.produto,
        a.cor,
        a.tamanho,
        a.controleEstoque,
        v_locEst_indicadorPropPosseIt,
        0,
        v_item_precoSugestaoAPrazo,
        v_item_precoSugestaoAVista,
        v_item_tipoPreco,
        v_item_tabelaPreco,
        /* Retornos */
        v_item_tipoPreco,
        v_item_tabelaPreco,
        v_item_precoSugestaoAPrazo,
        v_item_precoSugestaoAVista,
        v_item_precoDesconto,
        v_item_precoMinimo,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber);
      v_item_precoUnitarioBruto      := CASE WHEN p_item_usarPrecoAVista = 1 THEN v_item_precoSugestaoAVista ELSE v_item_precoSugestaoAPrazo END;
      v_item_precoUnitario           := v_item_precoUnitarioBruto;
      v_item_valorProdutoServicoBrut := ROUND ((v_item_quantidade * v_item_precoUnitarioBruto), 2);
      v_item_valorProdutoServico     := v_item_valorProdutoServicoBrut;
      v_item_valorDescontoItem       := ROUND ((v_item_valorProdutoServico * p_item_percDescontoItem / 100), 2);
      v_item_valorAcrescimoItem      := ROUND ((v_item_valorProdutoServico * p_item_percAcrescimoItem / 100), 2);
      v_item_operacaoFiscal          := FUNC_ADD_BUSCA_OPERACAO_FISCAL (
        p_item_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_pessoa,
        0,
        p_cab_municipioFatoGerador,
        p_cab_indicadorConsumidorFinal,
        p_est_grupoFiscal,
        p_pessEst_regimeTributario,
        p_munEndEst_uf,
        p_pess_indicadorInscricaoEstad,
        p_munEndPess_uf,
        a.produto);
      ADD_ITEM_OPERACAO_FISCAL_BUSCA (
        1,
        p_cab_origemDocumento,
        p_cab_tipoDocumento,
        p_cab_entradaSaida,
        0,
        p_cab_finalidadeNota,
        p_cab_estabelecimento,
        0,
        p_cab_dataEmissao,
        p_cab_pessoa,
        0,
        p_cab_enderecoEntregaPessoa,
        p_cab_localDestinoOperacao,
        p_cab_indicadorConsumidorFinal,
        p_modDoc_movimentaEstoque,
        p_modDoc_geraFinanceiro,
        p_munEndEst_uf,
        p_pess_indicadorInscricaoEstad,
        p_endPess_enderecoPessoa,
        p_munEndPess_uf,
        p_munEndEntr_uf,
        v_item_operacaoFiscal,
        a.produto,
        a.tipoProduto,
        a.origemMercadoria,
        a.idNcm,
        a.listaServicos,
        0,
        0,
        0,
        0,
        1,
        ' ',
        0,
        1,
        0,
        1,
        0,
        1,
        0,
        1,
        0,
        1,
        0,
        1,
        0,
        1,
        0,
        1,
        0,
        '  ',
        0,
        0,
        1,
        '  ',
        0,
        0,
        1,
        0,
        0,
        1,
        '  ',
        0,
        0,
        1,
        0,
        0,
        1,
        '   ',
        0,
        1,
        '  ',
        ' ',
        0,
        0,
        0,
        '  ',
        0,
        1,
        ' ',
        0,
        0,
        0,
        1,
        0,
        0,
        0,
        0,
        '  ',
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        1,
        0,
        0,
        0,
        1,
        0,
        0,
        0,
        0,
        1,
        0,
        0,
        0,
        /* Retornos */
        v_auxNumber,
        v_item_movimentaEstoque,
        v_auxNumber,
        v_item_geraFinanceiro,
        v_item_cfop,
        v_item_indicadorISSQN,
        v_item_aliquotaISSQN,
        v_item_aliquotaIRRF,
        v_item_aliquotaINSS,
        v_item_retencaoPIS,
        v_item_retencaoCOFINS,
        v_item_retencaoCSLL,
        v_item_aliquotaII,
        v_item_aliquotaIOF,
        v_item_codigoEnquadramentoIPI,
        v_item_stIPI,
        v_item_aliquotaIPI,
        v_item_valorAliquotaIPI,
        v_item_stPIS,
        v_item_aliquotaPIS,
        v_item_valorAliquotaPIS,
        v_item_aliquotaPISST,
        v_item_valorAliquotaPISST,
        v_item_stCOFINS,
        v_item_aliquotaCOFINS,
        v_item_valorAliquotaCOFINS,
        v_item_aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST,
        v_item_stSimplesNacional,
        v_item_creditoSimplesNacional,
        v_item_stICMS,
        v_item_modalBaseCalcICMS,
        v_item_reducaoBaseICMS,
        v_item_aliquotaICMS,
        v_item_diferimentoICMS,
        v_item_motivoDesoneracaoICMS,
        v_auxNumber,
        v_item_modalBaseCalcICMSST,
        v_item_margemValorAdicST,
        v_item_reducaoBaseST,
        v_item_aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin,
        v_item_reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo,
        v_auxVarchar,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_item_aliquotaICMSUFDestinat,
        v_item_aliquotaICMSInterestad,
        v_item_partilhaICMSInterestad,
        v_item_aliquotaFCP,
        v_item_aliquotaFCPST,
        v_item_aliquotaFCPSTAnteriorm,
        v_item_aliquotaFCPUFDestinat,
        v_item_aliquotaEstImpFederais,
        v_item_aliquotaEstImpEstaduais,
        v_item_aliquotaEstImpMunicipai);      
      ADD_CALCULA_TOTAIS_ITEM (
        p_cab_tipoPagamentoFrete,
        p_modDoc_diminuiDescontoPrUnit,
        p_modDoc_somaAcrescimosPrUnit,
        p_modDoc_somaFreteSeguroPrUnit,
        v_item_quantidade,
        v_item_quantidadeConvertida,
        v_item_precoUnitarioBruto,
        0,
        v_item_precoUnitario,
        v_item_valorDescontoItem,
        v_item_valorAcrescimoItem,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        /* Retornos */
        v_item_precoUnitario,
        v_item_precoUnitarioConvertido,
        v_item_valorProdutoServico,
        v_auxNumber,
        v_item_valorTotalItem,
        v_auxNumber,
        v_auxNumber,
        v_item_valorDescontoTotal,
        v_item_valorOutrasDespTotal,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber);
      ADD_CALCULA_IMPOSTOS_ITEM (
        p_config_64_casasDecSaidas,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_entradaSaida,
        0,
        p_cab_estabelecimento,
        0,
        p_cab_dataEmissao,
        p_cab_pessoa,
        p_cab_localDestinoOperacao,
        p_cab_indicadorConsumidorFinal,
        p_cab_tipoPagamentoFrete,
        p_pess_indicadorInscricaoEstad,
        0,
        v_item_quantidade,
        v_item_precoPautaTabelado,
        v_item_valorProdutoServico,
        0,
        0,
        v_item_valorDescontoTotal,
        v_item_valorOutrasDespTotal,
        0,
        0,
        v_item_cfop,
        1,
        v_item_indicadorISSQN,
        v_item_aliquotaISSQN,
        0,
        0,
        1,
        v_item_aliquotaIRRF,
        0,
        0,
        1,
        v_item_aliquotaINSS,
        0,
        0,
        1,
        v_item_retencaoPIS,
        0,
        0,
        1,
        v_item_retencaoCOFINS,
        0,
        0,
        1,
        v_item_retencaoCSLL,
        0,
        0,
        1,
        v_item_aliquotaII,
        0,
        0,
        1,
        v_item_aliquotaIOF,
        0,
        0,
        1,
        v_item_aliquotaIPI,
        v_item_valorAliquotaIPI,
        0,
        0,
        0,
        1,
        v_item_aliquotaPIS,
        v_item_valorAliquotaPIS,
        0,
        0,
        1,
        v_item_aliquotaPISST,
        v_item_valorAliquotaPISST,
        0,
        0,
        1,
        v_item_aliquotaCOFINS,
        v_item_valorAliquotaCOFINS,
        0,
        0,
        1,
        v_item_aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST,
        0,
        0,
        1,
        v_item_stSimplesNacional,
        v_item_creditoSimplesNacional,
        0,
        0,
        1,
        v_item_stICMS,
        v_item_modalBaseCalcICMS,
        v_item_reducaoBaseICMS,
        v_item_aliquotaICMS,
        v_item_diferimentoICMS,
        0,
        0,
        0,
        0,
        0,
        1,
        v_item_modalBaseCalcICMSST,
        v_item_margemValorAdicST,
        v_item_reducaoBaseST,
        v_item_aliquotaICMSST,
        0,
        0,
        1,
        0,
        0,
        0,
        v_item_reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo,
        0,
        0,
        0,
        '  ',
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        1,
        v_item_aliquotaICMSUFDestinat,
        v_item_aliquotaICMSInterestad,
        v_item_partilhaICMSInterestad,
        0,
        0,
        0,
        0,
        1,
        v_item_aliquotaFCP,
        0,
        0,
        v_item_aliquotaFCPST,
        0,
        0,
        v_item_aliquotaFCPSTAnteriorm,
        0,
        0,
        v_item_aliquotaFCPUFDestinat,
        0,
        0,
        1,
        v_item_aliquotaEstImpFederais,
        v_item_aliquotaEstImpEstaduais,
        v_item_aliquotaEstImpMunicipai,
        0,
        0,
        0,
        0,
        a.produto,
        a.cor,
        a.tamanho,
        a.controleEstoque,
        a.tipoProduto,
        /* Retornos */
        v_item_baseISSQN,
        v_item_valorISSQN,
        v_item_baseIRRF,
        v_item_valorIRRF,
        v_item_baseINSS,
        v_item_valorINSS,
        v_item_baseRetPIS,
        v_item_valorRetPIS,
        v_item_baseRetCOFINS,
        v_item_valorRetCOFINS,
        v_item_baseRetCSLL,
        v_item_valorRetCSLL,
        v_item_baseII,
        v_item_valorII,
        v_item_baseIOF,
        v_item_valorIOF,
        v_item_baseIPI,
        v_item_valorIPI,
        v_item_basePIS,
        v_item_valorPIS,
        v_item_basePISST,
        v_item_valorPISST,
        v_item_baseCOFINS,
        v_item_valorCOFINS,
        v_item_baseCOFINSST,
        v_item_valorCOFINSST,
        v_item_baseCreditoSimplesNac,
        v_item_valorCreditoSimplesNac,
        v_item_baseICMS,
        v_item_valorICMSOperacao,
        v_item_valorICMSDiferido,
        v_item_valorICMS,
        v_item_valorICMSDesoneracao,
        v_item_baseICMSST,
        v_item_valorICMSST,
        v_item_baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment,
        v_item_valorICMSProprioSubstit,
        v_item_baseICMSEfetivo,
        v_item_valorICMSEfetivo,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_item_baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente,
        v_item_valorICMSUFRemetente,
        v_item_baseFCP,
        v_item_valorFCP,
        v_item_baseFCPST,
        v_item_valorFCPST,
        v_item_baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente,
        v_item_baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario,
        v_item_baseEstimadaImpostos,
        v_item_valorEstImpFederais,
        v_item_valorEstImpEstaduais,
        v_item_valorEstImpMunicipais);
      ADD_CALCULA_VALOR_LIQUIDO (
        p_cab_origemDocumento,
        0,
        p_cab_tipoPagamentoFrete,
        v_item_geraFinanceiro,
        v_item_valorProdutoServico,
        0,
        0,
        0,
        0,
        0,
        v_item_valorDescontoTotal,
        v_item_valorOutrasDespTotal,
        v_item_valorIRRF,
        v_item_valorINSS,
        v_item_valorRetPIS,
        v_item_valorRetCOFINS,
        v_item_valorRetCSLL,
        v_item_valorII,
        v_item_valorIOF,
        v_item_valorIPI,
        0,
        v_item_valorICMSST,
        0,
        0,
        0,
        p_modDoc_geraFinanceiro,
        /* Retornos */
        v_item_valorBasePagamento,
        v_item_valorImpostosSomaPag,
        v_item_valorImpostosDiminuiPag,
        v_item_valorLiquidoItem);
      IF p_config_378_calcularVolumes = 1 THEN
        r_cab_quantidadeVolume       := r_cab_quantidadeVolume + TRUNC(CASE WHEN v_item_controleQuantidade = 1 AND v_item_loteMultiplo <> 0 THEN v_item_quantidade / v_item_loteMultiplo ELSE v_item_quantidadeConvertida END,0);
      END IF;
      r_cab_quantidade               := r_cab_quantidade + v_item_quantidadeConvertida;
      r_cab_pesoLiquido              := r_cab_pesoLiquido + v_item_pesoLiquido;
      r_cab_pesoBruto                := r_cab_pesoBruto + v_item_pesoBruto;
      IF v_item_servico = 1 THEN
        r_cab_valorServicosBruto     := r_cab_valorServicosBruto + v_item_valorProdutoServicoBrut;
        r_cab_valorServicos          := r_cab_valorServicos + v_item_valorProdutoServico;
        r_cab_valorDescontoServicos  := r_cab_valorDescontoServicos + v_item_valorDescontoItem;
        r_cab_valorAcrescimoServicos := r_cab_valorAcrescimoServicos + v_item_valorAcrescimoItem;
      ELSE 
        r_cab_valorProdutosBruto     := r_cab_valorProdutosBruto + v_item_valorProdutoServicoBrut;
        r_cab_valorProdutos          := r_cab_valorProdutos + v_item_valorProdutoServico;
        r_cab_valorDescontoProdutos  := r_cab_valorDescontoProdutos + v_item_valorDescontoItem;
        r_cab_valorAcrescimoProdutos := r_cab_valorAcrescimoProdutos + v_item_valorAcrescimoItem;
      END IF;
      r_cab_valorBasePagamento       := r_cab_valorBasePagamento + v_item_valorBasePagamento;
      IF p_item_usarPrecoAVista = 1 AND v_item_geraFinanceiro = 1 THEN
        r_cab_valorAVistaMinimo      := r_cab_valorAVistaMinimo + v_item_valorProdutoServico - v_item_valorDescontoTotal + v_item_valorOutrasDespTotal;
      END IF;
      r_cab_valorDescontoTotal       := r_cab_valorDescontoTotal + v_item_valorDescontoTotal;
      r_cab_valorOutrasDespTotal     := r_cab_valorOutrasDespTotal + v_item_valorOutrasDespTotal;
      r_cab_valorImpostosSomaPag     := r_cab_valorImpostosSomaPag + v_item_valorImpostosSomaPag;
      r_cab_valorImpostosDiminuiPag  := r_cab_valorImpostosDiminuiPag + v_item_valorImpostosDiminuiPag;
      r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem + v_item_valorLiquidoItem;
      SELECT COALESCE (MAX (sequencia),0) + 1
      INTO v_item_sequencia
      FROM MOORCAMENTOXITENS
      WHERE orcamento = p_cab_orcamento;
      ADD_ORCAMENTO_ITEM_GRAVA (
        p_uniqueMachineID,
        p_estabelecimentoAtivo,
        p_config_198_obs_add_referenc,
        p_config_199_obs_add_caractA,
        p_config_200_obs_add_caractB,
        p_config_201_obs_add_caractC,
        p_config_202_obs_add_caractD,
        p_config_203_obs_add_caractE,
        '',
        0,
        p_cab_orcamento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_etOrc_situacaoOrcamento,
        0,
        v_item_sequencia,
        0,
        0,
        p_item_modeloDocumento,
        p_item_estabelecimentoOriginal,
        p_item_vendedor,
        0,
        a.gradeProdutoFilho,
        v_item_servico,
        0,
        'A',
        0,
        0,
        0,
        0,
        0,
        999,
        v_item_operacaoFiscal,
        0,
        v_item_movimentaEstoque,
        v_item_geraFinanceiro,
        0,
        p_item_localEstoque,
        0,
        p_item_pessoaParticipante,
        p_item_dataEntrega,
        v_item_controleQuantidade,
        v_item_unidadeMedidaConversao,
        v_item_conversorQuantidade,
        v_item_loteMinimo,
        v_item_loteMultiplo,
        v_item_altura,
        v_item_largura,
        v_item_comprimento,
        v_item_pecas,
        v_item_quantidade,
        v_item_quantidadeConvertida,
        0,
        v_item_quantidade,
        p_item_controleEntrega,
        1,
        v_item_pesoLiquido,
        v_item_pesoBruto,
        v_item_tipoPreco,
        v_item_tabelaPreco,
        v_item_precoSugestaoAPrazo,
        v_item_precoSugestaoAVista,
        v_item_precoDesconto,
        v_item_precoMinimo,
        p_item_usarPrecoAVista,
        v_item_precoPautaTabelado,
        v_item_precoUnitarioBruto,
        0,
        v_item_precoUnitario,
        v_item_precoUnitarioConvertido,
        v_item_valorProdutoServicoBrut,
        v_item_valorProdutoServico,
        p_item_percDescontoItem,
        v_item_valorDescontoItem,
        p_item_percAcrescimoItem,
        v_item_valorAcrescimoItem,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        v_item_valorBasePagamento,
        0,
        0,
        0,
        0,
        0,
        v_item_valorDescontoTotal,
        v_item_valorOutrasDespTotal,
        0,
        0,
        v_item_cfop,
        v_item_indicadorISSQN,
        v_item_aliquotaISSQN,
        v_item_baseISSQN,
        v_item_valorISSQN,
        v_item_aliquotaIRRF,
        v_item_baseIRRF,
        v_item_valorIRRF,
        v_item_aliquotaINSS,
        v_item_baseINSS,
        v_item_valorINSS,
        v_item_retencaoPIS,
        v_item_baseRetPIS,
        v_item_valorRetPIS,
        v_item_retencaoCOFINS,
        v_item_baseRetCOFINS,
        v_item_valorRetCOFINS,
        v_item_retencaoCSLL,
        v_item_baseRetCSLL,
        v_item_valorRetCSLL,
        v_item_aliquotaII,
        v_item_baseII,
        v_item_valorII,
        v_item_aliquotaIOF,
        v_item_baseIOF,
        v_item_valorIOF,
        v_item_codigoEnquadramentoIPI,
        v_item_stIPI,
        v_item_aliquotaIPI,
        v_item_valorAliquotaIPI,
        v_item_baseIPI,
        v_item_valorIPI,
        v_item_stPIS,
        v_item_aliquotaPIS,
        v_item_valorAliquotaPIS,
        v_item_basePIS,
        v_item_valorPIS,
        v_item_aliquotaPISST,
        v_item_valorAliquotaPISST,
        v_item_basePISST,
        v_item_valorPISST,
        v_item_stCOFINS,
        v_item_aliquotaCOFINS,
        v_item_valorAliquotaCOFINS,
        v_item_baseCOFINS,
        v_item_valorCOFINS,
        v_item_aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST,
        v_item_baseCOFINSST,
        v_item_valorCOFINSST,
        v_item_stSimplesNacional,
        v_item_creditoSimplesNacional,
        v_item_baseCreditoSimplesNac,
        v_item_valorCreditoSimplesNac,
        v_item_stICMS,
        v_item_modalBaseCalcICMS,
        v_item_reducaoBaseICMS,
        v_item_aliquotaICMS,
        v_item_diferimentoICMS,
        v_item_motivoDesoneracaoICMS,
        v_item_baseICMS,
        v_item_valorICMSOperacao,
        v_item_valorICMSDiferido,
        v_item_valorICMS,
        v_item_valorICMSDesoneracao,
        v_item_modalBaseCalcICMSST,
        v_item_margemValorAdicST,
        v_item_reducaoBaseST,
        v_item_aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin,
        v_item_baseICMSST,
        v_item_valorICMSST,
        v_item_baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment,
        v_item_valorICMSProprioSubstit,
        v_item_reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo,
        v_item_baseICMSEfetivo,
        v_item_valorICMSEfetivo,
        v_item_aliquotaICMSUFDestinat,
        v_item_aliquotaICMSInterestad,
        v_item_partilhaICMSInterestad,
        v_item_baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente,
        v_item_valorICMSUFRemetente,
        v_item_aliquotaFCP,
        v_item_baseFCP,
        v_item_valorFCP,
        v_item_aliquotaFCPST,
        v_item_baseFCPST,
        v_item_valorFCPST,
        v_item_aliquotaFCPSTAnteriorm,
        v_item_baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente,
        v_item_aliquotaFCPUFDestinat,
        v_item_baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario,
        v_item_aliquotaEstImpFederais,
        v_item_aliquotaEstImpEstaduais,
        v_item_aliquotaEstImpMunicipai,
        v_item_baseEstimadaImpostos,
        v_item_valorEstImpFederais,
        v_item_valorEstImpEstaduais,
        v_item_valorEstImpMunicipais,
        v_item_valorImpostosSomaPag,
        v_item_valorImpostosDiminuiPag,
        v_item_valorLiquidoItem,
        p_item_observacoesDigitadas,
        /* Retornos */
        v_item_idItemOrcamento);
        r_item_valorTotalItem    := r_item_valorTotalItem + v_item_valorTotalItem;
        r_buffer_idItemOrcamento := CASE WHEN (r_buffer_idItemOrcamento IS NULL OR r_buffer_idItemOrcamento = '' OR r_buffer_idItemOrcamento = ' ') THEN '' ELSE RTRIM (r_buffer_idItemOrcamento) || ';' END || TO_CHAR (LPAD(v_item_idItemOrcamento,14,'0'));
      IF p_modDoc_habilitaAmbiente = 1 THEN
        MERGE INTO MOORCAMENTOXAMBIENTES a
        USING (
          SELECT
            v_item_idItemOrcamento idItemOrcamento,
            p_item_ambiente        ambiente,
            p_item_amb_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 IF;
      IF p_idItemOrcamentoReferenciado > 0 THEN
        ADD_ORCAMENTO_ITEM_ORC_GRAVA (
          p_estabelecimentoAtivo,
          v_item_idItemOrcamento,
          p_idItemOrcamentoReferenciado,
          v_item_quantidade);
      END IF;
      IF p_idItemDocTransferencia > 0 THEN
        ADD_ORCAMENTO_ITEM_TRANS_GRAVA (
          p_estabelecimentoAtivo,
          p_cab_entradaSaida,
          p_idItemDocTransferencia,
          v_item_idItemOrcamento,
          v_item_quantidade);
      END IF;
      IF p_idEnderecoEstoque > 0 THEN
        ADD_ORCAMENTO_ITEM_ENDER_GRAVA (
          p_estabelecimentoAtivo,
          0,
          v_item_idItemOrcamento,
          p_idEnderecoEstoque,
          v_item_quantidade,
          v_item_quantidade,
          ' ',
          /* Retornos */
          v_auxNumber);
      END IF;
    END IF;
  END LOOP;
END ADD_ORCAMENTO_ITEM_INSERE_COMB;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_INSERE (
    p_uniqueMachineID              IN VARCHAR2,
    p_usuarioLogado                IN NUMBER,
    p_perfilUsuarioLogado          IN NUMBER,
    p_estabelecimentoAtivo         IN NUMBER,
    p_person_190_modeloFrete       IN CHAR,
    p_config_64_casasDecSaidas     IN CHAR,
    p_config_65_casasDecEntrada    IN CHAR,
    p_config_198_obs_add_referenc  IN NUMBER,
    p_config_199_obs_add_caractA   IN NUMBER,
    p_config_200_obs_add_caractB   IN NUMBER,
    p_config_201_obs_add_caractC   IN NUMBER,
    p_config_202_obs_add_caractD   IN NUMBER,
    p_config_203_obs_add_caractE   IN NUMBER,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_config_378_calcularVolumes   IN NUMBER,
    p_manterFinanceiro             IN NUMBER,
    p_tempComp_nomeTempComposicao  IN VARCHAR2,
    p_tempComp_sequencia           IN NUMBER,
    p_cab_orcamento                IN NUMBER,
    p_item_modeloDocumento         IN NUMBER,
    p_item_estabelecimentoOriginal IN NUMBER,
    p_item_vendedor                IN NUMBER,
    p_item_gradeProduto            IN NUMBER,
    p_item_servico                 IN NUMBER,
    p_item_atividadeServico        IN NUMBER,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_idLoteEstoque           IN NUMBER,
    p_item_vinculoItemDocumento    IN NUMBER,
    p_item_operacaoFiscal          IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_dataEntrega             IN DATE,
    p_item_controleQuantidade      IN NUMBER,
    p_item_unidadeMedidaConversao  IN VARCHAR2,
    p_item_conversorQuantidade     IN NUMBER,
    p_item_loteMinimo              IN NUMBER,
    p_item_loteMultiplo            IN NUMBER,
    p_item_altura                  IN NUMBER,
    p_item_largura                 IN NUMBER,
    p_item_comprimento             IN NUMBER,
    p_item_pecas                   IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_item_quantidadeConvertida    IN NUMBER,
    p_item_controleEntrega         IN NUMBER,
    p_item_pesoLiquido             IN NUMBER,
    p_item_pesoBruto               IN NUMBER,
    p_item_tipoPreco               IN CHAR,
    p_item_tabelaPreco             IN VARCHAR2,
    p_item_precoSugestaoAPrazo     IN NUMBER,
    p_item_precoSugestaoAVista     IN NUMBER,
    p_item_precoDesconto           IN NUMBER,
    p_item_precoMinimo             IN NUMBER,
    p_item_usarPrecoAVista         IN NUMBER,
    p_item_precoPautaTabelado      IN NUMBER,
    p_item_precoUnitarioBruto      IN NUMBER,
    p_item_acrescimoUnitarioCompos IN NUMBER,
    p_item_precoUnitario           IN NUMBER,
    p_item_precoUnitarioConvertido IN NUMBER,
    p_item_valorProdutoServicoBrut IN NUMBER,
    p_item_valorProdutoServico     IN NUMBER,
    p_item_percDescontoItem        IN NUMBER,
    p_item_valorDescontoItem       IN NUMBER,
    p_item_percAcrescimoItem       IN NUMBER,
    p_item_valorAcrescimoItem      IN NUMBER,
    p_item_valorFreteItem          IN NUMBER,
    p_item_valorSeguroItem         IN NUMBER,
    p_item_valorAdicFreteMarItem   IN NUMBER,
    p_item_valorDespesasAduanItem  IN NUMBER,
    p_item_valorFreteGeral         IN NUMBER,
    p_item_valorSeguroGeral        IN NUMBER,
    p_item_valorDescontoGeral      IN NUMBER,
    p_item_valorOutrasDespGeral    IN NUMBER,
    p_item_valorAdicFreteMarGeral  IN NUMBER,
    p_item_valorDespesasAduanGeral IN NUMBER,
    p_item_observacoesDigitadas    IN VARCHAR2,
    p_idEnderecoEstoque            IN NUMBER,
    p_idNumeroSerie                IN NUMBER,
    p_item_ambiente                IN NUMBER,
    p_item_amb_observacoes         IN VARCHAR2,
    p_idItemOrcamentoReferenciado  IN NUMBER,
    p_idItemDocTransferencia       IN NUMBER,
    /* Retornos */
    r_calcularImpostos             OUT NUMBER,
    r_idItemOrcamento              OUT NUMBER,
    r_item_valorBasePagamento      OUT NUMBER)
IS
    v_auxNumber                    NUMBER;
    v_auxVarchar                   VARCHAR2(256);
    v_cab_origemDocumento          NUMBER;
    v_cab_tipoDocumento            NUMBER;
    v_cab_entradaSaida             CHAR(1);
    v_cab_finalidadeNota           CHAR(1);
    v_cab_atualizaCustoMedio       NUMBER;
    v_cab_estabelecimento          NUMBER;
    v_cab_dataEmissao              DATE;
    v_cab_dataPreco                DATE;
    v_cab_pessoa                   NUMBER;
    v_cab_dataEntrega              DATE;
    v_cab_modalidadeFrete          CHAR(1);
    v_cab_municipioFatoGerador     NUMBER;
    v_cab_localDestinoOperacao     CHAR;
    v_cab_enderecoEntregaPessoa    NUMBER;
    v_cab_indicadorConsumidorFinal CHAR(1);
    v_cab_tipoPagamentoFrete       CHAR(1);
    v_cab_ultimoVendedorItem       NUMBER;
    v_cab_quantidade               NUMBER;
    v_cab_quantidadeVolume         NUMBER;
    v_cab_pesoLiquido              NUMBER;
    v_cab_pesoBruto                NUMBER;
    v_cab_valorProdutosBruto       NUMBER;
    v_cab_valorProdutos            NUMBER;
    v_cab_valorDescontoProdutos    NUMBER;
    v_cab_valorAcrescimoProdutos   NUMBER;
    v_cab_valorServicosBruto       NUMBER;
    v_cab_valorServicos            NUMBER;
    v_cab_valorDescontoServicos    NUMBER;
    v_cab_valorAcrescimoServicos   NUMBER;
    v_cab_valorFreteItem           NUMBER;
    v_cab_valorSeguroItem          NUMBER;
    v_cab_valorAdicFreteMarItem    NUMBER;
    v_cab_valorDespesasAduanItem   NUMBER;
    v_cab_valorFreteGeral          NUMBER;
    v_cab_valorSeguroGeral         NUMBER;
    v_cab_valorDescontoGeral       NUMBER;
    v_cab_valorOutrasDespGeral     NUMBER;
    v_cab_valorAdicFreteMarGeral   NUMBER;
    v_cab_valorDespesasAduanGeral  NUMBER;
    v_cab_valorBasePagamento       NUMBER;
    v_cab_condicaoPagamento        NUMBER;
    v_cab_numeroParcelas           NUMBER;
    v_cab_somaPrazoParcelas        NUMBER;
    v_cab_valorXPrazoParcelas      NUMBER;
    v_cab_prazoMedio               NUMBER;
    v_cab_prazoMedioPonderado      NUMBER;
    v_cab_valorAVistaMinimo        NUMBER;
    v_cab_valorEntradaMinima       NUMBER;
    v_cab_valorAVistaEntrada       NUMBER;
    v_cab_valorPagamentoBruto      NUMBER;
    v_cab_valorPagamentoLiquido    NUMBER;
    v_cab_valorDescontoPagamento   NUMBER;
    v_cab_valorOutrasDespPag       NUMBER;
    v_cab_valorJurosPagamento      NUMBER;
    v_cab_valorTroco               NUMBER;
    v_cab_valorFreteTotal          NUMBER;
    v_cab_valorSeguroTotal         NUMBER;
    v_cab_valorDescontoTotal       NUMBER;
    v_cab_valorOutrasDespTotal     NUMBER;
    v_cab_valorAdicFreteMarTotal   NUMBER;
    v_cab_valorDespesasAduanTotal  NUMBER;
    v_cab_valorImpostosSomaPag     NUMBER;
    v_cab_valorImpostosDiminuiPag  NUMBER;
    v_cab_valorLiquidoItem         NUMBER;
    v_modDoc_capituloNatFiscal     NUMBER;
    v_modDoc_movimentaEstoque      NUMBER;
    v_modDoc_geraFinanceiro        NUMBER;
    v_modDoc_habilitaAmbiente      NUMBER;
    v_modDoc_tipoPreco             CHAR(1);
    v_modDoc_tabelaPreco           VARCHAR2(10);
    v_modDoc_fatorMultipPreco      NUMBER;
    v_modDoc_tipoPrecoB            CHAR(1);
    v_modDoc_tabelaPrecoB          VARCHAR2(10);
    v_modDoc_fatorMultipPrecoB     NUMBER;
    v_modDoc_diminuiDescontoPrUnit NUMBER;
    v_modDoc_somaAcrescimosPrUnit  NUMBER;
    v_modDoc_somaFreteSeguroPrUnit NUMBER;
    v_est_grupoFiscal              NUMBER;
    v_pessEst_regimeTributario     CHAR(1);
    v_munEndEst_uf                 CHAR(2);
    v_pess_indicadorInscricaoEstad CHAR(1);
    v_endPess_enderecoPessoa       NUMBER;
    v_munEndPess_uf                CHAR(2);
    v_munEndEntr_uf                CHAR(2);
    v_etOrc_situacaoOrcamento      NUMBER;
    v_item_sequencia               NUMBER;
    v_item_movimentaEstoque        NUMBER;
    v_item_geraFinanceiro          NUMBER;
    v_item_precoUnitario           NUMBER;
    v_item_precoUnitarioConvertido NUMBER;
    v_item_valorProdutoServico     NUMBER;
    v_item_valorDescontoGeral      NUMBER;
    v_item_valorFreteTotal         NUMBER;
    v_item_valorSeguroTotal        NUMBER;
    v_item_valorDescontoTotal      NUMBER;
    v_item_valorOutrasDespTotal    NUMBER;
    v_item_valorAdicFreteMarTotal  NUMBER;
    v_item_valorDespesasAduanTotal NUMBER;
    v_item_cfop                    NUMBER;
    v_item_indicadorISSQN          CHAR(1);
    v_item_aliquotaISSQN           NUMBER;
    v_item_baseISSQN               NUMBER;
    v_item_valorISSQN              NUMBER;
    v_item_aliquotaIRRF            NUMBER;
    v_item_baseIRRF                NUMBER;
    v_item_valorIRRF               NUMBER;
    v_item_aliquotaINSS            NUMBER;
    v_item_baseINSS                NUMBER;
    v_item_valorINSS               NUMBER;
    v_item_retencaoPIS             NUMBER;
    v_item_baseRetPIS              NUMBER;
    v_item_valorRetPIS             NUMBER;
    v_item_retencaoCOFINS          NUMBER;
    v_item_baseRetCOFINS           NUMBER;
    v_item_valorRetCOFINS          NUMBER;
    v_item_retencaoCSLL            NUMBER;
    v_item_baseRetCSLL             NUMBER;
    v_item_valorRetCSLL            NUMBER;
    v_item_aliquotaII              NUMBER;
    v_item_baseII                  NUMBER;
    v_item_valorII                 NUMBER;
    v_item_aliquotaIOF             NUMBER;
    v_item_baseIOF                 NUMBER;
    v_item_valorIOF                NUMBER;
    v_item_codigoEnquadramentoIPI  NUMBER;
    v_item_stIPI                   CHAR(2);
    v_item_aliquotaIPI             NUMBER;
    v_item_valorAliquotaIPI        NUMBER;
    v_item_baseIPI                 NUMBER;
    v_item_valorIPI                NUMBER;
    v_item_stPIS                   CHAR(2);
    v_item_aliquotaPIS             NUMBER;
    v_item_valorAliquotaPIS        NUMBER;
    v_item_basePIS                 NUMBER;
    v_item_valorPIS                NUMBER;
    v_item_aliquotaPISST           NUMBER;
    v_item_valorAliquotaPISST      NUMBER;
    v_item_basePISST               NUMBER;
    v_item_valorPISST              NUMBER;
    v_item_stCOFINS                CHAR(2);
    v_item_aliquotaCOFINS          NUMBER;
    v_item_valorAliquotaCOFINS     NUMBER;
    v_item_baseCOFINS              NUMBER;
    v_item_valorCOFINS             NUMBER;
    v_item_aliquotaCOFINSST        NUMBER;
    v_item_valorAliquotaCOFINSST   NUMBER;
    v_item_baseCOFINSST            NUMBER;
    v_item_valorCOFINSST           NUMBER;
    v_item_stSimplesNacional       CHAR(3);
    v_item_creditoSimplesNacional  NUMBER;
    v_item_baseCreditoSimplesNac   NUMBER;
    v_item_valorCreditoSimplesNac  NUMBER;
    v_item_stICMS                  CHAR(2);
    v_item_modalBaseCalcICMS       CHAR(1);
    v_item_reducaoBaseICMS         NUMBER;
    v_item_aliquotaICMS            NUMBER;
    v_item_diferimentoICMS         NUMBER;
    v_item_motivoDesoneracaoICMS   CHAR(2);
    v_item_baseICMS                NUMBER;
    v_item_valorICMSOperacao       NUMBER;
    v_item_valorICMSDiferido       NUMBER;
    v_item_valorICMS               NUMBER;
    v_item_valorICMSDesoneracao    NUMBER;
    v_item_modalBaseCalcICMSST     CHAR(1);
    v_item_margemValorAdicST       NUMBER;
    v_item_reducaoBaseST           NUMBER;
    v_item_aliquotaICMSST          NUMBER;
    v_item_aliquotaSTSuportConsFin NUMBER;
    v_item_baseICMSST              NUMBER;
    v_item_valorICMSST             NUMBER;
    v_item_baseICMSSTAnteriormente NUMBER;
    v_item_valorICMSSTAnteriorment NUMBER;
    v_item_valorICMSProprioSubstit NUMBER;
    v_item_reducaoBaseICMSEfetivo  NUMBER;
    v_item_aliquotaICMSEfetivo     NUMBER;
    v_item_baseICMSEfetivo         NUMBER;
    v_item_valorICMSEfetivo        NUMBER;
    v_item_aliquotaICMSUFDestinat  NUMBER;
    v_item_aliquotaICMSInterestad  NUMBER;
    v_item_partilhaICMSInterestad  NUMBER;
    v_item_baseICMSUFDestinatario  NUMBER;
    v_item_valorICMSUFDestinatario NUMBER;
    v_item_baseICMSUFRemetente     NUMBER;
    v_item_valorICMSUFRemetente    NUMBER;
    v_item_aliquotaFCP             NUMBER;
    v_item_baseFCP                 NUMBER;
    v_item_valorFCP                NUMBER;
    v_item_aliquotaFCPST           NUMBER;
    v_item_baseFCPST               NUMBER;
    v_item_valorFCPST              NUMBER;
    v_item_aliquotaFCPSTAnteriorm  NUMBER;
    v_item_aliquotaFCPUFDestinat   NUMBER;
    v_item_baseFCPSTAnteriormente  NUMBER;
    v_item_valorFCPSTAnteriormente NUMBER;
    v_item_baseFCPUFDestinatario   NUMBER;
    v_item_valorFCPUFDestinatario  NUMBER;
    v_item_aliquotaEstImpFederais  NUMBER;
    v_item_aliquotaEstImpEstaduais NUMBER;
    v_item_aliquotaEstImpMunicipai NUMBER;
    v_item_baseEstimadaImpostos    NUMBER;
    v_item_valorEstImpFederais     NUMBER;
    v_item_valorEstImpEstaduais    NUMBER;
    v_item_valorEstImpMunicipais   NUMBER;
    v_item_valorImpostosSomaPag    NUMBER;
    v_item_valorImpostosDiminuiPag NUMBER;
    v_item_valorLiquidoItem        NUMBER;
    v_item_observacoes             VARCHAR2 (4000);
    v_gradProd_produto             NUMBER;
    v_gradProd_cor                 NUMBER;
    v_gradProd_tamanho             VARCHAR(10);
    v_prod_controleEstoque         NUMBER;
    v_prod_tipoProduto             CHAR(2);
    v_prod_origemMercadoria        CHAR(1);
    v_prod_idNcm                   NUMBER;
    v_prod_listaServicos           NUMBER;
    v_ativServ_validoPrevisto      NUMBER;
    v_ativServ_habilitaAtivPrev    NUMBER;   
    v_locEst_indicadorPropPosseIt  CHAR(1);
    v_idEnderecoEstoqueOrcamento   NUMBER;
    v_buffer_idItemOrcamento       VARCHAR2 (32000);
    v_item_valorTotalItem          NUMBER;
    v_item_valorTotalItemComb      NUMBER;
    v_residuoRateioDescontoItem    NUMBER;
    v_residuoRateioAcrescimoItem   NUMBER;
    v_aj_idItemOrcamento           NUMBER;
    v_aj_valorTotalItem            NUMBER;
    v_aj_servico                   NUMBER;
    v_aj_quantidade                NUMBER;
    v_aj_quantidadeConvertida      NUMBER;
    v_aj_precoUnitarioBruto        NUMBER;
    v_aj_acrescimoUnitarioCompos   NUMBER;
    v_aj_precoUnitario             NUMBER;
    v_aj_precoUnitarioConvertido   NUMBER;
    v_aj_valorProdutoServicoBrut   NUMBER;
    v_aj_valorProdutoServico       NUMBER;
    v_aj_valorDescontoItem         NUMBER;
    v_aj_valorAcrescimoItem        NUMBER;
    v_aj_valorFreteItem            NUMBER;
    v_aj_valorSeguroItem           NUMBER;
    v_aj_valorAdicFreteMarItem     NUMBER;
    v_aj_valorDespesasAduanItem    NUMBER;
    v_aj_valorBasePagamento        NUMBER;
    v_aj_valorFreteTotal           NUMBER;
    v_aj_valorSeguroTotal          NUMBER;
    v_aj_valorDescontoTotal        NUMBER;
    v_aj_valorOutrasDespTotal      NUMBER;
    v_aj_valorAdicFreteMarTotal    NUMBER;
    v_aj_valorDespesasAduanTotal   NUMBER;
    v_aj_valorLiquidoItem          NUMBER;
    v_aj_usarPrecoAVista           NUMBER;
    v_aj_geraFinanceiro            NUMBER;
    v_aj_cfop_geraFinanceiro       NUMBER;
BEGIN
  v_item_precoUnitario           := p_item_precoUnitario;
  v_item_precoUnitarioConvertido := p_item_precoUnitarioConvertido;
  v_item_valorProdutoServico     := p_item_valorProdutoServico;
  v_item_valorDescontoGeral      := p_item_valorDescontoGeral;
  v_buffer_idItemOrcamento       := '';
  v_item_valorTotalItem          := 0;
  v_item_valorTotalItemComb      := 0;
  SELECT
    cab.origemDocumento,
    cab.tipoDocumento,
    cab.entradaSaida,
    cab.finalidadeNota,
    cab.atualizaCustoMedio,
    cab.estabelecimento,
    cab.dataEmissao,
    cab.dataPreco,
    cab.pessoa,
    cab.dataEntrega,
    cab.municipioFatoGerador,
    cab.localDestinoOperacao,
    cab.enderecoEntregaPessoa,
    cab.indicadorConsumidorFinal,
    cab.modalidadeFrete,
    cab.tipoPagamentoFrete,
    cab.quantidadeVolume,
    cab.ultimoVendedorItem,
    cab.quantidade,
    cab.pesoLiquido,
    cab.pesoBruto,
    cab.valorProdutosBruto,
    cab.valorProdutos,
    cab.valorDescontoProdutos,
    cab.valorAcrescimoProdutos,
    cab.valorServicosBruto,
    cab.valorServicos,
    cab.valorDescontoServicos,
    cab.valorAcrescimoServicos,
    cab.valorFreteItem,
    cab.valorSeguroItem,
    cab.valorAdicFreteMarinhaMerItem,
    cab.valorDespesasAduaneirasItem,
    cab.valorFreteGeral,
    cab.valorSeguroGeral,
    cab.valorDescontoGeral,
    cab.valorOutrasDespesasGeral,
    cab.valorAdicFreteMarinhaMerGeral,
    cab.valorDespesasAduaneirasGeral,
    cab.condicaoPagamento,
    cab.numeroParcelas,
    cab.somaPrazoParcelas,
    cab.valorXPrazoParcelas,
    cab.prazoMedio,
    cab.prazoMedioPonderado,
    cab.valorBasePagamento,
    cab.valorAVistaMinimo,
    cab.valorEntradaMinima,
    cab.valorAVistaEntrada,
    cab.valorPagamentoBruto,
    cab.valorDescontoPagamento,
    cab.valorOutrasDespesasPagamento,
    cab.valorJurosPagamento,
    cab.valorPagamentoLiquido,
    cab.valorTroco,
    cab.valorFreteTotal,
    cab.valorSeguroTotal,
    cab.valorDescontoTotal,
    cab.valorOutrasDespesasTotal,
    cab.valorAdicFreteMarinhaMerTotal,
    cab.valorDespesasAduaneirasTotal,
    cab.valorImpostosSomaPagamento,
    cab.valorImpostosDiminuiPagamento,
    cab.valorLiquidoItem,
    modDoc.capituloNaturezaFiscal,
    modDoc.movimentaEstoque,
    modDoc.geraFinanceiro,
    modDoc.habilitaAmbiente,
    modDoc.tipoPreco,
    modDoc.tabelaPreco,
    modDoc.fatorMultiplicadorPreco,
    modDoc.tipoPrecoB,
    modDoc.tabelaPrecoB,
    modDoc.fatorMultiplicadorPrecoB,
    modDoc.diminuiDescontoPrUnit,
    modDoc.somaAcrescimosPrUnit,
    modDoc.somaFreteSeguroPrUnit,
    est.grupoFiscal,
    COALESCE (pessEst.regimeTributario, ' '),
    COALESCE ((
      SELECT MIN(munEst.uf)
      FROM CAENDERECOSPESSOA endEst
      JOIN SIMUNICIPIOS munEst
      ON munEst.municipio = endEst.municipio
      WHERE endEst.pessoa = est.pessoaEstabelecimento
      AND endEst.ativo = 1
      AND endEst.principal = 1), '  '),
    pess.indicadorInscricaoEstadual,
    COALESCE ((
      SELECT MIN(enderecoPessoa)
      FROM CAENDERECOSPESSOA endPess
      JOIN SIMUNICIPIOS munPess
      ON munPess.municipio = endPess.municipio
      WHERE endPess.pessoa = cab.pessoa
      AND endPess.ativo = 1
      AND endPess.principal = 1), 0),
    COALESCE ((
      SELECT MIN(munPess.uf)
      FROM CAENDERECOSPESSOA endPess
      JOIN SIMUNICIPIOS munPess
      ON munPess.municipio = endPess.municipio
      WHERE endPess.pessoa = cab.pessoa
      AND endPess.ativo = 1
      AND endPess.principal = 1), '  '),
    munEndEntr.uf,
    etOrc.situacaoOrcamento
  INTO
    v_cab_origemDocumento,
    v_cab_tipoDocumento,
    v_cab_entradaSaida,
    v_cab_finalidadeNota,
    v_cab_atualizaCustoMedio,
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_dataPreco,
    v_cab_pessoa,
    v_cab_dataEntrega,
    v_cab_municipioFatoGerador,
    v_cab_localDestinoOperacao,
    v_cab_enderecoEntregaPessoa,
    v_cab_indicadorConsumidorFinal,
    v_cab_modalidadeFrete,
    v_cab_tipoPagamentoFrete,
    v_cab_quantidadeVolume,
    v_cab_ultimoVendedorItem,
    v_cab_quantidade,
    v_cab_pesoLiquido,
    v_cab_pesoBruto,
    v_cab_valorProdutosBruto,
    v_cab_valorProdutos,
    v_cab_valorDescontoProdutos,
    v_cab_valorAcrescimoProdutos,
    v_cab_valorServicosBruto,
    v_cab_valorServicos,
    v_cab_valorDescontoServicos,
    v_cab_valorAcrescimoServicos,
    v_cab_valorFreteItem,
    v_cab_valorSeguroItem,
    v_cab_valorAdicFreteMarItem,
    v_cab_valorDespesasAduanItem,
    v_cab_valorFreteGeral,
    v_cab_valorSeguroGeral,
    v_cab_valorDescontoGeral,
    v_cab_valorOutrasDespGeral,
    v_cab_valorAdicFreteMarGeral,
    v_cab_valorDespesasAduanGeral,
    v_cab_condicaoPagamento,
    v_cab_numeroParcelas,
    v_cab_somaPrazoParcelas,
    v_cab_valorXPrazoParcelas,
    v_cab_prazoMedio,
    v_cab_prazoMedioPonderado,
    v_cab_valorBasePagamento,
    v_cab_valorAVistaMinimo,
    v_cab_valorEntradaMinima,
    v_cab_valorAVistaEntrada,
    v_cab_valorPagamentoBruto,
    v_cab_valorDescontoPagamento,
    v_cab_valorOutrasDespPag,
    v_cab_valorJurosPagamento,
    v_cab_valorPagamentoLiquido,
    v_cab_valorTroco,
    v_cab_valorFreteTotal,
    v_cab_valorSeguroTotal,
    v_cab_valorDescontoTotal,
    v_cab_valorOutrasDespTotal,
    v_cab_valorAdicFreteMarTotal,
    v_cab_valorDespesasAduanTotal,
    v_cab_valorImpostosSomaPag,
    v_cab_valorImpostosDiminuiPag,
    v_cab_valorLiquidoItem,
    v_modDoc_capituloNatFiscal,
    v_modDoc_movimentaEstoque,
    v_modDoc_geraFinanceiro,
    v_modDoc_habilitaAmbiente,
    v_modDoc_tipoPreco,
    v_modDoc_tabelaPreco,
    v_modDoc_fatorMultipPreco,
    v_modDoc_tipoPrecoB,
    v_modDoc_tabelaPrecoB,
    v_modDoc_fatorMultipPrecoB,
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit,
    v_est_grupoFiscal,
    v_pessEst_regimeTributario,
    v_munEndEst_uf,
    v_pess_indicadorInscricaoEstad,
    v_endPess_enderecoPessoa,
    v_munEndPess_uf,
    v_munEndEntr_uf,
    v_etOrc_situacaoOrcamento
  FROM MOORCAMENTOS cab
  JOIN PAMODELOSDOCUMENTO modDoc
  ON modDoc.modeloDocumento = p_item_modeloDocumento
  JOIN PAESTABELECIMENTOS est
  ON est.estabelecimento = cab.estabelecimento
  JOIN CAPESSOAS pessEst
  ON pessEst.pessoa = est.pessoaEstabelecimento
  JOIN CAPESSOAS pess
  ON pess.pessoa = cab.pessoa
  JOIN CAENDERECOSPESSOA endEntr
  ON endEntr.enderecoPessoa = cab.enderecoEntregaPessoa
  JOIN SIMUNICIPIOS munEndEntr
  ON munEndEntr.municipio = endEntr.municipio
  JOIN PAETAPASORCAMENTO etOrc
  ON etOrc.etapaOrcamento = cab.etapaOrcamento
  WHERE cab.orcamento = p_cab_orcamento;
  SELECT
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho,
    prod.controleEstoque,
    prod.tipoProduto,
    prod.origemMercadoria,
    prod.idNcm,
    prod.listaServicos
  INTO
    v_gradProd_produto,
    v_gradProd_cor,
    v_gradProd_tamanho,
    v_prod_controleEstoque,
    v_prod_tipoProduto,
    v_prod_origemMercadoria,
    v_prod_idNcm,
    v_prod_listaServicos
  FROM CAGRADESPRODUTO gradProd
  JOIN CAPRODUTOS prod
  ON prod.produto = gradProd.produto
  WHERE gradProd.gradeProduto = p_item_gradeProduto;
  SELECT
    validoPrevisto,
    habilitaAtividadePrevista
  INTO
    v_ativServ_validoPrevisto,
    v_ativServ_habilitaAtivPrev
  FROM PAATIVIDADESSERVICO
  WHERE atividadeServico = p_item_atividadeServico;
  SELECT indicadorPropriedadePosseItem
  INTO v_locEst_indicadorPropPosseIt
  FROM PALOCAISESTOQUE
  WHERE localEstoque = p_item_localEstoque;
  r_calcularImpostos := 0;
  r_idItemOrcamento  := 0;
  IF p_manterFinanceiro = 0
    AND (v_cab_valorFreteGeral <> 0
      OR v_cab_valorSeguroGeral <> 0
      OR v_cab_valorDescontoGeral <> 0
      OR v_cab_valorOutrasDespGeral <> 0
      OR v_cab_valorAdicFreteMarGeral <> 0
      OR v_cab_valorDespesasAduanGeral <> 0) THEN
    r_calcularImpostos := 1;
  END IF;  
  IF p_manterFinanceiro = 0
    AND (v_cab_valorDescontoGeral <> 0
      OR v_cab_valorOutrasDespGeral <> 0
      OR v_cab_valorPagamentoBruto <> 0) THEN
    r_calcularImpostos := 1;
    ADD_ORCAMENTO_PAG_EXCLUI_TROCA (
      r_calcularImpostos,
      p_cab_orcamento,
      v_cab_valorDescontoGeral,
      v_cab_valorOutrasDespGeral,
      v_cab_valorDescontoPagamento,
      v_cab_valorOutrasDespPag,
      v_cab_valorJurosPagamento,
      0,
      v_item_valorDescontoGeral,
      0,
      0,
      0,
      /* Retornos */
      r_calcularImpostos,
      v_cab_valorDescontoGeral,
      v_cab_condicaoPagamento,
      v_cab_numeroParcelas,
      v_cab_somaPrazoParcelas,
      v_cab_valorXPrazoParcelas,
      v_cab_prazoMedio,
      v_cab_prazoMedioPonderado,
      v_cab_valorEntradaMinima,
      v_cab_valorAVistaEntrada,
      v_cab_valorPagamentoBruto,
      v_cab_valorDescontoPagamento,
      v_cab_valorOutrasDespPag,
      v_cab_valorJurosPagamento,
      v_cab_valorPagamentoLiquido,
      v_cab_valorTroco,
      v_item_valorDescontoGeral,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber);
  END IF;
  v_cab_ultimoVendedorItem := p_item_vendedor;
  IF v_prod_controleEstoque = 3 THEN
    v_item_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_uniqueMachineID,
      p_config_198_obs_add_referenc,
      p_config_199_obs_add_caractA,
      p_config_200_obs_add_caractB,
      p_config_201_obs_add_caractC,
      p_config_202_obs_add_caractD,
      p_config_203_obs_add_caractE,
      p_tempComp_nomeTempComposicao,
      p_tempComp_sequencia,
      'O',
      0,
      p_item_gradeProduto,
      0,
      0,
      0,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    v_auxNumber := 0;
    ADD_ORCAMENTO_ITEM_INSERE_COMB (
      p_uniqueMachineID,
      p_usuarioLogado,
      p_perfilUsuarioLogado,
      p_estabelecimentoAtivo,
      p_config_64_casasDecSaidas,
      p_config_65_casasDecEntrada,
      p_config_198_obs_add_referenc,
      p_config_199_obs_add_caractA,
      p_config_200_obs_add_caractB,
      p_config_201_obs_add_caractC,
      p_config_202_obs_add_caractD,
      p_config_203_obs_add_caractE,
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_config_378_calcularVolumes,
      p_cab_orcamento,
      v_cab_origemDocumento,
      v_cab_tipoDocumento,
      v_cab_entradaSaida,
      v_cab_finalidadeNota,
      v_cab_atualizaCustoMedio,
      v_cab_estabelecimento,
      v_cab_dataEmissao,
      v_cab_dataPreco,
      v_cab_pessoa,
      v_cab_dataEntrega,
      v_cab_enderecoEntregaPessoa,
      v_cab_municipioFatoGerador,
      v_cab_localDestinoOperacao,
      v_cab_indicadorConsumidorFinal,
      v_cab_tipoPagamentoFrete,
      v_cab_quantidadeVolume,
      v_cab_quantidade,
      v_cab_pesoLiquido,
      v_cab_pesoBruto,
      v_cab_valorProdutosBruto,
      v_cab_valorProdutos,
      v_cab_valorDescontoProdutos,
      v_cab_valorAcrescimoProdutos,
      v_cab_valorServicosBruto,
      v_cab_valorServicos,
      v_cab_valorDescontoServicos,
      v_cab_valorAcrescimoServicos,
      v_cab_prazoMedioPonderado,
      v_cab_valorBasePagamento,
      v_cab_valorAVistaMinimo,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespTotal,
      v_cab_valorFreteTotal,
      v_cab_valorSeguroTotal,
      v_cab_valorAdicFreteMarTotal,
      v_cab_valorDespesasAduanTotal,
      v_cab_valorImpostosSomaPag,
      v_cab_valorImpostosDiminuiPag,
      v_cab_valorLiquidoItem,
      v_est_grupoFiscal,
      v_pessEst_regimeTributario,
      v_munEndEst_uf,
      v_pess_indicadorInscricaoEstad,
      v_endPess_enderecoPessoa,
      v_munEndPess_uf,
      v_munEndEntr_uf,
      v_etOrc_situacaoOrcamento,
      p_item_modeloDocumento,
      p_item_estabelecimentoOriginal,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_localEstoque,
      p_item_pessoaParticipante,
      p_item_dataEntrega,
      p_item_quantidade,
      p_item_controleEntrega,
      p_item_usarPrecoAVista,
      p_item_percDescontoItem,
      p_item_percAcrescimoItem,
      v_item_observacoes,
      p_idEnderecoEstoque,
      p_item_ambiente,
      p_item_amb_observacoes,
      v_modDoc_capituloNatFiscal,
      v_modDoc_movimentaEstoque,
      v_modDoc_geraFinanceiro,
      v_modDoc_habilitaAmbiente,
      v_modDoc_tipoPreco,
      v_modDoc_tabelaPreco,
      v_modDoc_fatorMultipPreco,
      v_modDoc_tipoPrecoB,
      v_modDoc_tabelaPrecoB,
      v_modDoc_fatorMultipPrecoB,
      v_modDoc_diminuiDescontoPrUnit,
      v_modDoc_somaAcrescimosPrUnit,
      v_modDoc_somaFreteSeguroPrUnit,
      p_idItemOrcamentoReferenciado,
      p_idItemDocTransferencia,
      v_buffer_idItemOrcamento,
      /* Retornos */
      v_cab_quantidadeVolume,
      v_cab_quantidade,
      v_cab_pesoLiquido,
      v_cab_pesoBruto,
      v_cab_valorProdutosBruto,
      v_cab_valorProdutos,
      v_cab_valorDescontoProdutos,
      v_cab_valorAcrescimoProdutos,
      v_cab_valorServicosBruto,
      v_cab_valorServicos,
      v_cab_valorDescontoServicos,
      v_cab_valorAcrescimoServicos,
      v_cab_valorBasePagamento,
      v_cab_valorAVistaMinimo,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespTotal,
      v_cab_valorImpostosSomaPag,
      v_cab_valorImpostosDiminuiPag,
      v_cab_valorLiquidoItem,
      v_buffer_idItemOrcamento,
      v_item_valorTotalItemComb);
      ADD_CALCULA_TOTAIS_ITEM (
        v_cab_tipoPagamentoFrete,
        v_modDoc_diminuiDescontoPrUnit,
        v_modDoc_somaAcrescimosPrUnit,
        v_modDoc_somaFreteSeguroPrUnit,
        p_item_quantidade,
        p_item_quantidadeConvertida,
        p_item_precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos,
        v_item_precoUnitario,
        p_item_valorDescontoItem,
        p_item_valorAcrescimoItem,
        p_item_valorFreteItem,
        p_item_valorSeguroItem,
        p_item_valorAdicFreteMarItem,
        p_item_valorDespesasAduanItem,
        p_item_valorFreteGeral,
        p_item_valorSeguroGeral,
        p_item_valorDescontoGeral,
        p_item_valorOutrasDespGeral,
        p_item_valorAdicFreteMarGeral,
        p_item_valorDespesasAduanGeral,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        /* Retornos */
        v_item_precoUnitario,
        v_item_precoUnitarioConvertido,
        v_item_valorProdutoServico,
        v_auxNumber,
        v_item_valorTotalItem,
        v_item_valorFreteTotal,
        v_item_valorSeguroTotal,
        v_item_valorDescontoTotal,
        v_item_valorOutrasDespTotal,
        v_item_valorAdicFreteMarTotal,
        v_item_valorDespesasAduanTotal,
        v_auxNumber,
        v_auxNumber);
    IF v_item_valorTotalItem <> 0
      AND v_item_valorTotalItem <> v_item_valorTotalItemComb
    THEN
      v_residuoRateioDescontoItem  := 0;
      v_residuoRateioAcrescimoItem := 0;
      WHILE v_buffer_idItemOrcamento IS NOT NULL AND LENGTH(RTRIM(v_buffer_idItemOrcamento)) >= 14
      LOOP
        v_aj_idItemOrcamento     := TO_NUMBER(SUBSTR(v_buffer_idItemOrcamento, 1, 14));
        v_aj_valorTotalItem      := 0;
        v_buffer_idItemOrcamento := RTRIM(SUBSTR(v_buffer_idItemOrcamento,16,32000));
        SELECT
          a.servico,
          a.quantidade,
          a.quantidadeConvertida,
          a.precoUnitarioBruto,
          a.acrescimoUnitarioComposicao,
          a.precoUnitario,
          a.precoUnitarioConvertido,
          a.valorProdutoServicoBruto,
          a.valorProdutoServico,
          a.valorDescontoItem,
          a.valorAcrescimoItem,
          a.valorFreteItem,
          a.valorSeguroItem,
          a.valorAdicFreteMarinhaMerItem,
          a.valorDespesasAduaneirasItem,
          a.valorBasePagamento,
          a.valorFreteTotal,
          a.valorSeguroTotal,
          a.valorDescontoTotal,
          a.valorOutrasDespesasTotal,
          a.valorAdicFreteMarinhaMerTotal,
          a.valorDespesasAduaneirasTotal,
          a.valorLiquidoItem,
          a.usarPrecoAVista,
          a.geraFinanceiro,
          cfop.geraFinanceiro
        INTO
          v_aj_servico,
          v_aj_quantidade,
          v_aj_quantidadeConvertida,
          v_aj_precoUnitarioBruto,
          v_aj_acrescimoUnitarioCompos,
          v_aj_precoUnitario,
          v_aj_precoUnitarioConvertido,
          v_aj_valorProdutoServicoBrut,
          v_aj_valorProdutoServico,
          v_aj_valorDescontoItem,
          v_aj_valorAcrescimoItem,
          v_aj_valorFreteItem,
          v_aj_valorSeguroItem,
          v_aj_valorAdicFreteMarItem,
          v_aj_valorDespesasAduanItem,
          v_aj_valorBasePagamento,
          v_aj_valorFreteTotal,
          v_aj_valorSeguroTotal,
          v_aj_valorDescontoTotal,
          v_aj_valorOutrasDespTotal,
          v_aj_valorAdicFreteMarTotal,
          v_aj_valorDespesasAduanTotal,
          v_aj_valorLiquidoItem,
          v_aj_usarPrecoAVista,
          v_aj_geraFinanceiro,
          v_aj_cfop_geraFinanceiro
        FROM MOORCAMENTOXITENS a
        JOIN SICFOPS cfop
        ON cfop.cfop = a.cfop
        WHERE a.idItemOrcamento = v_aj_idItemOrcamento;        
        IF v_aj_servico = 1 THEN
          v_cab_valorServicosBruto       := v_cab_valorServicosBruto      - v_aj_valorProdutoServicoBrut;
          v_cab_valorServicos            := v_cab_valorServicos           - v_aj_valorProdutoServico;
          v_cab_valorDescontoServicos    := v_cab_valorDescontoServicos   - v_aj_valorDescontoItem;
          v_cab_valorAcrescimoServicos   := v_cab_valorAcrescimoServicos  - v_aj_valorAcrescimoItem;
        ELSE 
          v_cab_valorProdutosBruto       := v_cab_valorProdutosBruto      - v_aj_valorProdutoServicoBrut;
          v_cab_valorProdutos            := v_cab_valorProdutos           - v_aj_valorProdutoServico;
          v_cab_valorDescontoProdutos    := v_cab_valorDescontoProdutos   - v_aj_valorDescontoItem;
          v_cab_valorAcrescimoProdutos   := v_cab_valorAcrescimoProdutos  - v_aj_valorAcrescimoItem;
        END IF;
        v_cab_valorFreteItem           := v_cab_valorFreteItem          - v_aj_valorFreteItem;
        v_cab_valorSeguroItem          := v_cab_valorSeguroItem         - v_aj_valorSeguroItem;
        v_cab_valorAdicFreteMarItem    := v_cab_valorAdicFreteMarItem   - v_aj_valorAdicFreteMarItem;
        v_cab_valorDespesasAduanItem   := v_cab_valorDespesasAduanItem  - v_aj_valorDespesasAduanItem;
        v_cab_valorBasePagamento       := v_cab_valorBasePagamento      - v_aj_valorBasePagamento;
        r_item_valorBasePagamento      := r_item_valorBasePagamento     - v_aj_valorBasePagamento;
        IF v_aj_usarPrecoAVista = 1 AND v_aj_geraFinanceiro = 1 AND v_aj_cfop_geraFinanceiro = 1 THEN
          v_cab_valorAVistaMinimo        := v_cab_valorAVistaMinimo - v_aj_valorProdutoServico + v_aj_valorDescontoTotal - v_aj_valorOutrasDespTotal;
        END IF;
        v_cab_valorFreteTotal          := v_cab_valorFreteTotal         - v_aj_valorFreteTotal;
        v_cab_valorSeguroTotal         := v_cab_valorSeguroTotal        - v_aj_valorSeguroTotal;
        v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal      - v_aj_valorDescontoTotal;
        v_cab_valorOutrasDespTotal     := v_cab_valorOutrasDespTotal    - v_aj_valorOutrasDespTotal;
        v_cab_valorAdicFreteMarTotal   := v_cab_valorAdicFreteMarTotal  - v_aj_valorAdicFreteMarTotal;
        v_cab_valorDespesasAduanTotal  := v_cab_valorDespesasAduanTotal - v_aj_valorDespesasAduanTotal;
        v_cab_valorLiquidoItem         := v_cab_valorLiquidoItem        - v_aj_valorLiquidoItem;
        -- Total item original        
        ADD_CALCULA_TOTAIS_ITEM (
          v_cab_tipoPagamentoFrete,
          v_modDoc_diminuiDescontoPrUnit,
          v_modDoc_somaAcrescimosPrUnit,
          v_modDoc_somaFreteSeguroPrUnit,
          v_aj_quantidade,
          v_aj_quantidadeConvertida,
          v_aj_precoUnitarioBruto,
          v_aj_acrescimoUnitarioCompos,
          v_aj_precoUnitario,
          v_aj_valorDescontoItem,
          v_aj_valorAcrescimoItem,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          /* Retornos */
          v_aj_precoUnitario,
          v_aj_precoUnitarioConvertido,
          v_aj_valorProdutoServico,
          v_auxNumber,
          v_aj_valorTotalItem,
          v_aj_valorFreteTotal,
          v_aj_valorSeguroTotal,
          v_aj_valorDescontoTotal,
          v_aj_valorOutrasDespTotal,
          v_aj_valorAdicFreteMarTotal,
          v_aj_valorDespesasAduanTotal,
          v_auxNumber,
          v_auxNumber);
        v_aj_valorDescontoItem := 
          v_aj_valorDescontoItem
          + ROUND(
              CASE
                WHEN v_item_valorTotalItemComb > v_item_valorTotalItem
                THEN v_item_valorTotalItemComb - v_item_valorTotalItem
                ELSE 0
              END
              * v_aj_valorTotalItem / v_item_valorTotalItemComb
              + v_residuoRateioDescontoItem,2);
        v_residuoRateioDescontoItem :=
          CASE
            WHEN v_item_valorTotalItemComb > v_item_valorTotalItem
            THEN v_item_valorTotalItemComb - v_item_valorTotalItem
            ELSE 0
          END
          * v_aj_valorTotalItem / v_item_valorTotalItemComb
          + v_residuoRateioDescontoItem
          - ROUND(
              CASE
                WHEN v_item_valorTotalItemComb > v_item_valorTotalItem
                THEN v_item_valorTotalItemComb - v_item_valorTotalItem
                ELSE 0
              END
              * v_aj_valorTotalItem / v_item_valorTotalItemComb
              + v_residuoRateioDescontoItem,2);
        v_aj_valorAcrescimoItem :=
          v_aj_valorAcrescimoItem
          + ROUND(
              CASE
                WHEN v_item_valorTotalItem > v_item_valorTotalItemComb
                THEN v_item_valorTotalItem - v_item_valorTotalItemComb
                ELSE 0
              END
              * v_aj_valorTotalItem / v_item_valorTotalItemComb
              + v_residuoRateioAcrescimoItem,2);
        v_residuoRateioAcrescimoItem :=
          CASE
            WHEN v_item_valorTotalItem > v_item_valorTotalItemComb
            THEN v_item_valorTotalItem - v_item_valorTotalItemComb
            ELSE 0
          END
          * v_aj_valorTotalItem / v_item_valorTotalItemComb
          + v_residuoRateioAcrescimoItem
          - ROUND(
              CASE 
                WHEN v_item_valorTotalItem > v_item_valorTotalItemComb
                THEN v_item_valorTotalItem - v_item_valorTotalItemComb
                ELSE 0
              END
              * v_aj_valorTotalItem / v_item_valorTotalItemComb
              + v_residuoRateioAcrescimoItem,2);
        -- Total item novo
        ADD_CALCULA_TOTAIS_ITEM (
          v_cab_tipoPagamentoFrete,
          v_modDoc_diminuiDescontoPrUnit,
          v_modDoc_somaAcrescimosPrUnit,
          v_modDoc_somaFreteSeguroPrUnit,
          v_aj_quantidade,
          v_aj_quantidadeConvertida,
          v_aj_precoUnitarioBruto,
          v_aj_acrescimoUnitarioCompos,
          v_aj_precoUnitario,
          v_aj_valorDescontoItem,
          v_aj_valorAcrescimoItem,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          /* Retornos */
          v_aj_precoUnitario,
          v_aj_precoUnitarioConvertido,
          v_aj_valorProdutoServico,
          v_auxNumber,
          v_aj_valorTotalItem,
          v_aj_valorFreteTotal,
          v_aj_valorSeguroTotal,
          v_aj_valorDescontoTotal,
          v_aj_valorOutrasDespTotal,
          v_aj_valorAdicFreteMarTotal,
          v_aj_valorDespesasAduanTotal,
          v_auxNumber,
          v_auxNumber);
        IF v_aj_servico = 1 THEN
          v_cab_valorServicosBruto       := v_cab_valorServicosBruto      + v_aj_valorProdutoServicoBrut;
          v_cab_valorServicos            := v_cab_valorServicos           + v_aj_valorProdutoServico;
          v_cab_valorDescontoServicos    := v_cab_valorDescontoServicos   + v_aj_valorDescontoItem;
          v_cab_valorAcrescimoServicos   := v_cab_valorAcrescimoServicos  + v_aj_valorAcrescimoItem;
        ELSE 
          v_cab_valorProdutosBruto       := v_cab_valorProdutosBruto      + v_aj_valorProdutoServicoBrut;
          v_cab_valorProdutos            := v_cab_valorProdutos           + v_aj_valorProdutoServico;
          v_cab_valorDescontoProdutos    := v_cab_valorDescontoProdutos   + v_aj_valorDescontoItem;
          v_cab_valorAcrescimoProdutos   := v_cab_valorAcrescimoProdutos  + v_aj_valorAcrescimoItem;
        END IF;
        v_cab_valorFreteItem           := v_cab_valorFreteItem          + v_aj_valorFreteItem;
        v_cab_valorSeguroItem          := v_cab_valorSeguroItem         + v_aj_valorSeguroItem;
        v_cab_valorAdicFreteMarItem    := v_cab_valorAdicFreteMarItem   + v_aj_valorAdicFreteMarItem;
        v_cab_valorDespesasAduanItem   := v_cab_valorDespesasAduanItem  + v_aj_valorDespesasAduanItem;
        v_cab_valorBasePagamento       := v_cab_valorBasePagamento      + v_aj_valorBasePagamento;
        r_item_valorBasePagamento      := r_item_valorBasePagamento     + v_aj_valorBasePagamento;
        IF v_aj_usarPrecoAVista = 1 AND v_aj_geraFinanceiro = 1 AND v_aj_cfop_geraFinanceiro = 1 THEN
          v_cab_valorAVistaMinimo        := v_cab_valorAVistaMinimo + v_aj_valorProdutoServico - v_aj_valorDescontoTotal + v_aj_valorOutrasDespTotal;
        END IF;
        v_cab_valorFreteTotal          := v_cab_valorFreteTotal         + v_aj_valorFreteTotal;
        v_cab_valorSeguroTotal         := v_cab_valorSeguroTotal        + v_aj_valorSeguroTotal;
        v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal      + v_aj_valorDescontoTotal;
        v_cab_valorOutrasDespTotal     := v_cab_valorOutrasDespTotal    + v_aj_valorOutrasDespTotal;
        v_cab_valorAdicFreteMarTotal   := v_cab_valorAdicFreteMarTotal  + v_aj_valorAdicFreteMarTotal;
        v_cab_valorDespesasAduanTotal  := v_cab_valorDespesasAduanTotal + v_aj_valorDespesasAduanTotal;
        v_cab_valorLiquidoItem         := v_cab_valorLiquidoItem        + v_aj_valorLiquidoItem;
        r_calcularImpostos      := 1;
        UPDATE MOORCAMENTOXITENS SET
          acrescimoUnitarioComposicao   = v_aj_acrescimoUnitarioCompos,
          precoUnitario                 = v_aj_precoUnitario,
          precoUnitarioConvertido       = v_aj_precoUnitarioConvertido,
          valorProdutoServico           = v_aj_valorProdutoServico,
          percDescontoItem              = CASE WHEN v_aj_valorProdutoServicoBrut = 0 THEN 0 ELSE ROUND(100* v_aj_valorDescontoItem / v_aj_valorProdutoServicoBrut,4) END,
          valorDescontoItem             = v_aj_valorDescontoItem,
          percAcrescimoItem              = CASE WHEN v_aj_valorProdutoServicoBrut = 0 THEN 0 ELSE ROUND(100* v_aj_valorAcrescimoItem / v_aj_valorProdutoServicoBrut,4) END,
          valorAcrescimoItem            = v_aj_valorAcrescimoItem,
          valorFreteTotal               = v_aj_valorFreteTotal,
          valorSeguroTotal              = v_aj_valorSeguroTotal,
          valorDescontoTotal            = v_aj_valorDescontoTotal,
          valorOutrasDespesasTotal      = v_aj_valorOutrasDespTotal,
          valorAdicFreteMarinhaMerTotal = v_aj_valorAdicFreteMarTotal,
          valorDespesasAduaneirasTotal  = v_aj_valorDespesasAduanTotal
        WHERE idItemOrcamento = v_aj_idItemOrcamento;
      END LOOP;
    END IF;
  ELSE
    r_item_valorBasePagamento      := 0;
    ADD_ITEM_OPERACAO_FISCAL_BUSCA (
      1,
      v_cab_origemDocumento,
      v_cab_tipoDocumento,
      v_cab_entradaSaida,
      0,
      v_cab_finalidadeNota,
      v_cab_estabelecimento,
      0,
      v_cab_dataEmissao,
      v_cab_pessoa,
      0,
      v_cab_enderecoEntregaPessoa,
      v_cab_localDestinoOperacao,
      v_cab_indicadorConsumidorFinal,
      v_modDoc_movimentaEstoque,
      v_modDoc_geraFinanceiro,
      v_munEndEst_uf,
      v_pess_indicadorInscricaoEstad,
      v_endPess_enderecoPessoa,
      v_munEndPess_uf,
      v_munEndEntr_uf,
      p_item_operacaoFiscal,
      v_gradProd_produto,
      v_prod_tipoProduto,
      v_prod_origemMercadoria,
      v_prod_idNcm,
      v_prod_listaServicos,
      0,
      0,
      0,
      0,
      1,
      ' ',
      0,
      1,
      0,
      1,
      0,
      1,
      0,
      1,
      0,
      1,
      0,
      1,
      0,
      1,
      0,
      1,
      0,
      '  ',
      0,
      0,
      1,
      '  ',
      0,
      0,
      1,
      0,
      0,
      1,
      '  ',
      0,
      0,
      1,
      0,
      0,
      1,
      '   ',
      0,
      1,
      '  ',
      ' ',
      0,
      0,
      0,
      '  ',
      0,
      1,
      ' ',
      0,
      0,
      0,
      1,
      0,
      0,
      0,
      0,
      '  ',
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      1,
      0,
      0,
      0,
      1,
      0,
      0,
      0,
      0,
      1,
      0,
      0,
      0,
      /* Retornos */
      v_auxNumber,
      v_item_movimentaEstoque,
      v_auxNumber,
      v_item_geraFinanceiro,
      v_item_cfop,
      v_item_indicadorISSQN,
      v_item_aliquotaISSQN,
      v_item_aliquotaIRRF,
      v_item_aliquotaINSS,
      v_item_retencaoPIS,
      v_item_retencaoCOFINS,
      v_item_retencaoCSLL,
      v_item_aliquotaII,
      v_item_aliquotaIOF,
      v_item_codigoEnquadramentoIPI,
      v_item_stIPI,
      v_item_aliquotaIPI,
      v_item_valorAliquotaIPI,
      v_item_stPIS,
      v_item_aliquotaPIS,
      v_item_valorAliquotaPIS,
      v_item_aliquotaPISST,
      v_item_valorAliquotaPISST,
      v_item_stCOFINS,
      v_item_aliquotaCOFINS,
      v_item_valorAliquotaCOFINS,
      v_item_aliquotaCOFINSST,
      v_item_valorAliquotaCOFINSST,
      v_item_stSimplesNacional,
      v_item_creditoSimplesNacional,
      v_item_stICMS,
      v_item_modalBaseCalcICMS,
      v_item_reducaoBaseICMS,
      v_item_aliquotaICMS,
      v_item_diferimentoICMS,
      v_item_motivoDesoneracaoICMS,
      v_auxNumber,
      v_item_modalBaseCalcICMSST,
      v_item_margemValorAdicST,
      v_item_reducaoBaseST,
      v_item_aliquotaICMSST,
      v_item_aliquotaSTSuportConsFin,
      v_item_reducaoBaseICMSEfetivo,
      v_item_aliquotaICMSEfetivo,
      v_auxVarchar,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_item_aliquotaICMSUFDestinat,
      v_item_aliquotaICMSInterestad,
      v_item_partilhaICMSInterestad,
      v_item_aliquotaFCP,
      v_item_aliquotaFCPST,
      v_item_aliquotaFCPSTAnteriorm,
      v_item_aliquotaFCPUFDestinat,
      v_item_aliquotaEstImpFederais,
      v_item_aliquotaEstImpEstaduais,
      v_item_aliquotaEstImpMunicipai);
      ADD_CALCULA_TOTAIS_ITEM (
        v_cab_tipoPagamentoFrete,
        v_modDoc_diminuiDescontoPrUnit,
        v_modDoc_somaAcrescimosPrUnit,
        v_modDoc_somaFreteSeguroPrUnit,
        p_item_quantidade,
        p_item_quantidadeConvertida,
        p_item_precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos,
        v_item_precoUnitario,
        p_item_valorDescontoItem,
        p_item_valorAcrescimoItem,
        p_item_valorFreteItem,
        p_item_valorSeguroItem,
        p_item_valorAdicFreteMarItem,
        p_item_valorDespesasAduanItem,
        p_item_valorFreteGeral,
        p_item_valorSeguroGeral,
        p_item_valorDescontoGeral,
        p_item_valorOutrasDespGeral,
        p_item_valorAdicFreteMarGeral,
        p_item_valorDespesasAduanGeral,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        /* Retornos */
        v_item_precoUnitario,
        v_item_precoUnitarioConvertido,
        v_item_valorProdutoServico,
        v_auxNumber,
        v_item_valorTotalItem,
        v_item_valorFreteTotal,
        v_item_valorSeguroTotal,
        v_item_valorDescontoTotal,
        v_item_valorOutrasDespTotal,
        v_item_valorAdicFreteMarTotal,
        v_item_valorDespesasAduanTotal,
        v_auxNumber,
        v_auxNumber);
    ADD_CALCULA_IMPOSTOS_ITEM (
      p_config_64_casasDecSaidas,
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_cab_entradaSaida,
      0,
      v_cab_estabelecimento,
      0,
      v_cab_dataEmissao,
      v_cab_pessoa,
      v_cab_localDestinoOperacao,
      v_cab_indicadorConsumidorFinal,
      v_cab_tipoPagamentoFrete,
      v_pess_indicadorInscricaoEstad,
      p_item_pessoaParticipante,
      p_item_quantidade,
      p_item_precoPautaTabelado,
      p_item_valorProdutoServico,
      v_item_valorFreteTotal,
      v_item_valorSeguroTotal,
      v_item_valorDescontoTotal,
      v_item_valorOutrasDespTotal,
      v_item_valorAdicFreteMarTotal,
      v_item_valorDespesasAduanTotal,
      v_item_cfop,
      1,
      v_item_indicadorISSQN,
      v_item_aliquotaISSQN,
      0,
      0,
      1,
      v_item_aliquotaIRRF,
      0,
      0,
      1,
      v_item_aliquotaINSS,
      0,
      0,
      1,
      v_item_retencaoPIS,
      0,
      0,
      1,
      v_item_retencaoCOFINS,
      0,
      0,
      1,
      v_item_retencaoCSLL,
      0,
      0,
      1,
      v_item_aliquotaII,
      0,
      0,
      1,
      v_item_aliquotaIOF,
      0,
      0,
      1,
      v_item_aliquotaIPI,
      v_item_valorAliquotaIPI,
      0,
      0,
      0,
      1,
      v_item_aliquotaPIS,
      v_item_valorAliquotaPIS,
      0,
      0,
      1,
      v_item_aliquotaPISST,
      v_item_valorAliquotaPISST,
      0,
      0,
      1,
      v_item_aliquotaCOFINS,
      v_item_valorAliquotaCOFINS,
      0,
      0,
      1,
      v_item_aliquotaCOFINSST,
      v_item_valorAliquotaCOFINSST,
      0,
      0,
      1,
      v_item_stSimplesNacional,
      v_item_creditoSimplesNacional,
      0,
      0,
      1,
      v_item_stICMS,
      v_item_modalBaseCalcICMS,
      v_item_reducaoBaseICMS,
      v_item_aliquotaICMS,
      v_item_diferimentoICMS,
      0,
      0,
      0,
      0,
      0,
      1,
      v_item_modalBaseCalcICMSST,
      v_item_margemValorAdicST,
      v_item_reducaoBaseST,
      v_item_aliquotaICMSST,
      0,
      0,
      1,
      0,
      0,
      0,
      v_item_reducaoBaseICMSEfetivo,
      v_item_aliquotaICMSEfetivo,
      0,
      0,
      0,
      '  ',
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      1,
      v_item_aliquotaICMSUFDestinat,
      v_item_aliquotaICMSInterestad,
      v_item_partilhaICMSInterestad,
      0,
      0,
      0,
      0,
      1,
      v_item_aliquotaFCP,
      0,
      0,
      v_item_aliquotaFCPST,
      0,
      0,
      v_item_aliquotaFCPSTAnteriorm,
      0,
      0,
      v_item_aliquotaFCPUFDestinat,
      0,
      0,
      1,
      v_item_aliquotaEstImpFederais,
      v_item_aliquotaEstImpEstaduais,
      v_item_aliquotaEstImpMunicipai,
      0,
      0,
      0,
      0,
      v_gradProd_produto,
      v_gradProd_cor,
      v_gradProd_tamanho,
      v_prod_controleEstoque,
      v_prod_tipoProduto,
      /* Retornos */
      v_item_baseISSQN,
      v_item_valorISSQN,
      v_item_baseIRRF,
      v_item_valorIRRF,
      v_item_baseINSS,
      v_item_valorINSS,
      v_item_baseRetPIS,
      v_item_valorRetPIS,
      v_item_baseRetCOFINS,
      v_item_valorRetCOFINS,
      v_item_baseRetCSLL,
      v_item_valorRetCSLL,
      v_item_baseII,
      v_item_valorII,
      v_item_baseIOF,
      v_item_valorIOF,
      v_item_baseIPI,
      v_item_valorIPI,
      v_item_basePIS,
      v_item_valorPIS,
      v_item_basePISST,
      v_item_valorPISST,
      v_item_baseCOFINS,
      v_item_valorCOFINS,
      v_item_baseCOFINSST,
      v_item_valorCOFINSST,
      v_item_baseCreditoSimplesNac,
      v_item_valorCreditoSimplesNac,
      v_item_baseICMS,
      v_item_valorICMSOperacao,
      v_item_valorICMSDiferido,
      v_item_valorICMS,
      v_item_valorICMSDesoneracao,
      v_item_baseICMSST,
      v_item_valorICMSST,
      v_item_baseICMSSTAnteriormente,
      v_item_valorICMSSTAnteriorment,
      v_item_valorICMSProprioSubstit,
      v_item_baseICMSEfetivo,
      v_item_valorICMSEfetivo,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_item_baseICMSUFDestinatario,
      v_item_valorICMSUFDestinatario,
      v_item_baseICMSUFRemetente,
      v_item_valorICMSUFRemetente,
      v_item_baseFCP,
      v_item_valorFCP,
      v_item_baseFCPST,
      v_item_valorFCPST,
      v_item_baseFCPSTAnteriormente,
      v_item_valorFCPSTAnteriormente,
      v_item_baseFCPUFDestinatario,
      v_item_valorFCPUFDestinatario,
      v_item_baseEstimadaImpostos,
      v_item_valorEstImpFederais,
      v_item_valorEstImpEstaduais,
      v_item_valorEstImpMunicipais);
    ADD_CALCULA_VALOR_LIQUIDO (
      v_cab_origemDocumento,
      0,
      v_cab_tipoPagamentoFrete,
      v_item_geraFinanceiro,
      p_item_valorProdutoServico,
      0,
      0,
      0,
      v_item_valorFreteTotal,
      v_item_valorSeguroTotal,
      v_item_valorDescontoTotal,
      v_item_valorOutrasDespTotal,
      v_item_valorIRRF,
      v_item_valorINSS,
      v_item_valorRetPIS,
      v_item_valorRetCOFINS,
      v_item_valorRetCSLL,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      0,
      v_item_valorICMSST,
      0,
      0,
      0,
      v_modDoc_geraFinanceiro,
      /* Retornos */
      r_item_valorBasePagamento,
      v_item_valorImpostosSomaPag,
      v_item_valorImpostosDiminuiPag,
      v_item_valorLiquidoItem);
    IF p_config_378_calcularVolumes = 1 THEN
      v_cab_quantidadeVolume         := v_cab_quantidadeVolume + TRUNC(CASE WHEN p_item_controleQuantidade = 1 AND p_item_loteMultiplo <> 0 THEN p_item_quantidade / p_item_loteMultiplo ELSE p_item_quantidadeConvertida END,0);
    END IF;
    v_cab_quantidade               := v_cab_quantidade + p_item_quantidadeConvertida;
    v_cab_pesoLiquido              := v_cab_pesoLiquido + p_item_pesoLiquido;
    v_cab_pesoBruto                := v_cab_pesoBruto + p_item_pesoBruto;
    IF p_item_servico = 1 THEN
      v_cab_valorServicosBruto       := v_cab_valorServicosBruto + p_item_valorProdutoServicoBrut;
      v_cab_valorServicos            := v_cab_valorServicos + p_item_valorProdutoServico;
      v_cab_valorDescontoServicos    := v_cab_valorDescontoServicos + p_item_valorDescontoItem;
      v_cab_valorAcrescimoServicos   := v_cab_valorAcrescimoServicos + p_item_valorAcrescimoItem;
    ELSE 
      v_cab_valorProdutosBruto       := v_cab_valorProdutosBruto + p_item_valorProdutoServicoBrut;
      v_cab_valorProdutos            := v_cab_valorProdutos + p_item_valorProdutoServico;
      v_cab_valorDescontoProdutos    := v_cab_valorDescontoProdutos + p_item_valorDescontoItem;
      v_cab_valorAcrescimoProdutos   := v_cab_valorAcrescimoProdutos + p_item_valorAcrescimoItem;
    END IF;
    v_cab_valorFreteItem           := v_cab_valorFreteItem + p_item_valorFreteItem;
    v_cab_valorSeguroItem          := v_cab_valorSeguroItem + p_item_valorSeguroItem;
    v_cab_valorAdicFreteMarItem    := v_cab_valorAdicFreteMarItem + p_item_valorAdicFreteMarItem;
    v_cab_valorDespesasAduanItem   := v_cab_valorDespesasAduanItem + p_item_valorDespesasAduanItem;
    v_cab_valorFreteGeral          := v_cab_valorFreteGeral + p_item_valorFreteGeral;
    v_cab_valorSeguroGeral         := v_cab_valorSeguroGeral + p_item_valorSeguroGeral;
    v_cab_valorDescontoGeral       := v_cab_valorDescontoGeral + v_item_valorDescontoGeral;
    v_cab_valorOutrasDespGeral     := v_cab_valorOutrasDespGeral + p_item_valorOutrasDespGeral;
    v_cab_valorAdicFreteMarGeral   := v_cab_valorAdicFreteMarGeral + p_item_valorAdicFreteMarGeral;
    v_cab_valorDespesasAduanGeral  := v_cab_valorDespesasAduanGeral + p_item_valorDespesasAduanGeral;
    v_cab_valorBasePagamento       := v_cab_valorBasePagamento + r_item_valorBasePagamento;
    IF p_item_usarPrecoAVista = 1
      AND v_item_geraFinanceiro = 1
    THEN
      v_cab_valorAVistaMinimo        := v_cab_valorAVistaMinimo + p_item_valorProdutoServico - v_item_valorDescontoTotal + v_item_valorOutrasDespTotal;
    END IF;
    IF v_cab_valorFreteTotal = 0
      AND v_item_valorFreteTotal <> 0
      AND NOT(p_person_190_modeloFrete IS NULL)
      AND p_person_190_modeloFrete <> ' '
    THEN
      v_cab_modalidadeFrete          := p_person_190_modeloFrete;
    END IF;    
    v_cab_valorFreteTotal          := v_cab_valorFreteTotal + v_item_valorFreteTotal;
    v_cab_valorSeguroTotal         := v_cab_valorSeguroTotal + v_item_valorSeguroTotal;
    v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal + v_item_valorDescontoTotal;
    v_cab_valorOutrasDespTotal     := v_cab_valorOutrasDespTotal + v_item_valorOutrasDespTotal;
    v_cab_valorAdicFreteMarTotal   := v_cab_valorAdicFreteMarTotal + v_item_valorAdicFreteMarTotal;
    v_cab_valorDespesasAduanTotal  := v_cab_valorDespesasAduanTotal + v_item_valorDespesasAduanTotal;
    v_cab_valorImpostosSomaPag     := v_cab_valorImpostosSomaPag + v_item_valorImpostosSomaPag;
    v_cab_valorImpostosDiminuiPag  := v_cab_valorImpostosDiminuiPag + v_item_valorImpostosDiminuiPag;
    v_cab_valorLiquidoItem         := v_cab_valorLiquidoItem + v_item_valorLiquidoItem;
