    SELECT MAX (dataEstInic.data)
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = cabDoc.estabelecimento
    AND dataEstInic.produto = gradProd.produto),
    COALESCE((
      SELECT MAX (dataInvFisc.data) + 1
      FROM DATAINVENTARIOESTOQUEXFISC dataInvFisc
      WHERE dataInvFisc.estabelecimento = cabDoc.estabelecimento
      AND dataInvFisc.produto = gradProd.produto),
      COALESCE((
        SELECT MAX (dataInv.data) + 1
        FROM DATAINVENTARIOSESTOQUE dataInv
        WHERE dataInv.estabelecimento = cabDoc.estabelecimento),
        TO_DATE (''01/01/1900'',''DD/MM/YYYY''))))
  AND NOT(EXISTS(
    SELECT 1
    FROM MODOCFISCALXPRODUTOFILHO filhoDoc
    WHERE filhoDoc.idItemDocFiscal = itemDoc.idItemDocFiscal))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
  AND cabDoc.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_docFiscal_andWhere IS NULL OR p_docFiscal_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_docFiscal_andWhere)
   END
|| '
  UNION ALL
  SELECT DISTINCT
    filhoDoc.id,
    cabDoc.estabelecimento,
    locEst.indicadorPropriedadePosseItem,
    itemDoc.pessoaParticipante,
    filhoDoc.gradeProduto,
    filhoDoc.quantidade * CASE WHEN cabDoc.entradaSaida = ''S'' THEN -1 ELSE 1 END quantidade,
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MODOCFISCALXPRODUTOFILHO filhoDoc
  JOIN MODOCFISCALXITENS itemDoc
  ON itemDoc.idItemDocFiscal = filhoDoc.idItemDocFiscal
  JOIN MODOCUMENTOSFISCAIS cabDoc
  ON cabDoc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = filhoDoc.gradeProduto
  JOIN PALOCAISESTOQUE locEst
  ON locEst.localEstoque = itemDoc.localEstoque'
|| v_prod_join
|| CASE
     WHEN p_inventario_join IS NULL OR p_inventario_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_join)
   END
|| '
  WHERE itemDoc.cancelado = 0
  AND itemDoc.movimentaEstoqueFiscal = 1
  AND cabDoc.situacaoDocumentoFiscal BETWEEN 21 AND 23
  AND cabDoc.dataEntradaSaida < TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') + 1
  AND cabDoc.dataEntradaSaida >= COALESCE((
    SELECT MAX (dataEstInic.data)
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = cabDoc.estabelecimento
    AND dataEstInic.produto = gradProd.produto),
    COALESCE((
      SELECT MAX (dataInvFisc.data) + 1
      FROM DATAINVENTARIOESTOQUEXFISC dataInvFisc
      WHERE dataInvFisc.estabelecimento = cabDoc.estabelecimento
      AND dataInvFisc.produto = gradProd.produto),
      COALESCE((
        SELECT MAX (dataInv.data) + 1
        FROM DATAINVENTARIOSESTOQUE dataInv
        WHERE dataInv.estabelecimento = cabDoc.estabelecimento),
        TO_DATE (''01/01/1900'',''DD/MM/YYYY''))))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
  AND cabDoc.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_inventario_andWhere IS NULL OR p_inventario_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_andWhere)
   END
|| ') a
GROUP BY
  a.gradeProduto,
  a.estabelecimento,
  a.indicadorPropriedadePosseItem,
  a.pessoaParticipante,
  a.produto,
  a.cor,
  a.tamanho';
    IF p_buscarPrecoUnitarioCMV = 1 THEN
      EXECUTE IMMEDIATE 'BEGIN
  FOR a IN (
    SELECT
      a.sessaoClient,
      a.contadorSessao,
      a.estabelecimento,
      a.indicadorPropriedadePosseItem,
      a.pessoaParticipante,
      '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'a.gradeProduto'
           ELSE 'a.produto'
          END
      || ',
      FUNC_ADD_BUSCA_PRECO_MEDIO_FIS(
        ' || TO_CHAR(p_config_209_filtrarGrupoEcon) || ', -- p_config_209_filtrarGrupoEcon
        ' || TO_CHAR(p_config_362_calcCustoPorGrade) || ', -- p_config_362_calcCustoPorGrade
        a.estabelecimento,
        TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY''), -- p_dataFinal
        a.pessoaParticipante,
        a.produto,
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.cor' ELSE '0' END || ',
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.tamanho' ELSE ''' ''' END || ',
        a.indicadorPropriedadePosseItem,
        ' || TO_CHAR(p_gerandoInventario) || ' -- p_gerandoInventario
      ) precoUnitarioCMV
    FROM (
      SELECT
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        gradProd.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        MIN(a.estabelecimento) estabelecimento
      FROM TEMPINVENTARIOESTXFISCAL a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = a.estabelecimento
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      WHERE a.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
      AND a.contadorSessao = ' || TO_CHAR(p_contadorSessaoFiscal) || '
      GROUP BY
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        gradProd.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        CASE'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
          WHEN est.pessoaEstabelecimento <> 0
            AND pessEst.grupoEconomico <> 0
          THEN pessEst.grupoEconomico'
           ELSE ''
         END
      || '
          WHEN est.pessoaEstabelecimento <> 0
          THEN est.pessoaEstabelecimento
          ELSE a.estabelecimento
        END) a)
  LOOP
    UPDATE TEMPINVENTARIOESTXFISCAL b
    SET b.precoUnitarioCMV = a.precoUnitarioCMV
    WHERE b.sessaoClient = a.sessaoClient 
    AND b.contadorSessao = a.contadorSessao
    AND (b.estabelecimento = a.estabelecimento
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')
    AND b.indicadorPropriedadePosseItem = a.indicadorPropriedadePosseItem
    AND b.pessoaParticipante = a.pessoaParticipante'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN '
    AND b.gradeProduto = a.gradeProduto'
           ELSE '
    AND EXISTS(
      SELECT 1
      FROM CAGRADESPRODUTO gradProd
      WHERE gradProd.gradeProduto = b.gradeProduto
      AND gradProd.produto = a.produto)'
          END
      || ';
  END LOOP;
END;';
    END IF;
    IF p_buscarICMS = 1 THEN
      EXECUTE IMMEDIATE 'DECLARE
  v_stICMS           CHAR (2);
  v_baseICMS         NUMBER;
  v_valorICMS        NUMBER;
  v_existeEntrada    NUMBER;
  v_precoUnitarioCMV NUMBER;
BEGIN
  FOR a IN (
    SELECT
      a.sessaoClient,
      a.contadorSessao,
      a.estabelecimento,
      a.indicadorPropriedadePosseItem,
      a.pessoaParticipante,
      a.produto,'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN '
      a.gradeProduto,
      a.cor,
      a.tamanho,'
           ELSE ''
          END
      || '
      a.precoUnitarioCMV
    FROM (
      SELECT
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        gradProd.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        MIN(a.estabelecimento) estabelecimento,
        MAX(a.precoUnitarioCMV) precoUnitarioCMV
      FROM TEMPINVENTARIOESTXFISCAL a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = a.estabelecimento
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      WHERE a.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
      AND a.contadorSessao = ' || TO_CHAR(p_contadorSessaoFiscal) || '
      GROUP BY
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        gradProd.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        CASE'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
          WHEN est.pessoaEstabelecimento <> 0
            AND pessEst.grupoEconomico <> 0
          THEN pessEst.grupoEconomico'
           ELSE ''
         END
      || '
          WHEN est.pessoaEstabelecimento <> 0
          THEN est.pessoaEstabelecimento
          ELSE a.estabelecimento
        END) a)
  LOOP
    v_stICMS           := ''00'';
    v_baseICMS         := 0;
    v_valorICMS        := 0;
    v_existeEntrada    := 0;
    v_precoUnitarioCMV := 0;
    SELECT
      COALESCE(MAX(b.stICMS),''00''),
      COALESCE(MAX(b.baseICMS),0),
      COALESCE(MAX(b.valorICMS),0),
      COALESCE(MAX(b.existeEntrada),0)
    INTO
      v_stICMS,
      v_baseICMS,
      v_valorICMS,
      v_existeEntrada
    FROM (
      SELECT
        CASE
          WHEN b.nfFornecedor = 1
            AND b.stICMSEscrituracao <> ''  ''
          THEN b.stICMSEscrituracao
          WHEN b.stICMS <> ''  ''
          THEN b.stICMS
          ELSE ''90''
        END stICMS,
        ROUND((
          CASE
            WHEN b.nfFornecedor = 1
            AND (b.stICMSEscrituracao IN(''10'',''30'',''70'')
                OR b.stICMSEscrituracao = ''90''
                AND b.aliquotaICMSSTEscrituracao > 0)
              OR (b.nfFornecedor = 0
                OR b.stICMSEscrituracao = ''  ''
                OR b.stICMSEscrituracao = ''60'')
              AND (b.stICMS IN(''10'',''30'',''70'')
                OR b.stICMS = ''90''
                AND b.aliquotaICMSST > 0
                OR b.stSimplesNacional IN(''201'',''202'')
                OR b.stSimplesNacional = ''900''
                AND b.aliquotaICMSST > 0)
            THEN
              CASE
                WHEN b.nfFornecedor = 1 AND b.baseICMSSTEscrituracao <> 0
                THEN b.baseICMSSTEscrituracao
                WHEN b.baseICMSST <> 0
                THEN b.baseICMSST
                ELSE b.baseICMS
              END *
                CASE
                  WHEN b.valorCustoOperacao = 0 OR b.totalCustoOperacao = 0
                  THEN 1 / b.quantidade
                  ELSE (1 / b.quantidadeEstoque)
                    * (b.totalCustoOperacao / b.valorCustoOperacao)
                END
            ELSE 0
          END),2) baseICMS,
        ROUND((
          CASE
            WHEN b.nfFornecedor = 1
            AND (b.stICMSEscrituracao IN(''10'',''30'',''70'')
                OR b.stICMSEscrituracao = ''90''
                AND b.aliquotaICMSSTEscrituracao > 0)
              OR (b.nfFornecedor = 0
                OR b.stICMSEscrituracao = ''  ''
                OR b.stICMSEscrituracao = ''60'')
              AND (b.stICMS IN(''10'',''30'',''70'')
                OR b.stICMS = ''90''
                AND b.aliquotaICMSST > 0
                OR b.stSimplesNacional IN(''201'',''202'')
                OR b.stSimplesNacional = ''900''
                AND b.aliquotaICMSST > 0)
            THEN
              CASE
                WHEN b.nfFornecedor = 1 AND b.baseICMSSTEscrituracao <> 0
                THEN b.valorICMSEscrituracao + b.valorICMSSTEscrituracao
                ELSE b.valorICMS + b.valorICMSST
              END *
                CASE
                  WHEN b.valorCustoOperacao = 0 OR b.totalCustoOperacao = 0
                  THEN 1 / b.quantidade
                  ELSE (1 / b.quantidadeEstoque)
                    * (b.totalCustoOperacao / b.valorCustoOperacao)
                END
            ELSE 0
          END),2) valorICMS,
        1 existeEntrada,
        ROW_NUMBER() OVER (
          ORDER BY b.dataEntradaSaida DESC) ordenacao
      FROM (
        SELECT
          b.idDocumentoFiscal,
          b.estabelecimento,
          b.dataEntradaSaida,
          b.nfFornecedor,
          b.produto,
          b.stSimplesNacional,
          b.stICMS,
          b.aliquotaICMSST,
          b.stICMSEscrituracao,
          b.aliquotaICMSSTEscrituracao,
          SUM(b.quantidade) quantidade,
          SUM(b.baseICMS) baseICMS,
          SUM(b.valorICMS) valorICMS,
          SUM(b.baseICMSST) baseICMSST,
          SUM(b.valorICMSST) valorICMSST,
          SUM(b.valorICMSEscrituracao) valorICMSEscrituracao,
          SUM(b.baseICMSSTEscrituracao) baseICMSSTEscrituracao,
          SUM(b.valorICMSSTEscrituracao) valorICMSSTEscrituracao,
          SUM(b.valorCustoOperacao) valorCustoOperacao,
          SUM(b.quantidadeEstoque) quantidadeEstoque,
          SUM(b.totalCustoOperacao) totalCustoOperacao
        FROM (
          SELECT
            itemDoc.idDocumentoFiscal,
            cabDoc.estabelecimento,
            cabDoc.dataEntradaSaida,
            cabDoc.nfFornecedor,
            docXEst.idItemDocFiscal,
            gradProd.Produto,
            itemDoc.stSimplesNacional,
            itemDoc.stICMS,
            itemDoc.aliquotaICMSST,
            itemDoc.stICMSEscrituracao,
            itemDoc.aliquotaICMSSTEscrituracao,
            itemDoc.quantidade,
            itemDoc.baseICMS,
            itemDoc.valorICMS,
            itemDoc.baseICMSST,
            itemDoc.valorICMSST,
            itemDoc.valorICMSEscrituracao,
            itemDoc.baseICMSSTEscrituracao,
            itemDoc.valorICMSSTEscrituracao,
            itemDoc.valorCustoOperacao,
            SUM(est.quantidade) quantidadeEstoque,
            SUM(est.totalCustoOperacao) totalCustoOperacao
          FROM MOESTOQUES est
          JOIN CAGRADESPRODUTO gradProd
          on gradProd.gradeProduto = est.gradeProduto
          JOIN MODOCFISCALXESTOQUE docXEst
          ON docXEst.idEstoque = est.idEstoque
          JOIN MODOCFISCALXITENS itemDoc
          ON itemDoc.idItemDocFiscal = docXEst.idItemDocFiscal
          JOIN MODOCUMENTOSFISCAIS cabDoc
          ON cabDoc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
          WHERE est.entradaSaida = ''E''
          AND est.atualizaUltimaCompra = 1
          AND cabDoc.dataEntradaSaida < TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') + 1
          AND (est.gradeProduto = itemDoc.gradeProduto
            OR NOT(EXISTS(
              SELECT 1
              FROM CAGRADEPRODUTOXKITSCOMBOS kit
              WHERE kit.gradeProduto = itemDoc.gradeProduto
              AND kit.gradeProdutoFilho = est.gradeProduto
              AND kit.ativo = 1
              AND kit.manterUltimoCusto = 1)))
          GROUP BY
            itemDoc.idDocumentoFiscal,
            cabDoc.estabelecimento,
            cabDoc.dataEntradaSaida,
            cabDoc.nfFornecedor,
            docXEst.idItemDocFiscal,
            gradProd.Produto,
            itemDoc.stSimplesNacional,
            itemDoc.stICMS,
            itemDoc.aliquotaICMSST,
            itemDoc.stICMSEscrituracao,
            itemDoc.aliquotaICMSSTEscrituracao,
            itemDoc.quantidade,
            itemDoc.baseICMS,
            itemDoc.valorICMS,
            itemDoc.baseICMSST,
            itemDoc.valorICMSST,
            itemDoc.valorICMSEscrituracao,
            itemDoc.baseICMSSTEscrituracao,
            itemDoc.valorICMSSTEscrituracao,
            itemDoc.valorCustoOperacao) b
      GROUP BY
        b.idDocumentoFiscal,
        b.estabelecimento,
        b.dataEntradaSaida,
        b.nfFornecedor,
        b.produto,
        b.stSimplesNacional,
        b.stICMS,
        b.aliquotaICMSST,
        b.stICMSEscrituracao,
        b.aliquotaICMSSTEscrituracao) b
      WHERE b.produto = a.produto
      AND (b.estabelecimento = a.estabelecimento
        OR EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN PAESTABELECIMENTOS est2
          ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
          WHERE est.estabelecimento = b.estabelecimento
          AND est.ativo = 1
          AND est.pessoaEstabelecimento > 0
          AND est2.estabelecimento = a.estabelecimento)'
        || CASE
             WHEN p_config_209_filtrarGrupoEcon = 1
             THEN '
        OR EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN CAPESSOAS pessEst
          ON pessEst.pessoa = est.pessoaEstabelecimento
          JOIN CAPESSOAS pessEst2
          ON pessEst2.grupoEconomico = pessEst.grupoEconomico
          JOIN PAESTABELECIMENTOS est2
          ON est2.pessoaEstabelecimento = pessEst2.pessoa
          WHERE est.estabelecimento = b.estabelecimento
          AND est.ativo = 1
          AND est.pessoaEstabelecimento > 0
          AND pessEst.grupoEconomico > 0
          AND est2.estabelecimento = a.estabelecimento)'
             ELSE ''
           END
        || ')) b
    WHERE b.ordenacao = 1;
    IF (v_existeEntrada = 0 OR v_stICMS = ''00'') AND v_valorICMS = 0 THEN
      v_stICMS   := ''00'';
      v_baseICMS := ROUND(FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
        ' || TO_CHAR(p_config_209_filtrarGrupoEcon) || ', -- p_config_209_filtrarGrupoEcon
        ' || TO_CHAR(p_config_362_calcCustoPorGrade) || ', -- p_config_362_calcCustoPorGrade
        a.estabelecimento,
        NULL, -- p_dataInicial
        TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY''), -- p_dataFinal
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.personalizacao' ELSE '0' END || ',
        a.produto,
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.cor' ELSE '0' END || ',
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.tamanho' ELSE ''' ''' END || ',
        0, -- p_retornarPrecoBruto
        ' || TO_CHAR(p_gerandoInventario) || '),2);
      IF v_baseICMS = 0 THEN
        v_baseICMS := ROUND(FUNC_ADD_BUSCA_PRECO_ULT_CUSTO(
        ' || TO_CHAR(p_config_209_filtrarGrupoEcon) || ', -- p_config_209_filtrarGrupoEcon
        ' || TO_CHAR(p_config_362_calcCustoPorGrade) || ', -- p_config_362_calcCustoPorGrade
        a.estabelecimento,
        NULL, -- p_dataInicial
        TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY''), -- p_dataFinal
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.personalizacao' ELSE '0' END || ',
        a.pessoaParticipante,
        a.produto,
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.cor' ELSE '0' END || ',
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.tamanho' ELSE ''' ''' END || ',
        a.indicadorPropriedadePosseItem,
        ' || TO_CHAR(p_gerandoInventario) || '),2);
      END IF;
      IF v_baseICMS = 0 THEN
        v_baseICMS := ROUND(FUNC_ADD_BUSCA_PRECO_FORMACAO(
        ' || TO_CHAR(p_config_209_filtrarGrupoEcon) || ', -- p_config_209_filtrarGrupoEcon
        ' || TO_CHAR(p_config_362_calcCustoPorGrade) || ', -- p_config_362_calcCustoPorGrade
        a.estabelecimento,
        NULL, -- p_dataInicial
        TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY''), -- p_dataFinal
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.personalizacao' ELSE '0' END || ',
        a.produto,
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.cor' ELSE '0' END || ',
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.tamanho' ELSE ''' ''' END || ',
        ' || TO_CHAR(p_gerandoInventario) || '),2);
      END IF;
      IF v_baseICMS = 0 THEN
        v_baseICMS := a.precoUnitarioCmv;
      END IF;
      v_valorICMS := ROUND(v_baseICMS * 0.17,2);
    END IF;'
      || CASE
           WHEN p_invEst_motivoInventario = '02'
           THEN '
    IF v_valorICMS > 0 THEN
      v_precoUnitarioCMV := a.precoUnitarioCMV - v_valorICMS;
      IF v_precoUnitarioCMV < 0 THEN
        v_precoUnitarioCMV := 0;
      END IF;
    ELSE
      v_precoUnitarioCMV := a.precoUnitarioCMV;
    END IF;'
           ELSE '
    v_precoUnitarioCMV := a.precoUnitarioCMV;'
         END
      || '
    UPDATE TEMPINVENTARIOESTXFISCAL b SET
      b.stICMS           = v_stICMS,
      b.baseICMS         = v_baseICMS,
      b.valorICMS        = v_valorICMS'
      || CASE
           WHEN p_invEst_motivoInventario = '02'
           THEN ',
      b.precoUnitarioCMV = v_precoUnitarioCMV'
           ELSE ''
         END
      || '
    WHERE b.sessaoClient = a.sessaoClient 
    AND b.contadorSessao = a.contadorSessao
    AND (b.estabelecimento = a.estabelecimento
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')
    AND b.indicadorPropriedadePosseItem = a.indicadorPropriedadePosseItem
    AND b.pessoaParticipante = a.pessoaParticipante'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN '
    AND b.gradeProduto = a.gradeProduto'
           ELSE '
    AND EXISTS(
      SELECT 1
      FROM CAGRADESPRODUTO gradProd
      WHERE gradProd.gradeProduto = b.gradeProduto
      AND gradProd.produto = a.produto)'
          END
      || ';
  END LOOP;
END;';
    END IF;
  END IF;
  IF p_contadorSessaoGerencial <> 0 THEN
    DELETE TEMPINVENTARIOESTXGERENC
    WHERE sessaoClient = p_sessaoClient
    AND contadorSessao = p_contadorSessaoGerencial;
    EXECUTE IMMEDIATE 'INSERT INTO TEMPINVENTARIOESTXGERENC (
  sessaoClient,
  contadorSessao,
  contador,
  estabelecimento,
  gradeProduto,
  indicadorPropriedadePosseItem,
  pessoaParticipante,
  localEstoque,
  personalizacao,
  idLoteEstoque,
  idEnderecoEstoque,
  idNumeroSerie,
  quantidade,
  precoUnitarioCMV,
  precoUnitarioUltimaCompra,
  precoCustoUltimaCompra,
  precoCustoUltimaFormacao)
WITH
DATAINVENTARIOSESTOQUE AS (
  SELECT
    a.inventarioEstoque,
    a.estabelecimento,
    TRUNC(a.data) data
  FROM (
    SELECT
      inventarioEstoque,
      estabelecimento,
      data,
      ROW_NUMBER() OVER (
        PARTITION BY estabelecimento
        ORDER BY
          estabelecimento ASC,
          data DESC,
          inventarioEstoque DESC
        ) ordenacao
    FROM MOINVENTARIOSESTOQUE
    WHERE motivoInventarioEstoque = ''01''
    AND data < TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')'
|| CASE
     WHEN p_gerandoInventario = 0
     THEN ' + 1'
     ELSE ''
   END
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
    AND estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| ') a
  WHERE a.ordenacao = 1),
DATAINVENTARIOESTOQUEXITENS AS (
  SELECT
    a.inventarioEstoque,
    a.estabelecimento,
    a.produto,
    TRUNC(a.data) data
  FROM (
    SELECT
      invEst.inventarioEstoque,
      invEst.estabelecimento,
      gradProd.produto,
      invEst.data,
      ROW_NUMBER() OVER (
        PARTITION BY
          invEst.estabelecimento,
          gradProd.produto
        ORDER BY
          invEst.estabelecimento ASC,
          gradProd.produto ASC,
          invEst.data DESC,
          itemInv.inventarioEstoque DESC
        ) ordenacao
    FROM MOINVENTARIOESTOQUEXITENS itemInv
    JOIN MOINVENTARIOSESTOQUE invEst
    ON invEst.inventarioEstoque = itemInv.inventarioEstoque
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = itemInv.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_inventario_join IS NULL OR p_inventario_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_join)
   END
|| '
    WHERE invEst.motivoInventarioEstoque <> ''01''
    AND invEst.data < TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')
    AND invEst.data >= COALESCE((
      SELECT MAX (dataInv.data) + 1
      FROM DATAINVENTARIOSESTOQUE dataInv
      WHERE dataInv.estabelecimento = invEst.estabelecimento),
      TO_DATE (''01/01/1900'',''DD/MM/YYYY''))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
    AND invEst.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_inventario_andWhere IS NULL OR p_inventario_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_andWhere)
   END
|| ') a
  WHERE a.ordenacao = 1),
DATAESTOQUEINICIAL AS (
  SELECT
    a.estabelecimento,
    TRUNC(a.data) data,
    a.produto
  FROM (
    SELECT
      mov.estabelecimento,
      mov.data,
      gradProd.produto,
      ROW_NUMBER() OVER (
        PARTITION BY
          mov.estabelecimento,
          gradProd.produto
        ORDER BY
          mov.estabelecimento ASC,
          gradProd.produto ASC,
          mov.data DESC,
          mov.idEstoque DESC
        ) ordenacao
    FROM MOESTOQUES mov
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = mov.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_movimentos_join IS NULL OR p_movimentos_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_movimentos_join)
   END
|| '
    WHERE mov.operacaoInternaEstoque = 1
    AND mov.data < TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') + 1
    AND mov.data >= COALESCE((
      SELECT MAX (dataInvGer.data) + 1
      FROM DATAINVENTARIOESTOQUEXITENS dataInvGer
      WHERE dataInvGer.estabelecimento = mov.estabelecimento
      AND dataInvGer.produto = gradProd.produto),
      COALESCE((
        SELECT MAX (dataInv.data) + 1
        FROM DATAINVENTARIOSESTOQUE dataInv
        WHERE dataInv.estabelecimento = mov.estabelecimento),
        TO_DATE (''01/01/1900'',''DD/MM/YYYY'')))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
    AND mov.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_movimentos_andWhere IS NULL OR p_movimentos_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_movimentos_andWhere)
   END
|| ') a
  WHERE a.ordenacao = 1)
SELECT
  ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || ''',
  ' || TO_CHAR(p_contadorSessaoGerencial) || ',
  ROW_NUMBER() OVER (
    ORDER BY
      a.estabelecimento,
      a.gradeProduto,
      a.indicadorPropriedadePosseItem,
      a.pessoaParticipante,
      a.localEstoque,
      a.personalizacao,
      a.idLoteEstoque,
      a.idEnderecoEstoque,
      a.idNumeroSerie),
  a.estabelecimento,
  a.gradeProduto,
  a.indicadorPropriedadePosseItem,
  a.pessoaParticipante,
  a.localEstoque,
  a.personalizacao,
  a.idLoteEstoque,
  a.idEnderecoEstoque,
  a.idNumeroSerie,
  SUM (a.quantidade),
  0 precoUnitarioCMV,
  0 precoUnitarioUltimaCompra,
  0 precoCustoUltimaCompra,
  0 precoCustoUltimaFormacao
FROM (
  SELECT DISTINCT
    itemInv.idItemInventarioEstoque id,
    invEst.estabelecimento,
    itemInv.localEstoque,
    itemInv.indicadorPropriedadePosseItem,
    itemInv.pessoaParticipante,
    itemInv.gradeProduto,
    itemInv.personalizacao,
    itemInv.idLoteEstoque,
    itemInv.idEnderecoEstoque,
    CASE WHEN prod.controlaNumeroSerie = 1 THEN itemInv.idNumeroSerie ELSE 0 END idNumeroSerie,
    itemInv.quantidade,
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MOINVENTARIOESTOQUEXITENS itemInv
  JOIN MOINVENTARIOSESTOQUE invEst
  ON invEst.inventarioEstoque = itemInv.inventarioEstoque
  JOIN DATAINVENTARIOSESTOQUE dataInv
  ON dataInv.inventarioEstoque = itemInv.inventarioEstoque
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = itemInv.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_inventario_join IS NULL OR p_inventario_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_join)
   END
|| '
  WHERE NOT (EXISTS(
    SELECT 1
    FROM DATAINVENTARIOESTOQUEXITENS dataInvGer
    WHERE dataInvGer.estabelecimento = invEst.estabelecimento
    AND dataInvGer.produto = gradProd.produto))
  AND NOT (EXISTS(
    SELECT 1
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = invEst.estabelecimento
    AND dataEstInic.produto = gradProd.produto))'
|| v_prod_andWhere
|| CASE
     WHEN p_inventario_andWhere IS NULL OR p_inventario_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_andWhere)
   END
|| '
  UNION ALL
  SELECT DISTINCT
    itemInv.idItemInventarioEstoque id,
    invEst.estabelecimento,
    itemInv.localEstoque,
    itemInv.indicadorPropriedadePosseItem,
    itemInv.pessoaParticipante,
    itemInv.gradeProduto,
    itemInv.personalizacao,
    itemInv.idLoteEstoque,
    itemInv.idEnderecoEstoque,
    CASE WHEN prod.controlaNumeroSerie = 1 THEN itemInv.idNumeroSerie ELSE 0 END idNumeroSerie,
    itemInv.quantidade,
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MOINVENTARIOESTOQUEXITENS itemInv
  JOIN MOINVENTARIOSESTOQUE invEst
  ON invEst.inventarioEstoque = itemInv.inventarioEstoque
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = itemInv.gradeProduto
  JOIN DATAINVENTARIOESTOQUEXITENS dataInvGer
  ON dataInvGer.inventarioEstoque = itemInv.inventarioEstoque
  AND dataInvGer.produto = gradProd.produto'
|| v_prod_join
|| CASE
     WHEN p_inventario_join IS NULL OR p_inventario_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_join)
   END
|| '
  WHERE NOT (EXISTS(
    SELECT 1
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = invEst.estabelecimento
    AND dataEstInic.produto = gradProd.produto))'
|| v_prod_andWhere
|| CASE
     WHEN p_inventario_andWhere IS NULL OR p_inventario_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_andWhere)
   END
|| '
  UNION ALL
  SELECT DISTINCT
    mov.idEstoque id,
    mov.estabelecimento,
    mov.localEstoque,
    mov.indicadorPropriedadePosseItem,
    mov.pessoaParticipante,
    mov.gradeProduto,
    mov.personalizacao,
    mov.idLoteEstoque,
    mov.idEnderecoEstoque,
    CASE WHEN prod.controlaNumeroSerie = 1 THEN mov.idNumeroSerie ELSE 0 END idNumeroSerie,
    mov.quantidade * CASE WHEN mov.entradaSaida = ''S'' THEN -1 ELSE 1 END quantidade,
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MOESTOQUES mov
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = mov.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_movimentos_join IS NULL OR p_movimentos_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_movimentos_join)
   END
|| '
  WHERE mov.data < TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') + 1
  AND mov.data >= COALESCE((
    SELECT MAX (dataEstInic.data)
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = mov.estabelecimento
    AND dataEstInic.produto = gradProd.produto),
    COALESCE((
      SELECT MAX (dataInvGer.data) + 1
      FROM DATAINVENTARIOESTOQUEXITENS dataInvGer
      WHERE dataInvGer.estabelecimento = mov.estabelecimento
      AND dataInvGer.produto = gradProd.produto),
      COALESCE((
        SELECT MAX (dataInv.data) + 1
        FROM DATAINVENTARIOSESTOQUE dataInv
        WHERE dataInv.estabelecimento = mov.estabelecimento),
        TO_DATE (''01/01/1900'',''DD/MM/YYYY''))))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
  AND mov.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_movimentos_andWhere IS NULL OR p_movimentos_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_movimentos_andWhere)
   END
|| ') a
GROUP BY
  a.gradeProduto,
  a.estabelecimento,
  a.localEstoque,
  a.indicadorPropriedadePosseItem,
  a.pessoaParticipante,
  a.personalizacao,
  a.idLoteEstoque,
  a.idEnderecoEstoque,
  a.idNumeroSerie,
  a.produto,
  a.cor,
  a.tamanho';
    IF p_buscarPrecoUnitarioCMV = 1
      AND p_config_335_cmvGerencIgualFis = 1
      AND p_contadorSessaoFiscal <> 0
    THEN
      EXECUTE IMMEDIATE 'BEGIN
  FOR a IN (
    SELECT
      a.sessaoClient,
      a.contadorSessao,
      a.estabelecimento,
      a.indicadorPropriedadePosseItem,
      a.pessoaParticipante,
      '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'a.gradeProduto'
           ELSE 'a.produto'
          END
      || ',
      COALESCE((
            SELECT MAX(b.precoUnitarioCMV)
            FROM TEMPINVENTARIOESTXFISCAL b'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ''
           ELSE '
            JOIN CAGRADESPRODUTO gradProd
            ON gradProd.gradeProduto = b.gradeProduto'
          END
      || '
            WHERE b.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
            AND b.contadorSessao = ' || TO_CHAR(p_contadorSessaoFiscal) || '
            AND (b.estabelecimento = a.estabelecimento
              OR EXISTS (
                SELECT 1
                FROM PAESTABELECIMENTOS est
                JOIN PAESTABELECIMENTOS est2
                ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
                WHERE est.estabelecimento = b.estabelecimento
                AND est.ativo = 1
                AND est.pessoaEstabelecimento > 0
                AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
              OR EXISTS (
                SELECT 1
                FROM PAESTABELECIMENTOS est
                JOIN CAPESSOAS pessEst
                ON pessEst.pessoa = est.pessoaEstabelecimento
                JOIN CAPESSOAS pessEst2
                ON pessEst2.grupoEconomico = pessEst.grupoEconomico
                JOIN PAESTABELECIMENTOS est2
                ON est2.pessoaEstabelecimento = pessEst2.pessoa
                WHERE est.estabelecimento = b.estabelecimento
                AND est.ativo = 1
                AND est.pessoaEstabelecimento > 0
                AND pessEst.grupoEconomico > 0
                AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')
            AND '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'b.gradeProduto = a.gradeProduto'
           ELSE 'gradProd.produto = a.produto'
          END
      || '),0) precoUnitarioCMV
    FROM (
      SELECT
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        gradProd.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        MIN(a.estabelecimento) estabelecimento
      FROM TEMPINVENTARIOESTXGERENC a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = a.estabelecimento
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      WHERE a.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
      AND a.contadorSessao = ' || TO_CHAR(p_contadorSessaoGerencial) || '
      GROUP BY
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        gradProd.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        CASE'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
          WHEN est.pessoaEstabelecimento <> 0
            AND pessEst.grupoEconomico <> 0
          THEN pessEst.grupoEconomico'
           ELSE ''
         END
      || '
          WHEN est.pessoaEstabelecimento <> 0
          THEN est.pessoaEstabelecimento
          ELSE a.estabelecimento
        END) a)
  LOOP
    UPDATE TEMPINVENTARIOESTXGERENC b
    SET b.precoUnitarioCMV = a.precoUnitarioCMV
    WHERE b.sessaoClient = a.sessaoClient 
    AND b.contadorSessao = a.contadorSessao
    AND (b.estabelecimento = a.estabelecimento
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')
    AND b.indicadorPropriedadePosseItem = a.indicadorPropriedadePosseItem
    AND b.pessoaParticipante = a.pessoaParticipante'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN '
    AND b.gradeProduto = a.gradeProduto'
           ELSE '
    AND EXISTS(
      SELECT 1
      FROM CAGRADESPRODUTO gradProd
      WHERE gradProd.gradeProduto = b.gradeProduto
      AND gradProd.produto = a.produto)'
          END
      || ';
  END LOOP;
END;';
    ELSIF p_buscarPrecoUnitarioCMV = 1
      AND p_config_335_cmvGerencIgualFis = 1
    THEN
      EXECUTE IMMEDIATE 'BEGIN
  FOR a IN (
    SELECT
      a.sessaoClient,
      a.contadorSessao,
      a.estabelecimento,
      a.indicadorPropriedadePosseItem,
      a.pessoaParticipante,
      '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'a.gradeProduto'
           ELSE 'a.produto'
          END
      || ',
      FUNC_ADD_BUSCA_PRECO_MEDIO_FIS(
        ' || TO_CHAR(p_config_209_filtrarGrupoEcon) || ', -- p_config_209_filtrarGrupoEcon
        ' || TO_CHAR(p_config_362_calcCustoPorGrade) || ', -- p_config_362_calcCustoPorGrade
        a.estabelecimento,
        TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY''), -- p_dataFinal
        a.pessoaParticipante,
        a.produto,
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.cor' ELSE '0' END || ',
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.tamanho' ELSE ''' ''' END || ',
        a.indicadorPropriedadePosseItem,
        ' || TO_CHAR(p_gerandoInventario) || ' -- p_gerandoInventario
      ) precoUnitarioCMV
    FROM (
      SELECT
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        gradProd.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        MIN(a.estabelecimento) estabelecimento
      FROM TEMPINVENTARIOESTXGERENC a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = a.estabelecimento
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      WHERE a.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
      AND a.contadorSessao = ' || TO_CHAR(p_contadorSessaoGerencial) || '
      GROUP BY
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        gradProd.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        CASE'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
          WHEN est.pessoaEstabelecimento <> 0
            AND pessEst.grupoEconomico <> 0
          THEN pessEst.grupoEconomico'
           ELSE ''
         END
      || '
          WHEN est.pessoaEstabelecimento <> 0
          THEN est.pessoaEstabelecimento
          ELSE a.estabelecimento
        END) a)
  LOOP
    UPDATE TEMPINVENTARIOESTXGERENC b
    SET b.precoUnitarioCMV = a.precoUnitarioCMV
    WHERE b.sessaoClient = a.sessaoClient 
    AND b.contadorSessao = a.contadorSessao
    AND (b.estabelecimento = a.estabelecimento
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')
    AND b.indicadorPropriedadePosseItem = a.indicadorPropriedadePosseItem
    AND b.pessoaParticipante = a.pessoaParticipante'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN '
    AND b.gradeProduto = a.gradeProduto'
           ELSE '
    AND EXISTS(
      SELECT 1
      FROM CAGRADESPRODUTO gradProd
      WHERE gradProd.gradeProduto = b.gradeProduto
      AND gradProd.produto = a.produto)'
          END
      || ';
  END LOOP;
END;';
     ELSIF p_buscarPrecoUnitarioCMV = 1
     THEN
      EXECUTE IMMEDIATE 'BEGIN
  FOR a IN (
    SELECT
      a.sessaoClient,
      a.contadorSessao,
      a.estabelecimento,
      a.indicadorPropriedadePosseItem,
      a.pessoaParticipante,
      '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'a.gradeProduto,
      a.personalizacao'
           ELSE 'a.produto'
          END
      || ',
      (FUNC_ADD_BUSCA_PRECO_MEDIO_GER(
        ' || TO_CHAR(p_config_209_filtrarGrupoEcon) || ', -- p_config_209_filtrarGrupoEcon
        ' || TO_CHAR(p_config_362_calcCustoPorGrade) || ', -- p_config_362_calcCustoPorGrade
        a.estabelecimento,
        TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY''), -- p_dataFinal
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.personalizacao' ELSE '0' END || ',
        a.pessoaParticipante,
        a.produto,
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.cor' ELSE '0' END || ',
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.tamanho' ELSE ''' ''' END || ',
        a.indicadorPropriedadePosseItem,
        ' || TO_CHAR(p_gerandoInventario) || ') -- p_gerandoInventario'
      || CASE
           WHEN p_contadorSessaoFiscal <> 0
             AND p_invEst_motivoInventario = '02'
           THEN '
        - COALESCE((
            SELECT MAX(b.valorICMS)
            FROM TEMPINVENTARIOESTXFISCAL b'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ''
           ELSE '
            JOIN CAGRADESPRODUTO gradProd
            ON gradProd.gradeProduto = b.gradeProduto'
          END
      || '
            WHERE b.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
            AND b.contadorSessao = ' || TO_CHAR(p_contadorSessaoFiscal) || '
            AND (b.estabelecimento = a.estabelecimento
              OR EXISTS (
                SELECT 1
                FROM PAESTABELECIMENTOS est
                JOIN PAESTABELECIMENTOS est2
                ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
                WHERE est.estabelecimento = b.estabelecimento
                AND est.ativo = 1
                AND est.pessoaEstabelecimento > 0
                AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
              OR EXISTS (
                SELECT 1
                FROM PAESTABELECIMENTOS est
                JOIN CAPESSOAS pessEst
                ON pessEst.pessoa = est.pessoaEstabelecimento
                JOIN CAPESSOAS pessEst2
                ON pessEst2.grupoEconomico = pessEst.grupoEconomico
                JOIN PAESTABELECIMENTOS est2
                ON est2.pessoaEstabelecimento = pessEst2.pessoa
                WHERE est.estabelecimento = b.estabelecimento
                AND est.ativo = 1
                AND est.pessoaEstabelecimento > 0
                AND pessEst.grupoEconomico > 0
                AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')
            AND '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'b.gradeProduto = a.gradeProduto'
           ELSE 'gradProd.produto = a.produto'
          END
      || '),0)'
           ELSE ''
         END
      || '
      ) precoUnitarioCMV
    FROM (
      SELECT
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        gradProd.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        a.personalizacao,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        MIN(a.estabelecimento) estabelecimento
      FROM TEMPINVENTARIOESTXGERENC a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = a.estabelecimento
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      WHERE a.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
      AND a.contadorSessao = ' || TO_CHAR(p_contadorSessaoGerencial) || '
      GROUP BY
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        gradProd.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        a.personalizacao,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        CASE'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
          WHEN est.pessoaEstabelecimento <> 0
            AND pessEst.grupoEconomico <> 0
          THEN pessEst.grupoEconomico'
           ELSE ''
         END
      || '
          WHEN est.pessoaEstabelecimento <> 0
          THEN est.pessoaEstabelecimento
          ELSE a.estabelecimento
        END) a)
  LOOP
    UPDATE TEMPINVENTARIOESTXGERENC b
    SET b.precoUnitarioCMV = a.precoUnitarioCMV
    WHERE b.sessaoClient = a.sessaoClient 
    AND b.contadorSessao = a.contadorSessao
    AND (b.estabelecimento = a.estabelecimento
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')
    AND b.indicadorPropriedadePosseItem = a.indicadorPropriedadePosseItem
    AND b.pessoaParticipante = a.pessoaParticipante'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN '
    AND b.gradeProduto = a.gradeProduto
    AND b.personalizacao = a.personalizacao'
           ELSE '
    AND EXISTS(
      SELECT 1
      FROM CAGRADESPRODUTO gradProd
      WHERE gradProd.gradeProduto = b.gradeProduto
      AND gradProd.produto = a.produto)'
          END
      || ';
  END LOOP;
END;';
   END IF;
    IF p_buscarPrecoUnitUltimaCompra = 1 THEN
      EXECUTE IMMEDIATE 'BEGIN
  FOR a IN (
    SELECT
      a.sessaoClient,
      a.contadorSessao,
      a.estabelecimento,
      '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'a.gradeProduto,
      a.personalizacao'
           ELSE 'a.produto'
          END
      || ',
      (FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
        ' || TO_CHAR(p_config_209_filtrarGrupoEcon) || ', -- p_config_209_filtrarGrupoEcon
        ' || TO_CHAR(p_config_362_calcCustoPorGrade) || ', -- p_config_362_calcCustoPorGrade
        a.estabelecimento,
        NULL, -- p_dataInicial
        TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY''), -- p_dataFinal
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.personalizacao' ELSE '0' END || ',
        a.produto,
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.cor' ELSE '0' END || ',
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.tamanho' ELSE ''' ''' END || ',
        0, -- p_retornarPrecoBruto
        ' || TO_CHAR(p_gerandoInventario) || ') -- p_gerandoInventario'
      || CASE
           WHEN p_contadorSessaoFiscal <> 0
             AND p_invEst_motivoInventario = '02'
           THEN '
        - COALESCE((
            SELECT MAX(b.valorICMS)
            FROM TEMPINVENTARIOESTXFISCAL b'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ''
           ELSE '
            JOIN CAGRADESPRODUTO gradProd
            ON gradProd.gradeProduto = b.gradeProduto'
          END
      || '
            WHERE b.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
            AND b.contadorSessao = ' || TO_CHAR(p_contadorSessaoFiscal) || '
            AND (b.estabelecimento = a.estabelecimento
              OR EXISTS (
                SELECT 1
                FROM PAESTABELECIMENTOS est
                JOIN PAESTABELECIMENTOS est2
                ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
                WHERE est.estabelecimento = b.estabelecimento
                AND est.ativo = 1
                AND est.pessoaEstabelecimento > 0
                AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
              OR EXISTS (
                SELECT 1
                FROM PAESTABELECIMENTOS est
                JOIN CAPESSOAS pessEst
                ON pessEst.pessoa = est.pessoaEstabelecimento
                JOIN CAPESSOAS pessEst2
                ON pessEst2.grupoEconomico = pessEst.grupoEconomico
                JOIN PAESTABELECIMENTOS est2
                ON est2.pessoaEstabelecimento = pessEst2.pessoa
                WHERE est.estabelecimento = b.estabelecimento
                AND est.ativo = 1
                AND est.pessoaEstabelecimento > 0
                AND pessEst.grupoEconomico > 0
                AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')
            AND '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'b.gradeProduto = a.gradeProduto'
           ELSE 'gradProd.produto = a.produto'
          END
      || '),0)'
           ELSE ''
         END
      || '
      ) precoUnitarioUltimaCompra
    FROM (
      SELECT
        a.sessaoClient,
        a.contadorSessao,
        gradProd.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        a.personalizacao,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        MIN(a.estabelecimento) estabelecimento
      FROM TEMPINVENTARIOESTXGERENC a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = a.estabelecimento
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      WHERE a.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
      AND a.contadorSessao = ' || TO_CHAR(p_contadorSessaoGerencial) || '
      GROUP BY
        a.sessaoClient,
        a.contadorSessao,
        gradProd.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        a.personalizacao,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        CASE'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
          WHEN est.pessoaEstabelecimento <> 0
            AND pessEst.grupoEconomico <> 0
          THEN pessEst.grupoEconomico'
           ELSE ''
         END
      || '
          WHEN est.pessoaEstabelecimento <> 0
          THEN est.pessoaEstabelecimento
          ELSE a.estabelecimento
        END) a)
  LOOP
    UPDATE TEMPINVENTARIOESTXGERENC b
    SET b.precoUnitarioUltimaCompra = a.precoUnitarioUltimaCompra
    WHERE b.sessaoClient = a.sessaoClient 
    AND b.contadorSessao = a.contadorSessao
    AND (b.estabelecimento = a.estabelecimento
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN '
    AND b.gradeProduto = a.gradeProduto
    AND b.personalizacao = a.personalizacao'
           ELSE '
    AND EXISTS(
      SELECT 1
      FROM CAGRADESPRODUTO gradProd
      WHERE gradProd.gradeProduto = b.gradeProduto
      AND gradProd.produto = a.produto)'
          END
      || ';
  END LOOP;
END;';
    END IF;
    IF p_buscarPrecoCustoUltimaCompra = 1 THEN
      EXECUTE IMMEDIATE 'BEGIN
  FOR a IN (
    SELECT
      a.sessaoClient,
      a.contadorSessao,
      a.estabelecimento,
      a.indicadorPropriedadePosseItem,
      a.pessoaParticipante,
      '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'a.gradeProduto,
      a.personalizacao'
           ELSE 'a.produto'
          END
      || ',
      (FUNC_ADD_BUSCA_PRECO_ULT_CUSTO(
        ' || TO_CHAR(p_config_209_filtrarGrupoEcon) || ', -- p_config_209_filtrarGrupoEcon
        ' || TO_CHAR(p_config_362_calcCustoPorGrade) || ', -- p_config_362_calcCustoPorGrade
        a.estabelecimento,
        NULL, -- p_dataInicial
        TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY''), -- p_dataFinal
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.personalizacao' ELSE '0' END || ',
        a.pessoaParticipante,
        a.produto,
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.cor' ELSE '0' END || ',
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.tamanho' ELSE ''' ''' END || ',
        a.indicadorPropriedadePosseItem,
        ' || TO_CHAR(p_gerandoInventario) || ') -- p_gerandoInventario'
      || CASE
           WHEN p_contadorSessaoFiscal <> 0
             AND p_invEst_motivoInventario = '02'
           THEN '
        - COALESCE((
            SELECT MAX(b.valorICMS)
            FROM TEMPINVENTARIOESTXFISCAL b'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ''
           ELSE '
            JOIN CAGRADESPRODUTO gradProd
            ON gradProd.gradeProduto = b.gradeProduto'
          END
      || '
            WHERE b.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
            AND b.contadorSessao = ' || TO_CHAR(p_contadorSessaoFiscal) || '
            AND (b.estabelecimento = a.estabelecimento
              OR EXISTS (
                SELECT 1
                FROM PAESTABELECIMENTOS est
                JOIN PAESTABELECIMENTOS est2
                ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
                WHERE est.estabelecimento = b.estabelecimento
                AND est.ativo = 1
                AND est.pessoaEstabelecimento > 0
                AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
              OR EXISTS (
                SELECT 1
                FROM PAESTABELECIMENTOS est
                JOIN CAPESSOAS pessEst
                ON pessEst.pessoa = est.pessoaEstabelecimento
                JOIN CAPESSOAS pessEst2
                ON pessEst2.grupoEconomico = pessEst.grupoEconomico
                JOIN PAESTABELECIMENTOS est2
                ON est2.pessoaEstabelecimento = pessEst2.pessoa
                WHERE est.estabelecimento = b.estabelecimento
                AND est.ativo = 1
                AND est.pessoaEstabelecimento > 0
                AND pessEst.grupoEconomico > 0
                AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')
            AND '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'b.gradeProduto = a.gradeProduto'
           ELSE 'gradProd.produto = a.produto'
          END
      || '),0)'
           ELSE ''
         END
      || '
      ) precoCustoUltimaCompra
    FROM (
      SELECT
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        gradProd.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        a.personalizacao,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        MIN(a.estabelecimento) estabelecimento
      FROM TEMPINVENTARIOESTXGERENC a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = a.estabelecimento
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      WHERE a.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
      AND a.contadorSessao = ' || TO_CHAR(p_contadorSessaoGerencial) || '
      GROUP BY
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        gradProd.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        a.personalizacao,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        CASE'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
          WHEN est.pessoaEstabelecimento <> 0
            AND pessEst.grupoEconomico <> 0
          THEN pessEst.grupoEconomico'
           ELSE ''
         END
      || '
          WHEN est.pessoaEstabelecimento <> 0
          THEN est.pessoaEstabelecimento
          ELSE a.estabelecimento
        END) a)
  LOOP
    UPDATE TEMPINVENTARIOESTXGERENC b
    SET b.precoCustoUltimaCompra = a.precoCustoUltimaCompra
    WHERE b.sessaoClient = a.sessaoClient 
    AND b.contadorSessao = a.contadorSessao
    AND (b.estabelecimento = a.estabelecimento
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')
    AND b.indicadorPropriedadePosseItem = a.indicadorPropriedadePosseItem
    AND b.pessoaParticipante = a.pessoaParticipante'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN '
    AND b.gradeProduto = a.gradeProduto
    AND b.personalizacao = a.personalizacao'
           ELSE '
    AND EXISTS(
      SELECT 1
      FROM CAGRADESPRODUTO gradProd
      WHERE gradProd.gradeProduto = b.gradeProduto
      AND gradProd.produto = a.produto)'
          END
      || ';
  END LOOP;
END;';
    END IF;
    IF p_buscarPrecoCustoUltimaFormac = 1 THEN
      EXECUTE IMMEDIATE 'BEGIN
  FOR a IN (
    SELECT
      a.sessaoClient,
      a.contadorSessao,
      a.estabelecimento,
      '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'a.gradeProduto,
      a.personalizacao'
           ELSE 'a.produto'
          END
      || ',
      (FUNC_ADD_BUSCA_PRECO_FORMACAO(
        ' || TO_CHAR(p_config_209_filtrarGrupoEcon) || ', -- p_config_209_filtrarGrupoEcon
        ' || TO_CHAR(p_config_362_calcCustoPorGrade) || ', -- p_config_362_calcCustoPorGrade
        a.estabelecimento,
        NULL, -- p_dataInicial
        TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY''), -- p_dataFinal
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.personalizacao' ELSE '0' END || ',
        a.produto,
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.cor' ELSE '0' END || ',
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.tamanho' ELSE ''' ''' END || ',
        ' || TO_CHAR(p_gerandoInventario) || ') -- p_gerandoInventario'
      || CASE
           WHEN p_contadorSessaoFiscal <> 0
             AND p_invEst_motivoInventario = '02'
           THEN '
        - COALESCE((
            SELECT MAX(b.valorICMS)
            FROM TEMPINVENTARIOESTXFISCAL b'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ''
           ELSE '
            JOIN CAGRADESPRODUTO gradProd
            ON gradProd.gradeProduto = b.gradeProduto'
          END
      || '
            WHERE b.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
            AND b.contadorSessao = ' || TO_CHAR(p_contadorSessaoFiscal) || '
            AND (b.estabelecimento = a.estabelecimento
              OR EXISTS (
                SELECT 1
                FROM PAESTABELECIMENTOS est
                JOIN PAESTABELECIMENTOS est2
                ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
                WHERE est.estabelecimento = b.estabelecimento
                AND est.ativo = 1
                AND est.pessoaEstabelecimento > 0
                AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
              OR EXISTS (
                SELECT 1
                FROM PAESTABELECIMENTOS est
                JOIN CAPESSOAS pessEst
                ON pessEst.pessoa = est.pessoaEstabelecimento
                JOIN CAPESSOAS pessEst2
                ON pessEst2.grupoEconomico = pessEst.grupoEconomico
                JOIN PAESTABELECIMENTOS est2
                ON est2.pessoaEstabelecimento = pessEst2.pessoa
                WHERE est.estabelecimento = b.estabelecimento
                AND est.ativo = 1
                AND est.pessoaEstabelecimento > 0
                AND pessEst.grupoEconomico > 0
                AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')
            AND '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'b.gradeProduto = a.gradeProduto'
           ELSE 'gradProd.produto = a.produto'
          END
      || '),0)'
           ELSE ''
         END
      || '
      ) precoCustoUltimaFormacao
    FROM (
      SELECT
        a.sessaoClient,
        a.contadorSessao,
        gradProd.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        a.personalizacao,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        MIN(a.estabelecimento) estabelecimento
      FROM TEMPINVENTARIOESTXGERENC a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = a.estabelecimento
      JOIN CAPESSOAS pessEst
      ON pessEst.pessoa = est.pessoaEstabelecimento
      WHERE a.sessaoClient = ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || '''
      AND a.contadorSessao = ' || TO_CHAR(p_contadorSessaoGerencial) || '
      GROUP BY
        a.sessaoClient,
        a.contadorSessao,
        gradProd.produto'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN ',
        a.gradeProduto,
        a.personalizacao,
        gradProd.cor,
        gradProd.tamanho'
           ELSE ''
          END
      || ',
        CASE'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
          WHEN est.pessoaEstabelecimento <> 0
            AND pessEst.grupoEconomico <> 0
          THEN pessEst.grupoEconomico'
           ELSE ''
         END
      || '
          WHEN est.pessoaEstabelecimento <> 0
          THEN est.pessoaEstabelecimento
          ELSE a.estabelecimento
        END) a)
  LOOP
    UPDATE TEMPINVENTARIOESTXGERENC b
    SET b.precoCustoUltimaFormacao = a.precoCustoUltimaFormacao
    WHERE b.sessaoClient = a.sessaoClient 
    AND b.contadorSessao = a.contadorSessao
    AND (b.estabelecimento = a.estabelecimento
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND est2.estabelecimento = a.estabelecimento)'
      || CASE
           WHEN p_config_209_filtrarGrupoEcon = 1
           THEN '
      OR EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE est.estabelecimento = b.estabelecimento
        AND est.ativo = 1
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.estabelecimento = a.estabelecimento)'
           ELSE ''
         END
      || ')'
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN '
    AND b.gradeProduto = a.gradeProduto
    AND b.personalizacao = a.personalizacao'
           ELSE '
    AND EXISTS(
      SELECT 1
      FROM CAGRADESPRODUTO gradProd
      WHERE gradProd.gradeProduto = b.gradeProduto
      AND gradProd.produto = a.produto)'
          END
      || ';
  END LOOP;
END;';
    END IF;
  END IF;
END ADD_GERA_TEMP_INVENTARIO;

/

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_ENTREGA_CRIA_PENDENTE (
  p_usuarioLogado        IN NUMBER,
  p_estabelecimentoAtivo IN NUMBER,
  p_idItemOrcamento      IN NUMBER)
IS
  v_quantidadeSaldo NUMBER;
  v_auxNumber       NUMBER;
  v_auxVarchar      VARCHAR (32000);
BEGIN
  FOR a IN (
    SELECT
      a.modeloDocumentoEntrega,
      a.estabelecimento,
      a.dataEntrega,
      a.motorista,
      a.placa,
      (a.quantidadeConvertida - a.quantidadeEntrega) quantidadePendente
    FROM (
      SELECT
        contr.modeloDocumentoEntrega,
        orc.estabelecimento,
        COALESCE(item.dataEntrega, orc.dataEntrega) dataEntrega,
        orc.motorista,
        orc.placa,
        item.quantidadeConvertida,
        COALESCE ((
          SELECT SUM(entr.quantidade)
          FROM MOENTREGAS entr
          WHERE entr.idItemOrcamento = item.idItemOrcamento), 0) quantidadeEntrega
      FROM MOORCAMENTOXITENS item
      JOIN PACONTROLESENTREGA contr
      ON contr.controleEntrega = item.controleEntrega
      JOIN MOORCAMENTOS orc
      ON orc.orcamento = item.orcamento
      JOIN PAETAPASORCAMENTO etOrc
      ON etOrc.etapaOrcamento = orc.etapaOrcamento
      WHERE item.idItemOrcamento = p_idItemOrcamento
      AND item.cancelado = 0
      AND item.controleEntrega > 0) a
    WHERE a.quantidadeConvertida <> a.quantidadeEntrega)
  LOOP
    IF a.quantidadePendente > 0 THEN
      ADD_ENTREGA_CRIA (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        a.modeloDocumentoEntrega, -- p_modeloDocumento,
        a.estabelecimento, -- p_estabelecimento,
        a.dataEntrega, -- p_dataEntrega,
        TO_CHAR (a.dataEntrega, 'HH24MISS'), -- p_horaEntregaFinal,
        a.motorista, -- p_motorista,
        a.placa, -- p_placa,
        0, -- p_rota,
        p_idItemOrcamento,
        0, -- p_idItemPreDocumentoRemessa,
        0, -- p_idItemDocFiscalRemessa,
        a.quantidadePendente, -- p_quantidade,
        1, -- p_situacaoEntrega
        'ADD_ENTREGA_CRIA_PENDENTE'  -- p_observacoes
      );
    ELSIF a.quantidadePendente < 0 THEN
      v_quantidadeSaldo := - a.quantidadePendente;
      FOR b IN (
        SELECT
          entr.entrega,
          entr.modeloDocumento,
          entr.estabelecimento,
          entr.dataEntrega,
          entr.horaEntregaFinal,
          entr.motorista,
          entr.placa,
          entr.rota,
          entr.quantidade,
          entr.situacaoEntrega,
          entr.observacoes
        FROM MOENTREGAS entr
        WHERE entr.idItemOrcamento = p_idItemOrcamento
        AND entr.situacaoEntrega IN (1, 2))
      LOOP
        IF v_quantidadeSaldo > 0
          AND b.quantidade > 0 THEN
          IF v_quantidadeSaldo < b.quantidade THEN
            ADD_ENTREGA_CRIA (
              p_usuarioLogado,
              p_estabelecimentoAtivo,
              b.modeloDocumento,
              b.estabelecimento,
              b.dataEntrega,
              b.horaEntregaFinal,
              b.motorista,
              b.placa,
              b.rota,
              p_idItemOrcamento,
              0,
              0,
              b.quantidade - v_quantidadeSaldo,
              b.situacaoEntrega,
              b.observacoes);
            UPDATE MOENTREGAS c SET
              c.quantidade = v_quantidadeSaldo
            WHERE c.entrega = b.entrega;
            ADD_ENTREGA_SITUACAO_CRIA (
              p_usuarioLogado,
              p_estabelecimentoAtivo,
              p_idItemOrcamento,
              b.entrega,
              b.situacaoEntrega,
              'ADD_ENTREGA_CRIA_PENDENTE - Ajusta Saldo');
            v_quantidadeSaldo := 0;
          ELSE
            ADD_ENTREGA_EXCLUI (
              p_usuarioLogado,
              p_estabelecimentoAtivo,
              b.entrega,
              0,
              'ADD_ENTREGA_CRIA_PENDENTE');
            v_quantidadeSaldo := v_quantidadeSaldo - b.quantidade;
          END IF;
        END IF;
      END LOOP;
    END IF;
  END LOOP;
  ADD_ORCAMENTO_ITEM_RES_ITEM (
    p_idItemOrcamento,
    p_estabelecimentoAtivo,
    '',
    v_auxVarchar);
END ADD_ENTREGA_CRIA_PENDENTE;

/

create or replace PROCEDURE ADD_EFETIVA_TEMP_INVENTARIO (
  p_sessaoClient            IN VARCHAR2,
  p_estabelecimentoAtivo    IN NUMBER,
  p_contadorSessaoFiscal    IN NUMBER,
  p_contadorSessaoGerencial IN NUMBER,
  p_invEst_data             IN DATE,
  p_invEst_motivoInventario IN CHAR,
  p_invEst_observacoes      IN VARCHAR2,
  p_inEstabelecimentos      IN VARCHAR2)
IS
  v_idInventarioEstoque NUMBER;
BEGIN
  FOR estab IN (
    SELECT estabelecimento
    FROM PAESTABELECIMENTOS
    WHERE estabelecimento > 0
    AND ((p_inEstabelecimentos IS NULL
        OR p_inEstabelecimentos = ' '
        OR p_inEstabelecimentos = '0')
      AND ativo = 1
      OR NOT(p_inEstabelecimentos IS NULL)
      AND p_inEstabelecimentos <> ' '
      AND p_inEstabelecimentos <> '0'
      AND INSTR(',' || RTRIM(p_inEstabelecimentos) || ',', ',' || TRIM(TO_CHAR(estabelecimento)) || ',') > 0)
    ORDER BY estabelecimento)
  LOOP
    v_idInventarioEstoque := FUNC_ADD_BUSCA_PROXIMO_ID('MOINVENTARIOSESTOQUE', 'inventarioEstoque', 0, p_estabelecimentoAtivo, NULL);
    INSERT INTO MOINVENTARIOSESTOQUE (
      inventarioEstoque,
      estabelecimento,
      data,
      motivoInventarioEstoque,
      observacoes)
    VALUES (
      v_idInventarioEstoque,
      estab.estabelecimento,
      p_invEst_data,
      COALESCE(p_invEst_motivoInventario,'01'),
      COALESCE(p_invEst_observacoes,' '));
    INSERT INTO MOINVENTARIOESTOQUEXFISC (
      id,
      inventarioEstoque,
      gradeProduto,
      indicadorPropriedadePosseItem,
      pessoaParticipante,
      quantidade,
      precoUnitarioCMV,
      stICMS,
      baseICMS,
      valorICMS)
    SELECT
      FUNC_ADD_BUSCA_PROXIMO_ID('MOINVENTARIOESTOQUEXFISC', 'id', 0, p_estabelecimentoAtivo, NULL),
      v_idInventarioEstoque,
      temp.gradeProduto,
      temp.indicadorPropriedadePosseItem,
      temp.pessoaParticipante,
      CASE WHEN temp.quantidade < 0 THEN 0 ELSE temp.quantidade END,
      temp.precoUnitarioCMV,
      temp.stICMS,
      temp.baseICMS,
      temp.valorICMS
    FROM TEMPINVENTARIOESTXFISCAL temp
    WHERE temp.sessaoClient = p_sessaoClient
    AND temp.contadorSessao = p_contadorSessaoFiscal
    AND temp.estabelecimento = estab.estabelecimento;
    INSERT INTO MOINVENTARIOESTOQUEXITENS (
      idItemInventarioEstoque,
      inventarioEstoque,
      gradeProduto,
      indicadorPropriedadePosseItem,
      pessoaParticipante,
      localEstoque,
      personalizacao,
      idLoteEstoque,
      idEnderecoEstoque,
      idNumeroSerie,
      quantidade,
      precoUnitarioCMV,
      precoUnitarioUltimaCompra,
      precoCustoUltimaCompra,
      precoCustoUltimaFormacao)
    SELECT
      FUNC_ADD_BUSCA_PROXIMO_ID('MOINVENTARIOESTOQUEXITENS', 'idItemInventarioEstoque', 0, p_estabelecimentoAtivo, NULL),
      v_idInventarioEstoque,
      temp.gradeProduto,
      temp.indicadorPropriedadePosseItem,
      temp.pessoaParticipante,
      temp.localEstoque,
      temp.personalizacao,
      temp.idLoteEstoque,
      temp.idEnderecoEstoque,
      temp.idNumeroSerie,
      CASE WHEN temp.quantidade < 0 THEN 0 ELSE temp.quantidade END,
      temp.precoUnitarioCMV,
      temp.precoUnitarioUltimaCompra,
      temp.precoCustoUltimaCompra,
      temp.precoCustoUltimaFormacao
    FROM TEMPINVENTARIOESTXGERENC temp
    WHERE temp.sessaoClient = p_sessaoClient
    AND temp.contadorSessao = p_contadorSessaoGerencial
    AND temp.estabelecimento = estab.estabelecimento;
  END LOOP;
END ADD_EFETIVA_TEMP_INVENTARIO;

/

create or replace PROCEDURE ADD_SEPARACAO_ITEM_EST_KIT(
  p_bufferIdEstoque              IN VARCHAR2,
  p_estabelecimentoAtivo         IN NUMBER,
  p_cab_modeloDocumento          IN NUMBER,
  p_entradaSaida                 IN CHAR,
  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_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  p_endEst_idEnderecoEstoqueSep  IN NUMBER,
  p_idEnderecoEstoque            IN NUMBER,
  p_locEst_indicProprPosseItem   IN CHAR,
  r_bufferIdEstoque              OUT VARCHAR2)
IS
  v_quantidadeNumerosSerie NUMBER;
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  FOR kit IN (
    SELECT 
      kit.gradeProdutoFilho,
      kit.manterUltimoCusto,
      gradProdFilho.produto,
      prodFilho.controleEstoque,
      prodFilho.controlaNumeroSerie,
      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 ROUND(p_item_quantidade * kit.quantidade, uniFilho.casasDecimaisUnidadeMedida) > 0)
  LOOP  
    IF kit.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,
        kit.gradeProdutoFilho,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        kit.quantidade,
        p_item_observacoes,
        p_endEst_idEnderecoEstoqueSep,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        r_bufferIdEstoque);
    ELSIF kit.controleEstoque IN(1,5,11,12) THEN
      v_quantidadeNumerosSerie := 0;
      IF kit.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,
          kit.gradeProdutoFilho,
          0, -- p_item_idFormulaTinta
          0, -- p_item_personalizacao
          0, -- p_item_idLoteEstoque
          p_item_localEstoque,
          p_item_pessoaParticipante,
          0, -- p_item_precoCustoOperacao,
          0, -- p_item_precoCMV
          p_item_observacoes,
          p_endEst_idEnderecoEstoqueSep,
          p_idEnderecoEstoque,
          p_locEst_indicProprPosseItem,
          r_bufferIdEstoque,
          v_quantidadeNumerosSerie);
      END IF;
      IF kit.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
          kit.gradeProdutoFilho,
          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,
          0, -- p_personalizacao
          0, -- p_idLoteEstoque
          p_idEnderecoEstoque,
          0, -- p_idNumeroSerie
          kit.quantidade - v_quantidadeNumerosSerie,
          0, -- p_precoCustoOperacao
          0, -- p_totalCustoOperacao
          0, -- p_precoCMV
          0, -- p_valorCMV
          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_KIT;

/

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

/

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

/

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

/

create or replace PROCEDURE ADD_ORCAMENTO_REGRA_DESC_PAG (
  p_usuarioLogado                IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_config_246_baseDescontoPagam IN CHAR,
  p_config_337_descontoSobreFret IN NUMBER,
  p_orcamento                    IN NUMBER,
  p_soma_valorPagamentoBruto     IN NUMBER,
  p_pag_meioPagamento            IN NUMBER,
  p_pag_condicaoPagamento        IN NUMBER,
  p_pag_valorPagamentoBruto      IN NUMBER,
  /* Retornos */
  r_possuiRegra                  OUT NUMBER,
  r_percentualDescontoSugestao   OUT NUMBER,
  r_valorDescontoSugestao        OUT NUMBER,
  r_valorDescontoMaximoSemSenha  OUT NUMBER)
IS
BEGIN
  WITH
  CABECALHO AS (
    SELECT
      a.estabelecimento,
      a.pessoa,
      COALESCE((
        CASE
          WHEN a.pessoa = 0
          THEN (
            SELECT MAX(munPess.uf)
            FROM CAENDERECOSPESSOA endPess
            JOIN SIMUNICIPIOS munPess
            ON munPess.municipio = endPess.municipio
            WHERE endPess.pessoa = est.pessoaEstabelecimento
            AND endPess.ativo = 1
            AND endPess.principal = 1)
          ELSE COALESCE((
            SELECT MAX(munPess.uf)
            FROM CAENDERECOSPESSOA endPess
            JOIN SIMUNICIPIOS munPess
            ON munPess.municipio = endPess.municipio
            WHERE endPess.pessoa = a.pessoa
            AND endPess.ativo = 1
            AND endPess.principal = 1),(
            SELECT MAX(munPess.uf)
            FROM CAENDERECOSPESSOA endPess
            JOIN SIMUNICIPIOS munPess
            ON munPess.municipio = endPess.municipio
            WHERE endPess.pessoa = est.pessoaEstabelecimento
            AND endPess.ativo = 1
            AND endPess.principal = 1))
        END
      ),'  ') uf,
      CASE
        WHEN pess.nascimentoFundacao IS NULL
          OR TRUNC (pess.nascimentoFundacao) > TRUNC (SYSDATE)
        THEN 0
        ELSE EXTRACT(YEAR FROM SYSDATE)
          - EXTRACT(YEAR FROM pess.nascimentoFundacao)
          - CASE
              WHEN TO_CHAR (SYSDATE, 'MMDD') < TO_CHAR (pess.nascimentoFundacao, 'MMDD')
              THEN 1
              ELSE 0
            END
      END idade,
      CASE
        WHEN p_config_246_baseDescontoPagam = 'S'
        THEN a.valorBasePagamento
          - CASE
              WHEN p_config_337_descontoSobreFret = 1
                OR a.tipoPagamentoFrete = 'V'
              THEN 0
              ELSE a.valorFreteTotal + a.valorSeguroTotal
            END
        WHEN p_soma_valorPagamentoBruto >= a.valorBasePagamento
        THEN 0
        WHEN p_soma_valorPagamentoBruto + p_pag_valorPagamentoBruto > a.valorBasePagamento
        THEN a.valorBasePagamento - p_soma_valorPagamentoBruto
          - CASE
              WHEN p_config_337_descontoSobreFret = 1
                OR a.tipoPagamentoFrete = 'V'
              THEN 0
              ELSE ROUND (
                (a.valorFreteTotal + a.valorSeguroTotal)
                * (a.valorBasePagamento - p_soma_valorPagamentoBruto)
                / a.valorBasePagamento,2)
            END
        ELSE p_pag_valorPagamentoBruto
          - CASE
              WHEN p_config_337_descontoSobreFret = 1
                OR a.tipoPagamentoFrete = 'V'
              THEN 0
              ELSE ROUND (
                (a.valorFreteTotal + a.valorSeguroTotal)
                * p_pag_valorPagamentoBruto
                / a.valorBasePagamento,2)
            END
      END valorBaseDesconto,
      ( CASE
          WHEN p_soma_valorPagamentoBruto >= a.valorBasePagamento
          THEN 0
          WHEN p_soma_valorPagamentoBruto + p_pag_valorPagamentoBruto > a.valorBasePagamento
          THEN a.valorBasePagamento - p_soma_valorPagamentoBruto
          ELSE p_pag_valorPagamentoBruto
        END
        / a.valorBasePagamento) proporcaoPagamento
    FROM (
      SELECT
        a.estabelecimento,
        a.pessoa,
        a.valorBasePagamento,
        a.tipoPagamentoFrete,
        a.valorFreteTotal,
        a.valorSeguroTotal
      FROM MOORCAMENTOS a
      WHERE a.orcamento = p_orcamento
      AND a.valorBasePagamento > 0) a
    JOIN PAESTABELECIMENTOS est
    ON est.estabelecimento = a.estabelecimento
    JOIN CAPESSOAS pess
    ON pess.pessoa = a.pessoa),
  ITENS AS (
    SELECT
      a.sequencia,
      a.vendedor,
      a.gradeProduto,
      a.localEstoque,
      a.personalizacao,
      a.quantidade,
      ROUND (a.quantidade * (a.precoUnitarioBruto + a.acrescimoUnitarioComposicao),2) valorBaseRegra,
      a.valorDescontoItem,
      a.valorDescontoGeral,
      a.tabelaPreco,
      gradProd.produto,
      gradProd.cor,
      gradProd.tamanho,
      prod.subcategoriaProduto,
      prod.marca,
      prod.caracteristicaA,
      prod.caracteristicaB,
      prod.caracteristicaC,
      prod.caracteristicaD,
      prod.caracteristicaE,
      prod.idNcm,
      prod.listaServicos,
      subCatProd.categoriaProduto
    FROM MOORCAMENTOXITENS a
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PASUBCATEGORIASPRODUTO subCatProd
    ON subCatProd.subCategoriaProduto = prod.subCategoriaProduto
    WHERE a.orcamento = p_orcamento
    AND a.cancelado = 0
    AND a.quantidade > 0),
  REGRAS AS (
    SELECT
      a.regraDescontoMargem,
      a.ordenacao,
      a.tipoRegraDescontoMargem,
      a.valorSugestao,
      a.valorMaximoSemSenha,
      a.filtrarTabelaPreco,
      cab.idade,
      cab.valorBaseDesconto,
      cab.proporcaoPagamento
    FROM PAREGRASDESCONTOSMARGEM a
    JOIN CABECALHO cab
    ON 1=1
    JOIN PAFILTROSCABECALHO filtroCab
    ON filtroCab.filtroCabecalho = a.filtroCabecalho
    JOIN CAPESSOAS pess
    ON pess.pessoa = cab.pessoa
    JOIN PAFILTROSPAGAMENTO filtroPag
    ON filtroPag.filtroPagamento = a.filtroPagamento
    WHERE a.regraDescontoMargem > 0
    AND a.ativo = 1
    AND a.dataValidadeInicial <= TRUNC(SYSDATE)
    AND a.dataValidadeFinal >= TRUNC(SYSDATE)
    AND a.cabecalhoItemPagamento = 'P'
    AND a.tipoRegraDescontoMargem BETWEEN 1 AND 6
    -- Filtro Cabeçalho
    AND (a.filtroCabecalho = 0
      OR (filtroCab.filtrarEstabelecimentos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROCABECXESTABELEC filtroCabX
          WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
          AND filtroCabX.estabelecimento = cab.estabelecimento
          AND filtroCabX.ativo = 1))
      AND (filtroCab.filtrarUfs = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROCABECXUFS filtroCabX
          WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
          AND filtroCabX.uf = cab.uf
          AND filtroCabX.ativo = 1))
      AND (filtroCab.filtrarPessoas = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROCABECXPESSOAS filtroCabX
          WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
          AND filtroCabX.pessoa = cab.pessoa
          AND filtroCabX.ativo = 1))
      AND (filtroCab.filtrarPerfisUsuario = 0
        AND filtroCab.filtrarUsuarios = 0
        OR filtroCab.filtrarPerfisUsuario = 1
        AND EXISTS (
          SELECT 1
          FROM PAFILTROCABECXPERFISUSUAR filtroCabX
          WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
          AND filtroCabX.perfilUsuario = p_perfilUsuarioLogado
          AND filtroCabX.ativo = 1)
        OR filtroCab.filtrarUsuarios = 1
        AND EXISTS (
          SELECT 1
          FROM PAFILTROCABECXUSUARIOS filtroCabX
          WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
          AND filtroCabX.usuario = p_usuarioLogado
          AND filtroCabX.ativo = 1))
      AND (filtroCab.indicadorPessoa = ' '
        OR filtroCab.indicadorPessoa = pess.indicadorPessoa)
      AND (filtroCab.colaborador = ' '
        OR filtroCab.colaborador = 'N'
        AND (cab.pessoa = 0
          OR NOT (EXISTS (
            SELECT 1
            FROM CACOLABORADORES colab
            WHERE colab.colaborador = cab.pessoa
            AND colab.ativo = 1 )))
        OR filtroCab.colaborador = 'S'
        AND cab.pessoa <> 0
        AND EXISTS (
          SELECT 1
          FROM CACOLABORADORES colab
          WHERE colab.colaborador = cab.pessoa
          AND colab.ativo = 1)))
    -- Filtro Pagamento
    AND (a.filtroPagamento = 0
      OR (filtroPag.filtrarMeiosPagamento = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPAGAMENTOXMEIOPAG filtroPagX
          WHERE filtroPagX.filtroPagamento = a.filtroPagamento
          AND filtroPagX.meioPagamento = p_pag_meioPagamento
          AND filtroPagX.ativo = 1))
      AND (filtroPag.filtrarCondicoesPagamento = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPAGAMENTOXCONDPAG filtroPagX
          WHERE filtroPagX.filtroPagamento = a.filtroPagamento
          AND filtroPagX.condicaoPagamento = p_pag_condicaoPagamento
          AND filtroPagX.ativo = 1)))),
  FILTROSPRODUTOS AS (
    SELECT
      a.regraDescontoMargem,
      a.filtroProduto,
      b.quantidadeMinima,
      b.quantidadeMaxima,
      b.filtrarVendedores,
      b.filtrarLocaisEstoque,
      b.filtrarPersonalizacoes,
      b.filtrarProdutos,
      b.filtrarCategoriasProdutos,
      b.filtrarSubcategoriasProdutos,
      b.filtrarMarcas,
      b.filtrarCaracteristicasA,
      b.filtrarCaracteristicasB,
      b.filtrarCaracteristicasC,
      b.filtrarCaracteristicasD,
      b.filtrarCaracteristicasE,
      b.filtrarCores,
      b.filtrarTamanhos,
      b.filtrarNCMs,
      b.filtrarListasServicos,
      c.filtrarTabelaPreco
    FROM PAREGRADESCMARGXFILTPROD a
    JOIN PAFILTROSPRODUTO b
    ON b.filtroProduto = a.filtroProduto
    JOIN REGRAS c
    ON c.regraDescontoMargem = a.regraDescontoMargem
    AND a.filtroProduto > 0
    AND a.ativo = 1),
  REGRASXITENS AS (
    SELECT
      a.regraDescontoMargem,
      a.filtroProduto,
      a.quantidadeMinima,
      a.quantidadeMaxima,
      b.sequencia,
      b.quantidade,
      b.valorBaseRegra,
      b.valorDescontoItem,
      b.valorDescontoGeral
    FROM FILTROSPRODUTOS a
    JOIN ITENS b
	  ON 1=1
    WHERE (a.filtrarTabelaPreco = 0
      OR EXISTS (
        SELECT 1
        FROM PAREGRADESCMARGXTABELASPR x
        WHERE x.regraDescontoMargem = a.regraDescontoMargem
        AND x.tabelaPreco = b.tabelaPreco
        AND x.ativo = 1))
    AND (a.filtrarVendedores = 0
    OR EXISTS (
      SELECT 1
      FROM PAFILTROPRODUTOXVENDEDOR x
      WHERE x.filtroProduto = a.filtroProduto
      AND x.vendedor = b.vendedor
      AND x.ativo = 1))
    AND (a.filtrarLocaisEstoque = 0
    OR EXISTS (
      SELECT 1
      FROM PAFILTROPRODUTOXLOCAISEST x
      WHERE x.filtroProduto = a.filtroProduto
      AND x.localEstoque = b.localEstoque
      AND x.ativo = 1))
    AND (a.filtrarPersonalizacoes = 0
    OR EXISTS (
      SELECT 1
      FROM PAFILTROPRODUTOXPERSONAL x
      WHERE x.filtroProduto = a.filtroProduto
      AND x.personalizacao = b.personalizacao
      AND x.ativo = 1))
    AND (a.filtrarProdutos = 0
      AND a.filtrarCategoriasProdutos = 0
      AND a.filtrarSubcategoriasProdutos = 0
      AND a.filtrarMarcas = 0
      AND a.filtrarCaracteristicasA = 0
      AND a.filtrarCaracteristicasB = 0
      AND a.filtrarCaracteristicasC = 0
      AND a.filtrarCaracteristicasD = 0
      AND a.filtrarCaracteristicasE = 0
      AND a.filtrarCores = 0
      AND a.filtrarTamanhos = 0
      AND a.filtrarNCMs = 0
      AND a.filtrarListasServicos = 0
      OR a.filtrarProdutos = 1
      AND EXISTS (
        SELECT 1
        FROM PAFILTROPRODUTOXPRODUTOS x
        WHERE x.filtroProduto = a.filtroProduto
        AND x.produto = b.produto
        AND x.ativo = 1)
      OR (a.filtrarCategoriasProdutos = 1
        OR a.filtrarSubcategoriasProdutos = 1
        OR a.filtrarMarcas = 1
        OR a.filtrarCaracteristicasA = 1
        OR a.filtrarCaracteristicasB = 1
        OR a.filtrarCaracteristicasC = 1
        OR a.filtrarCaracteristicasD = 1
        OR a.filtrarCaracteristicasE = 1
        OR a.filtrarCores = 1
        OR a.filtrarTamanhos = 1
        OR a.filtrarNCMs = 1
        OR a.filtrarListasServicos = 1)
      AND (a.filtrarCategoriasProdutos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCATEGPROD x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.categoriaProduto = b.categoriaProduto
          AND x.ativo = 1))
      AND (a.filtrarSubcategoriasProdutos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXSUBCAPROD x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.subcategoriaProduto = b.subcategoriaProduto
          AND x.ativo = 1))
      AND (a.filtrarMarcas = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXMARCAS x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.marca = b.marca
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasA = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERA x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaA = b.caracteristicaA
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasB = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERB x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaB = b.caracteristicaB
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasC = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERC x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaC = b.caracteristicaC
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasD = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERD x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaD = b.caracteristicaD
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasE = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERE x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaE = b.caracteristicaE
          AND x.ativo = 1))
      AND (a.filtrarCores = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCORES x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.cor = b.cor
          AND x.ativo = 1))
      AND (a.filtrarTamanhos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXTAMANHOS x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.tamanho = b.tamanho
          AND x.ativo = 1))
      AND (a.filtrarNCMs = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXNCMS x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.idNcm = b.idNcm
          AND x.ativo = 1))
      AND (a.filtrarListasServicos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXLISTASSE x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.listaServicos = b.listaServicos
          AND x.ativo = 1)))),
  REGRASXFILTROS AS (
    SELECT
      a.regraDescontoMargem,
      a.filtroProduto
    FROM (
      SELECT
        a.regraDescontoMargem,
        a.filtroProduto,
        a.quantidadeMinima,
        a.quantidadeMaxima,
        SUM (a.quantidade) quantidade
      FROM REGRASXITENS a
      GROUP BY
        a.regraDescontoMargem,
        a.filtroProduto,
        a.quantidadeMinima,
        a.quantidadeMaxima) a
    WHERE a.quantidade >= a.quantidadeMinima
    AND (a.quantidadeMaxima = 0
      OR a.quantidade <= a.quantidadeMaxima)),
  REGRASVALIDAS AS (
    SELECT
      a.regraDescontoMargem,
      a.ordenacao,
      a.tipoRegraDescontoMargem,
      a.valorSugestao,
      a.valorMaximoSemSenha,
      a.filtrarTabelaPreco,
      a.idade,
      a.valorBaseDesconto,
      a.proporcaoPagamento,
      COALESCE((
        SELECT COUNT(1)
        FROM FILTROSPRODUTOS b
        WHERE b.regraDescontoMargem = a.regraDescontoMargem),0) filtrosProdutos
    FROM REGRAS a
    WHERE
      ( SELECT COUNT(1)
        FROM FILTROSPRODUTOS b
        WHERE b.regraDescontoMargem = a.regraDescontoMargem)
    = ( SELECT COUNT(1)
        FROM REGRASXFILTROS b
        WHERE b.regraDescontoMargem = a.regraDescontoMargem))
  SELECT
    COALESCE (MAX(a.possuiRegra), 0) possuiRegra,
    COALESCE (ROUND((
      CASE
        WHEN MIN (a.valorDescontoSugestao) < 0
          OR SUM (
          CASE
            WHEN a.valorDescontoSugestao < 0
            THEN 0
            ELSE a.valorDescontoSugestao
          END) >= p_pag_valorPagamentoBruto
          OR SUM(a.valorBaseDescontoSugestao) <> MAX(a.valorBaseDesconto)
          OR SUM(a.valorDescontoItem) <> 0
          OR SUM(a.valorDescontoGeral) <> 0
          OR SUM(a.possuiRegra) > 1
        THEN 100
          * ROUND(
              CASE
                WHEN SUM (
                  CASE
                    WHEN a.valorDescontoSugestao < 0
                    THEN 0
                    ELSE a.valorDescontoSugestao
                  END) >= p_pag_valorPagamentoBruto
                THEN p_pag_valorPagamentoBruto - 0.01
                ELSE SUM (
                  CASE
                    WHEN a.valorDescontoSugestao < 0
                    THEN 0
                    ELSE a.valorDescontoSugestao
                  END)
              END, 2) / MAX(a.valorBaseDesconto)
        ELSE MAX(a.percentualDescontoSugestao)
      END), 8), 0) percentualDescontoSugestao,
    COALESCE (ROUND(
      CASE
        WHEN SUM (
          CASE
            WHEN a.valorDescontoSugestao < 0
            THEN 0
            ELSE a.valorDescontoSugestao
          END) >= p_pag_valorPagamentoBruto
        THEN p_pag_valorPagamentoBruto - 0.01
        ELSE SUM (
          CASE
            WHEN a.valorDescontoSugestao < 0
            THEN 0
            ELSE a.valorDescontoSugestao
          END)
      END, 2), 0) valorDescontoSugestao,
    COALESCE (ROUND(
      CASE
        WHEN SUM (
          CASE
            WHEN a.valorDescontoMaximoSemSenha < 0
            THEN 0
            ELSE a.valorDescontoMaximoSemSenha
          END) >= p_pag_valorPagamentoBruto
        THEN p_pag_valorPagamentoBruto - 0.01
        ELSE SUM (
          CASE
            WHEN a.valorDescontoMaximoSemSenha < 0
            THEN 0
            ELSE a.valorDescontoMaximoSemSenha
          END)
      END, 2), 0) valorDescontoMaximoSemSenha
  INTO
    r_possuiRegra,
    r_percentualDescontoSugestao,
    r_valorDescontoSugestao,
    r_valorDescontoMaximoSemSenha
  FROM (
    SELECT
      1 possuiRegra,
      a.valorBaseDesconto,
      a.valorDescontoItem,
      a.valorDescontoGeral,
      ROUND (
        CASE a.tipoRegraDescontoMargem
          -- Desconto em percentual
          WHEN 1
          THEN a.valorBaseRegra
          -- Desconto em valor
          WHEN 2
          THEN a.valorBaseDesconto
          -- Preço unitário fixo
          WHEN 3
          THEN a.valorBaseDesconto
          -- Desconto igual a idade em percentual
          WHEN 4
          THEN a.valorBaseRegra
          -- Desconto igual a idade em valor
          WHEN 5
          THEN a.valorBaseDesconto
          -- Preço total fixado
          WHEN 6
          THEN a.valorBaseDesconto
          ELSE 0
        END, 2) valorBaseDescontoSugestao,
      ROUND (
        CASE a.tipoRegraDescontoMargem
          -- Desconto em percentual
          WHEN 1
          THEN a.valorSugestao
          -- Desconto em valor
          WHEN 2
          THEN 100 * a.valorSugestao * a.multiplicador / a.valorBaseDesconto
          -- Preço unitário fixo
          WHEN 3
          THEN 100 * (a.valorBaseRegra-ROUND (a.quantidadeRegra*a.valorMaximoSemSenha,2)) / a.valorBaseDesconto
          -- Desconto igual a idade em percentual
          WHEN 4
          THEN a.idade
          -- Desconto igual a idade em valor
          WHEN 5
          THEN 100 * a.idade * a.multiplicador / a.valorBaseDesconto
          -- Preço total fixado
          WHEN 6
          THEN 100 * a.valorBaseRegra / a.valorBaseDesconto
          ELSE 0
        END, 8) percentualDescontoSugestao,
      ROUND (
        ( CASE a.tipoRegraDescontoMargem
            -- Desconto em percentual
            WHEN 1
            THEN a.valorBaseRegra * a.valorSugestao / 100
            -- Desconto em valor
            WHEN 2
            THEN a.valorSugestao * a.multiplicador
             -- Preço unitário fixo
            WHEN 3
            THEN a.valorBaseRegra-ROUND (a.quantidadeRegra*a.valorSugestao,2)
            -- Desconto igual a idade em percentual
            WHEN 4
            THEN a.valorBaseRegra * a.idade / 100
            -- Desconto igual a idade em valor
            WHEN 5
            THEN a.idade * a.multiplicador
            -- Preço total fixado
            WHEN 6
            THEN a.valorBaseRegra
            ELSE 0
          END
          - a.valorDescontoItem
          - a.valorDescontoGeral)
        * a.proporcaoPagamento, 2) valorDescontoSugestao,
      ROUND (
        CASE a.tipoRegraDescontoMargem
          -- Desconto em percentual
          WHEN 1
          THEN a.valorBaseRegra * a.valorMaximoSemSenha / 100
          -- Desconto em valor
          WHEN 2
          THEN a.valorMaximoSemSenha * a.multiplicador
          -- Preço unitário fixo
          WHEN 3
          THEN a.valorBaseRegra-ROUND (a.quantidadeRegra*a.valorMaximoSemSenha,2)
          -- Desconto igual a idade em percentual
          WHEN 4
          THEN a.valorBaseRegra * a.idade / 100
          -- Desconto igual a idade em valor
          WHEN 5
          THEN a.idade * a.multiplicador
          -- Preço total fixado
          WHEN 6
          THEN a.valorBaseRegra
          ELSE 0
        END * a.proporcaoPagamento, 2) valorDescontoMaximoSemSenha
    FROM (
      SELECT
        a.tipoRegraDescontoMargem,
        a.valorSugestao,
        a.valorMaximoSemSenha,
        a.idade,
        a.valorBaseDesconto,
        a.proporcaoPagamento,
        SUM(a.quantidade) quantidadeRegra,
        CASE
          WHEN SUM (a.valorBaseRegraTodos - a.valorDescontoItemTodos - a.valorDescontoGeralTodos) = 0
          THEN 0
          ELSE SUM (a.valorBaseRegra - a.valorDescontoItem - a.valorDescontoGeral)
            / SUM (a.valorBaseRegraTodos - a.valorDescontoItemTodos - a.valorDescontoGeralTodos)
        END multiplicador,
        SUM (a.valorBaseRegra) valorBaseRegra,
        SUM (a.valorDescontoItem) valorDescontoItem,
        SUM (a.valorDescontoGeral) valorDescontoGeral
      FROM (
        SELECT 
          a.regraDescontoMargem,
          ROW_NUMBER() OVER (
            PARTITION BY a.sequencia
            ORDER BY
              a.sequencia,
              a.ordenacao,
              a.regraDescontoMargem) ordenacao,
          a.tipoRegraDescontoMargem,
          a.valorSugestao,
          a.valorMaximoSemSenha,
          a.idade,
          a.valorBaseDesconto,
          a.proporcaoPagamento,
          a.sequencia,
          a.quantidade,
          a.valorBaseRegra,
          a.valorDescontoItem,
          a.valorDescontoGeral,
          a.valorBaseRegraTodos,
          a.valorDescontoItemTodos,
          a.valorDescontoGeralTodos
        FROM (
          SELECT DISTINCT
            a.regraDescontoMargem,
            a.ordenacao,
            a.tipoRegraDescontoMargem,
            a.valorSugestao,
            a.valorMaximoSemSenha,
            a.idade,
            a.valorBaseDesconto,
            a.proporcaoPagamento,
            b.sequencia,
            b.quantidade,
            b.valorBaseRegra,
            b.valorDescontoItem,
            b.valorDescontoGeral,
            0 valorBaseRegraTodos,
            0 valorDescontoItemTodos,
            0 valorDescontoGeralTodos
          FROM REGRASVALIDAS a
          JOIN ITENS b
          ON 1=1
          WHERE a.filtrosProdutos = 0
          AND (a.filtrarTabelaPreco = 0
            OR EXISTS (
              SELECT 1
              FROM PAREGRADESCMARGXTABELASPR x
              WHERE x.regraDescontoMargem = a.regraDescontoMargem
              AND x.tabelaPreco = b.tabelaPreco
              AND x.ativo = 1))
          UNION ALL
          SELECT DISTINCT
            a.regraDescontoMargem,
            a.ordenacao,
            a.tipoRegraDescontoMargem,
            a.valorSugestao,
            a.valorMaximoSemSenha,
            a.idade,
            a.valorBaseDesconto,
            a.proporcaoPagamento,
            b.sequencia,
            b.quantidade,
            b.valorBaseRegra,
            b.valorDescontoItem,
            b.valorDescontoGeral,
            0 valorBaseRegraTodos,
            0 valorDescontoItemTodos,
            0 valorDescontoGeralTodos
          FROM REGRASVALIDAS a
          JOIN REGRASXITENS b
          ON b.regraDescontoMargem = a.regraDescontoMargem
          WHERE a.filtrosProdutos > 0
          UNION ALL
          SELECT DISTINCT
            a.regraDescontoMargem,
            a.ordenacao,
            a.tipoRegraDescontoMargem,
            a.valorSugestao,
            a.valorMaximoSemSenha,
            a.idade,
            a.valorBaseDesconto,
            a.proporcaoPagamento,
            b.sequencia,
            b.quantidade,
            0 valorBaseRegra,
            0 valorDescontoItem,
            0 valorDescontoGeral,
            b.valorBaseRegra valorBaseRegraTodos,
            b.valorDescontoItem valorDescontoItemTodos,
            b.valorDescontoGeral valorDescontoGeralTodos
          FROM REGRASVALIDAS a
          JOIN ITENS b
          ON 1=1) a) a
      WHERE a.ordenacao = 1
      GROUP BY
        a.regraDescontoMargem,
        a.tipoRegraDescontoMargem,
        a.valorSugestao,
        a.valorMaximoSemSenha,
        a.idade,
        a.valorBaseDesconto,
        a.proporcaoPagamento) a) a;
END ADD_ORCAMENTO_REGRA_DESC_PAG;

/

create or replace PROCEDURE ADD_ORCAMENTO_REGRA_DESC_CAB (
  p_usuarioLogado                IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_orcamento                    IN NUMBER,
  /* Retornos */
  r_possuiRegra                  OUT NUMBER,
  r_valorDescontoSugestao        OUT NUMBER,
  r_valorDescontoMaximoSemSenha  OUT NUMBER)
IS
BEGIN
  WITH
  CABECALHO AS (
    SELECT
      a.estabelecimento,
      a.pessoa,
      COALESCE((
        CASE
          WHEN a.pessoa = 0
          THEN (
            SELECT MAX(munPess.uf)
            FROM CAENDERECOSPESSOA endPess
            JOIN SIMUNICIPIOS munPess
            ON munPess.municipio = endPess.municipio
            WHERE endPess.pessoa = est.pessoaEstabelecimento
            AND endPess.ativo = 1
            AND endPess.principal = 1)
          ELSE COALESCE((
            SELECT MAX(munPess.uf)
            FROM CAENDERECOSPESSOA endPess
            JOIN SIMUNICIPIOS munPess
            ON munPess.municipio = endPess.municipio
            WHERE endPess.pessoa = a.pessoa
            AND endPess.ativo = 1
            AND endPess.principal = 1),(
            SELECT MAX(munPess.uf)
            FROM CAENDERECOSPESSOA endPess
            JOIN SIMUNICIPIOS munPess
            ON munPess.municipio = endPess.municipio
            WHERE endPess.pessoa = est.pessoaEstabelecimento
            AND endPess.ativo = 1
            AND endPess.principal = 1))
        END
      ),'  ') uf,
      CASE
        WHEN pess.nascimentoFundacao IS NULL
          OR TRUNC (pess.nascimentoFundacao) > TRUNC (SYSDATE)
        THEN 0
        ELSE EXTRACT(YEAR FROM SYSDATE)
          - EXTRACT(YEAR FROM pess.nascimentoFundacao)
          - CASE
              WHEN TO_CHAR (SYSDATE, 'MMDD') < TO_CHAR (pess.nascimentoFundacao, 'MMDD')
              THEN 1
              ELSE 0
            END
      END idade,
      a.valorBasePagamento
    FROM (
      SELECT
        a.estabelecimento,
        a.pessoa,
        a.valorBasePagamento
      FROM MOORCAMENTOS a
      WHERE a.orcamento = p_orcamento
      AND a.valorBasePagamento > 0) a
    JOIN PAESTABELECIMENTOS est
    ON est.estabelecimento = a.estabelecimento
    JOIN CAPESSOAS pess
    ON pess.pessoa = a.pessoa),
  ITENS AS (
    SELECT
      a.sequencia,
      a.vendedor,
      a.gradeProduto,
      a.localEstoque,
      a.personalizacao,
      a.quantidade,
      ROUND (a.quantidade * (a.precoUnitarioBruto + a.acrescimoUnitarioComposicao),2) valorBaseRegra,
      a.valorDescontoItem,
      a.tabelaPreco,
      gradProd.produto,
      gradProd.cor,
      gradProd.tamanho,
      prod.subcategoriaProduto,
      prod.marca,
      prod.caracteristicaA,
      prod.caracteristicaB,
      prod.caracteristicaC,
      prod.caracteristicaD,
      prod.caracteristicaE,
      prod.idNcm,
      prod.listaServicos,
      subCatProd.categoriaProduto
    FROM MOORCAMENTOXITENS a
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PASUBCATEGORIASPRODUTO subCatProd
    ON subCatProd.subCategoriaProduto = prod.subCategoriaProduto
    WHERE a.orcamento = p_orcamento
    AND a.cancelado = 0
    AND a.quantidade > 0),
  REGRAS AS (
    SELECT
      a.regraDescontoMargem,
      a.ordenacao,
      a.tipoRegraDescontoMargem,
      a.valorSugestao,
      a.valorMaximoSemSenha,
      a.filtrarTabelaPreco,
      cab.idade,
      cab.valorBasePagamento
    FROM PAREGRASDESCONTOSMARGEM a
    JOIN CABECALHO cab
    ON 1=1
    JOIN PAFILTROSCABECALHO filtroCab
    ON filtroCab.filtroCabecalho = a.filtroCabecalho
    JOIN CAPESSOAS pess
    ON pess.pessoa = cab.pessoa
    JOIN PAFILTROSPAGAMENTO filtroPag
    ON filtroPag.filtroPagamento = a.filtroPagamento
    WHERE a.regraDescontoMargem > 0
    AND a.ativo = 1
    AND a.dataValidadeInicial <= TRUNC(SYSDATE)
    AND a.dataValidadeFinal >= TRUNC(SYSDATE)
    AND a.cabecalhoItemPagamento = 'C'
    AND a.tipoRegraDescontoMargem BETWEEN 1 AND 6
    -- Filtro Cabeçalho
    AND (a.filtroCabecalho = 0
      OR (filtroCab.filtrarEstabelecimentos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROCABECXESTABELEC filtroCabX
          WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
          AND filtroCabX.estabelecimento = cab.estabelecimento
          AND filtroCabX.ativo = 1))
      AND (filtroCab.filtrarUfs = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROCABECXUFS filtroCabX
          WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
          AND filtroCabX.uf = cab.uf
          AND filtroCabX.ativo = 1))
      AND (filtroCab.filtrarPessoas = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROCABECXPESSOAS filtroCabX
          WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
          AND filtroCabX.pessoa = cab.pessoa
          AND filtroCabX.ativo = 1))
      AND (filtroCab.filtrarPerfisUsuario = 0
        AND filtroCab.filtrarUsuarios = 0
        OR filtroCab.filtrarPerfisUsuario = 1
        AND EXISTS (
          SELECT 1
          FROM PAFILTROCABECXPERFISUSUAR filtroCabX
          WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
          AND filtroCabX.perfilUsuario = p_perfilUsuarioLogado
          AND filtroCabX.ativo = 1)
        OR filtroCab.filtrarUsuarios = 1
        AND EXISTS (
          SELECT 1
          FROM PAFILTROCABECXUSUARIOS filtroCabX
          WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
          AND filtroCabX.usuario = p_usuarioLogado
          AND filtroCabX.ativo = 1))
      AND (filtroCab.indicadorPessoa = ' '
        OR filtroCab.indicadorPessoa = pess.indicadorPessoa)
      AND (filtroCab.colaborador = ' '
        OR filtroCab.colaborador = 'N'
        AND (cab.pessoa = 0
          OR NOT (EXISTS (
            SELECT 1
            FROM CACOLABORADORES colab
            WHERE colab.colaborador = cab.pessoa
            AND colab.ativo = 1 )))
        OR filtroCab.colaborador = 'S'
        AND cab.pessoa <> 0
        AND EXISTS (
          SELECT 1
          FROM CACOLABORADORES colab
          WHERE colab.colaborador = cab.pessoa
          AND colab.ativo = 1)))),
  FILTROSPRODUTOS AS (
    SELECT
      a.regraDescontoMargem,
      a.filtroProduto,
      b.quantidadeMinima,
      b.quantidadeMaxima,
      b.filtrarVendedores,
      b.filtrarLocaisEstoque,
      b.filtrarPersonalizacoes,
      b.filtrarProdutos,
      b.filtrarCategoriasProdutos,
      b.filtrarSubcategoriasProdutos,
      b.filtrarMarcas,
      b.filtrarCaracteristicasA,
      b.filtrarCaracteristicasB,
      b.filtrarCaracteristicasC,
      b.filtrarCaracteristicasD,
      b.filtrarCaracteristicasE,
      b.filtrarCores,
      b.filtrarTamanhos,
      b.filtrarNCMs,
      b.filtrarListasServicos,
      c.filtrarTabelaPreco
    FROM PAREGRADESCMARGXFILTPROD a
    JOIN PAFILTROSPRODUTO b
    ON b.filtroProduto = a.filtroProduto
    JOIN REGRAS c
    ON c.regraDescontoMargem = a.regraDescontoMargem
    AND a.filtroProduto > 0
    AND a.ativo = 1),
  REGRASXITENS AS (
    SELECT
      a.regraDescontoMargem,
      a.filtroProduto,
      a.quantidadeMinima,
      a.quantidadeMaxima,
      b.sequencia,
      b.quantidade,
      b.valorBaseRegra,
      b.valorDescontoItem
    FROM FILTROSPRODUTOS a
    JOIN ITENS b
	  ON 1=1
    WHERE (a.filtrarTabelaPreco = 0
      OR EXISTS (
        SELECT 1
        FROM PAREGRADESCMARGXTABELASPR x
        WHERE x.regraDescontoMargem = a.regraDescontoMargem
        AND x.tabelaPreco = b.tabelaPreco
        AND x.ativo = 1))
    AND (a.filtrarVendedores = 0
    OR EXISTS (
      SELECT 1
      FROM PAFILTROPRODUTOXVENDEDOR x
      WHERE x.filtroProduto = a.filtroProduto
      AND x.vendedor = b.vendedor
      AND x.ativo = 1))
    AND (a.filtrarLocaisEstoque = 0
    OR EXISTS (
      SELECT 1
      FROM PAFILTROPRODUTOXLOCAISEST x
      WHERE x.filtroProduto = a.filtroProduto
      AND x.localEstoque = b.localEstoque
      AND x.ativo = 1))
    AND (a.filtrarPersonalizacoes = 0
    OR EXISTS (
      SELECT 1
      FROM PAFILTROPRODUTOXPERSONAL x
      WHERE x.filtroProduto = a.filtroProduto
      AND x.personalizacao = b.personalizacao
      AND x.ativo = 1))
    AND (a.filtrarProdutos = 0
      AND a.filtrarCategoriasProdutos = 0
      AND a.filtrarSubcategoriasProdutos = 0
      AND a.filtrarMarcas = 0
      AND a.filtrarCaracteristicasA = 0
      AND a.filtrarCaracteristicasB = 0
      AND a.filtrarCaracteristicasC = 0
      AND a.filtrarCaracteristicasD = 0
      AND a.filtrarCaracteristicasE = 0
      AND a.filtrarCores = 0
      AND a.filtrarTamanhos = 0
      AND a.filtrarNCMs = 0
      AND a.filtrarListasServicos = 0
      OR a.filtrarProdutos = 1
      AND EXISTS (
        SELECT 1
        FROM PAFILTROPRODUTOXPRODUTOS x
        WHERE x.filtroProduto = a.filtroProduto
        AND x.produto = b.produto
        AND x.ativo = 1)
      OR (a.filtrarCategoriasProdutos = 1
        OR a.filtrarSubcategoriasProdutos = 1
        OR a.filtrarMarcas = 1
        OR a.filtrarCaracteristicasA = 1
        OR a.filtrarCaracteristicasB = 1
        OR a.filtrarCaracteristicasC = 1
        OR a.filtrarCaracteristicasD = 1
        OR a.filtrarCaracteristicasE = 1
        OR a.filtrarCores = 1
        OR a.filtrarTamanhos = 1
        OR a.filtrarNCMs = 1
        OR a.filtrarListasServicos = 1)
      AND (a.filtrarCategoriasProdutos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCATEGPROD x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.categoriaProduto = b.categoriaProduto
          AND x.ativo = 1))
      AND (a.filtrarSubcategoriasProdutos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXSUBCAPROD x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.subcategoriaProduto = b.subcategoriaProduto
          AND x.ativo = 1))
      AND (a.filtrarMarcas = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXMARCAS x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.marca = b.marca
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasA = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERA x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaA = b.caracteristicaA
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasB = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERB x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaB = b.caracteristicaB
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasC = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERC x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaC = b.caracteristicaC
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasD = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERD x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaD = b.caracteristicaD
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasE = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERE x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaE = b.caracteristicaE
          AND x.ativo = 1))
      AND (a.filtrarCores = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCORES x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.cor = b.cor
          AND x.ativo = 1))
      AND (a.filtrarTamanhos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXTAMANHOS x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.tamanho = b.tamanho
          AND x.ativo = 1))
      AND (a.filtrarNCMs = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXNCMS x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.idNcm = b.idNcm
          AND x.ativo = 1))
      AND (a.filtrarListasServicos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXLISTASSE x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.listaServicos = b.listaServicos
          AND x.ativo = 1)))),
  REGRASXFILTROS AS (
    SELECT
      a.regraDescontoMargem,
      a.filtroProduto
    FROM (
      SELECT
        a.regraDescontoMargem,
        a.filtroProduto,
        a.quantidadeMinima,
        a.quantidadeMaxima,
        SUM (a.quantidade) quantidade
      FROM REGRASXITENS a
      GROUP BY
        a.regraDescontoMargem,
        a.filtroProduto,
        a.quantidadeMinima,
        a.quantidadeMaxima) a
    WHERE a.quantidade >= a.quantidadeMinima
    AND (a.quantidadeMaxima = 0
      OR a.quantidade <= a.quantidadeMaxima)),
  REGRASVALIDAS AS (
    SELECT
      a.regraDescontoMargem,
      a.ordenacao,
      a.tipoRegraDescontoMargem,
      a.valorSugestao,
      a.valorMaximoSemSenha,
      a.filtrarTabelaPreco,
      a.idade,
      a.valorBasePagamento,
      COALESCE((
        SELECT COUNT(1)
        FROM FILTROSPRODUTOS b
        WHERE b.regraDescontoMargem = a.regraDescontoMargem),0) filtrosProdutos
    FROM REGRAS a
    WHERE
      ( SELECT COUNT(1)
        FROM FILTROSPRODUTOS b
        WHERE b.regraDescontoMargem = a.regraDescontoMargem)
    = ( SELECT COUNT(1)
        FROM REGRASXFILTROS b
        WHERE b.regraDescontoMargem = a.regraDescontoMargem))
  SELECT
    COALESCE (MAX(a.possuiRegra), 0) possuiRegra,
    COALESCE (ROUND(
      CASE
        WHEN SUM (
          CASE
            WHEN a.valorDescontoSugestao < 0
            THEN 0
            ELSE a.valorDescontoSugestao
          END) >= MAX(a.valorBasePagamento)
        THEN MAX(a.valorBasePagamento) - 0.01
        ELSE SUM (
          CASE
            WHEN a.valorDescontoSugestao < 0
            THEN 0
            ELSE a.valorDescontoSugestao
          END)
      END, 2), 0) valorDescontoSugestao,
    COALESCE (ROUND(
      CASE
        WHEN SUM (
          CASE
            WHEN a.valorDescontoMaximoSemSenha < 0
            THEN 0
            ELSE a.valorDescontoMaximoSemSenha
          END) >= MAX(a.valorBasePagamento)
        THEN MAX(a.valorBasePagamento) - 0.01
        ELSE SUM (
          CASE
            WHEN a.valorDescontoMaximoSemSenha < 0
            THEN 0
            ELSE a.valorDescontoMaximoSemSenha
          END)
      END, 2), 0) valorDescontoMaximoSemSenha
  INTO
    r_possuiRegra,
    r_valorDescontoSugestao,
    r_valorDescontoMaximoSemSenha
  FROM (
    SELECT
      1 possuiRegra,
      a.valorBasePagamento,
      ROUND (
        CASE a.tipoRegraDescontoMargem
          -- Desconto em percentual
          WHEN 1
          THEN a.valorBaseRegra * a.valorSugestao / 100
          -- Desconto em valor
          WHEN 2
          THEN a.valorSugestao * a.multiplicador
           -- Preço unitário fixo
          WHEN 3
          THEN a.valorBaseRegra-ROUND (a.quantidadeRegra*a.valorSugestao,2)
          -- Desconto igual a idade em percentual
          WHEN 4
          THEN a.valorBaseRegra * a.idade / 100
          -- Desconto igual a idade em valor
          WHEN 5
          THEN a.idade * a.multiplicador
          -- Preço total fixado
          WHEN 6
          THEN a.valorBaseRegra
          ELSE 0
        END - a.valorDescontoItem, 2) valorDescontoSugestao,
      ROUND (
        CASE a.tipoRegraDescontoMargem
          -- Desconto em percentual
          WHEN 1
          THEN a.valorBaseRegra * a.valorMaximoSemSenha / 100
          -- Desconto em valor
          WHEN 2
          THEN a.valorMaximoSemSenha * a.multiplicador
          -- Preço unitário fixo
          WHEN 3
          THEN a.valorBaseRegra-ROUND (a.quantidadeRegra*a.valorMaximoSemSenha,2)
          -- Desconto igual a idade em percentual
          WHEN 4
          THEN a.valorBaseRegra * a.idade / 100
          -- Desconto igual a idade em valor
          WHEN 5
          THEN a.idade * a.multiplicador
          -- Preço total fixado
          WHEN 6
          THEN a.valorBaseRegra
          ELSE 0
        END, 2) valorDescontoMaximoSemSenha
    FROM (
      SELECT
        a.tipoRegraDescontoMargem,
        a.valorSugestao,
        a.valorMaximoSemSenha,
        a.idade,
        a.valorBasePagamento,
        SUM(a.quantidade) quantidadeRegra,
        CASE
          WHEN SUM (a.valorBaseRegraTodos - a.valorDescontoItemTodos) = 0
          THEN 0
          ELSE SUM (a.valorBaseRegra - a.valorDescontoItem)
            / SUM (a.valorBaseRegraTodos - a.valorDescontoItemTodos)
        END multiplicador,
        SUM (a.valorBaseRegra) valorBaseRegra,
        SUM (a.valorDescontoItem) valorDescontoItem
      FROM (
        SELECT 
          a.regraDescontoMargem,
          ROW_NUMBER() OVER (
            PARTITION BY a.sequencia
            ORDER BY
              a.sequencia,
              a.ordenacao,
              a.regraDescontoMargem) ordenacao,
          a.tipoRegraDescontoMargem,
          a.valorSugestao,
          a.valorMaximoSemSenha,
          a.idade,
          a.valorBasePagamento,
          a.sequencia,
          a.quantidade,
          a.valorBaseRegra,
          a.valorDescontoItem,
          a.valorBaseRegraTodos,
          a.valorDescontoItemTodos
        FROM (
          SELECT DISTINCT
            a.regraDescontoMargem,
            a.ordenacao,
            a.tipoRegraDescontoMargem,
            a.valorSugestao,
            a.valorMaximoSemSenha,
            a.idade,
            a.valorBasePagamento,
            b.sequencia,
            b.quantidade,
            b.valorBaseRegra,
            b.valorDescontoItem,
            0 valorBaseRegraTodos,
            0 valorDescontoItemTodos
          FROM REGRASVALIDAS a
          JOIN ITENS b
          ON 1=1
          WHERE a.filtrosProdutos = 0
          AND (a.filtrarTabelaPreco = 0
            OR EXISTS (
              SELECT 1
              FROM PAREGRADESCMARGXTABELASPR x
              WHERE x.regraDescontoMargem = a.regraDescontoMargem
              AND x.tabelaPreco = b.tabelaPreco
              AND x.ativo = 1))
          UNION ALL
          SELECT DISTINCT
            a.regraDescontoMargem,
            a.ordenacao,
            a.tipoRegraDescontoMargem,
            a.valorSugestao,
            a.valorMaximoSemSenha,
            a.idade,
            a.valorBasePagamento,
            b.sequencia,
            b.quantidade,
            b.valorBaseRegra,
            b.valorDescontoItem,
            0 valorBaseRegraTodos,
            0 valorDescontoItemTodos
          FROM REGRASVALIDAS a
          JOIN REGRASXITENS b
          ON b.regraDescontoMargem = a.regraDescontoMargem
          WHERE a.filtrosProdutos > 0
          UNION ALL
          SELECT DISTINCT
            a.regraDescontoMargem,
            a.ordenacao,
            a.tipoRegraDescontoMargem,
            a.valorSugestao,
            a.valorMaximoSemSenha,
            a.idade,
            a.valorBasePagamento,
            b.sequencia,
            b.quantidade,
            0 valorBaseRegra,
            0 valorDescontoItem,
            b.valorBaseRegra valorBaseRegraTodos,
            b.valorDescontoItem valorDescontoItemTodos
          FROM REGRASVALIDAS a
          JOIN ITENS b
          ON 1=1) a) a
      WHERE a.ordenacao = 1
      GROUP BY
        a.regraDescontoMargem,
        a.tipoRegraDescontoMargem,
        a.valorSugestao,
        a.valorMaximoSemSenha,
        a.idade,
        a.valorBasePagamento) a) a;
END ADD_ORCAMENTO_REGRA_DESC_CAB;

/

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

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_SALDO_VOLTA (
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_person_184_tipoEventoCancCon IN NUMBER,
  p_config_95_etapaOrcamentoCanc IN NUMBER,
  p_config_96_etapaOrdemServCanc IN NUMBER,
  p_config_97_etapaPedCompraCanc IN NUMBER,
  p_idItemOrcamento              IN NUMBER,
  p_quantidade                   IN NUMBER)
IS  
  v_orcamento                NUMBER;
  v_cancelado                NUMBER;
  v_quantidadeSaldo          NUMBER;
  v_tipoDocumento            NUMBER;
  v_novaEtapaOrcamento       NUMBER;  
  v_situacaoOrcamento        NUMBER;
  v_quantidadeSaldoOrcamento NUMBER;
  v_auxAlpha                 VARCHAR (32000);
  v_auxNumber                NUMBER;
BEGIN
  SELECT
    item.orcamento,
    item.cancelado,
    item.quantidadeSaldo,
    cab.tipoDocumento
  INTO
    v_orcamento,
    v_cancelado,
    v_quantidadeSaldo,
    v_tipoDocumento
  FROM MOORCAMENTOXITENS item
  JOIN MOORCAMENTOS cab
  ON cab.orcamento = item.orcamento
  WHERE item.idItemOrcamento = p_idItemOrcamento;
  IF v_tipoDocumento = 201 THEN
    v_novaEtapaOrcamento := p_config_97_etapaPedCompraCanc;
    IF v_novaEtapaOrcamento = 0 THEN
      SELECT COALESCE (a.etapaOrcamento,0)
      INTO v_novaEtapaOrcamento
      FROM (
        SELECT
          etapaOrcamento,
          ROW_NUMBER() OVER (
            ORDER BY
              ordenacao,
              etapaOrcamento) ordenacao
        FROM PAETAPASORCAMENTO
        WHERE etapaOrcamento > 0
        AND ativo = 1
        AND situacaoOrcamento = 60
        AND validoPedidoCompra = 1) a
      WHERE a.ordenacao = 1;
    END IF;
  ELSIF v_tipoDocumento = 102 THEN
    v_novaEtapaOrcamento := p_config_96_etapaOrdemServCanc;
    IF v_novaEtapaOrcamento = 0 THEN
      SELECT COALESCE (a.etapaOrcamento,0)
      INTO v_novaEtapaOrcamento
      FROM (
        SELECT
          etapaOrcamento,
          ROW_NUMBER() OVER (
            ORDER BY
              ordenacao,
              etapaOrcamento) ordenacao
        FROM PAETAPASORCAMENTO
        WHERE etapaOrcamento > 0
        AND ativo = 1
        AND situacaoOrcamento = 90
        AND validoOrdemServico = 1) a
      WHERE a.ordenacao = 1;
    END IF;
  ELSE
    v_novaEtapaOrcamento := p_config_95_etapaOrcamentoCanc;
    IF v_novaEtapaOrcamento = 0 THEN
      SELECT COALESCE (a.etapaOrcamento,0)
      INTO v_novaEtapaOrcamento
      FROM (
        SELECT
          etapaOrcamento,
          ROW_NUMBER() OVER (
            ORDER BY
              ordenacao,
              etapaOrcamento) ordenacao
        FROM PAETAPASORCAMENTO
        WHERE etapaOrcamento > 0
        AND ativo = 1
        AND situacaoOrcamento = 90
        AND validoOrcamento = 1) a
      WHERE a.ordenacao = 1;
    END IF;
  END IF;
  IF v_novaEtapaOrcamento = 0 THEN
    v_situacaoOrcamento := 0;
  ELSE
    SELECT situacaoOrcamento
    INTO v_situacaoOrcamento
    FROM PAETAPASORCAMENTO
    WHERE etapaOrcamento = v_novaEtapaOrcamento;
  END IF;
  IF p_quantidade <> 0
    AND (v_novaEtapaOrcamento = 0
      OR v_situacaoOrcamento <= 63)
  THEN
    v_quantidadeSaldo := v_quantidadeSaldo + p_quantidade;
  END IF;
  IF v_novaEtapaOrcamento <> 0
    AND v_situacaoOrcamento = 90
  THEN
    v_cancelado := 1;
  END IF;
  UPDATE MOORCAMENTOXITENS SET
    cancelado = v_cancelado,
    quantidadeSaldo = v_quantidadeSaldo
  WHERE idItemOrcamento = p_idItemOrcamento;
  IF v_cancelado = 1 THEN
    SELECT COALESCE (SUM (quantidadeSaldo), 0)
    INTO v_quantidadeSaldoOrcamento
    FROM MOORCAMENTOXITENS
    WHERE orcamento = v_orcamento
    AND cancelado = 0;
    IF v_quantidadeSaldoOrcamento <= 0 THEN
      UPDATE MOORCAMENTOS
      SET etapaOrcamento = v_novaEtapaOrcamento
      WHERE orcamento = v_orcamento;
    END IF;
  ELSIF v_novaEtapaOrcamento <> 0 THEN
    UPDATE MOORCAMENTOS
    SET etapaOrcamento = v_novaEtapaOrcamento
    WHERE orcamento = v_orcamento;
  END IF;
  IF v_novaEtapaOrcamento <> 0 THEN
    IF v_situacaoOrcamento = 90 THEN
      FOR a IN (
        SELECT
          entrega,
          quantidade
        FROM MOENTREGAS
        WHERE idItemOrcamento = p_idItemOrcamento
        AND situacaoEntrega <= 4)
      LOOP
        ADD_ENTREGA_SITUACAO_TROCA (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_idItemOrcamento,
          a.entrega,
          a.quantidade,
          8,
          'ADD_ORCAMENTO_ITEM_SALDO_VOLTA');
      END LOOP;
    ELSE
      FOR a IN (
        SELECT entrega
        FROM MOENTREGAS
        WHERE idItemOrcamento = p_idItemOrcamento
        AND situacaoEntrega <= 4)
      LOOP
        ADD_ENTREGA_EXCLUI (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          a.entrega,
          0,
          'ADD_ORCAMENTO_ITEM_SALDO_VOLTA');
      END LOOP;
    END IF;
  END IF;
  ADD_ORCAMENTO_ITEM_RES_ITEM (
    p_idItemOrcamento,
    p_estabelecimentoAtivo,
    '',
    v_auxAlpha);
END ADD_ORCAMENTO_ITEM_SALDO_VOLTA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_RES_KIT (
  p_bufferIdReservaEstoque       IN VARCHAR2,
  p_estabelecimentoAtivo         IN NUMBER,
  p_cab_modeloDocumento          IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_dataEntrega              IN DATE,
  p_item_idItemOrcamento         IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_idEnderecoEstoque       IN NUMBER,
  p_item_quantidadeSaldo         IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  p_end_idEnderecoEstoqueOrcam   IN NUMBER,
  p_locEst_indicProprPosseItem   IN CHAR,
  r_bufferIdReservaEstoque       OUT VARCHAR2)
IS
  v_idReservaEstoque       NUMBER (14,0);
  v_quantidadeNumerosSerie NUMBER (14,0);
BEGIN
  r_bufferIdReservaEstoque := p_bufferIdReservaEstoque;
  FOR kit IN (
    SELECT
      kit.gradeProdutoFilho gradeProduto,
      prodFilho.controleEstoque,
      prodFilho.controlaNumeroSerie,
      ROUND(p_item_quantidadeSaldo*kit.quantidade, uniFilho.casasDecimaisUnidadeMedida) quantidadeSaldo
    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 ROUND(p_item_quantidadeSaldo*kit.quantidade, uniFilho.casasDecimaisUnidadeMedida) > 0)
  LOOP
    IF kit.controleEstoque IN (3,4) THEN
      ADD_ORCAMENTO_ITEM_RES_KIT (
        r_bufferIdReservaEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        kit.gradeProduto,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_idEnderecoEstoque,
        kit.quantidadeSaldo,
        p_item_observacoes,
        p_end_idEnderecoEstoqueOrcam,
        p_locEst_indicProprPosseItem,
        r_bufferIdReservaEstoque                    
      );
    ELSIF kit.controleEstoque IN(1,5,11,12) THEN
      v_quantidadeNumerosSerie := 0;
      IF kit.controlaNumeroSerie > 0 THEN
        ADD_ORCAMENTO_ITEM_RES_N_SERIE (
          r_bufferIdReservaEstoque, 
          p_estabelecimentoAtivo, 
          p_cab_modeloDocumento,
          p_cab_entradaSaida,
          p_cab_estabelecimento,
          p_cab_dataEmissao,
          p_cab_dataEntrega,
          p_item_idItemOrcamento,
          kit.gradeProduto,
          0, -- p_personalizacao,
          0, -- p_idLoteEstoque,
          p_item_localEstoque,
          p_item_pessoaParticipante,
          p_item_idEnderecoEstoque,
          p_item_observacoes,
          p_end_idEnderecoEstoqueOrcam,
          p_locEst_indicProprPosseItem,
          r_bufferIdReservaEstoque,
          v_quantidadeNumerosSerie);
      END IF;
      IF kit.quantidadeSaldo > v_quantidadeNumerosSerie THEN
        ADD_RESERVA_ESTOQUE_GRAVA (
          0,
          r_bufferIdReservaEstoque, 
          p_estabelecimentoAtivo, 
          p_cab_estabelecimento,
          CASE WHEN p_cab_dataEntrega IS NULL OR p_cab_dataEntrega < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntrega END, --p_data
          kit.gradeProduto,
          p_cab_modeloDocumento,
          p_cab_entradaSaida,
          p_locEst_indicProprPosseItem,
          p_item_pessoaParticipante,
          p_item_localEstoque,
          0, -- p_personalizacao,
          0, -- p_idLoteEstoque,
          p_item_idEnderecoEstoque,
          0, -- p_idNumeroSerie
          kit.quantidadeSaldo - v_quantidadeNumerosSerie,
          p_item_observacoes,
          p_item_idItemOrcamento,
          0, -- p_idItemDocTransferencia
          v_idReservaEstoque,
          r_bufferIdReservaEstoque);
      END IF;
    END IF;
  END LOOP; 
END ADD_ORCAMENTO_ITEM_RES_KIT;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_RES_ENDEREC (
  p_bufferIdReservaEstoque       IN VARCHAR2,
  p_estabelecimentoAtivo         IN NUMBER,
  p_cab_modeloDocumento          IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEmissao              IN DATE,
  p_cab_dataEntrega              IN DATE,
  p_item_idItemOrcamento         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_quantidadeSaldo         IN NUMBER,
  p_item_observacoes             IN VARCHAR2,
  p_prod_controlaNumeroSerie     IN NUMBER,
  p_prod_controleEstoque         IN NUMBER,
  p_locEst_indicProprPosseItem   IN CHAR,
  r_bufferIdReservaEstoque       OUT VARCHAR2,
  r_quantidadeEnderecoEstoque    OUT NUMBER)
IS
  v_idReservaEstoque              NUMBER (14,0);
  v_quantidadeNumerosSerie        NUMBER (14,0);
BEGIN
  r_bufferIdReservaEstoque    := p_bufferIdReservaEstoque;
  r_quantidadeEnderecoEstoque := 0;
  FOR endEst IN (
    SELECT 
      endEst.idEnderecoEstoque,
      endEst.idEnderecoEstoqueOrcamento,
      endEst.quantidadeSaldo 
    FROM MOORCAMENTOXENDERECOESTOQ endEst 
    WHERE endEst.idItemOrcamento = p_item_idItemOrcamento
    AND endEst.quantidadeSaldo   > 0)
  LOOP
    r_quantidadeEnderecoEstoque := r_quantidadeEnderecoEstoque + endEst.quantidadeSaldo;
    IF p_prod_controleEstoque=12 AND p_item_idFormulaTinta > 0 THEN
      ADD_RESERVA_ESTOQUE_FORM_TINTA (
        r_bufferIdReservaEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        0, -- p_idItemDocTransferencia
        p_item_idFormulaTinta,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        endEst.idEnderecoEstoque,
        endEst.quantidadeSaldo,
        p_item_observacoes,
        p_locEst_indicProprPosseItem,
        r_bufferIdReservaEstoque);
    ELSIF p_prod_controleEstoque IN (3,4) THEN
      ADD_ORCAMENTO_ITEM_RES_KIT (
        r_bufferIdReservaEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_item_idItemOrcamento,
        p_item_gradeProduto,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        endEst.idEnderecoEstoque,
        endEst.quantidadeSaldo,
        p_item_observacoes,
        endEst.idEnderecoEstoqueOrcamento,
        p_locEst_indicProprPosseItem,
        r_bufferIdReservaEstoque);
    ELSIF p_prod_controleEstoque IN (1,5,11,12) THEN
      v_quantidadeNumerosSerie := 0;
      IF p_prod_controlaNumeroSerie > 0 THEN
        ADD_ORCAMENTO_ITEM_RES_N_SERIE (
          r_bufferIdReservaEstoque, 
          p_estabelecimentoAtivo, 
          p_cab_modeloDocumento,
          p_cab_entradaSaida,
          p_cab_estabelecimento,
          p_cab_dataEmissao,
          p_cab_dataEntrega,
          p_item_idItemOrcamento,
          p_item_gradeProduto,
          p_item_personalizacao,
          p_item_idLoteEstoque,
          p_item_localEstoque,
          p_item_pessoaParticipante,
          endEst.idEnderecoEstoque,
          p_item_observacoes,
          endEst.idEnderecoEstoqueOrcamento,
          p_locEst_indicProprPosseItem,
          r_bufferIdReservaEstoque,
          v_quantidadeNumerosSerie);
      END IF;
      IF endEst.quantidadeSaldo > v_quantidadeNumerosSerie THEN
        ADD_RESERVA_ESTOQUE_GRAVA (
          0,
          r_bufferIdReservaEstoque, 
          p_estabelecimentoAtivo, 
          p_cab_estabelecimento,
          CASE WHEN p_cab_dataEntrega IS NULL OR p_cab_dataEntrega < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntrega END, --p_data
          p_item_gradeProduto,
          p_cab_modeloDocumento,
          p_cab_entradaSaida,
          p_locEst_indicProprPosseItem,
          p_item_pessoaParticipante,
          p_item_localEstoque,
          p_item_personalizacao,
          p_item_idLoteEstoque,
          endEst.idEnderecoEstoque,
          0, -- p_idNumeroSerie
          endEst.quantidadeSaldo - v_quantidadeNumerosSerie,
          p_item_observacoes,
          p_item_idItemOrcamento,
          0, -- p_idItemDocTransferencia
          v_idReservaEstoque,
          r_bufferIdReservaEstoque);
      END IF;
    END IF;
  END LOOP;
END ADD_ORCAMENTO_ITEM_RES_ENDEREC;

/

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

/

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

/

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

/

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

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_REF_ORCAMEN (
  p_estabelecimentoAtivo        IN NUMBER,
  p_idItemOrcamento             IN NUMBER,
  p_item_quantidade             IN NUMBER,
  p_idItemOrcamentoReferenciado IN NUMBER,
  p_quantidadeReferenciada      IN NUMBER,
  p_atualizarObservacoes        IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes        OUT NUMBER)
IS
  v_id NUMBER;
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  ADD_ORCAMENTO_ITEM_N_SER_ORC (
    p_estabelecimentoAtivo,
    p_idItemOrcamentoReferenciado,
    p_idItemOrcamento,
    0,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  ADD_ORCAMENTO_ITEM_CUSTO_ORC (
    p_estabelecimentoAtivo,
    p_idItemOrcamentoReferenciado,
    p_idItemOrcamento);
  ADD_ORCAMENTO_ITEM_COMP_ORC (
    p_estabelecimentoAtivo,
    p_idItemOrcamentoReferenciado,
    p_idItemOrcamento,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  SELECT COALESCE (MAX (id),0)
  INTO v_id
  FROM MOORCAMENTOXORCAMENTO
  WHERE idItemOrcamento = p_idItemOrcamento
  AND idItemOrcamentoReferenc = p_idItemOrcamentoReferenciado;
  IF v_id > 0 THEN
    IF p_quantidadeReferenciada <> 0 THEN
      UPDATE MOORCAMENTOXORCAMENTO
      SET quantidade = quantidade + p_quantidadeReferenciada
      WHERE id = v_id;
    END IF;
  ELSE
    v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MOORCAMENTOXORCAMENTO', 'id', 14, p_estabelecimentoAtivo, NULL);
    INSERT INTO MOORCAMENTOXORCAMENTO (
      id,
      idItemOrcamento,
      idItemOrcamentoReferenc,
      quantidade)
    VALUES (
      v_id,
      p_idItemOrcamento,
      p_idItemOrcamentoReferenciado,
      p_quantidadeReferenciada);
  END IF;
  IF p_item_quantidade > 0
  AND p_quantidadeReferenciada = 0
  THEN
    FOR a IN (
      SELECT
        a.idItemOrcamentoReferenc,
        a.quantidade,
        b.quantidade quantidadeOrcamento
      FROM MOORCAMENTOXORCAMENTO a
      JOIN MOORCAMENTOXITENS b
      ON b.idItemOrcamento = a.idItemOrcamento
      WHERE a.idItemOrcamento = p_idItemOrcamento
      AND a.quantidade > 0 
      AND b.quantidade > 0)
    LOOP
      IF ROUND(a.quantidade * p_item_quantidade / a.quantidadeOrcamento,7) > 0 THEN
        SELECT COALESCE (MAX (id),0)
        INTO v_id
        FROM MOORCAMENTOXORCAMENTO
        WHERE idItemOrcamento = p_idItemOrcamento
        AND idItemOrcamentoReferenc = a.idItemOrcamentoReferenc;
        IF v_id > 0 THEN
          UPDATE MOORCAMENTOXORCAMENTO
          SET quantidade = quantidade + ROUND(a.quantidade * p_item_quantidade / a.quantidadeOrcamento,7)
          WHERE id = v_id;
        ELSE
          v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MOORCAMENTOXORCAMENTO', 'id', 14, p_estabelecimentoAtivo, NULL);
          INSERT INTO MOORCAMENTOXORCAMENTO (
            id,
            idItemOrcamento,
            idItemOrcamentoReferenc,
            quantidade)
          VALUES (
            v_id,
            p_idItemOrcamento,
            a.idItemOrcamentoReferenc,
            ROUND(a.quantidade * p_item_quantidade / a.quantidadeOrcamento,7));
        END IF;
       END IF;
    END LOOP;
  END IF;
END ADD_ORCAMENTO_ITEM_REF_ORCAMEN;

/

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

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_COMBO_RESID (
  p_item_orcamento               IN NUMBER,
  p_item_valorProdutoServico     IN NUMBER,
  p_item_valorDescontoItem       IN NUMBER,
  p_item_valorAcrescimoItem      IN NUMBER,
  p_modDoc_diminuiDescontoPrUnit IN NUMBER,
  p_modDoc_somaAcrescimosPrUnit  IN NUMBER,
  p_buffer_idItemOrcamento       IN VARCHAR2,
  p_combo_valorTotal             IN NUMBER)
IS
  v_soma_valorProdutos          NUMBER;
  v_soma_valorDescontoProdutos  NUMBER;
  v_soma_valorAcrescimoProdutos NUMBER;
  v_soma_valorServicos          NUMBER;
  v_soma_valorDescontoServicos  NUMBER;
  v_soma_valorAcrescimoServicos NUMBER;
  v_residuoRateioDesconto       NUMBER;
  v_residuoRateioAcrescimo      NUMBER;
  v_buffer_idItemOrcamento      VARCHAR2 (32000);
  v_valorOriginal               NUMBER;
  v_idItemOrcamento             NUMBER;
  v_quantidade                  NUMBER;
  v_precoUnitarioBruto          NUMBER;
  v_valorProdutoServicoBruto    NUMBER;
  v_valorDescontoItem           NUMBER;
  v_valorAcrescimoItem          NUMBER;
  v_prod_tipoProduto            CHAR(2);
BEGIN
  v_soma_valorProdutos          := 0;
  v_soma_valorDescontoProdutos  := 0;
  v_soma_valorAcrescimoProdutos := 0;
  v_soma_valorServicos          := 0;
  v_soma_valorDescontoServicos  := 0;
  v_soma_valorAcrescimoServicos := 0;
  v_residuoRateioDesconto       := 0;
  v_residuoRateioAcrescimo      := 0;
  v_buffer_idItemOrcamento      := p_buffer_idItemOrcamento;
  v_valorOriginal               := p_item_valorProdutoServico -
    CASE
      WHEN p_modDoc_diminuiDescontoPrUnit = 1
      THEN 0
      ELSE p_item_valorDescontoItem
    END +
    CASE
      WHEN p_modDoc_somaAcrescimosPrUnit = 1
      THEN 0
      ELSE p_item_valorAcrescimoItem
    END;
  WHILE v_buffer_idItemOrcamento IS NOT NULL AND LENGTH(RTRIM(v_buffer_idItemOrcamento)) >= 14
  LOOP
    v_idItemOrcamento := TO_NUMBER(SUBSTR(v_buffer_idItemOrcamento,1,14));
    v_buffer_idItemOrcamento := RTRIM(SUBSTR(v_buffer_idItemOrcamento,16,32000));
    SELECT
      a.quantidade,
      a.precoUnitarioBruto,
      a.valorProdutoServicoBruto,
      a.valorDescontoItem,
      a.valorAcrescimoItem,
      prod.tipoProduto
    INTO
      v_quantidade,
      v_precoUnitarioBruto,
      v_valorProdutoServicoBruto,
      v_valorDescontoItem,
      v_valorAcrescimoItem,
      v_prod_tipoProduto
    FROM MOORCAMENTOXITENS a
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE a.idItemOrcamento = v_idItemOrcamento;
    IF v_prod_tipoProduto = '09' THEN
      v_soma_valorServicos := v_soma_valorServicos - v_valorProdutoServicoBruto
        + CASE
            WHEN p_modDoc_diminuiDescontoPrUnit = 1
            THEN v_valorDescontoItem
            ELSE 0
          END
        - CASE
            WHEN p_modDoc_somaAcrescimosPrUnit = 1
            THEN v_valorAcrescimoItem
            ELSE 0
          END;
      v_soma_valorDescontoServicos  := v_soma_valorDescontoServicos  - v_valorDescontoItem;
      v_soma_valorAcrescimoServicos := v_soma_valorAcrescimoServicos - v_valorAcrescimoItem;
    ELSE
      v_soma_valorProdutos := v_soma_valorProdutos - v_valorProdutoServicoBruto
        + CASE
            WHEN p_modDoc_diminuiDescontoPrUnit = 1
            THEN v_valorDescontoItem
            ELSE 0
          END
        - CASE
            WHEN p_modDoc_somaAcrescimosPrUnit = 1
            THEN v_valorAcrescimoItem
            ELSE 0
          END;
      v_soma_valorDescontoProdutos  := v_soma_valorDescontoProdutos  - v_valorDescontoItem;
      v_soma_valorAcrescimoProdutos := v_soma_valorAcrescimoProdutos - v_valorAcrescimoItem;
    END IF;
    v_valorDescontoItem := v_valorDescontoItem + ROUND (
      CASE
        WHEN p_combo_valorTotal > v_valorOriginal
        THEN p_combo_valorTotal - v_valorOriginal
        ELSE 0
      END
      * (v_valorProdutoServicoBruto - v_valorDescontoItem + v_valorAcrescimoItem)
      / p_combo_valorTotal + v_residuoRateioDesconto, 2);
    v_residuoRateioDesconto :=
      CASE
        WHEN p_combo_valorTotal > v_valorOriginal
        THEN p_combo_valorTotal - v_valorOriginal
        ELSE 0
      END
      * (v_valorProdutoServicoBruto - v_valorDescontoItem + v_valorAcrescimoItem)
      / p_combo_valorTotal + v_residuoRateioDesconto - ROUND (
      CASE
        WHEN p_combo_valorTotal > v_valorOriginal
        THEN p_combo_valorTotal - v_valorOriginal
        ELSE 0
      END
      * (v_valorProdutoServicoBruto - v_valorDescontoItem + v_valorAcrescimoItem)
      / p_combo_valorTotal + v_residuoRateioDesconto, 2);
    v_valorAcrescimoItem := v_valorAcrescimoItem + ROUND (
      CASE
        WHEN v_valorOriginal > p_combo_valorTotal
        THEN v_valorOriginal - p_combo_valorTotal
        ELSE 0
      END
      * (v_valorProdutoServicoBruto - v_valorDescontoItem + v_valorAcrescimoItem)
      / p_combo_valorTotal + v_residuoRateioAcrescimo, 2);
    v_residuoRateioAcrescimo :=
      CASE
        WHEN v_valorOriginal > p_combo_valorTotal
        THEN v_valorOriginal - p_combo_valorTotal
        ELSE 0
      END
      * (v_valorProdutoServicoBruto - v_valorDescontoItem + v_valorAcrescimoItem)
      / p_combo_valorTotal + v_residuoRateioAcrescimo - ROUND (
      CASE
        WHEN v_valorOriginal > p_combo_valorTotal
        THEN v_valorOriginal - p_combo_valorTotal
        ELSE 0
      END
      * (v_valorProdutoServicoBruto - v_valorDescontoItem + v_valorAcrescimoItem)
      / p_combo_valorTotal + v_residuoRateioAcrescimo, 2);
    IF v_prod_tipoProduto = '09' THEN
      v_soma_valorServicos := v_soma_valorServicos + v_valorProdutoServicoBruto
        - CASE
            WHEN p_modDoc_diminuiDescontoPrUnit = 1
            THEN v_valorDescontoItem
            ELSE 0
          END
        + CASE
            WHEN p_modDoc_somaAcrescimosPrUnit = 1
            THEN v_valorAcrescimoItem
            ELSE 0
          END;
      v_soma_valorDescontoServicos  := v_soma_valorDescontoServicos  + v_valorDescontoItem;
      v_soma_valorAcrescimoServicos := v_soma_valorAcrescimoServicos + v_valorAcrescimoItem;
    ELSE
      v_soma_valorProdutos := v_soma_valorProdutos + v_valorProdutoServicoBruto
        - CASE
            WHEN p_modDoc_diminuiDescontoPrUnit = 1
            THEN v_valorDescontoItem
            ELSE 0
          END
        + CASE
            WHEN p_modDoc_somaAcrescimosPrUnit = 1
            THEN v_valorAcrescimoItem
            ELSE 0
          END;
      v_soma_valorDescontoProdutos  := v_soma_valorDescontoProdutos  + v_valorDescontoItem;
      v_soma_valorAcrescimoProdutos := v_soma_valorAcrescimoProdutos + v_valorAcrescimoItem;
    END IF;
    UPDATE MOORCAMENTOXITENS
    SET precoUnitario =
      CASE
        WHEN v_quantidade = 0
          OR CASE
               WHEN p_modDoc_diminuiDescontoPrUnit = 1
               THEN v_valorDescontoItem
               ELSE 0
             END =
             CASE
               WHEN p_modDoc_somaAcrescimosPrUnit = 1
               THEN v_valorAcrescimoItem
               ELSE 0
             END
        THEN v_precoUnitarioBruto
        ELSE ROUND (( v_valorProdutoServicoBruto
          - CASE
              WHEN p_modDoc_diminuiDescontoPrUnit = 1
              THEN v_valorDescontoItem
              ELSE 0
            END
          + CASE
              WHEN p_modDoc_somaAcrescimosPrUnit = 1
              THEN v_valorAcrescimoItem
              ELSE 0
            END) / v_quantidade, 7)
      END,
      valorProdutoServico = v_valorProdutoServicoBruto
        - CASE
            WHEN p_modDoc_diminuiDescontoPrUnit = 1
            THEN v_valorDescontoItem
            ELSE 0
          END
        + CASE
            WHEN p_modDoc_somaAcrescimosPrUnit = 1
            THEN v_valorAcrescimoItem
            ELSE 0
          END,
      percDescontoItem =
        CASE
          WHEN v_valorProdutoServicoBruto = 0
          THEN 0
          ELSE ROUND (100 * v_valorDescontoItem / v_valorProdutoServicoBruto, 4)
        END,
      valorDescontoItem = v_valorDescontoItem,
      percAcrescimoItem =
        CASE
          WHEN v_valorProdutoServicoBruto = 0
          THEN 0
          ELSE ROUND (100 * v_valorAcrescimoItem / v_valorProdutoServicoBruto, 4)
        END,
      valorAcrescimoItem  = v_valorAcrescimoItem
    WHERE idItemOrcamento = v_idItemOrcamento;
  END LOOP;
  UPDATE MOORCAMENTOS SET
    valorProdutos          = valorProdutos          + v_soma_valorProdutos,
    valorDescontoProdutos  = valorDescontoProdutos  + v_soma_valorDescontoProdutos,
    valorAcrescimoProdutos = valorAcrescimoProdutos + v_soma_valorAcrescimoProdutos,
    valorServicos          = valorServicos          + v_soma_valorServicos,
    valorDescontoServicos  = valorDescontoServicos  + v_soma_valorDescontoServicos,
    valorAcrescimoServicos = valorAcrescimoServicos + v_soma_valorAcrescimoServicos
  WHERE orcamento          = p_item_orcamento;
END ADD_ORCAMENTO_ITEM_COMBO_RESID;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_GRAVA (
  p_sessaoClient                 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_Retotalizar IN NUMBER,
  p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
  p_buscarGeraFinanceiroEstoque  IN NUMBER,
  p_tipoDocumentoReferenciado    IN CHAR, -- C = Painel de Compras L = Lista Evento, O = Orçamento, T = Transferência
  p_idItemReferenciado           IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_tempComp_nomeTempComposicao  IN VARCHAR2,
  p_tempComp_sequencia           IN NUMBER,
  p_mensagemAviso                IN VARCHAR,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemOrcamento         IN NUMBER,
  p_item_orcamento               IN NUMBER,
  p_item_pedidoCompraFornecedor  IN VARCHAR2,
  p_item_sequenciaPedidoCompraFo IN NUMBER,
  p_item_ambiente                IN NUMBER,
  p_item_ambienteObservacoes     IN VARCHAR2,
  p_item_vinculoItemDocumento    IN NUMBER,
  p_item_atividadeServico        IN NUMBER,
  p_item_statusAtividadeServico  IN CHAR,
  p_item_controleEntrega         IN NUMBER,
  p_item_dataEntrega             IN DATE,
  p_item_modeloDocumento         IN NUMBER,
  p_item_estabelecimentoOriginal IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_idLoteEstoque           IN NUMBER,
  p_item_idEnderecoEstoque       IN NUMBER,
  p_item_idNumeroSerie           IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  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_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_precoUnitarioBruto      IN NUMBER,
  p_item_acrescimoUnitarioCompos IN NUMBER,
  p_item_precoUnitario           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_observacoesDigitadas    IN VARCHAR2,
  p_item_valorFreteGeral         IN NUMBER,
  p_item_valorSeguroGeral        IN NUMBER,
  p_item_valorDescontoGeral      IN NUMBER,
  p_item_valorOutrasDespesasGer  IN NUMBER,
  p_item_valorAdicFreteMarGeral  IN NUMBER,
  p_item_valorDespesasAduanGeral IN NUMBER,
  p_item_valorDescontoPagamento  IN NUMBER,
  p_item_valorOutrasDespPagament IN NUMBER,
  p_item_valorJurosPagamento     IN NUMBER,
  p_item_operacaoFiscal          IN NUMBER,
  p_item_movimentaEstoque        IN NUMBER,
  p_item_geraFinanceiro          IN NUMBER,
  p_item_cfop                    IN NUMBER,
  p_item_indicadorISSQN          IN CHAR,
  p_item_aliquotaISSQN           IN NUMBER,
  p_item_retidoISSQN             IN NUMBER,
  p_item_tributadoForaMunicipio  IN NUMBER,
  p_item_incentivoFiscal         IN NUMBER,
  p_item_listaServicos           IN NUMBER,
  p_item_cnae                    IN NUMBER,
  p_item_idServicoMunicipio      IN NUMBER,
  p_item_numeroProcessoAdministr IN VARCHAR2,
  p_item_retencaoIRRF            IN NUMBER,
  p_item_retencaoINSS            IN NUMBER,
  p_item_retencaoPIS             IN NUMBER,
  p_item_retencaoCOFINS          IN NUMBER,
  p_item_retencaoCSLL            IN NUMBER,
  p_item_retencaoOutros          IN NUMBER,
  p_item_aliquotaII              IN NUMBER,
  p_item_aliquotaIOF             IN NUMBER,
  p_item_codigoEnquadramentoIPI  IN NUMBER,
  p_item_stIPI                   IN CHAR,
  p_item_aliquotaIPI             IN NUMBER,
  p_item_valorAliquotaIPI        IN NUMBER,
  p_item_stPIS                   IN CHAR,
  p_item_aliquotaPIS             IN NUMBER,
  p_item_valorAliquotaPIS        IN NUMBER,
  p_item_aliquotaPISST           IN NUMBER,
  p_item_valorAliquotaPISST      IN NUMBER,
  p_item_stCOFINS                IN CHAR,
  p_item_aliquotaCOFINS          IN NUMBER,
  p_item_valorAliquotaCOFINS     IN NUMBER,
  p_item_aliquotaCOFINSST        IN NUMBER,
  p_item_valorAliquotaCOFINSST   IN NUMBER,
  p_item_stSimplesNacional       IN CHAR,
  p_item_creditoSimplesNacional  IN NUMBER,
  p_item_stICMS                  IN CHAR,
  p_item_modalBaseCalcICMS       IN CHAR,
  p_item_reducaoBaseICMS         IN NUMBER,
  p_item_aliquotaICMS            IN NUMBER,
  p_item_diferimentoICMS         IN NUMBER,
  p_item_motivoDesoneracaoICMS   IN CHAR,
  p_item_idBeneficio             IN NUMBER,
  p_item_modalBaseCalcICMSST     IN CHAR,
  p_item_margemValorAdicionadoST IN NUMBER,
  p_item_reducaoBaseST           IN NUMBER,
  p_item_aliquotaICMSST          IN NUMBER,
  p_item_aliquotaSTSuportConsFin IN NUMBER,
  p_item_reducaoBaseICMSEfetivo  IN NUMBER,
  p_item_aliquotaICMSEfetivo     IN NUMBER,
  p_item_aliquotaICMSUFDestinat  IN NUMBER,
  p_item_aliquotaICMSInterestad  IN NUMBER,
  p_item_partilhaICMSInterestad  IN NUMBER,
  p_item_aliquotaFCP             IN NUMBER,
  p_item_aliquotaFCPST           IN NUMBER,
  p_item_aliquotaFCPSTAnteriorm  IN NUMBER,
  p_item_aliquotaFCPUFDestinat   IN NUMBER,
  p_item_aliquotaEstImpFederais  IN NUMBER,
  p_item_aliquotaEstImpEstaduais IN NUMBER,
  p_item_aliquotaEstImpMunicipai IN NUMBER,
  p_item_baseISSQN               IN NUMBER,
  p_item_valorISSQN              IN NUMBER,
  p_item_baseRetIRRF             IN NUMBER,
  p_item_valorRetIRRF            IN NUMBER,
  p_item_baseRetINSS             IN NUMBER,
  p_item_valorRetINSS            IN NUMBER,
  p_item_baseRetPIS              IN NUMBER,
  p_item_valorRetPIS             IN NUMBER,
  p_item_baseRetCOFINS           IN NUMBER,
  p_item_valorRetCOFINS          IN NUMBER,
  p_item_baseRetCSLL             IN NUMBER,
  p_item_valorRetCSLL            IN NUMBER,
  p_item_baseRetOutros           IN NUMBER,
  p_item_valorRetOutros          IN NUMBER,
  p_item_baseII                  IN NUMBER,
  p_item_valorII                 IN NUMBER,
  p_item_baseIOF                 IN NUMBER,
  p_item_valorIOF                IN NUMBER,
  p_item_baseIPI                 IN NUMBER,
  p_item_valorIPI                IN NUMBER,
  p_item_basePIS                 IN NUMBER,
  p_item_valorPIS                IN NUMBER,
  p_item_basePISST               IN NUMBER,
  p_item_valorPISST              IN NUMBER,
  p_item_baseCOFINS              IN NUMBER,
  p_item_valorCOFINS             IN NUMBER,
  p_item_baseCOFINSST            IN NUMBER,
  p_item_valorCOFINSST           IN NUMBER,
  p_item_baseCreditoSimplesNac   IN NUMBER,
  p_item_valorCreditoSimplesNac  IN NUMBER,
  p_item_baseICMS                IN NUMBER,
  p_item_valorICMSOperacao       IN NUMBER,
  p_item_valorICMSDiferido       IN NUMBER,
  p_item_valorICMS               IN NUMBER,
  p_item_valorICMSDesoneracao    IN NUMBER,
  p_item_baseICMSST              IN NUMBER,
  p_item_valorICMSST             IN NUMBER,
  p_item_baseICMSSTAnteriormente IN NUMBER,
  p_item_valorICMSSTAnteriorment IN NUMBER,
  p_item_valorICMSProprioSubstit IN NUMBER,
  p_item_baseICMSEfetivo         IN NUMBER,
  p_item_valorICMSEfetivo        IN NUMBER,
  p_item_baseICMSUFDestinatario  IN NUMBER,
  p_item_valorICMSUFDestinatario IN NUMBER,
  p_item_baseICMSUFRemetente     IN NUMBER,
  p_item_valorICMSUFRemetente    IN NUMBER,
  p_item_baseFCP                 IN NUMBER,
  p_item_valorFCP                IN NUMBER,
  p_item_baseFCPST               IN NUMBER,
  p_item_valorFCPST              IN NUMBER,
  p_item_baseFCPSTAnteriormente  IN NUMBER,
  p_item_valorFCPSTAnteriormente IN NUMBER,
  p_item_baseFCPUFDestinatario   IN NUMBER,
  p_item_valorFCPUFDestinatario  IN NUMBER,
  p_item_baseEstimadaImpostos    IN NUMBER,
  p_item_valorEstImpFederais     IN NUMBER,
  p_item_valorEstImpEstaduais    IN NUMBER,
  p_item_valorEstImpMunicipais   IN NUMBER,
  p_nivel                        IN NUMBER,
  p_buffer_idItemOrcamento       IN VARCHAR2,
  /* Retornos */
  r_mensagemAviso                OUT VARCHAR,
  r_calcularImpostos             OUT NUMBER,
  r_item_idItemOrcamento         OUT NUMBER,
  r_buffer_idItemOrcamento       OUT VARCHAR2,
  r_valorInserido                OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_finalidadeNota           CHAR (1);
  v_cab_estabelecimento          NUMBER;
  v_cab_dataEmissao              DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_enderecoEntregaPessoa    NUMBER;
  v_cab_municipioFatoGerador     NUMBER;
  v_cab_localDestinoOperacao     CHAR (1);
  v_cab_indicadorConsumidorFinal CHAR (1);
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  v_cab_transportadora           NUMBER;
  v_cab_enderecoTransportadora   NUMBER;
  v_cab_ultimoVendedorItem       NUMBER;
  v_cab_quantidadeVolume         NUMBER;
  v_cab_quantidade               NUMBER;
  v_cab_pesoLiquido              NUMBER;
  v_cab_pesoBruto                NUMBER;
  v_cab_valorProdutosBruto       NUMBER;
  v_cab_valorProdutos            NUMBER;
  v_cab_valorDescontoProdutos    NUMBER;
  v_cab_valorAcrescimoProdutos   NUMBER;
  v_cab_valorServicosBruto       NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorDescontoServicos    NUMBER;
  v_cab_valorAcrescimoServicos   NUMBER;
  v_cab_valorFreteItem           NUMBER;
  v_cab_valorSeguroItem          NUMBER;
  v_cab_valorAdicFreteMarItem    NUMBER;
  v_cab_valorDespesasAduanItem   NUMBER;
  v_cab_valorFreteGeral          NUMBER;
  v_cab_valorSeguroGeral         NUMBER;
  v_cab_valorDescontoGeral       NUMBER;
  v_cab_valorOutrasDespesasGeral NUMBER;
  v_cab_valorAdicFreteMarGeral   NUMBER;
  v_cab_valorDespesasAduanGeral  NUMBER;
  v_cab_condicaoPagamento        NUMBER;
  v_cab_numeroParcelas           NUMBER;
  v_cab_somaPrazoParcelas        NUMBER;
  v_cab_valorXPrazoParcelas      NUMBER;
  v_cab_prazoMedio               NUMBER;
  v_cab_prazoMedioPonderado      NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorEntradaMinima       NUMBER;
  v_cab_valorAVistaEntrada       NUMBER;
  v_cab_valorPagamentoBruto      NUMBER;
  v_cab_valorDescontoPagamento   NUMBER;
  v_cab_valorOutrasDespPagamento NUMBER;
  v_cab_valorJurosPagamento      NUMBER;
  v_cab_valorPagamentoLiquido    NUMBER;
  v_cab_valorTroco               NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarTotal   NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_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_inserindoItem                NUMBER;
  v_cab_promocaoExiste           NUMBER;
  v_ini_cab_valorFreteItem       NUMBER;
  v_ini_cab_valorFreteGeral      NUMBER;
  v_ini_gradeProduto             NUMBER;
  v_ini_personalizacao           NUMBER;
  v_ini_operacaoFiscal           NUMBER;
  v_ini_quantidade               NUMBER;
  v_ini_controleEntrega          NUMBER;
  v_ini_valorProdutoServicoBruto NUMBER;
  v_ini_valorProdutoServico      NUMBER;
  v_ini_valorDescontoItem        NUMBER;
  v_ini_valorAcrescimoItem       NUMBER;
  v_ini_valorBasePagamento       NUMBER;
  v_ini_valorFreteTotal          NUMBER;
  v_ini_valorSeguroTotal         NUMBER;
  v_ini_valorDescontoTotal       NUMBER;
  v_ini_valorOutrasDespesasTotal NUMBER;
  v_ini_valorAdicFreteMarTotal   NUMBER;
  v_ini_valorDespesasAduanTotal  NUMBER;
  v_ini_contrEntr_habilitaFrete  NUMBER;
  v_item_sequencia               NUMBER;
  v_item_cancelado               NUMBER;
  v_item_quantidadeSaldo         NUMBER;
  v_item_precoUnitario           NUMBER;
  v_item_precoUnitarioConvertido NUMBER;
  v_item_valorProdutoServicoBrut NUMBER;
  v_item_valorProdutoServico     NUMBER;
  v_item_valorFreteGeral         NUMBER;
  v_item_valorDescontoGeral      NUMBER;
  v_item_valorBasePagamento      NUMBER;
  v_item_valorDescontoPagamento  NUMBER;
  v_item_valorOutrasDespPagament NUMBER;
  v_item_valorJurosPagamento     NUMBER;
  v_item_valorFreteTotal         NUMBER;
  v_item_valorSeguroTotal        NUMBER;
  v_item_valorDescontoTotal      NUMBER;
  v_item_valorOutrasDespesasTot  NUMBER;
  v_item_valorAdicFreteMarTotal  NUMBER;
  v_item_valorDespesasAduanTotal NUMBER;
  v_item_movimentaEstoque        NUMBER;
  v_item_geraFinanceiro          NUMBER;
  v_item_cfop                    NUMBER;
  v_item_indicadorISSQN          CHAR (1);
  v_item_aliquotaISSQN           NUMBER;
  v_item_retidoISSQN             NUMBER;
  v_item_tributadoForaMunicipio  NUMBER;
  v_item_incentivoFiscal         NUMBER;
  v_item_listaServicos           NUMBER;
  v_item_cnae                    NUMBER;
  v_item_idServicoMunicipio      NUMBER;
  v_item_numeroProcessoAdministr VARCHAR2 (30);
  v_item_retencaoIRRF            NUMBER;
  v_item_retencaoINSS            NUMBER;
  v_item_retencaoPIS             NUMBER;
  v_item_retencaoCOFINS          NUMBER;
  v_item_retencaoCSLL            NUMBER;
  v_item_retencaoOutros          NUMBER;
  v_item_aliquotaII              NUMBER;
  v_item_aliquotaIOF             NUMBER;
  v_item_codigoEnquadramentoIPI  NUMBER;
  v_item_stIPI                   CHAR (2);
  v_item_aliquotaIPI             NUMBER;
  v_item_valorAliquotaIPI        NUMBER;
  v_item_stPIS                   CHAR (2);
  v_item_aliquotaPIS             NUMBER;
  v_item_valorAliquotaPIS        NUMBER;
  v_item_aliquotaPISST           NUMBER;
  v_item_valorAliquotaPISST      NUMBER;
  v_item_stCOFINS                CHAR (2);
  v_item_aliquotaCOFINS          NUMBER;
  v_item_valorAliquotaCOFINS     NUMBER;
  v_item_aliquotaCOFINSST        NUMBER;
  v_item_valorAliquotaCOFINSST   NUMBER;
  v_item_stSimplesNacional       CHAR (3);
  v_item_creditoSimplesNacional  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_idBeneficio             NUMBER;
  v_item_modalBaseCalcICMSST     CHAR (1);
  v_item_margemValorAdicionadoST NUMBER;
  v_item_reducaoBaseST           NUMBER;
  v_item_aliquotaICMSST          NUMBER;
  v_item_aliquotaSTSuportConsFin NUMBER;
  v_item_reducaoBaseICMSEfetivo  NUMBER;
  v_item_aliquotaICMSEfetivo     NUMBER;
  v_item_aliquotaICMSUFDestinat  NUMBER;
  v_item_aliquotaICMSInterestad  NUMBER;
  v_item_partilhaICMSInterestad  NUMBER;
  v_item_aliquotaFCP             NUMBER;
  v_item_aliquotaFCPST           NUMBER;
  v_item_aliquotaFCPSTAnteriorm  NUMBER;
  v_item_aliquotaFCPUFDestinat   NUMBER;
  v_item_aliquotaEstImpFederais  NUMBER;
  v_item_aliquotaEstImpEstaduais NUMBER;
  v_item_aliquotaEstImpMunicipai NUMBER;
  v_item_baseISSQN               NUMBER;
  v_item_valorISSQN              NUMBER;
  v_item_baseRetIRRF             NUMBER;
  v_item_valorRetIRRF            NUMBER;
  v_item_baseRetINSS             NUMBER;
  v_item_valorRetINSS            NUMBER;
  v_item_baseRetPIS              NUMBER;
  v_item_valorRetPIS             NUMBER;
  v_item_baseRetCOFINS           NUMBER;
  v_item_valorRetCOFINS          NUMBER;
  v_item_baseRetCSLL             NUMBER;
  v_item_valorRetCSLL            NUMBER;
  v_item_baseRetOutros           NUMBER;
  v_item_valorRetOutros          NUMBER;
  v_item_baseII                  NUMBER;
  v_item_valorII                 NUMBER;
  v_item_baseIOF                 NUMBER;
  v_item_valorIOF                NUMBER;
  v_item_baseIPI                 NUMBER;
  v_item_valorIPI                NUMBER;
  v_item_basePIS                 NUMBER;
  v_item_valorPIS                NUMBER;
  v_item_basePISST               NUMBER;
  v_item_valorPISST              NUMBER;
  v_item_baseCOFINS              NUMBER;
  v_item_valorCOFINS             NUMBER;
  v_item_baseCOFINSST            NUMBER;
  v_item_valorCOFINSST           NUMBER;
  v_item_baseCreditoSimplesNac   NUMBER;
  v_item_valorCreditoSimplesNac  NUMBER;
  v_item_baseICMS                NUMBER;
  v_item_valorICMSOperacao       NUMBER;
  v_item_valorICMSDiferido       NUMBER;
  v_item_valorICMS               NUMBER;
  v_item_valorICMSDesoneracao    NUMBER;
  v_item_baseICMSST              NUMBER;
  v_item_valorICMSST             NUMBER;
  v_item_baseICMSSTAnteriormente NUMBER;
  v_item_valorICMSSTAnteriorment NUMBER;
  v_item_valorICMSProprioSubstit NUMBER;
  v_item_baseICMSEfetivo         NUMBER;
  v_item_valorICMSEfetivo        NUMBER;
  v_item_baseICMSUFDestinatario  NUMBER;
  v_item_valorICMSUFDestinatario NUMBER;
  v_item_baseICMSUFRemetente     NUMBER;
  v_item_valorICMSUFRemetente    NUMBER;
  v_item_baseFCP                 NUMBER;
  v_item_valorFCP                NUMBER;
  v_item_baseFCPST               NUMBER;
  v_item_valorFCPST              NUMBER;
  v_item_baseFCPSTAnteriormente  NUMBER;
  v_item_valorFCPSTAnteriormente NUMBER;
  v_item_baseFCPUFDestinatario   NUMBER;
  v_item_valorFCPUFDestinatario  NUMBER;
  v_item_baseEstimadaImpostos    NUMBER;
  v_item_valorEstImpFederais     NUMBER;
  v_item_valorEstImpEstaduais    NUMBER;
  v_item_valorEstImpMunicipais   NUMBER;
  v_item_valorLiquidoItem        NUMBER;
  v_modDoc_capituloNatFiscal     NUMBER;
  v_modDoc_movimentaEstoque      NUMBER;
  v_modDoc_geraFinanceiro        NUMBER;
  v_modDoc_tipoPreco             CHAR (1);
  v_modDoc_tabelaPreco           VARCHAR (10);
  v_modDoc_fatorMultipPreco      NUMBER;
  v_modDoc_tipoPrecoB            CHAR (1);
  v_modDoc_tabelaPrecoB          VARCHAR (10);
  v_modDoc_fatorMultipPrecoB     NUMBER;
  v_modDoc_diminuiDescontoPrUnit NUMBER;
  v_modDoc_somaAcrescimosPrUnit  NUMBER;
  v_modDoc_somaFreteSeguroPrUnit NUMBER;
  v_gradProd_produto             NUMBER;
  v_gradProd_cor                 NUMBER;
  v_gradProd_tamanho             CHAR(10);
  v_prod_controleEstoque         NUMBER;
  v_prod_tipoProduto             CHAR(2);
  v_prod_origemMercadoria        CHAR(1);
  v_prod_idNcm                   NUMBER;
  v_prod_listaServicos           NUMBER;
  v_prod_precoPautaTabelado      NUMBER;
  v_prod_composicaoPreco         NUMBER;
  v_ativServ_validoPrevisto      NUMBER;
  v_ativServ_habilitaAtivPrev    NUMBER;   
  v_contrEntr_habilitaFrete      NUMBER;
  v_atualizarObservacoes         NUMBER;
  v_observacoes                  VARCHAR2 (4000);
  v_idEnderecoEstoque            NUMBER;
  v_combo_operacaoFiscal         NUMBER;
  v_combo_controleQuantidade     NUMBER;
  v_combo_unidadeMedidaConversao VARCHAR2(6);
  v_combo_conversorQuantidade    NUMBER;
  v_combo_loteMinimo             NUMBER;
  v_combo_loteMultiplo           NUMBER;
  v_combo_altura                 NUMBER;
  v_combo_largura                NUMBER;
  v_combo_comprimento            NUMBER;
  v_combo_pecas                  NUMBER;
  v_combo_quantidadeConvertida   NUMBER;
  v_combo_pesoLiquido            NUMBER;
  v_combo_pesoBruto              NUMBER;
  v_combo_tipoPreco              CHAR(1);
  v_combo_tabelaPreco            VARCHAR2(10);
  v_combo_precoSugestaoAPrazo    NUMBER;
  v_combo_precoSugestaoAVista    NUMBER;
  v_combo_precoDesconto          NUMBER;
  v_combo_precoMinimo            NUMBER;
  v_combo_precoUnitario          NUMBER;
  v_combo_valorTotal             NUMBER;
  v_uniMedConv_casasDecimaisUnid NUMBER;
  v_valorFreteRegra              NUMBER;
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_mensagemAviso := p_mensagemAviso;
  r_calcularImpostos := p_calcularImpostos;
  r_item_idItemOrcamento := p_item_idItemOrcamento;
  r_buffer_idItemOrcamento := p_buffer_idItemOrcamento;
  r_valorInserido := 0;
  SELECT
    capituloNaturezaFiscal,
    movimentaEstoque,
    geraFinanceiro,
    tipoPreco,
    tabelaPreco,
    fatorMultiplicadorPreco,
    tipoPrecoB,
    tabelaPrecoB,
    fatorMultiplicadorPrecoB,
    diminuiDescontoPrUnit,
    somaAcrescimosPrUnit,
    somaFreteSeguroPrUnit
  INTO
    v_modDoc_capituloNatFiscal,
    v_modDoc_movimentaEstoque,
    v_modDoc_geraFinanceiro,
    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
  FROM PAMODELOSDOCUMENTO
  WHERE modeloDocumento = p_item_modeloDocumento;
  SELECT
    cab.origemDocumento,
    cab.tipoDocumento,
    cab.entradaSaida,
    cab.finalidadeNota,
    cab.estabelecimento,
    cab.dataEmissao,
    cab.pessoa,
    cab.enderecoEntregaPessoa,
    cab.municipioFatoGerador,
    cab.localDestinoOperacao,
    cab.indicadorConsumidorFinal,
    cab.modalidadeFrete,
    cab.tipoPagamentoFrete,
    cab.transportadora,
    cab.enderecoTransportadora,
    cab.ultimoVendedorItem,
    cab.quantidadeVolume,
    cab.quantidade,
    cab.pesoLiquido,
    cab.pesoBruto,
    cab.valorProdutosBruto,
    cab.valorProdutos,
    cab.valorDescontoProdutos,
    cab.valorAcrescimoProdutos,
    cab.valorServicosBruto,
    cab.valorServicos,
    cab.valorDescontoServicos,
    cab.valorAcrescimoServicos,
    cab.valorFreteItem,
    cab.valorSeguroItem,
    cab.valorAdicFreteMarinhaMerItem,
    cab.valorDespesasAduaneirasItem,
    cab.valorFreteGeral,
    cab.valorSeguroGeral,
    cab.valorDescontoGeral,
    cab.valorOutrasDespesasGeral,
    cab.valorAdicFreteMarinhaMerGeral,
    cab.valorDespesasAduaneirasGeral,
    cab.condicaoPagamento,
    cab.numeroParcelas,
    cab.somaPrazoParcelas,
    cab.valorXPrazoParcelas,
    cab.prazoMedio,
    cab.prazoMedioPonderado,
    cab.valorBasePagamento,
    cab.valorAVistaMinimo,
    cab.valorEntradaMinima,
    cab.valorAVistaEntrada,
    cab.valorPagamentoBruto,
    cab.valorDescontoPagamento,
    cab.valorOutrasDespesasPagamento,
    cab.valorJurosPagamento,
    cab.valorPagamentoLiquido,
    cab.valorTroco,
    cab.valorFreteTotal,
    cab.valorSeguroTotal,
    cab.valorDescontoTotal,
    cab.valorOutrasDespesasTotal,
    cab.valorAdicFreteMarinhaMerTotal,
    cab.valorDespesasAduaneirasTotal,
    cab.valorLiquidoItem,
    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_estabelecimento,
    v_cab_dataEmissao,
    v_cab_pessoa,
    v_cab_enderecoEntregaPessoa,
    v_cab_municipioFatoGerador,
    v_cab_localDestinoOperacao,
    v_cab_indicadorConsumidorFinal,
    v_cab_modalidadeFrete,
    v_cab_tipoPagamentoFrete,
    v_cab_transportadora,
    v_cab_enderecoTransportadora,
    v_cab_ultimoVendedorItem,
    v_cab_quantidadeVolume,
    v_cab_quantidade,
    v_cab_pesoLiquido,
    v_cab_pesoBruto,
    v_cab_valorProdutosBruto,
    v_cab_valorProdutos,
    v_cab_valorDescontoProdutos,
    v_cab_valorAcrescimoProdutos,
    v_cab_valorServicosBruto,
    v_cab_valorServicos,
    v_cab_valorDescontoServicos,
    v_cab_valorAcrescimoServicos,
    v_cab_valorFreteItem,
    v_cab_valorSeguroItem,
    v_cab_valorAdicFreteMarItem,
    v_cab_valorDespesasAduanItem,
    v_cab_valorFreteGeral,
    v_cab_valorSeguroGeral,
    v_cab_valorDescontoGeral,
    v_cab_valorOutrasDespesasGeral,
    v_cab_valorAdicFreteMarGeral,
    v_cab_valorDespesasAduanGeral,
    v_cab_condicaoPagamento,
    v_cab_numeroParcelas,
    v_cab_somaPrazoParcelas,
    v_cab_valorXPrazoParcelas,
    v_cab_prazoMedio,
    v_cab_prazoMedioPonderado,
    v_cab_valorBasePagamento,
    v_cab_valorAVistaMinimo,
    v_cab_valorEntradaMinima,
    v_cab_valorAVistaEntrada,
    v_cab_valorPagamentoBruto,
    v_cab_valorDescontoPagamento,
    v_cab_valorOutrasDespPagamento,
    v_cab_valorJurosPagamento,
    v_cab_valorPagamentoLiquido,
    v_cab_valorTroco,
    v_cab_valorFreteTotal,
    v_cab_valorSeguroTotal,
    v_cab_valorDescontoTotal,
    v_cab_valorOutrasDespesasTotal,
    v_cab_valorAdicFreteMarTotal,
    v_cab_valorDespesasAduanTotal,
    v_cab_valorLiquidoItem,
    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 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_item_orcamento;
  v_ini_cab_valorFreteItem := v_cab_valorFreteItem;
  v_ini_cab_valorFreteGeral := v_cab_valorFreteGeral;
  SELECT
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho,
    prod.controleEstoque,
    prod.tipoProduto,
    prod.origemMercadoria,
    prod.idNcm,
    prod.listaServicos,
    prod.precoPautaTabelado,
    CASE
      WHEN EXISTS (
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        WHERE comp.produto = gradProd.produto
        AND comp.ativo = 1)
      THEN 1
      ELSE 0
    END
  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,
    v_prod_precoPautaTabelado,
    v_prod_composicaoPreco
  FROM CAGRADESPRODUTO gradProd
  JOIN CAPRODUTOS prod
  ON prod.produto = gradProd.produto
  WHERE gradProd.gradeProduto = p_item_gradeProduto;
  v_inserindoItem                := 1;
  v_cab_promocaoExiste           := 0;
  v_item_cancelado               := 0;
  v_ini_gradeProduto             := 0;
  v_ini_personalizacao           := 0;
  v_ini_operacaoFiscal           := 0;
  v_ini_quantidade               := 0;
  v_ini_controleEntrega          := 0;
  v_ini_valorProdutoServicoBruto := 0;
  v_ini_valorProdutoServico      := 0;
  v_ini_valorDescontoItem        := 0;
  v_ini_valorAcrescimoItem       := 0;
  v_ini_valorBasePagamento       := 0;
  v_ini_valorFreteTotal          := 0;
  v_ini_valorSeguroTotal         := 0;
  v_ini_valorDescontoTotal       := 0;
  v_ini_valorOutrasDespesasTotal := 0;
  v_ini_valorAdicFreteMarTotal   := 0;
  v_ini_valorDespesasAduanTotal  := 0;
  v_ini_contrEntr_habilitaFrete  := 0;
  v_item_quantidadeSaldo         := p_item_quantidade;
  v_item_precoUnitario           := p_item_precoUnitario;
  v_item_valorProdutoServicoBrut := ROUND (p_item_Quantidade * CASE WHEN v_modDoc_diminuiDescontoPrUnit = 1 OR v_modDoc_somaAcrescimosPrUnit = 1 OR v_modDoc_somaFreteSeguroPrUnit = 1 OR v_prod_composicaoPreco = 1 THEN p_item_precoUnitarioBruto ELSE p_item_precoUnitario END, 2);
  v_item_valorProdutoServico     := ROUND (p_item_Quantidade * p_item_precoUnitario, 2);
  v_item_valorFreteGeral         := p_item_valorFreteGeral;
  v_item_valorDescontoGeral      := p_item_valorDescontoGeral;
  v_item_valorDescontoPagamento  := p_item_valorDescontoPagamento;
  v_item_valorOutrasDespPagament := p_item_valorOutrasDespPagament;
  v_item_valorJurosPagamento     := p_item_valorJurosPagamento;
  v_item_movimentaEstoque        := p_item_movimentaEstoque;
  v_item_geraFinanceiro          := p_item_geraFinanceiro;
  v_item_cfop                    := p_item_cfop;
  v_item_indicadorISSQN          := p_item_indicadorISSQN;
  v_item_aliquotaISSQN           := p_item_aliquotaISSQN;
  v_item_retidoISSQN             := p_item_retidoISSQN;
  v_item_tributadoForaMunicipio  := p_item_tributadoForaMunicipio;
  v_item_incentivoFiscal         := p_item_incentivoFiscal;
  v_item_listaServicos           := p_item_listaServicos;
  v_item_cnae                    := p_item_cnae;
  v_item_idServicoMunicipio      := p_item_idServicoMunicipio;
  v_item_numeroProcessoAdministr := p_item_numeroProcessoAdministr;
  v_item_retencaoIRRF            := p_item_retencaoIRRF;
  v_item_retencaoINSS            := p_item_retencaoINSS;
  v_item_retencaoPIS             := p_item_retencaoPIS;
  v_item_retencaoCOFINS          := p_item_retencaoCOFINS;
  v_item_retencaoCSLL            := p_item_retencaoCSLL;
  v_item_retencaoOutros          := p_item_retencaoOutros;
  v_item_aliquotaII              := p_item_aliquotaII;
  v_item_aliquotaIOF             := p_item_aliquotaIOF;
  v_item_codigoEnquadramentoIPI  := p_item_codigoEnquadramentoIPI;
  v_item_stIPI                   := p_item_stIPI;
  v_item_aliquotaIPI             := p_item_aliquotaIPI;
  v_item_valorAliquotaIPI        := p_item_valorAliquotaIPI;
  v_item_stPIS                   := p_item_stPIS;
  v_item_aliquotaPIS             := p_item_aliquotaPIS;
  v_item_valorAliquotaPIS        := p_item_valorAliquotaPIS;
  v_item_aliquotaPISST           := p_item_aliquotaPISST;
  v_item_valorAliquotaPISST      := p_item_valorAliquotaPISST;
  v_item_stCOFINS                := p_item_stCOFINS;
  v_item_aliquotaCOFINS          := p_item_aliquotaCOFINS;
  v_item_valorAliquotaCOFINS     := p_item_valorAliquotaCOFINS;
  v_item_aliquotaCOFINSST        := p_item_aliquotaCOFINSST;
  v_item_valorAliquotaCOFINSST   := p_item_valorAliquotaCOFINSST;
  v_item_stSimplesNacional       := p_item_stSimplesNacional;
  v_item_creditoSimplesNacional  := p_item_creditoSimplesNacional;
  v_item_stICMS                  := p_item_stICMS;
  v_item_modalBaseCalcICMS       := p_item_modalBaseCalcICMS;
  v_item_reducaoBaseICMS         := p_item_reducaoBaseICMS;
  v_item_aliquotaICMS            := p_item_aliquotaICMS;
  v_item_diferimentoICMS         := p_item_diferimentoICMS;
  v_item_motivoDesoneracaoICMS   := p_item_motivoDesoneracaoICMS;
  v_item_idBeneficio             := p_item_idBeneficio;
  v_item_modalBaseCalcICMSST     := p_item_modalBaseCalcICMSST;
  v_item_margemValorAdicionadoST := p_item_margemValorAdicionadoST;
  v_item_reducaoBaseST           := p_item_reducaoBaseST;
  v_item_aliquotaICMSST          := p_item_aliquotaICMSST;
  v_item_aliquotaSTSuportConsFin := p_item_aliquotaSTSuportConsFin;
  v_item_reducaoBaseICMSEfetivo  := p_item_reducaoBaseICMSEfetivo;
  v_item_aliquotaICMSEfetivo     := p_item_aliquotaICMSEfetivo;
  v_item_aliquotaICMSUFDestinat  := p_item_aliquotaICMSUFDestinat;
  v_item_aliquotaICMSInterestad  := p_item_aliquotaICMSInterestad;
  v_item_partilhaICMSInterestad  := p_item_partilhaICMSInterestad;
  v_item_aliquotaFCP             := p_item_aliquotaFCP;
  v_item_aliquotaFCPST           := p_item_aliquotaFCPST;
  v_item_aliquotaFCPSTAnteriorm  := p_item_aliquotaFCPSTAnteriorm;
  v_item_aliquotaFCPUFDestinat   := p_item_aliquotaFCPUFDestinat;
  v_item_aliquotaEstImpFederais  := p_item_aliquotaEstImpFederais;
  v_item_aliquotaEstImpEstaduais := p_item_aliquotaEstImpEstaduais;
  v_item_aliquotaEstImpMunicipai := p_item_aliquotaEstImpMunicipai;
  v_item_baseISSQN               := p_item_baseISSQN;
  v_item_valorISSQN              := p_item_valorISSQN;
  v_item_baseRetIRRF             := p_item_baseRetIRRF;
  v_item_valorRetIRRF            := p_item_valorRetIRRF;
  v_item_baseRetINSS             := p_item_baseRetINSS;
  v_item_valorRetINSS            := p_item_valorRetINSS;
  v_item_baseRetPIS              := p_item_baseRetPIS;
  v_item_valorRetPIS             := p_item_valorRetPIS;
  v_item_baseRetCOFINS           := p_item_baseRetCOFINS;
  v_item_valorRetCOFINS          := p_item_valorRetCOFINS;
  v_item_baseRetCSLL             := p_item_baseRetCSLL;
  v_item_valorRetCSLL            := p_item_valorRetCSLL;
  v_item_baseRetOutros           := p_item_baseRetOutros;
  v_item_valorRetOutros          := p_item_valorRetOutros;
  v_item_baseII                  := p_item_baseII;
  v_item_valorII                 := p_item_valorII;
  v_item_baseIOF                 := p_item_baseIOF;
  v_item_valorIOF                := p_item_valorIOF;
  v_item_baseIPI                 := p_item_baseIPI;
  v_item_valorIPI                := p_item_valorIPI;
  v_item_basePIS                 := p_item_basePIS;
  v_item_valorPIS                := p_item_valorPIS;
  v_item_basePISST               := p_item_basePISST;
  v_item_valorPISST              := p_item_valorPISST;
  v_item_baseCOFINS              := p_item_baseCOFINS;
  v_item_valorCOFINS             := p_item_valorCOFINS;
  v_item_baseCOFINSST            := p_item_baseCOFINSST;
  v_item_valorCOFINSST           := p_item_valorCOFINSST;
  v_item_baseCreditoSimplesNac   := p_item_baseCreditoSimplesNac;
  v_item_valorCreditoSimplesNac  := p_item_valorCreditoSimplesNac;
  v_item_baseICMS                := p_item_baseICMS;
  v_item_valorICMSOperacao       := p_item_valorICMSOperacao;
  v_item_valorICMSDiferido       := p_item_valorICMSDiferido;
  v_item_valorICMS               := p_item_valorICMS;
  v_item_valorICMSDesoneracao    := p_item_valorICMSDesoneracao;
  v_item_baseICMSST              := p_item_baseICMSST;
  v_item_valorICMSST             := p_item_valorICMSST;
  v_item_baseICMSSTAnteriormente := p_item_baseICMSSTAnteriormente;
  v_item_valorICMSSTAnteriorment := p_item_valorICMSSTAnteriorment;
  v_item_valorICMSProprioSubstit := p_item_valorICMSProprioSubstit;
  v_item_baseICMSEfetivo         := p_item_baseICMSEfetivo;
  v_item_valorICMSEfetivo        := p_item_valorICMSEfetivo;
  v_item_baseICMSUFDestinatario  := p_item_baseICMSUFDestinatario;
  v_item_valorICMSUFDestinatario := p_item_valorICMSUFDestinatario;
  v_item_baseICMSUFRemetente     := p_item_baseICMSUFRemetente;
  v_item_valorICMSUFRemetente    := p_item_valorICMSUFRemetente;
  v_item_baseFCP                 := p_item_baseFCP;
  v_item_valorFCP                := p_item_valorFCP;
  v_item_baseFCPST               := p_item_baseFCPST;
  v_item_valorFCPST              := p_item_valorFCPST;
  v_item_baseFCPSTAnteriormente  := p_item_baseFCPSTAnteriormente;
  v_item_valorFCPSTAnteriormente := p_item_valorFCPSTAnteriormente;
  v_item_baseFCPUFDestinatario   := p_item_baseFCPUFDestinatario;
  v_item_valorFCPUFDestinatario  := p_item_valorFCPUFDestinatario;
  v_item_baseEstimadaImpostos    := p_item_baseEstimadaImpostos;
  v_item_valorEstImpFederais     := p_item_valorEstImpFederais;
  v_item_valorEstImpEstaduais    := p_item_valorEstImpEstaduais;
  v_item_valorEstImpMunicipais   := p_item_valorEstImpMunicipais;
  v_contrEntr_habilitaFrete      := 0;
  IF p_manterFinanceiro_Retotalizar = 0 THEN
    SELECT COALESCE (MAX(1), 0)
    INTO v_cab_promocaoExiste
    FROM MOORCAMENTOXPROMOCOES
    WHERE orcamento = p_item_orcamento;
  END IF;
  IF p_item_idItemOrcamento > 0 THEN
    FOR a IN (
      SELECT
        a.sequencia,
        a.cancelado,
        a.gradeProduto,
        a.personalizacao,
        a.usarPrecoAVista,
        a.controleQuantidade,
        a.loteMultiplo,
        a.quantidade,
        a.quantidadeConvertida,
        a.quantidadeSaldo,
        a.controleEntrega,
        a.pesoLiquido,
        a.pesoBruto,
        a.valorProdutoServicoBruto,
        a.valorProdutoServico,
        a.valorDescontoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.valorFreteTotal,
        a.valorSeguroTotal,
        a.valorDescontoTotal,
        a.valorOutrasDespesasTotal,
        a.valorAdicFreteMarinhaMerTotal,
        a.valorDespesasAduaneirasTotal,
        a.operacaoFiscal,
        a.movimentaEstoque,
        a.geraFinanceiro,
        a.cfop,
        a.indicadorISSQN,
        a.aliquotaISSQN,
        a.retidoISSQN,
        a.tributadoForaMunicipio,
        a.incentivoFiscal,
        a.listaServicos,
        a.cnae,
        a.idServicoMunicipio,
        a.numeroProcessoAdministrativo,
        a.retencaoIRRF,
        a.retencaoINSS,
        a.retencaoPIS,
        a.retencaoCOFINS,
        a.retencaoCSLL,
        a.retencaoOutros,
        a.aliquotaII,
        a.aliquotaIOF,
        a.codigoEnquadramentoIPI,
        a.stIPI,
        a.aliquotaIPI,
        a.valorAliquotaIPI,
        a.stPIS,
        a.aliquotaPIS,
        a.valorAliquotaPIS,
        a.aliquotaPISST,
        a.valorAliquotaPISST,
        a.stCOFINS,
        a.aliquotaCOFINS,
        a.valorAliquotaCOFINS,
        a.aliquotaCOFINSST,
        a.valorAliquotaCOFINSST,
        a.stSimplesNacional,
        a.creditoSimplesNacional,
        a.stICMS,
        a.modalidadeBaseCalcICMS,
        a.reducaoBaseICMS,
        a.aliquotaICMS,
        a.diferimentoICMS,
        a.motivoDesoneracaoICMS,
        a.idBeneficio,
        a.modalidadeBaseCalcICMSST,
        a.margemValorAdicionadoST,
        a.reducaoBaseST,
        a.aliquotaICMSST,
        a.aliquotaSTSuportConsFinal,
        a.reducaoBaseICMSEfetivo,
        a.aliquotaICMSEfetivo,
        a.aliquotaICMSUFDestinatario,
        a.aliquotaICMSInterestadual,
        a.partilhaICMSInterestadual,
        a.aliquotaFCP,
        a.aliquotaFCPST,
        a.aliquotaFCPSTAnteriormente,
        a.aliquotaFCPUFDestinatario,
        a.aliquotaEstimadaImpFederais,
        a.aliquotaEstimadaImpEstaduais,
        a.aliquotaEstimadaImpMunicipais,
        a.baseISSQN,
        a.valorISSQN,
        a.baseRetIRRF,
        a.valorRetIRRF,
        a.baseRetINSS,
        a.valorRetINSS,
        a.baseRetPIS,
        a.valorRetPIS,
        a.baseRetCOFINS,
        a.valorRetCOFINS,
        a.baseRetCSLL,
        a.valorRetCSLL,
        a.baseRetOutros,
        a.valorRetOutros,
        a.baseII,
        a.valorII,
        a.baseIOF,
        a.valorIOF,
        a.baseIPI,
        a.valorIPI,
        a.basePIS,
        a.valorPIS,
        a.basePISST,
        a.valorPISST,
        a.baseCOFINS,
        a.valorCOFINS,
        a.baseCOFINSST,
        a.valorCOFINSST,
        a.baseCreditoSimplesNacional,
        a.valorCreditoSimplesNacional,
        a.baseICMS,
        a.valorICMSOperacao,
        a.valorICMSDiferido,
        a.valorICMS,
        a.valorICMSDesoneracao,
        a.baseICMSST,
        a.valorICMSST,
        a.baseICMSSTAnteriormente,
        a.valorICMSSTAnteriormente,
        a.valorICMSProprioSubstituto,
        a.baseICMSEfetivo,
        a.valorICMSEfetivo,
        a.baseICMSUFDestinatario,
        a.valorICMSUFDestinatario,
        a.baseICMSUFRemetente,
        a.valorICMSUFRemetente,
        a.baseFCP,
        a.valorFCP,
        a.baseFCPST,
        a.valorFCPST,
        a.baseFCPSTAnteriormente,
        a.valorFCPSTAnteriormente,
        a.baseFCPUFDestinatario,
        a.valorFCPUFDestinatario,
        a.baseEstimadaImpostos,
        a.valorEstimadoImpFederais,
        a.valorEstimadoImpEstaduais,
        a.valorEstimadoImpMunicipais,
        a.valorBasePagamento,
        a.valorLiquidoItem,
        prod.tipoProduto,
        b.habilitaFrete
      FROM MOORCAMENTOXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN PACONTROLESENTREGA b
      ON b.controleEntrega = a.controleEntrega
      WHERE a.idItemOrcamento = p_item_idItemOrcamento)
    LOOP
      v_inserindoItem := 0;
      v_item_sequencia := a.sequencia;
      v_item_cancelado := a.cancelado;
      v_ini_gradeProduto := a.gradeProduto;
      v_ini_personalizacao := a.personalizacao;
      v_ini_operacaoFiscal := a.operacaoFiscal;
      v_ini_quantidade := a.quantidade;
      v_ini_controleEntrega := a.controleEntrega;
      v_ini_valorProdutoServicoBruto := a.valorProdutoServicoBruto;
      v_ini_valorProdutoServico := a.valorProdutoServico;
      v_ini_valorDescontoItem := a.valorDescontoItem;
      v_ini_valorAcrescimoItem := a.valorAcrescimoItem;
      v_ini_valorBasePagamento := a.valorBasePagamento;
      v_ini_valorFreteTotal := a.valorFreteTotal;
      v_ini_valorSeguroTotal := a.valorSeguroTotal;
      v_ini_valorDescontoTotal := a.valorDescontoTotal;
      v_ini_valorOutrasDespesasTotal := a.valorOutrasDespesasTotal;
      v_ini_valorAdicFreteMarTotal := a.valorAdicFreteMarinhaMerTotal;
      v_ini_valorDespesasAduanTotal := a.valorDespesasAduaneirasTotal;
      v_ini_contrEntr_habilitaFrete := 0;
      v_ini_valorBasePagamento := a.valorBasePagamento;
      v_ini_valorFreteTotal := a.valorFreteTotal;
      v_ini_contrEntr_habilitaFrete := a.habilitaFrete;
      IF p_buscarAliquotas_CalcularImp ='T'
      THEN
        v_item_movimentaEstoque        := a.movimentaEstoque;
        v_item_geraFinanceiro          := a.geraFinanceiro;
        v_item_cfop                    := a.cfop;
        v_item_indicadorISSQN          := a.indicadorISSQN;
        v_item_aliquotaISSQN           := a.aliquotaISSQN;
        v_item_retidoISSQN             := a.retidoISSQN;
        v_item_tributadoForaMunicipio  := a.tributadoForaMunicipio;
        v_item_incentivoFiscal         := a.incentivoFiscal;
        v_item_listaServicos           := a.listaServicos;
        v_item_cnae                    := a.cnae;
        v_item_idServicoMunicipio      := a.idServicoMunicipio;
        v_item_numeroProcessoAdministr := a.numeroProcessoAdministrativo;
        v_item_retencaoIRRF            := a.retencaoIRRF;
        v_item_retencaoINSS            := a.retencaoINSS;
        v_item_retencaoPIS             := a.retencaoPIS;
        v_item_retencaoCOFINS          := a.retencaoCOFINS;
        v_item_retencaoCSLL            := a.retencaoCSLL;
        v_item_retencaoOutros          := a.retencaoOutros;
        v_item_aliquotaII              := a.aliquotaII;
        v_item_aliquotaIOF             := a.aliquotaIOF;
        v_item_codigoEnquadramentoIPI  := a.codigoEnquadramentoIPI;
        v_item_stIPI                   := a.stIPI;
        v_item_aliquotaIPI             := a.aliquotaIPI;
        v_item_valorAliquotaIPI        := a.valorAliquotaIPI;
        v_item_stPIS                   := a.stPIS;
        v_item_aliquotaPIS             := a.aliquotaPIS;
        v_item_valorAliquotaPIS        := a.valorAliquotaPIS;
        v_item_aliquotaPISST           := a.aliquotaPISST;
        v_item_valorAliquotaPISST      := a.valorAliquotaPISST;
        v_item_stCOFINS                := a.stCOFINS;
        v_item_aliquotaCOFINS          := a.aliquotaCOFINS;
        v_item_valorAliquotaCOFINS     := a.valorAliquotaCOFINS;
        v_item_aliquotaCOFINSST        := a.aliquotaCOFINSST;
        v_item_valorAliquotaCOFINSST   := a.valorAliquotaCOFINSST;
        v_item_stSimplesNacional       := a.stSimplesNacional;
        v_item_creditoSimplesNacional  := a.creditoSimplesNacional;
        v_item_stICMS                  := a.stICMS;
        v_item_modalBaseCalcICMS       := a.modalidadeBaseCalcICMS;
        v_item_reducaoBaseICMS         := a.reducaoBaseICMS;
        v_item_aliquotaICMS            := a.aliquotaICMS;
        v_item_diferimentoICMS         := a.diferimentoICMS;
        v_item_motivoDesoneracaoICMS   := a.motivoDesoneracaoICMS;
        v_item_idBeneficio             := a.idBeneficio;
        v_item_modalBaseCalcICMSST     := a.modalidadeBaseCalcICMSST;
        v_item_margemValorAdicionadoST := a.margemValorAdicionadoST;
        v_item_reducaoBaseST           := a.reducaoBaseST;
        v_item_aliquotaICMSST          := a.aliquotaICMSST;
        v_item_aliquotaSTSuportConsFin := a.aliquotaSTSuportConsFinal;
        v_item_reducaoBaseICMSEfetivo  := a.reducaoBaseICMSEfetivo;
        v_item_aliquotaICMSEfetivo     := a.aliquotaICMSEfetivo;
        v_item_aliquotaICMSUFDestinat  := a.aliquotaICMSUFDestinatario;
        v_item_aliquotaICMSInterestad  := a.aliquotaICMSInterestadual;
        v_item_partilhaICMSInterestad  := a.partilhaICMSInterestadual;
        v_item_aliquotaFCP             := a.aliquotaFCP;
        v_item_aliquotaFCPST           := a.aliquotaFCPST;
        v_item_aliquotaFCPSTAnteriorm  := a.aliquotaFCPSTAnteriormente;
        v_item_aliquotaFCPUFDestinat   := a.aliquotaFCPUFDestinatario;
        v_item_aliquotaEstImpFederais  := a.aliquotaEstimadaImpFederais;
        v_item_aliquotaEstImpEstaduais := a.aliquotaEstimadaImpEstaduais;
        v_item_aliquotaEstImpMunicipai := a.aliquotaEstimadaImpMunicipais;
        v_item_baseISSQN               := a.baseISSQN;
        v_item_valorISSQN              := a.valorISSQN;
        v_item_baseRetIRRF             := a.baseRetIRRF;
        v_item_valorRetIRRF            := a.valorRetIRRF;
        v_item_baseRetINSS             := a.baseRetINSS;
        v_item_valorRetINSS            := a.valorRetINSS;
        v_item_baseRetPIS              := a.baseRetPIS;
        v_item_valorRetPIS             := a.valorRetPIS;
        v_item_baseRetCOFINS           := a.baseRetCOFINS;
        v_item_valorRetCOFINS          := a.valorRetCOFINS;
        v_item_baseRetCSLL             := a.baseRetCSLL;
        v_item_valorRetCSLL            := a.valorRetCSLL;
        v_item_baseRetOutros           := a.baseRetOutros;
        v_item_valorRetOutros          := a.valorRetOutros;
        v_item_baseII                  := a.baseII;
        v_item_valorII                 := a.valorII;
        v_item_baseIOF                 := a.baseIOF;
        v_item_valorIOF                := a.valorIOF;
        v_item_baseIPI                 := a.baseIPI;
        v_item_valorIPI                := a.valorIPI;
        v_item_basePIS                 := a.basePIS;
        v_item_valorPIS                := a.valorPIS;
        v_item_basePISST               := a.basePISST;
        v_item_valorPISST              := a.valorPISST;
        v_item_baseCOFINS              := a.baseCOFINS;
        v_item_valorCOFINS             := a.valorCOFINS;
        v_item_baseCOFINSST            := a.baseCOFINSST;
        v_item_valorCOFINSST           := a.valorCOFINSST;
        v_item_baseCreditoSimplesNac   := a.baseCreditoSimplesNacional;
        v_item_valorCreditoSimplesNac  := a.valorCreditoSimplesNacional;
        v_item_baseICMS                := a.baseICMS;
        v_item_valorICMSOperacao       := a.valorICMSOperacao;
        v_item_valorICMSDiferido       := a.valorICMSDiferido;
        v_item_valorICMS               := a.valorICMS;
        v_item_valorICMSDesoneracao    := a.valorICMSDesoneracao;
        v_item_baseICMSST              := a.baseICMSST;
        v_item_valorICMSST             := a.valorICMSST;
        v_item_baseICMSSTAnteriormente := a.baseICMSSTAnteriormente;
        v_item_valorICMSSTAnteriorment := a.valorICMSSTAnteriormente;
        v_item_valorICMSProprioSubstit := a.valorICMSProprioSubstituto;
        v_item_baseICMSEfetivo         := a.baseICMSEfetivo;
        v_item_valorICMSEfetivo        := a.valorICMSEfetivo;
        v_item_baseICMSUFDestinatario  := a.baseICMSUFDestinatario;
        v_item_valorICMSUFDestinatario := a.valorICMSUFDestinatario;
        v_item_baseICMSUFRemetente     := a.baseICMSUFRemetente;
        v_item_valorICMSUFRemetente    := a.valorICMSUFRemetente;
        v_item_baseFCP                 := a.baseFCP;
        v_item_valorFCP                := a.valorFCP;
        v_item_baseFCPST               := a.baseFCPST;
        v_item_valorFCPST              := a.valorFCPST;
        v_item_baseFCPSTAnteriormente  := a.baseFCPSTAnteriormente;
        v_item_valorFCPSTAnteriormente := a.valorFCPSTAnteriormente;
        v_item_baseFCPUFDestinatario   := a.baseFCPUFDestinatario;
        v_item_valorFCPUFDestinatario  := a.valorFCPUFDestinatario;
        v_item_baseEstimadaImpostos    := a.baseEstimadaImpostos;
        v_item_valorEstImpFederais     := a.valorEstimadoImpFederais;
        v_item_valorEstImpEstaduais    := a.valorEstimadoImpEstaduais;
        v_item_valorEstImpMunicipais   := a.valorEstimadoImpMunicipais;
      END IF;
      IF a.cancelado = 0 THEN
        v_item_quantidadeSaldo := v_item_quantidadeSaldo + a.quantidadeSaldo - a.quantidade;
      END IF;
      IF p_manterFinanceiro_Retotalizar = 0
        AND (v_cab_valorFreteGeral <> 0
          OR v_cab_valorSeguroGeral <> 0
          OR v_cab_valorDescontoGeral <> 0
          OR v_cab_valorOutrasDespesasGeral <> 0
          OR v_cab_valorAdicFreteMarGeral <> 0
          OR v_cab_valorDespesasAduanGeral <> 0)
        AND (a.valorProdutoServicoBruto <> v_item_valorProdutoServicoBrut
          OR a.valorProdutoServico <> v_item_valorProdutoServico
          OR a.valorDescontoItem <> p_item_valorDescontoItem
          OR a.valorAcrescimoItem <> p_item_valorAcrescimoItem)
        OR a.valorFreteGeral <> v_item_valorFreteGeral
        OR a.valorSeguroGeral <> p_item_valorSeguroGeral
        OR a.valorDescontoGeral <> v_item_valorDescontoGeral
        OR a.valorOutrasDespesasGeral <> p_item_valorOutrasDespesasGer
        OR a.valorAdicFreteMarinhaMerGeral <> p_item_valorAdicFreteMarGeral
        OR a.valorDespesasAduaneirasGeral <> p_item_valorDespesasAduanGeral
      THEN
        r_calcularImpostos := 1;
      END IF;
      IF p_manterFinanceiro_Retotalizar < 2
      AND a.cancelado = 0
      THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume - TRUNC(CASE WHEN a.controleQuantidade = 1 AND a.loteMultiplo <> 0 THEN a.quantidade / a.loteMultiplo ELSE a.quantidadeConvertida END,0);
        END IF;
        v_cab_quantidade := v_cab_quantidade - a.quantidadeConvertida;
        v_cab_pesoLiquido := v_cab_pesoLiquido - a.pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto - a.pesoBruto;
        IF a.tipoProduto = '09' THEN
          v_cab_valorServicosBruto := v_cab_valorServicosBruto - a.valorProdutoServicoBruto;
          v_cab_valorServicos := v_cab_valorServicos - a.valorProdutoServico;
          v_cab_valorDescontoServicos := v_cab_valorDescontoServicos - a.valorDescontoItem;
          v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos - a.valorAcrescimoItem;
        ELSE 
          v_cab_valorProdutosBruto := v_cab_valorProdutosBruto - a.valorProdutoServicoBruto;
          v_cab_valorProdutos := v_cab_valorProdutos - a.valorProdutoServico;
          v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos - a.valorDescontoItem;
          v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos - a.valorAcrescimoItem;
        END IF;
        v_cab_valorFreteItem := v_cab_valorFreteItem - a.valorFreteItem;
        v_cab_valorSeguroItem := v_cab_valorSeguroItem - a.valorSeguroItem;
        v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem - a.valorAdicFreteMarinhaMerItem;
        v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem - a.valorDespesasAduaneirasItem;
        v_cab_valorFreteGeral := v_cab_valorFreteGeral - a.valorFreteGeral;
        v_cab_valorSeguroGeral := v_cab_valorSeguroGeral - a.valorSeguroGeral;
        v_cab_valorDescontoGeral := v_cab_valorDescontoGeral - a.valorDescontoGeral;
        v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral - a.valorOutrasDespesasGeral;
        v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral - a.valorAdicFreteMarinhaMerGeral;
        v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral - a.valorDespesasAduaneirasGeral;
        v_cab_valorBasePagamento := v_cab_valorBasePagamento - a.valorBasePagamento;
        IF a.usarPrecoAVista = 1
          AND a.geraFinanceiro = 1
        THEN
          v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo - a.valorProdutoServico + a.valorDescontoTotal - a.valorOutrasDespesasTotal;
        END IF;
        v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento - a.valorDescontoPagamento;
        v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento - a.valorOutrasDespesasPagamento;
        v_cab_valorJurosPagamento := v_cab_valorJurosPagamento - a.valorJurosPagamento;
        v_cab_valorFreteTotal := v_cab_valorFreteTotal - a.valorFreteTotal;
        v_cab_valorSeguroTotal := v_cab_valorSeguroTotal - a.valorSeguroTotal;
        v_cab_valorDescontoTotal := v_cab_valorDescontoTotal - a.valorDescontoTotal;
        v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal - a.valorOutrasDespesasTotal;
        v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal - a.valorAdicFreteMarinhaMerTotal;
        v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal - a.valorDespesasAduaneirasTotal;
        v_cab_valorLiquidoItem := v_cab_valorLiquidoItem - a.valorLiquidoItem;
      END IF;
    END LOOP;
  END IF;
  ADD_CALCULA_TOTAIS_ITEM (
    v_cab_tipoPagamentoFrete,
    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,
    v_item_valorFreteGeral,
    p_item_valorSeguroGeral,
    v_item_valorDescontoGeral,
    p_item_valorOutrasDespesasGer,
    p_item_valorAdicFreteMarGeral,
    p_item_valorDespesasAduanGeral,
    v_item_valorDescontoPagamento,
    v_item_valorOutrasDespPagament,
    v_item_valorJurosPagamento,
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit,
    v_prod_composicaoPreco,
    v_item_precoUnitario,
    v_item_precoUnitarioConvertido,
    v_item_valorProdutoServico,
    v_item_valorFreteTotal,
    v_item_valorSeguroTotal,
    v_item_valorDescontoTotal,
    v_item_valorOutrasDespesasTot,
    v_item_valorAdicFreteMarTotal,
    v_item_valorDespesasAduanTotal);
  IF v_inserindoItem = 1
    AND v_prod_controleEstoque = 3
  THEN
    FOR a IN (
      SELECT
        kit.gradeProdutoFilho,
        ROUND (p_item_quantidade * kit.quantidade, unMed.casasDecimaisUnidadeMedida) 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,
        unMed.casasDecimaisUnidadeMedida,
        locEst.indicadorPropriedadePosseItem
      FROM CAGRADEPRODUTOXKITSCOMBOS kit
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = kit.gradeProdutoFilho
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN SIUNIDADESMEDIDA unMed
      ON unMed.unidadeMedida = prod.unidadeMedida
      JOIN PALOCAISESTOQUE locEst
      ON locEst.localEstoque = p_item_localEstoque
      WHERE kit.gradeProduto = p_item_gradeProduto
      AND kit.ativo = 1
      AND kit.gradeProduto <> kit.gradeProdutoFilho
      AND kit.quantidade > 0
      AND ROUND (p_item_quantidade * kit.quantidade, unMed.casasDecimaisUnidadeMedida) > 0)
    LOOP
      v_combo_operacaoFiscal := FUNC_ADD_BUSCA_OPERACAO_FISCAL (
        p_item_modeloDocumento,
        v_cab_entradaSaida,
        v_cab_pessoa,
        0, -- v_cab_vendaConsumidor,
        v_cab_indicadorConsumidorFinal,
        v_est_grupoFiscal,
        v_pessEst_regimeTributario,
        v_munEndEst_uf,
        v_pess_indicadorInscricaoEstad,
        v_munEndPess_uf,
        a.produto);
      IF v_cab_entradaSaida = 'E'
      THEN
        ADD_ITEM_PROD_REGRA_FORN_BUSCA (
          v_cab_pessoa,
          a.produto,
          a.unidadeMedida,
          a.casasDecimaisUnidadeMedida,
          /* Retornos */
          v_auxNumber,
          v_combo_controleQuantidade,
          v_combo_unidadeMedidaConversao,
          v_combo_conversorQuantidade,
          v_combo_loteMinimo,
          v_combo_loteMultiplo);
        IF v_auxNumber = 0
          AND v_cab_pessoa <> 0
        THEN
          ADD_ITEM_PROD_REGRA_FORN_BUSCA (
            0,
            a.produto,
            a.unidadeMedida,
            a.casasDecimaisUnidadeMedida,
            /* Retornos */
            v_auxNumber,
            v_combo_controleQuantidade,
            v_combo_unidadeMedidaConversao,
            v_combo_conversorQuantidade,
            v_combo_loteMinimo,
            v_combo_loteMultiplo);
        END IF;
        IF v_auxNumber = 0 THEN
          v_combo_controleQuantidade      := 1;
          v_combo_unidadeMedidaConversao  := a.unidadeMedida;
          v_combo_conversorQuantidade     := 1;
          v_combo_loteMinimo              := 0;
          v_combo_loteMultiplo            := 0;
        END IF;
      ELSE
        v_combo_controleQuantidade      := a.controleQuantidadeVenda;
        v_combo_unidadeMedidaConversao  :=
          CASE
            WHEN a.controleQuantidadeVenda IN (2,3) 
            THEN 'PC'
            ELSE (
              CASE
                WHEN a.controleQuantidadeVenda = 4 AND a.unidadeMedidaVenda <> ' ' AND a.conversorQuantidadeVenda <> 0 AND a.conversorQuantidadeVenda <> 1
                THEN a.unidadeMedidaVenda
                ELSE a.unidadeMedida
              END
            )
          END;
        v_combo_conversorQuantidade := a.conversorQuantidadeVenda;
        v_combo_loteMinimo          := ROUND (a.loteMinimoVenda, a.casasDecimaisUnidadeMedida);
        v_combo_loteMultiplo        := ROUND (a.loteMultiploVenda, a.casasDecimaisUnidadeMedida);
        SELECT COALESCE ( MAX (casasDecimaisUnidadeMedida), 0)
        INTO v_uniMedConv_casasDecimaisUnid
        FROM SIUNIDADESMEDIDA
        WHERE unidadeMedida = v_combo_unidadeMedidaConversao;
      END IF;
      IF v_combo_controleQuantidade NOT BETWEEN 1 AND 4 OR v_combo_controleQuantidade = 4 AND (v_combo_conversorQuantidade = 0 OR v_combo_conversorQuantidade = 1)
      THEN
        v_combo_controleQuantidade := 1;
      END IF;
      IF v_combo_controleQuantidade <> 4 THEN
        v_combo_conversorQuantidade  := 1;
      END IF;
      IF v_combo_controleQuantidade = 1 THEN
        v_combo_altura               := 0;
        v_combo_largura              := 0;
        v_combo_comprimento          := 0;
        v_combo_pecas                := 0;
        v_combo_quantidadeConvertida := a.quantidade;
      ELSIF v_combo_controleQuantidade = 2 THEN
        v_combo_altura               := a.altura;
        v_combo_largura              := a.largura;
        v_combo_comprimento          := 0;
        v_combo_pecas                := CASE WHEN v_combo_altura = 0 OR v_combo_largura = 0 THEN 0 ELSE ROUND ((a.quantidade / ((a.altura / 100) * (v_combo_largura / 100))),3) END;
        v_combo_quantidadeConvertida := ROUND (v_combo_pecas, v_uniMedConv_casasDecimaisUnid);
      ELSIF v_combo_controleQuantidade = 3 THEN
        v_combo_altura               := a.altura;
        v_combo_largura              := a.largura;
        v_combo_comprimento          := a.comprimento;
        v_combo_pecas                := CASE WHEN v_combo_altura = 0 OR v_combo_comprimento = 0 OR v_combo_comprimento = 0 THEN 0 ELSE ROUND (a.quantidade / ((a.altura / 100) * (v_combo_largura / 100) * v_combo_comprimento),3) END;
        v_combo_quantidadeConvertida := ROUND (v_combo_pecas, v_uniMedConv_casasDecimaisUnid);
      ELSIF v_combo_controleQuantidade = 4 THEN
        v_combo_altura               := 0;
        v_combo_largura              := 0;
        v_combo_comprimento          := 0;
        v_combo_pecas                := CASE WHEN v_combo_conversorQuantidade = 0 THEN 0 ELSE ROUND ((a.quantidade / v_combo_conversorQuantidade),3) END;
        v_combo_quantidadeConvertida := ROUND (v_combo_pecas, v_uniMedConv_casasDecimaisUnid);
      END IF;
      v_combo_pesoLiquido := ROUND ((a.quantidade * a.pesoLiquido), 3);
      v_combo_pesoBruto   := ROUND ((a.quantidade * a.pesoBruto), 3);
      ADD_BUSCA_PRECO (
        p_config_64_casasDecSaidas,
        p_config_65_casasDecEntrada,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        v_cab_entradaSaida,
        0, -- v_cab_devolucaoAnulacaoRetorno
        v_cab_estabelecimento,
        NULL, -- p_cab_dataPrecoInicial
        TRUNC(SYSDATE), -- p_cab_dataPrecoFinal
        v_cab_pessoa,
        v_modDoc_capituloNatFiscal,
        v_modDoc_tipoPreco,
        v_modDoc_tabelaPreco,
        v_modDoc_fatorMultipPreco,
        v_modDoc_tipoPrecoB,
        v_modDoc_tabelaPrecoB,
        v_modDoc_fatorMultipPrecoB,
        v_munEndEst_uf,
        v_munEndPess_uf,
        p_item_vendedor,
        0, -- p_item_idFormulaTinta
        0, -- p_item_personalizacao
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidade,
        a.produto,
        a.cor,
        a.tamanho,
        a.controleEstoque,
        a.indicadorPropriedadePosseItem,
        0, -- p_manterPreco
        v_combo_precoSugestaoAPrazo,
        v_combo_precoSugestaoAVista,
        v_combo_tipoPreco,
        v_combo_tabelaPreco,
        v_combo_tipoPreco,
        v_combo_tabelaPreco,
        v_combo_precoSugestaoAPrazo,
        v_combo_precoSugestaoAVista,
        v_combo_precoDesconto,
        v_combo_precoMinimo,
        v_auxNumber, -- r_informarPrecoManualmente
        v_auxNumber, -- r_precoAPrazo
        v_auxNumber, -- r_precoAVista
        v_auxNumber, -- r_promocao
        v_auxNumber, -- r_precoPromocaoAPrazo
        v_auxNumber, -- r_precoPromocaoAVista
        v_auxNumber, -- r_precoIndexadoAPrazo
        v_auxNumber); -- r_precoIndexadoAVista
      v_combo_precoUnitario := CASE WHEN p_item_usarPrecoAVista = 1 THEN v_combo_precoSugestaoAVista ELSE v_combo_precoSugestaoAPrazo END;
      ADD_ORCAMENTO_ITEM_GRAVA (
        ' ', -- p_sessaoClient
        p_usuarioLogado,
        p_perfilUsuarioLogado,
        p_estabelecimentoAtivo,
        p_person_190_modeloFrete,
        p_config_64_casasDecSaidas,
        p_config_65_casasDecEntrada,
        p_config_198_obs_add_referenc,
        p_config_199_obs_add_caractA,
        p_config_200_obs_add_caractB,
        p_config_201_obs_add_caractC,
        p_config_202_obs_add_caractD,
        p_config_203_obs_add_caractE,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_config_378_calcularVolumes,
        p_manterFinanceiro_Retotalizar,
        'S', -- p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
        p_buscarGeraFinanceiroEstoque,
        p_tipoDocumentoReferenciado, 
        p_idItemReferenciado,
        CASE
          WHEN p_quantidadeReferenciada = 0
          OR p_item_quantidade = 0
          THEN 0
          ELSE ROUND(a.quantidade * p_quantidadeReferenciada / p_item_quantidade, 7)
        END, -- p_quantidadeReferenciada
        ' ', -- p_tempComp_nomeTempComposicao,
        0, -- p_tempComp_sequencia
        r_mensagemAviso,
        r_calcularImpostos,
        0, -- p_item_idItemOrcamento
        p_item_orcamento,
        p_item_pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo,
        p_item_ambiente,
        p_item_ambienteObservacoes,
        999, -- p_item_vinculoItemDocumento
        0, -- p_item_atividadeServico
        'A', -- p_item_statusAtividadeServico
        p_item_controleEntrega,
        p_item_dataEntrega,
        p_item_modeloDocumento,
        p_item_estabelecimentoOriginal,
        p_item_vendedor,
        a.gradeProdutoFilho,
        0, -- p_item_idFormulaTinta
        0, -- p_item_personalizacao
        0, -- p_item_idLoteEstoque
        0, -- p_item_idEnderecoEstoque
        0, -- p_item_idNumeroSerie
        p_item_localEstoque,
        p_item_pessoaParticipante,
        v_combo_controleQuantidade,
        v_combo_unidadeMedidaConversao,
        v_combo_conversorQuantidade,
        v_combo_loteMinimo,
        v_combo_loteMultiplo,
        v_combo_altura,
        v_combo_largura,
        v_combo_comprimento,
        v_combo_pecas,
        a.quantidade,
        v_combo_quantidadeConvertida,
        v_combo_pesoLiquido,
        v_combo_pesoBruto,
        v_combo_tipoPreco,
        v_combo_tabelaPreco,
        v_combo_precoSugestaoAPrazo,
        v_combo_precoSugestaoAVista,
        v_combo_precoDesconto,
        v_combo_precoMinimo,
        p_item_usarPrecoAVista,
        v_combo_precoUnitario, -- p_item_precoUnitarioBruto
        0, -- p_item_acrescimoUnitarioCompos
        v_combo_precoUnitario,
        p_item_percDescontoItem,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoItem
        p_item_percAcrescimoItem,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorFreteItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorFreteItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorSeguroItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorSeguroItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAdicFreteMarItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAdicFreteMarItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDespesasAduanItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDespesasAduanItem
        p_item_observacoesDigitadas,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(v_item_valorFreteGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- v_item_valorFreteGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorSeguroGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorSeguroGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorOutrasDespesasGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorOutrasDespesasGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAdicFreteMarGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAdicFreteMarGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDespesasAduanGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDespesasAduanGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoPagamento
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoPagamento
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorOutrasDespPagament
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorOutrasDespPagament
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorJurosPagamento
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorJurosPagamento
        v_combo_operacaoFiscal,
        p_item_movimentaEstoque,
        p_item_geraFinanceiro,
        0, -- p_item_cfop
        ' ', -- p_item_indicadorISSQN
        0, -- p_item_aliquotaISSQN
        0, -- p_item_retidoISSQN
        0, -- p_item_tributadoForaMunicipio
        0, -- p_item_incentivoFiscal
        0, -- p_item_listaServicos
        0, -- p_item_cnae
        0, -- p_item_idServicoMunicipio
        ' ', -- p_item_numeroProcessoAdministr
        0, -- p_item_retencaoIRRF
        0, -- p_item_retencaoINSS
        0, -- p_item_retencaoPIS
        0, -- p_item_retencaoCOFINS
        0, -- p_item_retencaoCSLL
        0, -- p_item_retencaoOutros
        0, -- p_item_aliquotaII
        0, -- p_item_aliquotaIOF
        0, -- p_item_codigoEnquadramentoIPI
        0, -- p_item_stIPI
        0, -- p_item_aliquotaIPI
        0, -- p_item_valorAliquotaIPI
        ' ', -- p_item_stPIS
        0, -- p_item_aliquotaPIS
        0, -- p_item_valorAliquotaPIS
        0, -- p_item_aliquotaPISST
        0, -- p_item_valorAliquotaPISST
        ' ', -- p_item_stCOFINS
        0, -- p_item_aliquotaCOFINS
        0, -- p_item_valorAliquotaCOFINS
        0, -- p_item_aliquotaCOFINSST
        0, -- p_item_valorAliquotaCOFINSST
        '   ', -- p_item_stSimplesNacional
        0, -- p_item_creditoSimplesNacional
        '  ', -- p_item_stICMS
        0, -- p_item_modalBaseCalcICMS
        0, -- p_item_reducaoBaseICMS
        0, -- p_item_aliquotaICMS
        0, -- p_item_diferimentoICMS
        ' ', -- p_item_motivoDesoneracaoICMS
        0, -- p_item_idBeneficio
        ' ', -- p_item_modalBaseCalcICMSST
        0, -- p_item_margemValorAdicionadoST
        0, -- p_item_reducaoBaseST
        0, -- p_item_aliquotaICMSST
        0, -- p_item_aliquotaSTSuportConsFin
        0, -- p_item_reducaoBaseICMSEfetivo
        0, -- p_item_aliquotaICMSEfetivo
        0, -- p_item_aliquotaICMSUFDestinat
        0, -- p_item_aliquotaICMSInterestad
        0, -- p_item_partilhaICMSInterestad
        0, -- p_item_aliquotaFCP
        0, -- p_item_aliquotaFCPST
        0, -- p_item_aliquotaFCPSTAnteriorm
        0, -- p_item_aliquotaFCPUFDestinat
        0, -- p_item_aliquotaEstImpFederais
        0, -- p_item_aliquotaEstImpEstaduais
        0, -- p_item_aliquotaEstImpMunicipai
        0, -- p_item_baseISSQN
        0, -- p_item_valorISSQN
        0, -- p_item_baseRetIRRF
        0, -- p_item_valorRetIRRF
        0, -- p_item_baseRetINSS
        0, -- p_item_valorRetINSS
        0, -- p_item_baseRetPIS
        0, -- p_item_valorRetPIS
        0, -- p_item_baseRetCOFINS
        0, -- p_item_valorRetCOFINS
        0, -- p_item_baseRetCSLL
        0, -- p_item_valorRetCSLL
        0, -- p_item_baseRetOutros
        0, -- p_item_valorRetOutros
        0, -- p_item_baseII
        0, -- p_item_valorII
        0, -- p_item_baseIOF
        0, -- p_item_valorIOF
        0, -- p_item_baseIPI
        0, -- p_item_valorIPI
        0, -- p_item_basePIS
        0, -- p_item_valorPIS
        0, -- p_item_basePISST
        0, -- p_item_valorPISST
        0, -- p_item_baseCOFINS
        0, -- p_item_valorCOFINS
        0, -- p_item_baseCOFINSST
        0, -- p_item_valorCOFINSST
        0, -- p_item_baseCreditoSimplesNac
        0, -- p_item_valorCreditoSimplesNac
        0, -- p_item_baseICMS
        0, -- p_item_valorICMSOperacao
        0, -- p_item_valorICMSDiferido
        0, -- p_item_valorICMS
        0, -- p_item_valorICMSDesoneracao
        0, -- p_item_baseICMSST
        0, -- p_item_valorICMSST
        0, -- p_item_baseICMSSTAnteriormente
        0, -- p_item_valorICMSSTAnteriorment
        0, -- p_item_valorICMSProprioSubstit
        0, -- p_item_baseICMSEfetivo
        0, -- p_item_valorICMSEfetivo
        0, -- p_item_baseICMSUFDestinatario
        0, -- p_item_valorICMSUFDestinatario
        0, -- p_item_baseICMSUFRemetente
        0, -- p_item_valorICMSUFRemetente
        0, -- p_item_baseFCP
        0, -- p_item_valorFCP
        0, -- p_item_baseFCPST
        0, -- p_item_valorFCPST
        0, -- p_item_baseFCPSTAnteriormente
        0, -- p_item_valorFCPSTAnteriormente
        0, -- p_item_baseFCPUFDestinatario
        0, -- p_item_valorFCPUFDestinatario
        0, -- p_item_baseEstimadaImpostos
        0, -- p_item_valorEstImpFederais
        0, -- p_item_valorEstImpEstaduais
        0, -- p_item_valorEstImpMunicipais
        p_nivel + 1, -- p_nivel,
        r_buffer_idItemOrcamento,
        r_mensagemAviso,
        r_calcularImpostos,
        v_auxNumber, -- idItemOrcamento
        r_buffer_idItemOrcamento,
        v_combo_valorTotal);
      r_valorInserido := r_valorInserido + v_combo_valorTotal;
    END LOOP;
    IF p_nivel = 0
    AND r_valorInserido > 0
    AND r_valorInserido <> v_item_valorProdutoServico
      - CASE
          WHEN v_modDoc_diminuiDescontoPrUnit = 1
          THEN p_item_valorDescontoItem
          ELSE 0
        END
      + CASE
          WHEN v_modDoc_somaAcrescimosPrUnit = 1
          THEN p_item_valorAcrescimoItem
          ELSE 0
        END
    THEN
      ADD_ORCAMENTO_ITEM_COMBO_RESID (
        p_item_orcamento,
        v_item_valorProdutoServico,
        p_item_valorDescontoItem,
        p_item_valorAcrescimoItem,
        v_modDoc_diminuiDescontoPrUnit,
        v_modDoc_somaAcrescimosPrUnit,
        r_buffer_idItemOrcamento,
        r_valorInserido);
      r_calcularImpostos := 1;
    END IF;
  ELSE
    IF r_item_idItemOrcamento <= 0 THEN
      r_item_idItemOrcamento := FUNC_ADD_BUSCA_PROXIMO_ID ('MOORCAMENTOXITENS', 'idItemOrcamento', 14, p_estabelecimentoAtivo, NULL);
    END IF;
    IF p_manterFinanceiro_Retotalizar = 0
      AND v_item_cancelado = 0
    THEN
      IF v_inserindoItem = 1
        AND (v_cab_valorFreteGeral <> 0
          OR v_cab_valorSeguroGeral <> 0
          OR v_cab_valorDescontoGeral <> 0
          OR v_cab_valorOutrasDespesasGeral <> 0
          OR v_cab_valorAdicFreteMarGeral <> 0
          OR v_cab_valorDespesasAduanGeral <> 0)
      THEN
        r_calcularImpostos := 1;
      END IF;
      IF (v_cab_valorDescontoGeral <> 0
          OR v_cab_valorOutrasDespesasGeral <> 0
          OR v_cab_valorPagamentoBruto <> 0
          OR v_cab_promocaoExiste = 1)
        AND (v_inserindoItem = 1
          OR p_item_gradeProduto <> v_ini_gradeProduto
          OR p_item_quantidade <> v_ini_quantidade
          OR v_item_valorBasePagamento <> v_ini_valorBasePagamento)
      THEN
        ADD_ORCAMENTO_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          p_item_orcamento,
          v_cab_valorDescontoGeral,
          v_cab_valorOutrasDespesasGeral,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_promocaoExiste,
          v_item_valorDescontoGeral,
          v_item_valorDescontoPagamento,
          v_item_valorOutrasDespPagament,
          v_item_valorJurosPagamento,
          r_calcularImpostos,
          v_cab_valorDescontoGeral,
          v_cab_condicaoPagamento,
          v_cab_numeroParcelas,
          v_cab_somaPrazoParcelas,
          v_cab_valorXPrazoParcelas,
          v_cab_prazoMedio,
          v_cab_prazoMedioPonderado,
          v_cab_valorEntradaMinima,
          v_cab_valorAVistaEntrada,
          v_cab_valorPagamentoBruto,
          v_cab_valorDescontoPagamento,
          v_cab_valorOutrasDespPagamento,
          v_cab_valorJurosPagamento,
          v_cab_valorPagamentoLiquido,
          v_cab_valorTroco,
          v_item_valorDescontoGeral,
          v_item_valorDescontoPagamento,
          v_item_valorOutrasDespPagament,
          v_item_valorJurosPagamento);
      END IF;
      IF p_item_controleEntrega > 0 THEN
        SELECT habilitaFrete
        INTO v_contrEntr_habilitaFrete
        FROM PACONTROLESENTREGA
        WHERE controleEntrega = p_item_controleEntrega;
      END IF;
      IF
        CASE
          WHEN v_ini_controleEntrega = 0
            OR v_ini_contrEntr_habilitaFrete = 0
          THEN 0
          ELSE v_ini_valorProdutoServicoBruto - v_ini_valorDescontoItem + v_ini_valorAcrescimoItem
        END <>
        CASE
          WHEN p_item_controleEntrega = 0
            OR v_contrEntr_habilitaFrete = 0
          THEN 0
          ELSE v_item_valorProdutoServicoBrut - p_item_valorDescontoItem + p_item_valorAcrescimoItem
        END
      THEN
        ADD_ORCAMENTO_CAB_BUSCA_FRETE (
          p_person_190_modeloFrete,
          0,
          r_calcularImpostos,
          p_item_orcamento,
          v_cab_estabelecimento,
          v_cab_pessoa,
          v_cab_enderecoEntregaPessoa,
          v_cab_modalidadeFrete,
          v_cab_transportadora,
          v_cab_enderecoTransportadora,
          v_ini_cab_valorFreteItem,
          v_cab_valorFreteItem,
          v_ini_cab_valorFreteGeral,
          v_ini_cab_valorFreteGeral,
          v_modDoc_somaFreteSeguroPrUnit,
          r_item_idItemOrcamento,
          p_item_pesoLiquido,
          p_item_pesoBruto,
          v_item_valorProdutoServicoBrut,
          p_item_valorDescontoItem,
          p_item_valorAcrescimoItem,
          p_item_controleEntrega,
          v_item_valorFreteGeral,
          v_contrEntr_habilitaFrete,
          r_mensagemAviso,
          r_calcularImpostos,
          v_cab_modalidadeFrete,
          v_cab_transportadora,
          v_cab_enderecoTransportadora,
          v_valorFreteRegra,
          v_auxNumber);
        IF v_valorFreteRegra <> v_ini_cab_valorFreteGeral THEN
          v_cab_valorFreteGeral := v_valorFreteRegra;
          v_item_valorFreteGeral := 0;
        END IF;
      ELSIF NOT (p_person_190_modeloFrete IS NULL)
        AND p_person_190_modeloFrete <> ' '
        AND v_modDoc_somaFreteSeguroPrUnit = 0
      THEN
        v_cab_modalidadeFrete := FUNC_ADD_BUSCA_MODALIDADE_FRET (
          p_person_190_modeloFrete,
          v_cab_modalidadeFrete,
          v_ini_cab_valorFreteItem,
          v_cab_valorFreteItem,
          v_ini_cab_valorFreteGeral,
          v_cab_valorFreteGeral,
          v_modDoc_somaFreteSeguroPrUnit);
      END IF;
      ADD_CALCULA_TOTAIS_ITEM (
        v_cab_tipoPagamentoFrete,
        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,
        v_item_valorFreteGeral,
        p_item_valorSeguroGeral,
        v_item_valorDescontoGeral,
        p_item_valorOutrasDespesasGer,
        p_item_valorAdicFreteMarGeral,
        p_item_valorDespesasAduanGeral,
        v_item_valorDescontoPagamento,
        v_item_valorOutrasDespPagament,
        v_item_valorJurosPagamento,
        v_modDoc_diminuiDescontoPrUnit,
        v_modDoc_somaAcrescimosPrUnit,
        v_modDoc_somaFreteSeguroPrUnit,
        v_prod_composicaoPreco,
        v_item_precoUnitario,
        v_item_precoUnitarioConvertido,
        v_item_valorProdutoServico,
        v_item_valorFreteTotal,
        v_item_valorSeguroTotal,
        v_item_valorDescontoTotal,
        v_item_valorOutrasDespesasTot,
        v_item_valorAdicFreteMarTotal,
        v_item_valorDespesasAduanTotal);
    END IF;
    IF p_buscarAliquotas_CalcularImp = 'S'
      OR p_buscarAliquotas_CalcularImp ='T'
      AND (v_inserindoItem = 1
        OR v_ini_gradeProduto <> p_item_gradeProduto
        OR v_ini_operacaoFiscal <> p_item_operacaoFiscal)
    THEN
      ADD_ITEM_OPERACAO_FISCAL_BUSCA (
        p_buscarGeraFinanceiroEstoque,
        v_cab_origemDocumento,
        v_cab_tipoDocumento,
        v_cab_entradaSaida,
        0, -- p_cab_devolucaoAnulacaoRetorno
        v_cab_finalidadeNota,
        v_cab_estabelecimento,
        0, -- p_cab_nfFornecedor
        SYSDATE, -- p_cab_dataEmissao
        v_cab_pessoa,
        0, -- p_cab_vendaConsumidor
        v_cab_enderecoEntregaPessoa,
        v_cab_municipioFatoGerador,
        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,
        p_item_movimentaEstoque,
        0, -- p_movimentaEstoqueFiscal
        p_item_geraFinanceiro,
        0, -- p_item_cfop
        1, -- p_atualizarISSQN
        ' ', -- p_item_indicadorISSQN
        0, -- p_item_aliquotaISSQN
        0, -- p_item_retidoISSQN
        0, -- p_item_tributadoForaMunicipio
        0, -- p_item_incentivoFiscal
        0, -- p_item_listaServicos
        0, -- p_item_cnae
        0, -- p_item_idServicoMunicipio
        ' ', -- p_item_numeroProcessoAdministr
        1, -- p_atualizarRetIRRF
        0, -- p_item_retencaoIRRF
        1, -- p_atualizarRetINSS
        0, -- p_item_retencaoINSS
        1, -- p_atualizarRetencaoPIS
        0, -- p_item_retencaoPIS
        1, -- p_atualizarRetencaoCOFINS
        0, -- p_item_retencaoCOFINS
        1, -- p_atualizarRetencaoCSLL
        0, -- p_item_retencaoCSLL
        1, -- p_atualizarRetencaoOutros
        0, -- p_item_retencaoOutros
        1, -- p_atualizarII
        0, -- p_item_aliquotaII
        1, -- p_atualizarIOF
        0, -- p_item_aliquotaIOF
        1, -- p_atualizarIPI
        0, -- p_item_codigoEnquadramentoIPI
        '  ', -- p_item_stIPI
        0, -- p_item_aliquotaIPI
        0, -- p_item_valorAliquotaIPI
        1, -- p_atualizarPIS
        '  ', -- p_item_stPIS
        0, -- p_item_aliquotaPIS
        0, -- p_item_valorAliquotaPIS
        1, -- p_atualizarPISST
        0, -- p_item_aliquotaPISST
        0, -- p_item_valorAliquotaPISST
        1, -- p_atualizarCOFINS
        '  ', -- p_item_stCOFINS
        0, -- p_item_aliquotaCOFINS
        0, -- p_item_valorAliquotaCOFINS
        1, -- p_atualizarCOFINSST
        0, -- p_item_aliquotaCOFINSST
        0, -- p_item_valorAliquotaCOFINSST
        1, -- p_atualizarSimplesNacional
        '   ', -- p_item_stSimplesNacional
        0, -- p_item_creditoSimplesNacional
        1, -- p_atualizarICMS
        '  ', -- p_item_stICMS
        ' ', -- p_item_modalidadeBaseCalcICMS
        0, -- p_item_reducaoBaseICMS
        0, -- p_item_aliquotaICMS
        0, -- p_item_diferimentoICMS
        '  ', -- p_item_motivoDesoneracaoICMS
        0, -- p_item_idBeneficio
        1, -- p_atualizarICMSST
        ' ', -- p_item_modalBaseCalcICMSST
        0, -- p_item_margemValorAdicST
        0, -- p_item_reducaoBaseST
        0, -- p_item_aliquotaICMSST
        1, -- p_atualizarICMSSTAnteriorEfet
        0, -- p_item_aliquotaSTSuportConsF
        0, -- p_item_reducaoBaseICMSEfetivo
        0, -- p_item_aliquotaICMSEfetivo
        0, -- p_atualizarICMSEscrituracao
        '  ', -- p_item_stICMSEscrit
        0, -- p_item_reducaoBaseICMSEscrit
        0, -- p_item_aliquotaICMSEscrit
        0, -- p_item_diferimentoICMSEscritur
        0, -- p_atualizarICMSSTEscrituracao
        0, -- p_item_margemValorAdicSTEscrit
        0, -- p_item_reducaoBaseSTEscrit
        0, -- p_item_aliquotaICMSSTEscrit
        0, -- p_item_somarICMSST
        1, -- p_atualizarDIFAL
        0, -- p_item_aliquotaICMSUFDestinat
        0, -- p_item_aliquotaICMSInterestad
        0, -- p_item_partilhaICMSInterestad
        1, -- p_atualizarFCP
        0, -- p_item_aliquotaFCP
        0, -- p_item_aliquotaFCPST
        0, -- p_item_aliquotaFCPSTAnteriorm
        0, -- p_item_aliquotaFCPUFDestinat
        1, -- p_atualizarImpostosEstimados
        0, -- p_item_aliquotaEstImpFederais
        0, -- p_item_aliquotaEstImpEstaduais
        0, -- p_item_aliquotaEstImpMunicipai
        v_auxNumber, -- r_encontrouRegistro
        v_item_movimentaEstoque,
        v_auxNumber, -- r_movimentaEstoqueFiscal
        v_item_geraFinanceiro,
        v_item_cfop,
        v_item_indicadorISSQN,
        v_item_aliquotaISSQN,
        v_item_retidoISSQN,
        v_item_tributadoForaMunicipio,
        v_item_incentivoFiscal,
        v_item_listaServicos,
        v_item_cnae,
        v_item_idServicoMunicipio,
        v_item_numeroProcessoAdministr,
        v_item_retencaoIRRF,
        v_item_retencaoINSS,
        v_item_retencaoPIS,
        v_item_retencaoCOFINS,
        v_item_retencaoCSLL,
        v_item_retencaoOutros,
        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_item_idBeneficio,
        v_item_modalBaseCalcICMSST,
        v_item_margemValorAdicionadoST,
        v_item_reducaoBaseST,
        v_item_aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin,
        v_item_reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo,
        v_auxVarchar, -- r_item_stICMSEscrit
        v_auxNumber, -- r_item_reducaoBaseICMSEscrit
        v_auxNumber, -- r_item_aliquotaICMSEscrit
        v_auxNumber, -- r_item_diferimentoICMSEscritur
        v_auxNumber, -- r_item_margemValorAdicSTEscrit
        v_auxNumber, -- r_item_reducaoBaseSTEscrit
        v_auxNumber, -- r_item_aliquotaICMSSTEscrit
        v_auxNumber, -- r_item_somarICMSST
        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);      
    END IF;
    IF p_buscarAliquotas_CalcularImp IN ('I','S')
      OR p_buscarAliquotas_CalcularImp ='T'
      AND (v_inserindoItem = 1
        OR v_ini_gradeProduto <> p_item_gradeProduto
        OR v_ini_personalizacao <> p_item_personalizacao
        OR v_ini_operacaoFiscal <> p_item_operacaoFiscal
        OR v_ini_operacaoFiscal <> p_item_operacaoFiscal
        OR v_ini_quantidade <> p_item_quantidade
        OR v_ini_valorProdutoServicoBruto <> v_item_valorProdutoServicoBrut
        OR v_ini_valorProdutoServico <> v_item_valorProdutoServico
        OR v_ini_valorDescontoItem <> p_item_valorDescontoItem
        OR v_ini_valorAcrescimoItem <> p_item_valorAcrescimoItem
        OR v_cab_tipoPagamentoFrete <> 'V'
        AND (v_ini_valorFreteTotal <> v_item_valorFreteTotal
          OR v_ini_valorSeguroTotal <> v_item_valorSeguroTotal)
        OR v_ini_valorDescontoTotal <> v_item_valorDescontoTotal
        OR v_ini_valorOutrasDespesasTotal <> v_item_valorOutrasDespesasTot
        OR v_ini_valorAdicFreteMarTotal <> v_item_valorAdicFreteMarTotal
        OR v_ini_valorDespesasAduanTotal <> v_item_valorDespesasAduanTotal)
    THEN
      ADD_CALCULA_IMPOSTOS_ITEM (
        p_config_64_casasDecSaidas,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        v_cab_entradaSaida,
        0, -- p_cab_devolucaoAnulacaoRetorno
        v_cab_estabelecimento,
        0, -- p_cab_nfFornecedor
        v_cab_dataEmissao, -- p_cab_dataEntradaSaida
        v_cab_pessoa,
        v_cab_localDestinoOperacao,
        v_cab_indicadorConsumidorFinal,
        v_cab_tipoPagamentoFrete,
        v_pess_indicadorInscricaoEstad,
        p_item_personalizacao,
        p_item_quantidade,
        v_item_valorProdutoServico,
        v_item_valorFreteTotal,
        v_item_valorSeguroTotal,
        v_item_valorDescontoTotal,
        v_item_valorOutrasDespesasTot,
        v_item_valorAdicFreteMarTotal,
        v_item_valorDespesasAduanTotal,
        v_item_cfop,
        1, -- p_calcularISSQN
        v_item_indicadorISSQN,
        v_item_aliquotaISSQN,
        0, -- p_baseISSQN
        0, -- p_valorISSQN
        1, -- p_calcularIRRF
        v_item_retencaoIRRF,
        0, -- p_baseRetIRRF
        0, -- p_valorRetIRRF
        1, -- p_calcularINSS
        v_item_retencaoINSS,
        0, -- p_baseRetINSS
        0, -- p_valorRetINSS
        1, -- p_calcularRetencaoPIS
        v_item_retencaoPIS,
        0, -- p_baseRetPIS
        0, -- p_valorRetPIS
        1, -- p_calcularRetencaoCOFINS
        v_item_retencaoCOFINS,
        0, -- p_baseRetCOFINS
        0, -- p_valorRetCOFINS
        1, -- p_calcularRetencaoCSLL
        v_item_retencaoCSLL,
        0, -- p_baseRetCSLL
        0, -- p_valorRetCSLL
        1, -- p_calcularRetencaoOutros
        v_item_retencaoOutros,
        0, -- p_baseRetOutros
        0, -- p_valorRetOutros
        1, -- p_calcularII
        v_item_aliquotaII,
        0, -- p_baseII
        0, -- p_valorII
        1, -- p_calcularIOF
        v_item_aliquotaIOF,
        0, -- p_baseIOF
        0, -- p_valorIOF
        1, -- p_calcularIPI
        v_item_aliquotaIPI,
        v_item_valorAliquotaIPI,
        0, -- p_baseIPI
        0, -- p_valorIPI
        0, -- p_valorIPIDevolucao
        1, -- p_calcularPIS
        v_item_aliquotaPIS,
        v_item_valorAliquotaPIS,
        0, -- p_basePIS
        0, -- p_valorPIS
        1, -- p_calcularPISST
        v_item_aliquotaPISST,
        v_item_valorAliquotaPISST,
        0, -- p_basePISST
        0, -- p_valorPISST
        1, -- p_calcularCOFINS
        v_item_aliquotaCOFINS,
        v_item_valorAliquotaCOFINS,
        0, -- p_valorAliquotaCOFINS
        0, -- p_baseCOFINS
        1, -- p_valorCOFINS
        v_item_aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST,
        0, -- p_baseCOFINSST
        0, -- p_valorCOFINSST
        1, -- p_calcularSimplesNacional
        v_item_stSimplesNacional,
        v_item_creditoSimplesNacional,
        0, -- p_baseCreditoSimplesNacional
        0, -- p_valorCreditoSimplesNacional
        1, -- p_calcularICMS
        v_item_stICMS,
        v_item_modalBaseCalcICMS,
        v_item_reducaoBaseICMS,
        v_item_aliquotaICMS,
        v_item_diferimentoICMS,
        0, -- p_baseICMS
        0, -- p_valorICMSOperacao
        0, -- p_valorICMSDiferido
        0, -- p_valorICMS
        0, -- p_valorICMSDesoneracao
        1, -- p_calcularICMSST
        v_item_modalBaseCalcICMSST,
        v_item_margemValorAdicionadoST,
        v_item_reducaoBaseST,
        v_item_aliquotaICMSST,
        0, -- p_baseICMSST
        0, -- p_valorICMSST
        1, -- p_calcularICMSSTAnterEfetivo
        0, -- p_baseICMSSTAnteriormente
        0, -- p_valorICMSSTAnteriormente
        0, -- p_valorICMSProprioSubstituto
        v_item_reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo,
        0, -- p_baseICMSEfetivo
        0, -- p_valorICMSEfetivo
        0, -- p_calcularICMSEscrituracao
        '  ', -- p_stICMSEscrituracao
        0, -- p_reducaoBaseICMSEscrituracao
        0, -- p_aliquotaICMSEscrituracao
        0, -- p_item_diferimentoICMSEscritur
        0, -- p_baseICMSEscrituracao
        0, -- p_valorICMSEscrituracao
        0, -- p_valorICMSDesonEscrituracao
        0, -- p_calcularICMSSTEscrituracao
        0, -- p_margemValorAdicSTEscriturac
        0, -- p_reducaoBaseSTEscrituracao
        0, -- p_aliquotaICMSSTEscrituracao
        0, -- p_baseICMSSTEscrituracao
        0, -- p_valorICMSSTEscrituracao
        1, -- p_calcularDIFAL
        v_item_aliquotaICMSUFDestinat,
        v_item_aliquotaICMSInterestad,
        v_item_partilhaICMSInterestad,
        0, -- p_baseICMSUFDestinatario
        0, -- p_valorICMSUFDestinatario
        0, -- p_baseICMSUFRemetente
        0, -- p_valorICMSUFRemetente
        1, -- p_calcularFCP
        v_item_aliquotaFCP,
        0, -- p_baseFCP
        0, -- p_valorFCP
        v_item_aliquotaFCPST,
        0, -- p_baseFCPST
        0, -- p_valorFCPST
        v_item_aliquotaFCPSTAnteriorm,
        0, -- p_baseFCPSTAnteriormente
        0, -- p_valorFCPSTAnteriormente
        v_item_aliquotaFCPUFDestinat,
        0, -- p_baseFCPUFDestinatario
        0, -- p_valorFCPUFDestinatario
        1, -- p_calcularImpostosEstimados
        v_item_aliquotaEstImpFederais,
        v_item_aliquotaEstImpEstaduais,
        v_item_aliquotaEstImpMunicipai,
        0, -- p_baseEstimadaImpostos
        0, -- p_valorEstimadoImpFederais
        0, -- p_valorEstimadoImpEstaduais
        0, -- p_valorEstimadoImpMunicipais
        v_gradProd_produto,
        v_gradProd_cor,
        v_gradProd_tamanho,
        v_prod_controleEstoque,
        v_prod_tipoProduto,
        v_prod_precoPautaTabelado,
        v_item_baseISSQN,
        v_item_valorISSQN,
        v_item_baseRetIRRF,
        v_item_valorRetIRRF,
        v_item_baseRetINSS,
        v_item_valorRetINSS,
        v_item_baseRetPIS,
        v_item_valorRetPIS,
        v_item_baseRetCOFINS,
        v_item_valorRetCOFINS,
        v_item_baseRetCSLL,
        v_item_valorRetCSLL,
        v_item_baseRetOutros,
        v_item_valorRetOutros,
        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_valorICMSSTAnteriorment,
        v_item_valorICMSSTAnteriorment,
        v_item_valorICMSProprioSubstit,
        v_item_baseICMSEfetivo,
        v_item_valorICMSEfetivo,
        v_auxNumber, -- r_baseICMSEscrituracao
        v_auxNumber, -- r_valorICMSEscrituracao
        v_auxNumber, -- r_valorICMSDesonEscrituracao
        v_auxNumber, -- r_baseICMSSTEscrituracao
        v_auxNumber, -- r_valorICMSSTEscrituracao
        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);
    END IF;
    v_item_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
      v_cab_origemDocumento,
      0, -- p_cab_nfFornecedor,
      v_cab_tipoPagamentoFrete,
      v_item_geraFinanceiro,
      v_item_valorProdutoServico,
      v_item_valorDescontoPagamento,
      v_item_valorOutrasDespPagament,
      v_item_valorJurosPagamento,
      v_item_valorFreteTotal,
      v_item_valorSeguroTotal,
      v_item_valorDescontoTotal,
      v_item_valorOutrasDespesasTot,
      0, -- p_item_valorIPIDevolucao
      v_item_retidoISSQN,
      v_item_valorISSQN,
      v_item_valorRetIRRF,
      v_item_valorRetINSS,
      v_item_valorRetPIS,
      v_item_valorRetCOFINS,
      v_item_valorRetCSLL,
      v_item_valorRetOutros,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      v_item_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0, -- p_item_somarICMSST
      0, -- p_item_valorAcrescExtempTotal
      v_modDoc_geraFinanceiro);
    v_item_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
      0, -- p_cab_nfFornecedor,
      v_cab_tipoPagamentoFrete,
      v_item_valorProdutoServico,
      v_item_valorFreteTotal,
      v_item_valorSeguroTotal,
      v_item_valorDescontoTotal,
      v_item_valorOutrasDespesasTot,
      0, -- p_item_valorIPIDevolucao
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      v_item_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0 -- p_item_somarICMSST
      );
    IF v_inserindoItem = 1 THEN
