SET DEFINE OFF;

create or replace FUNCTION FUNC_ADD_GERA_XML_ENVIO (
  p_idDocumentoFiscal      IN NUMBER,
  p_seqLoteWebServiceEnvio IN NUMBER,
  p_loteWebService         IN VARCHAR)
  RETURN CLOB
/*  
  Todas as alterações realizadas estão comentadas como CK
  1º Efetuada alteração na exigilidadeISSqn que estava fixa como 3 e foi aplicado para utlizar o IndicadorISSqn do item da nota fiscal
*/  
IS
  v_xml                         CLOB;
  v_tecnologiaNFSe              NUMBER;
  v_versaoNFSe                  VARCHAR(20);
  v_estab_nomeRazaoSocial       VARCHAR(60);
  v_estab_indicadorPessoa       CHAR(1);
  v_estab_cnpjCpfIdEstrangeiro  VARCHAR(20);
  v_estab_inscricaoMunicipal    VARCHAR(15);
  v_estab_municipio             NUMBER;
  v_estab_pais                  VARCHAR(4);
  v_estab_uf                    CHAR(2);
  v_regimeEspecialTributacao    CHAR (1);
  v_indicadorIssqn              CHAR (1);
  v_optanteSimplesNacional      NUMBER;
  v_incentivadorCultural        NUMBER;
  v_incentivoFiscal             NUMBER;
  v_intermediario               NUMBER;
  v_pess_nomeRazaoSocial        VARCHAR(60);
  v_pess_apelidoFantasia        VARCHAR(60);
  v_pess_indicadorPessoa        CHAR(1);
  v_pess_cnpjCpfIdEstrangeiro   VARCHAR(20);
  v_pess_inscricaoEstadual      VARCHAR(14);
  v_pess_inscricaoMunicipal     VARCHAR(15);
  v_pess_logradouro             VARCHAR(60);
  v_pess_numero                 VARCHAR(60);
  v_pess_complemento            VARCHAR(60);
  v_pess_bairroDistrito         VARCHAR(60);
  v_pess_municipio              NUMBER;
  v_pess_cep                    NUMBER;
  v_pess_pais                   VARCHAR(4);
  v_pess_uf                     CHAR(2);
  v_pess_observacoesEndereco    VARCHAR(4000);
  v_pess_fone                   VARCHAR(14);
  v_pess_email                  VARCHAR(60);
  v_interm_nomeRazaoSocial      VARCHAR(60);
  v_interm_indicadorPessoa      CHAR(1);
  v_interm_cnpjCpfIdEstrangeiro VARCHAR(20);
  v_interm_inscricaoMunicipal   VARCHAR(15);
  v_municipioFatoGerador        NUMBER;
  v_documentoFiscal             VARCHAR(15);
  v_serieFiscal                 VARCHAR(4);
  v_dataEmissao                 DATE;
  v_dataCompetencia             DATE;
  v_baseCalculoCrs              NUMBER;
  v_valorServicos               NUMBER;
  v_valorDeducoes               NUMBER;
  v_valorPis                    NUMBER;
  v_valorCofins                 NUMBER;
  v_valorInss                   NUMBER;
  v_valorIrrf                   NUMBER;
  v_valorCsll                   NUMBER;
  v_valorOutrasRetencoes        NUMBER;
  v_valorIssqn                  NUMBER;
  v_aliquotaIssqn               NUMBER;
  v_percentualCargaTributariaFe NUMBER;
  v_valorCargaTributariaFederal NUMBER;
  v_percentualCargaTributariaEs NUMBER;
  v_valorCargaTributariaEstad   NUMBER;
  v_percentualCargaTributariaMu NUMBER;
  v_valorCargaTributariaMunicip NUMBER;
  v_valorDescontoTotal          NUMBER;
  v_valorDescontoCondicionado   NUMBER;
  v_irrfIndenizacao             NUMBER;
  v_issRetido                   NUMBER;
  v_tributadoForaMunicipio      NUMBER;
  v_responsavelRetencao         NUMBER;
  v_listaServicos               NUMBER;
  v_cnae                        NUMBER;
  v_produtoImpresso             VARCHAR(60);
  v_quantidade                  NUMBER;
  v_precoUnitario               NUMBER;
  v_codigoTributacaoMunicipio   VARCHAR(60);
  v_discriminacao               VARCHAR(4000);
  v_numeroProcesso              VARCHAR(60);
  v_codigoObra                  VARCHAR(60);
  v_art                         VARCHAR(60);
  v_outrasInformacoes           VARCHAR(4000);
  v_formaPagamento              NUMBER;
  v_numeroParcelas              NUMBER;

BEGIN
  -- NÃO DESENVOLVIDO
  v_baseCalculoCrs              := 0;
  v_valorDeducoes               := 0;
  v_valorDescontoCondicionado   := 0;
  v_irrfIndenizacao             := 0;
  v_responsavelRetencao         := 0;
  v_formaPagamento              := 0;
  v_numeroParcelas              := 0;

  -- DOCUMENTO
  SELECT
    CASE
      WHEN munEst.versaoNFSe = '1.00'
      THEN TO_CHAR (a.dataEmissao, 'YYYY') || LPAD (a.documentoFiscal, 11, '0')
      ELSE TO_CHAR (a.documentoFiscal)
    END,
    a.serieFiscal,
    a.dataEmissao,
    a.municipioFatoGerador,
    a.valorServicos,
    a.valorDescontoTotal,
    COALESCE (SUBSTR( TRIM(
      COALESCE ((SELECT LISTAGG(UPPER(infCompl.descInformacaoComplementar), ' ')
        WITHIN GROUP (ORDER BY infCompl.sequencia)
        FROM MODOCFISCALXINFOCOMPLEMEN infCompl
        WHERE infCompl.idDocumentoFiscal = a.idDocumentoFiscal
        AND infCompl.geradoPeloSistema = 1
        AND infCompl.descInformacaoComplementar <> ' '),
        ' ')),1,4000),' '),
    COALESCE (docXServ.dataCompetencia, a.dataEmissao),
    FUNC_ADD_REMOVE_CARACT_ESPEC (obra.codigoObra),
    FUNC_ADD_REMOVE_CARACT_ESPEC (obra.art),
    FUNC_ADD_REMOVE_CARACT_ESPEC (pessEst.nomeRazaoSocial),
    pessEst.indicadorPessoa,
    CASE
      WHEN pessEst.cnpjCpfIdEstrangeiro <> ' '
      THEN pessEst.cnpjCpfIdEstrangeiro
      WHEN pessEst.indicadorPessoa = 'J'
      THEN '00000000000000'
      ELSE '00000000000'
    END,
    FUNC_ADD_REMOVE_CARACT_ESPEC (pessEst.inscricaoMunicipal),
    CASE WHEN pessEst.regimeTributario IN ('1', '2') THEN 1 ELSE 2 END,
    endEst.municipio,
    endEst.pais,
    munEst.uf,
    munEst.tecnologiaNFSe,
    munEst.versaoNFSe,
    COALESCE (estXnfse.regimeEspecialTributacao, ' '),
    CASE WHEN estXnfse.incentivadorCultural = 1 THEN 1 ELSE 2 END,
    COALESCE (docXServ.intermediario, 0),
    CASE WHEN a.pessoa = 0 THEN ' ' ELSE FUNC_ADD_REMOVE_CARACT_ESPEC (pess.nomeRazaoSocial) END,
    CASE WHEN a.pessoa = 0 THEN ' ' ELSE FUNC_ADD_REMOVE_CARACT_ESPEC (pess.apelidoFantasia) END,
    pess.indicadorPessoa,
    CASE
      WHEN pess.cnpjCpfIdEstrangeiro <> ' '
      THEN pess.cnpjCpfIdEstrangeiro
      WHEN pess.indicadorPessoa = 'J'
      THEN '00000000000000'
      ELSE '00000000000'
    END,
    FUNC_ADD_REMOVE_CARACT_ESPEC (pess.inscricaoEstadual),
    FUNC_ADD_REMOVE_CARACT_ESPEC (pess.inscricaoMunicipal),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endPess.logradouro),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endPess.numero),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endPess.complemento),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endPess.bairroDistrito),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endPess.municipio),
    endPess.cep,
    endPess.pais,
    munPess.uf,
    FUNC_ADD_REMOVE_CARACT_ESPEC (endPess.observacoes),
    fonPess.fone,
    emailPess.email,
    CASE WHEN COALESCE (docXServ.intermediario, 0) = 0 THEN ' ' ELSE FUNC_ADD_REMOVE_CARACT_ESPEC (interm.nomeRazaoSocial) END,
    interm.indicadorPessoa,
    CASE
      WHEN interm.cnpjCpfIdEstrangeiro <> ' '
      THEN interm.cnpjCpfIdEstrangeiro
      WHEN interm.indicadorPessoa = 'J'
      THEN '00000000000000'
      ELSE '00000000000'
    END,
    FUNC_ADD_REMOVE_CARACT_ESPEC (interm.inscricaoMunicipal)
  INTO
    v_documentoFiscal,
    v_serieFiscal,
    v_dataEmissao,
    v_municipioFatoGerador,
    v_valorServicos,
    v_valorDescontoTotal,
    v_outrasInformacoes,
    v_dataCompetencia,
    v_codigoObra,
    v_art,
    v_estab_nomeRazaoSocial,
    v_estab_indicadorPessoa,
    v_estab_cnpjCpfIdEstrangeiro,
    v_estab_inscricaoMunicipal,
    v_optanteSimplesNacional,
    v_estab_municipio,
    v_estab_pais,
    v_estab_uf,
    v_tecnologiaNFSe,
    v_versaoNFSe,
    v_regimeEspecialTributacao,
    v_incentivadorCultural,
    v_intermediario,
    v_pess_nomeRazaoSocial,
    v_pess_apelidoFantasia,
    v_pess_indicadorPessoa,
    v_pess_cnpjCpfIdEstrangeiro,
    v_pess_inscricaoEstadual,
    v_pess_inscricaoMunicipal,
    v_pess_logradouro,
    v_pess_numero,
    v_pess_complemento,
    v_pess_bairroDistrito,
    v_pess_municipio,
    v_pess_cep,
    v_pess_pais,
    v_pess_uf,
    v_pess_observacoesEndereco,
    v_pess_fone,
    v_pess_email,
    v_interm_nomeRazaoSocial,
    v_interm_indicadorPessoa,
    v_interm_cnpjCpfIdEstrangeiro,
    v_interm_inscricaoMunicipal
  FROM MODOCUMENTOSFISCAIS a
  LEFT JOIN MODOCFISCALXSERVICO docXServ
  ON docXServ.idDocumentoFiscal = a.idDocumentoFiscal
  JOIN PAOBRAS obra
  ON obra.idObra = COALESCE (docXServ.idObra, 0)
  JOIN PAESTABELECIMENTOS est
  ON est.estabelecimento = a.estabelecimento
  LEFT JOIN PAESTABELECIMENTOXNFSE estXnfse
  ON estXnfse.estabelecimento = a.estabelecimento
  JOIN CAPESSOAS pessEst
  ON pessEst.pessoa = est.pessoaEstabelecimento
  JOIN CAENDERECOSPESSOA endEst
  ON endEst.enderecoPessoa = COALESCE ((
    SELECT MAX (end.enderecoPessoa)
    FROM CAENDERECOSPESSOA end
    WHERE end.pessoa = est.pessoaEstabelecimento
    AND end.ativo = 1
    AND end.principal = 1), 0)
  JOIN SIMUNICIPIOS munEst
  ON munEst.municipio = endEst.municipio
  JOIN CAPESSOAS pess
  ON pess.pessoa = a.pessoa
  JOIN CAENDERECOSPESSOA endPess
  ON endPess.enderecoPessoa = COALESCE ((
    SELECT MAX (end.enderecoPessoa)
    FROM CAENDERECOSPESSOA end
    WHERE end.pessoa = a.pessoa
    AND end.ativo = 1
    AND end.principal = 1), 0)
  JOIN SIMUNICIPIOS munPess
  ON munPess.municipio = endPess.municipio
  JOIN CAFONESPESSOA fonPess
  ON fonPess.idFonePessoa = COALESCE ((
    SELECT MAX (fon.idFonePessoa)
    FROM CAFONESPESSOA fon
    WHERE fon.pessoa = a.pessoa
    AND fon.ativo = 1
    AND fon.principal = 1), 0)
  JOIN CAEMAILSPESSOA emailPess
  ON emailPess.idEmailPessoa = COALESCE ((
    SELECT MAX (email.idEmailPessoa)
    FROM CAEMAILSPESSOA email
    WHERE email.pessoa = a.pessoa
    AND email.ativo = 1
    AND email.principal = 1), 0)
  JOIN CAPESSOAS interm
  ON interm.pessoa = COALESCE (docXServ.intermediario, 0)
  WHERE a.idDocumentoFiscal = p_idDocumentoFiscal;

  -- ITENS
  SELECT
    COALESCE (MAX (gradProd.produtoImpresso), ' '),
    COALESCE (SUM (a.quantidade), 0),
    COALESCE (MAX (a.precoUnitario), 0),
    COALESCE (MAX (a.indicadorIssqn), ' '),
    COALESCE (SUM (a.valorIssqn), 0),
    COALESCE (MAX (a.aliquotaIssqn), 0),
    CASE WHEN COALESCE (MAX (a.retidoIssqn), 0) = 1 THEN 1 ELSE 2 END,
    CASE WHEN COALESCE (MAX (a.tributadoForaMunicipio), 0) = 1 THEN 1 ELSE 2 END,
    CASE WHEN COALESCE (MAX (a.incentivoFiscal), 0) = 1 THEN 1 ELSE 2 END,
    COALESCE (MAX (a.listaServicos), 0),
    COALESCE (MAX (a.cnae), 0),
    COALESCE (MAX (servMun.codigoServicoMunicipio), ' '),
    COALESCE (MAX (a.numeroProcessoAdministrativo), ' '),
    COALESCE (SUM (a.valorRetInss), 0),
    COALESCE (SUM (a.valorRetIrrf), 0),
    COALESCE (SUM (a.valorRetPis), 0),
    COALESCE (SUM (a.valorRetCofins), 0),
    COALESCE (SUM (a.valorRetCsll), 0),
    COALESCE (SUM (a.valorRetOutros), 0),
    COALESCE (MAX (a.aliquotaEstimadaImpFederais), 0),
    COALESCE (SUM (a.valorEstimadoImpFederais), 0),
    COALESCE (MAX (a.aliquotaEstimadaImpEstaduais), 0),
    COALESCE (SUM (a.valorEstimadoImpEstaduais), 0),
    COALESCE (MAX (a.aliquotaEstimadaImpMunicipais), 0),
    COALESCE (SUM (a.valorEstimadoImpMunicipais), 0),
    FUNC_ADD_REMOVE_CARACT_ESPEC (COALESCE (MAX (
      CASE
        WHEN a.quantidadeConvertida = 1
          OR v_tecnologiaNFSe = 2
        THEN ''
        ELSE TO_CHAR(a.quantidadeConvertida)
          || ' '
          || a.unidadeMedidaConversao
          || ' X '
      END
      || TRIM (TRIM (gradProd.descricaoImpressa
      || ' '
      || a.observacoes)
      || CASE
           WHEN v_versaoNFSe = '1.00'
           THEN ' |||| Trib. Aprox.: R$ ' || TO_CHAR (a.valorEstimadoImpFederais, 'FM9999999999990D00') || ' Federal e R$ ' || TO_CHAR (a.valorEstimadoImpMunicipais, 'FM9999999999990D00') || ' Municipal'
           ELSE ''
         END)), ' '))
  INTO
    v_produtoImpresso,
    v_quantidade,
    v_precoUnitario,
    v_indicadorIssqn,
    v_valorIssqn,
    v_aliquotaIssqn,
    v_issRetido,
    v_tributadoForaMunicipio,
    v_incentivoFiscal,
    v_listaServicos,
    v_cnae,
    v_codigoTributacaoMunicipio,
    v_numeroProcesso,
    v_valorInss,
    v_valorIrrf,
    v_valorPis,
    v_valorCofins,
    v_valorCsll,
    v_valorOutrasRetencoes,
    v_percentualCargaTributariaFe,
    v_valorCargaTributariaFederal,
    v_percentualCargaTributariaEs,
    v_valorCargaTributariaEstad,
    v_percentualCargaTributariaMu,
    v_valorCargaTributariaMunicip,
    v_discriminacao
  FROM MODOCFISCALXITENS a
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = a.gradeProduto
  JOIN CAPRODUTOS prod
  ON prod.produto = gradProd.produto
  JOIN PASERVICOSMUNICIPIOS servMun
  ON servMun.idServicoMunicipio = a.idServicoMunicipio
  WHERE a.idDocumentoFiscal = p_idDocumentoFiscal
  AND a.cancelado = 0;

  IF v_tecnologiaNFSe = 2 THEN
    -- NFS-e
    v_xml := '<nfse id="rps_' || v_documentoFiscal || '">'
  || '<rps>'
    || FUNC_ADD_TAG_XML ('nro_recibo_provisorio', v_documentoFiscal)
    || FUNC_ADD_TAG_XML ('serie_recibo_provisorio', v_serieFiscal)
    || FUNC_ADD_TAG_XML ('data_emissao_recibo_provisorio', CASE WHEN v_dataEmissao IS NULL THEN '00/00/0000' ELSE TO_CHAR (v_dataEmissao, 'DD/MM/YYYY') END)
    || FUNC_ADD_TAG_XML ('hora_emissao_recibo_provisorio', CASE WHEN v_dataEmissao IS NULL THEN '00:00:00' ELSE TO_CHAR (v_dataEmissao, 'HH24:MI:SS') END)
  || '</rps>';

    -- NF
    v_xml := v_xml
  || '<nf>'
    || FUNC_ADD_TAG_XML ('valor_total', TO_CHAR (v_valorServicos - v_valorDescontoTotal, 'FM9999999999990D00'))
    || FUNC_ADD_TAG_XML ('valor_desconto', TO_CHAR (v_valorDescontoCondicionado, 'FM9999999999990D00'))
    || FUNC_ADD_TAG_XML ('valor_ir', TO_CHAR (v_valorIrrf, 'FM9999999999990D00'))
    || FUNC_ADD_TAG_XML ('valor_inss', TO_CHAR (v_valorInss, 'FM9999999999990D00'))
    || FUNC_ADD_TAG_XML ('valor_contribuicao_social', TO_CHAR (v_valorCsll, 'FM9999999999990D00'))
    || '<valor_rps>0,00</valor_rps>'
    || FUNC_ADD_TAG_XML ('valor_pis', TO_CHAR (v_valorPis, 'FM9999999999990D00'))
    || FUNC_ADD_TAG_XML ('valor_cofins', TO_CHAR (v_valorCofins, 'FM9999999999990D00'))
    || FUNC_ADD_TAG_XML ('observacao', v_outrasInformacoes)
  || '</nf>';

    -- Prestador
    v_xml := v_xml
  || '<prestador>'
    || FUNC_ADD_TAG_XML ('cpfcnpj', v_estab_cnpjCpfIdEstrangeiro)
    || FUNC_ADD_TAG_XML ('cidade', TO_CHAR (v_estab_municipio))
  || '</prestador>';

    -- Tomador (Cliente)
    v_xml := v_xml
  || '<tomador>'
    || FUNC_ADD_TAG_XML ('tipo', v_pess_indicadorPessoa)
    || FUNC_ADD_TAG_XML ('cpfcnpj', v_pess_cnpjCpfIdEstrangeiro)
    || FUNC_ADD_TAG_XML ('ie', v_pess_inscricaoEstadual)
    || FUNC_ADD_TAG_XML ('nome_razao_social', v_pess_nomeRazaoSocial)
    || FUNC_ADD_TAG_XML ('sobrenome_nome_fantasia', v_pess_apelidoFantasia)
    || FUNC_ADD_TAG_XML ('logradouro', v_pess_logradouro)
    || FUNC_ADD_TAG_XML ('email', v_pess_email)
    || FUNC_ADD_TAG_XML ('numero_residencia', v_pess_numero)
    || FUNC_ADD_TAG_XML ('complemento', v_pess_complemento)
    || FUNC_ADD_TAG_XML ('ponto_referencia', v_pess_observacoesEndereco)
    || FUNC_ADD_TAG_XML ('bairro', v_pess_bairroDistrito)
    || FUNC_ADD_TAG_XML ('cidade', TO_CHAR (v_pess_municipio))
    || FUNC_ADD_TAG_XML ('cep', TO_CHAR (v_pess_cep))
    || '<ddd_fone_comercial/>'
    || FUNC_ADD_TAG_XML ('fone_comercial', v_pess_fone)
    || '<ddd_fone_residencial/>'
    || '<fone_residencial/>'
    || '<ddd_fax/>'
    || '<fone_fax/>'
  || '</tomador>';

    -- Itens
    v_xml := v_xml
  || '<itens>'
    || '<lista>'
      || FUNC_ADD_TAG_XML ('codigo_local_prestacao_servico', TO_CHAR (v_municipioFatoGerador))
      || FUNC_ADD_TAG_XML ('codigo_item_lista_servico', TO_CHAR (v_listaServicos))
      || FUNC_ADD_TAG_XML ('descritivo', v_discriminacao)
      || FUNC_ADD_TAG_XML ('aliquota_item_lista_servico', TO_CHAR (v_aliquotaIssqn, 'FM9999999999990D00'))
      || FUNC_ADD_TAG_XML ('situacao_tributaria', '0')
      || FUNC_ADD_TAG_XML ('valor_tributavel', TO_CHAR (v_valorIssqn, 'FM9999999999990D00'))
      || FUNC_ADD_TAG_XML ('valor_deducao', TO_CHAR (v_valorDeducoes, 'FM9999999999990D00'))
      || FUNC_ADD_TAG_XML ('valor_issrf', CASE WHEN v_issRetido = 1 THEN  TO_CHAR (v_valorIssqn, 'FM9999999999990D00') ELSE '0,00' END)
      || FUNC_ADD_TAG_XML ('tributa_municipio_prestador', CASE WHEN v_tributadoForaMunicipio = 1 THEN 'N' ELSE 'S' END)
      || '<unidade_codigo/>'
      || FUNC_ADD_TAG_XML ('unidade_quantidade', TO_CHAR (v_quantidade, 'FM9999999999990D00'))
      || FUNC_ADD_TAG_XML ('unidade_valor_unitario', TO_CHAR (v_precoUnitario - (v_valorDescontoTotal / v_quantidade), 'FM9999999999990D00'))
    || '</lista>'
  || '</itens>'
  -- Assinar Aqui
|| '</nfse>';

  ELSIF v_versaoNFSe = '1.00' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsEnvio xmlns="http://www.abrasf.org.br/nfse.xsd">'
      || '<LoteRps Id="lote" versao="1.00">'
        || FUNC_ADD_TAG_XML ('NumeroLote', p_loteWebService)
        || FUNC_ADD_TAG_XML (CASE WHEN v_estab_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_estab_cnpjCpfIdEstrangeiro)
        || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
        || FUNC_ADD_TAG_XML ('QuantidadeRps', '1')
        || '<ListaRps>'
          || '<Rps>'
            || '<InfRps Id="rps:' || v_documentoFiscal || TRIM(v_serieFiscal) || '">'
              || '<IdentificacaoRps>'
                || FUNC_ADD_TAG_XML ('Numero', v_documentoFiscal)
                || FUNC_ADD_TAG_XML ('Serie', v_serieFiscal)
                || FUNC_ADD_TAG_XML ('Tipo', '1')
              || '</IdentificacaoRps>'
              || FUNC_ADD_TAG_XML ('DataEmissao', CASE WHEN v_dataEmissao IS NULL THEN '0000-00-00T00:00:00' ELSE TO_CHAR (v_dataEmissao, 'YYYY-MM-DD') || 'T' || TO_CHAR (v_dataEmissao, 'HH24:MI:SS') END)
              || FUNC_ADD_TAG_XML ('NaturezaOperacao', v_indicadorIssqn)
              || CASE WHEN v_regimeEspecialTributacao = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('RegimeEspecialTributacao', v_regimeEspecialTributacao) END
              || FUNC_ADD_TAG_XML ('OptanteSimplesNacional', TO_CHAR (v_optanteSimplesNacional))
              || FUNC_ADD_TAG_XML ('IncentivadorCultural', TO_CHAR (v_incentivadorCultural))
              || FUNC_ADD_TAG_XML ('Status', '1');

    -- Serviço
    v_xml := v_xml
              || '<Servico>'
                || '<Valores>'
                  || FUNC_ADD_TAG_XML ('ValorServicos', REPLACE (TO_CHAR (v_valorServicos, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorDeducoes', REPLACE (TO_CHAR (v_valorDeducoes, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorPis', REPLACE (TO_CHAR (v_valorPis, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorCofins', REPLACE (TO_CHAR (v_valorCofins, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorInss', REPLACE (TO_CHAR (v_valorInss, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorIr', REPLACE (TO_CHAR (v_valorIrrf, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorCsll', REPLACE (TO_CHAR (v_valorCsll, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('IssRetido', TO_CHAR (v_issRetido))
                  || FUNC_ADD_TAG_XML ('ValorIss', REPLACE (TO_CHAR (v_valorIssqn, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('OutrasRetencoes', REPLACE (TO_CHAR (v_valorOutrasRetencoes, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('Aliquota', REPLACE (TO_CHAR (v_aliquotaIssqn, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('DescontoIncondicionado', REPLACE (TO_CHAR (v_valorDescontoTotal, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('DescontoCondicionado', REPLACE (TO_CHAR (v_valorDescontoCondicionado, 'FM9999999999990D00'), ',', '.'))
                || '</Valores>'
                || FUNC_ADD_TAG_XML ('ItemListaServico', SUBSTR (LPAD (v_listaServicos,4,'0'),1,2) || '.' || SUBSTR (LPAD (v_listaServicos,4,'0'),3,2))
                || FUNC_ADD_TAG_XML ('CodigoTributacaoMunicipio', v_codigoTributacaoMunicipio)
                || FUNC_ADD_TAG_XML ('Discriminacao', v_discriminacao)
                || FUNC_ADD_TAG_XML ('CodigoMunicipio', TO_CHAR (v_estab_municipio))
              || '</Servico>';

  -- Prestador (Estabelecimento)
  v_xml := v_xml
              || '<Prestador>'
                || FUNC_ADD_TAG_XML (CASE WHEN v_estab_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END , v_estab_cnpjCpfIdEstrangeiro)
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
              || '</Prestador>';

    -- Tomador (Cliente)
    v_xml := v_xml
              || '<Tomador>'
                || '<IdentificacaoTomador>'
                  || '<CpfCnpj>'
                    || FUNC_ADD_TAG_XML (CASE WHEN v_pess_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_pess_cnpjCpfIdEstrangeiro)
                  || '</CpfCnpj>'
                  || CASE WHEN v_pess_inscricaoMunicipal = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_pess_inscricaoMunicipal) END
                || '</IdentificacaoTomador>'
                || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
                || '<Endereco>'
                  || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
                  || CASE WHEN v_pess_numero = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Numero', v_pess_numero) END
                  || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Complemento', v_pess_complemento) END
                  || CASE WHEN v_pess_bairroDistrito = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Bairro', v_pess_bairroDistrito) END
                  || FUNC_ADD_TAG_XML ('CodigoMunicipio', TO_CHAR (v_pess_municipio))
                  || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
                  || FUNC_ADD_TAG_XML ('Cep', TO_CHAR (v_pess_cep))
                || '</Endereco>'
              || '</Tomador>';

    -- Intermediário
    IF v_intermediario > 0 THEN
      v_xml := v_xml
              || '<IntermediarioServico>'
                || FUNC_ADD_TAG_XML ('RazaoSocial', v_interm_nomeRazaoSocial)
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
              || '</IntermediarioServico>';
    END IF;

    -- Construção Civil
    IF v_codigoObra <> ' ' THEN
      v_xml := v_xml
              || '<ConstrucaoCivil>'
                || FUNC_ADD_TAG_XML ('CodigoObra', v_codigoObra)
                || FUNC_ADD_TAG_XML ('Art', v_art)
              || '</ConstrucaoCivil>';
    END IF;

    -- Outros
    v_xml := v_xml
            || '</InfRps>'
            -- Assinar aqui
          || '</Rps>'
        || '</ListaRps>'
      || '</LoteRps>'
      -- Assinar aqui
    || '</EnviarLoteRpsEnvio>';
  ELSIF v_versaoNFSe = '2.03' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsEnvio>'
  || '<LoteRps Id="'
  || CASE WHEN v_dataEmissao IS NULL THEN '00000000' ELSE TO_CHAR (v_dataEmissao, 'YYYYMMDD') END
  || LPAD (p_loteWebService, 4, '0')
  || '" versao="2.03">'
    || FUNC_ADD_TAG_XML ('NumeroLote', p_loteWebService)
    || '<CpfCnpj>'
      || FUNC_ADD_TAG_XML (CASE WHEN v_estab_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_estab_cnpjCpfIdEstrangeiro)
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || '<QuantidadeRps>1</QuantidadeRps>'
    || '<ListaRps>'
      || '<Rps>'
        || '<InfDeclaracaoPrestacaoServico>'
          || '<Rps>'
            || '<IdentificacaoRps>'
              || FUNC_ADD_TAG_XML ('Numero', v_documentoFiscal)
              || FUNC_ADD_TAG_XML ('Serie', '0')
              || FUNC_ADD_TAG_XML ('Tipo', '1')
            || '</IdentificacaoRps>'
            || FUNC_ADD_TAG_XML ('DataEmissao', CASE WHEN v_dataEmissao IS NULL THEN '0000-00-00' ELSE TO_CHAR (v_dataEmissao, 'YYYY-MM-DD') END)
            || FUNC_ADD_TAG_XML ('Status', '1')
          || '</Rps>'
          || FUNC_ADD_TAG_XML ('Competencia', CASE WHEN v_dataCompetencia IS NULL THEN '0000-00-00' ELSE TO_CHAR (v_dataCompetencia, 'YYYY-MM-DD') END);

    -- Serviço
    v_xml := v_xml
          || '<Servico>'
            || '<Valores>'
              || FUNC_ADD_TAG_XML ('ValorServicos', REPLACE (TO_CHAR (v_valorServicos, 'FM9999999999990D00'), ',', '.'))
              || FUNC_ADD_TAG_XML ('ValorDeducoes', REPLACE (TO_CHAR (v_valorDeducoes, 'FM9999999999990D00'), ',', '.'))
              || FUNC_ADD_TAG_XML ('ValorPis', REPLACE (TO_CHAR (v_valorPis, 'FM9999999999990D00'), ',', '.'))
              || FUNC_ADD_TAG_XML ('ValorCofins', REPLACE (TO_CHAR (v_valorCofins, 'FM9999999999990D00'), ',', '.'))
              || FUNC_ADD_TAG_XML ('ValorInss', REPLACE (TO_CHAR (v_valorInss, 'FM9999999999990D00'), ',', '.'))
              || FUNC_ADD_TAG_XML ('ValorIr', REPLACE (TO_CHAR (v_valorIrrf, 'FM9999999999990D00'), ',', '.'))
              || FUNC_ADD_TAG_XML ('ValorCsll', REPLACE (TO_CHAR (v_valorCsll, 'FM9999999999990D00'), ',', '.'))
              || FUNC_ADD_TAG_XML ('OutrasRetencoes', REPLACE (TO_CHAR (v_valorOutrasRetencoes, 'FM9999999999990D00'), ',', '.'))
              || FUNC_ADD_TAG_XML ('ValorIss', REPLACE (TO_CHAR (v_valorIssqn, 'FM9999999999990D00'), ',', '.'))
              || FUNC_ADD_TAG_XML ('DescontoCondicionado', REPLACE (TO_CHAR (v_valorDescontoCondicionado, 'FM9999999999990D00'), ',', '.'))
            || '</Valores>'
            || FUNC_ADD_TAG_XML ('IssRetido', TO_CHAR (v_issRetido))
            || FUNC_ADD_TAG_XML ('ItemListaServico', SUBSTR (LPAD (v_listaServicos, 4, '0'), 1, 2) || '.' || SUBSTR (LPAD (v_listaServicos, 4, '0'), 3, 2))
            || FUNC_ADD_TAG_XML ('CodigoCnae', LPAD (v_cnae, 7, '0'))
            || FUNC_ADD_TAG_XML ('CodigoTributacaoMunicipio', v_codigoTributacaoMunicipio)
            || FUNC_ADD_TAG_XML ('Discriminacao', v_discriminacao)
            || FUNC_ADD_TAG_XML ('CodigoMunicipio', TO_CHAR (v_estab_municipio))
            || FUNC_ADD_TAG_XML ('CodigoPais', v_estab_pais)
            || FUNC_ADD_TAG_XML ('ExigibilidadeISS', v_indicadorIssqn)
            || FUNC_ADD_TAG_XML ('MunicipioIncidencia', TO_CHAR (v_municipioFatoGerador))
          || '</Servico>';

    -- Prestador
    v_xml := v_xml
          || '<Prestador>'
            || '<CpfCnpj>'
              || FUNC_ADD_TAG_XML (CASE WHEN v_estab_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END , v_estab_cnpjCpfIdEstrangeiro)
            || '</CpfCnpj>'
            || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
          || '</Prestador>';

    -- Tomador
    v_xml := v_xml
          || '<Tomador>'
            || '<IdentificacaoTomador>'
              || '<CpfCnpj>'
                || FUNC_ADD_TAG_XML (CASE WHEN v_pess_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_pess_cnpjCpfIdEstrangeiro)
              || '</CpfCnpj>'
            || '</IdentificacaoTomador>'
            || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
            || '<Endereco>'
              || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
              || CASE WHEN v_pess_numero = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Numero', v_pess_numero) END
              || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Complemento', v_pess_complemento) END
              || CASE WHEN v_pess_bairroDistrito = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Bairro', v_pess_bairroDistrito) END
              || FUNC_ADD_TAG_XML ('CodigoMunicipio', TO_CHAR (v_pess_municipio))
              || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
              || FUNC_ADD_TAG_XML ('Cep', TO_CHAR (v_pess_cep))
            || '</Endereco>'
            || '<Contato>'
            || '</Contato>'
          || '</Tomador>';
    -- Outros
    v_xml := v_xml
          || FUNC_ADD_TAG_XML ('OptanteSimplesNacional', TO_CHAR (v_optanteSimplesNacional))
          || FUNC_ADD_TAG_XML ('IncentivoFiscal', TO_CHAR (v_incentivoFiscal))
        || '</InfDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
  -- Assinar aqui
|| '</EnviarLoteRpsEnvio>';
  ELSE
    -- NFS-e
    v_xml := '<EnviarLoteRpsSincronoEnvio xmlns="http://www.abrasf.org.br/nfse.xsd">'
  || '<LoteRps Id="1'
  || TO_CHAR (v_dataEmissao, 'YYYY')
  || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
  || LPAD (p_seqLoteWebServiceEnvio, 14, '0')
  || '" versao="20.01">'
    || FUNC_ADD_TAG_XML ('NumeroLote', p_loteWebService)
    || '<CpfCnpj>'
      || FUNC_ADD_TAG_XML (CASE WHEN v_estab_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_estab_cnpjCpfIdEstrangeiro)
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || FUNC_ADD_TAG_XML ('QuantidadeRps', '1')
    || '<ListaRps>'
      || '<Rps>'
        || '<tcDeclaracaoPrestacaoServico>'
          || '<InfDeclaracaoPrestacaoServico Id="1'
            || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
            || LPAD (p_loteWebService, 14, '0')
            || '">'          
            || '<Rps>'
              || '<IdentificacaoRps>'
                || FUNC_ADD_TAG_XML ('Numero', v_documentoFiscal)
                || FUNC_ADD_TAG_XML ('Serie', 'UNICA')
                || FUNC_ADD_TAG_XML ('Tipo', '1')
              || '</IdentificacaoRps>'
              || FUNC_ADD_TAG_XML ('DataEmissao', CASE WHEN v_dataEmissao IS NULL THEN '0000-00-00T00:00:00' ELSE TO_CHAR (v_dataEmissao, 'YYYY-MM-DD') || 'T' || TO_CHAR (v_dataEmissao, 'HH24:MI:SS') END)
              || FUNC_ADD_TAG_XML ('Status', '1')
            || '</Rps>'
            || FUNC_ADD_TAG_XML ('Competencia', CASE WHEN v_dataCompetencia IS NULL THEN '0000-00-00T00:00:00' ELSE TO_CHAR (v_dataCompetencia, 'YYYY-MM-DD') || 'T' || TO_CHAR (v_dataCompetencia, 'HH24:MI:SS') END)
            || FUNC_ADD_TAG_XML ('IdCidade', TO_CHAR (v_estab_municipio));

    -- Serviço
    v_xml := v_xml
            || '<Servico>'
              || '<tcDadosServico>'
                || '<Valores>'
                  || FUNC_ADD_TAG_XML ('BaseCalculoCRS', REPLACE (TO_CHAR (v_baseCalculoCrs, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorServicos', REPLACE (TO_CHAR (v_valorServicos, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorDeducoes', REPLACE (TO_CHAR (v_valorDeducoes, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorPis', REPLACE (TO_CHAR (v_valorPis, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorCofins', REPLACE (TO_CHAR (v_valorCofins, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorInss', REPLACE (TO_CHAR (v_valorInss, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorIr', REPLACE (TO_CHAR (v_valorIrrf, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorCsll', REPLACE (TO_CHAR (v_valorCsll, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('OutrasRetencoes', REPLACE (TO_CHAR (v_valorOutrasRetencoes, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorIss', REPLACE (TO_CHAR (v_valorIssqn, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('Aliquota', REPLACE (TO_CHAR (v_aliquotaIssqn, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('DescontoIncondicionado', REPLACE (TO_CHAR (v_valorDescontoTotal, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('DescontoCondicionado', REPLACE (TO_CHAR (v_valorDescontoCondicionado, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('IrrfIndenizacao', TO_CHAR (v_irrfIndenizacao))
                || '</Valores>'
                || FUNC_ADD_TAG_XML ('IssRetido', TO_CHAR (v_issRetido))
                || FUNC_ADD_TAG_XML ('ResponsavelRetencao', TO_CHAR (v_responsavelRetencao))
                || FUNC_ADD_TAG_XML ('ItemListaServico', SUBSTR (LPAD (v_listaServicos, 4, '0'), 1, 2) || '.' || SUBSTR (LPAD (v_listaServicos, 4, '0'), 3, 2))
                || FUNC_ADD_TAG_XML ('CodigoCnae', LPAD (v_cnae, 7, '0'))
                || FUNC_ADD_TAG_XML ('CodigoTributacaoMunicipio', v_codigoTributacaoMunicipio)
                || FUNC_ADD_TAG_XML ('Discriminacao', v_discriminacao)
                || FUNC_ADD_TAG_XML ('CodigoMunicipio', TO_CHAR (v_estab_municipio))
                || FUNC_ADD_TAG_XML ('CodigoPais', v_estab_pais)
                || FUNC_ADD_TAG_XML ('ExigibilidadeISS', v_indicadorIssqn)
                || FUNC_ADD_TAG_XML ('MunicipioIncidencia', TO_CHAR (v_municipioFatoGerador))
                || FUNC_ADD_TAG_XML ('NumeroProcesso', v_numeroProcesso)
              || '</tcDadosServico>'
            || '</Servico>';

    -- Prestador (Estabelecimento)
    v_xml := v_xml
            || '<Prestador>'
              || '<CpfCnpj>'
                || FUNC_ADD_TAG_XML (CASE WHEN v_estab_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END , v_estab_cnpjCpfIdEstrangeiro)
              || '</CpfCnpj>'
              || FUNC_ADD_TAG_XML ('RazaoSocial', v_estab_nomeRazaoSocial)
              || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
            || '</Prestador>';

    -- Tomador (Cliente)
    v_xml := v_xml
            || '<Tomador>'
              || '<IdentificacaoTomador>'
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (CASE WHEN v_pess_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_pess_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_pess_inscricaoMunicipal)
              || '</IdentificacaoTomador>'
              || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
              || '<Endereco>'
                || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
                || FUNC_ADD_TAG_XML ('Numero', v_pess_numero)
                || FUNC_ADD_TAG_XML ('Complemento', v_pess_complemento)
                || FUNC_ADD_TAG_XML ('Bairro', v_pess_bairroDistrito)
                || FUNC_ADD_TAG_XML ('CodigoMunicipio', TO_CHAR (v_pess_municipio))
                || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
                || FUNC_ADD_TAG_XML ('CodigoPais', v_pess_pais)
                || FUNC_ADD_TAG_XML ('Cep', TO_CHAR (v_pess_cep))
              || '</Endereco>'
              || '<Contato>'
                || FUNC_ADD_TAG_XML ('Telefone', v_pess_fone)
                || FUNC_ADD_TAG_XML ('Email', v_pess_email)
              || '</Contato>'
            || '</Tomador>';

    IF v_intermediario <> 0 THEN
      -- Intermediário
      v_xml := v_xml
            || '<Intermediario>'
              || '<IdentificacaoIntermediario>'
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
              || '</IdentificacaoIntermediario>'
              || FUNC_ADD_TAG_XML ('RazaoSocial', v_interm_nomeRazaoSocial)
            || '</Intermediario>';
    END IF;

    -- Construção Civil
    v_xml := v_xml
            || '<ConstrucaoCivil>'
              || FUNC_ADD_TAG_XML ('CodigoObra', v_codigoObra)
              || FUNC_ADD_TAG_XML ('Art', v_art)
            || '</ConstrucaoCivil>';

    -- Outros
    v_xml := v_xml
            || FUNC_ADD_TAG_XML ('RegimeEspecialTributacao', v_regimeEspecialTributacao)
            || FUNC_ADD_TAG_XML ('NaturezaOperacao', v_indicadorIssqn)
            || FUNC_ADD_TAG_XML ('OptanteSimplesNacional', TO_CHAR (v_optanteSimplesNacional))
            || FUNC_ADD_TAG_XML ('IncentivoFiscal', TO_CHAR (v_incentivoFiscal))
            || FUNC_ADD_TAG_XML ('PercentualCargaTributaria', TO_CHAR (v_percentualCargaTributariaFe))
            || FUNC_ADD_TAG_XML ('ValorCargaTributaria', TO_CHAR (v_valorCargaTributariaFederal))
            || FUNC_ADD_TAG_XML ('PercentualCargaTributariaEstadual', TO_CHAR (v_percentualCargaTributariaEs))
            || FUNC_ADD_TAG_XML ('ValorCargaTributariaEstadual', TO_CHAR (v_valorCargaTributariaEstad))
            || FUNC_ADD_TAG_XML ('PercentualCargaTributariaMunicipal', TO_CHAR (v_percentualCargaTributariaMu))
            || FUNC_ADD_TAG_XML ('ValorCargaTributariaMunicipal', TO_CHAR (v_valorCargaTributariaMunicip))
            || FUNC_ADD_TAG_XML ('OutrasInformacoes', v_outrasInformacoes)
            || FUNC_ADD_TAG_XML ('SiglaUF', v_estab_uf)
            || FUNC_ADD_TAG_XML ('IdCidade', TO_CHAR (v_estab_municipio))
            || FUNC_ADD_TAG_XML ('FormaPagamento', v_formaPagamento)
--                    <!--identificação da forma de pagamento-->
--                        <!--0-Não identificada-->
--                        <!--1-A Vista-->
--                        <!--2-Apresentação-->
--                        <!--3-A Prazo-->
--                        <!--4-Cartão de Débito-->
--                        <!--5-Cartão de Crédito-->
            || FUNC_ADD_TAG_XML ('NumeroParcelas', v_numeroParcelas)
--                    <!--Caso não houver parcelamento informar o 0 e não colocar as tags abaixo-->
--            || '<Parcelamento>'
--              || '<Parcelas>'
--                || '<tcParcela>'
--                  || '<Numero>1</Numero>'
--                  || '<Valor>20.00</Valor>'
--                  || '<DataVencimento>2019-05-02T00:00:00</DataVencimento>'
--                || '</tcParcela>'
--                || '<tcParcela>'
--                  || '<Numero>2</Numero>'
--                  || '<Valor>20.00</Valor>'
--                  || '<DataVencimento>2019-06-02T00:00:00</DataVencimento>'
--                || '</tcParcela>'
--              || '</Parcelas>'
--            || '</Parcelamento>'
          || '</InfDeclaracaoPrestacaoServico>'
        -- Assinar aqui
        || '</tcDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsSincronoEnvio>';

  END IF;
  RETURN v_xml;
END;

/

create or replace PROCEDURE ADD_BUSCA_REGRA_FRETE (
  p_estabelecimento              IN NUMBER,
  p_pessoa                       IN NUMBER,
  p_enderecoEntregaPessoa        IN NUMBER,
  p_valorBaseFrete               IN NUMBER,
  p_pesoLiquido                  IN NUMBER,
  p_pesoBruto                    IN NUMBER,
  /* Retornos */
  r_regra_transportadora         OUT NUMBER,
  r_regra_enderecoTransportadora OUT NUMBER,
  r_regra_valorFreteMinimo       OUT NUMBER,
  r_regra_multiplicarPeloPeso    OUT NUMBER,
  r_regra_percentualFrete        OUT NUMBER,
  r_regra_valorFrete             OUT NUMBER,
  r_regra_encontrou              OUT NUMBER)
IS
  v_idRegraFrete        NUMBER;
  v_valorFreteMinimo    NUMBER;
  v_multiplicarPeloPeso NUMBER;
  v_percentualFrete     NUMBER;
  v_transportadora      NUMBER;
BEGIN
  r_regra_transportadora := 0;
  r_regra_enderecoTransportadora := 0;
  r_regra_valorFreteMinimo := 0;
  r_regra_multiplicarPeloPeso := 0;
  r_regra_percentualFrete := 0;
  r_regra_valorFrete := 0;
  r_regra_encontrou := 0;
  SELECT
    COALESCE (MAX (a.idRegraFrete), 0),
    COALESCE (MAX (a.valorFreteMinimo), 0),
    COALESCE (MAX (a.multiplicarPeloPeso), 0),
    COALESCE (MAX (a.percentualFrete), 0),
    COALESCE (MAX (a.transportadora), 0)
  INTO
    v_idRegraFrete,
    v_valorFreteMinimo,
    v_multiplicarPeloPeso,
    v_percentualFrete,
    v_transportadora
  FROM (
    SELECT
      frete.idRegraFrete,
      frete.valorFreteMinimo,
      frete.multiplicarPeloPeso,
      frete.percentualFrete,
      frete.transportadora,
      ROW_NUMBER() OVER (
        ORDER BY
          frete.pessoa DESC,
          frete.exclusivoPessoaE DESC,
          frete.exclusivoPessoaD DESC,
          frete.exclusivoPessoaC DESC,
          frete.exclusivoPessoaB DESC,
          frete.exclusivoPessoaA DESC,
          frete.bairroDistrito DESC,
          frete.municipio DESC,
          frete.microrregiaoGeografica DESC,
          frete.mesorregiaoGeografica DESC,
          frete.uf DESC,
          frete.estabelecimento DESC,
          frete.idRegraFrete DESC) rowNumber
    FROM CAPESSOAS pess
    JOIN CAENDERECOSPESSOA endEntr
    ON endEntr.enderecoPessoa =
      CASE
        WHEN p_pessoa = 0 OR p_enderecoEntregaPessoa = 0
        THEN COALESCE ((
          SELECT MAX (endEst.enderecoPessoa)
          FROM PAESTABELECIMENTOS est
          JOIN CAENDERECOSPESSOA endEst
          ON endEst.pessoa = est.pessoaEstabelecimento
          WHERE est.estabelecimento = p_estabelecimento
          AND endEst.ativo = 1
          AND endEst.principal = 1), 0)
        ELSE p_enderecoEntregaPessoa
      END
    JOIN SIMUNICIPIOS mun
    ON mun.municipio = endEntr.municipio
    JOIN SIMICRORREGIOESGEOGRAFICA micro
    ON micro.microrregiaoGeografica = mun.microrregiaoGeografica
    JOIN PAREGRASFRETE frete
    ON frete.idRegraFrete > 0
    WHERE pess.pessoa = p_pessoa
    AND frete.idRegraFrete > 0
    AND frete.ativo = 1
    AND (frete.estabelecimento = 0
      OR frete.estabelecimento = p_estabelecimento)
    AND (frete.uf = ' '
      OR frete.uf = '  '
      OR frete.uf = mun.uf)
    AND (frete.mesorregiaoGeografica = 0
      OR frete.mesorregiaoGeografica = micro.mesorregiaoGeografica)
    AND (frete.microrregiaoGeografica = 0
      OR frete.microrregiaoGeografica = mun.microrregiaoGeografica)
    AND (frete.municipio = 0
      OR frete.municipio = endEntr.municipio)
    AND (frete.bairroDistrito = ' '
      OR frete.bairroDistrito = endEntr.bairroDistrito)
    AND (frete.exclusivoPessoaA = 0
      OR frete.exclusivoPessoaA = pess.exclusivoPessoaA)
    AND (frete.exclusivoPessoaB = 0
      OR frete.exclusivoPessoaB = pess.exclusivoPessoaB)
    AND (frete.exclusivoPessoaC = 0
      OR frete.exclusivoPessoaC = pess.exclusivoPessoaC)
    AND (frete.exclusivoPessoaD = 0
      OR frete.exclusivoPessoaD = pess.exclusivoPessoaD)
    AND (frete.exclusivoPessoaE = 0
      OR frete.exclusivoPessoaE = pess.exclusivoPessoaE)
    AND (frete.pessoa = 0
      OR frete.pessoa = pess.pessoa)) a
  WHERE a.rowNumber = 1;
  IF v_idRegraFrete <> 0 THEN
    r_regra_transportadora := v_transportadora;
    r_regra_encontrou := 1;
    r_regra_valorFreteMinimo := v_valorFreteMinimo;
    r_regra_multiplicarPeloPeso := v_multiplicarPeloPeso;
    r_regra_percentualFrete := v_percentualFrete;
    r_regra_valorFrete := 
      CASE
        WHEN ROUND (p_valorBaseFrete * v_percentualFrete / 100, 0) <
          ROUND (v_valorFreteMinimo
            * CASE
                WHEN V_multiplicarPeloPeso = 1 AND
                  CASE
                    WHEN p_pesoBruto > p_pesoLiquido
                    THEN p_pesoBruto
                    ELSE p_pesoLiquido
                  END <> 0
                THEN
                  CASE
                    WHEN p_pesoBruto > p_pesoLiquido
                    THEN p_pesoBruto
                    ELSE p_pesoLiquido
                  END
                ELSE 1
              END, 2)
        THEN ROUND(v_valorFreteMinimo *
          CASE
            WHEN V_multiplicarPeloPeso = 1 AND
              CASE
                WHEN p_pesoBruto > p_pesoLiquido
                THEN p_pesoBruto
                ELSE p_pesoLiquido
              END <> 0
            THEN
              CASE
                WHEN p_pesoBruto > p_pesoLiquido
                THEN p_pesoBruto
                ELSE p_pesoLiquido
              END
            ELSE 1
          END, 2)
        ELSE ROUND (p_valorBaseFrete * v_percentualFrete / 100,0)
      END;
    IF v_transportadora = 0 THEN
      r_regra_enderecoTransportadora := 0;
    ELSE
      SELECT COALESCE ((
        SELECT MIN (enderecoPessoa)
        FROM CAENDERECOSPESSOA
        WHERE pessoa = v_transportadora
        AND ativo = 1
        AND principal = 1), 0)
      INTO r_regra_enderecoTransportadora
      FROM DUAL;
    END IF;
  END IF;
END ADD_BUSCA_REGRA_FRETE;

/

create or replace PROCEDURE ADD_ORCAMENTO_CAB_BUSCA_FRETE (
  p_person_190_modeloFrete       IN CHAR,
  p_buscarESalvarInternamente    IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_cab_orcamento                IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_cab_enderecoEntregaPessoa    IN NUMBER,
  p_cab_modalidadeFrete          IN CHAR,
  p_cab_transportadora           IN NUMBER,
  p_cab_enderecoTransportadora   IN NUMBER,
  p_a_cab_valorFreteItem         IN NUMBER,
  p_cab_valorFreteItem           IN NUMBER,
  p_a_cab_valorFreteGeral        IN NUMBER,
  p_cab_valorFreteGeral          IN NUMBER,
  p_modDoc_somaFreteSeguroPrUnit IN NUMBER,
  p_item_idItemOrcamento         IN NUMBER,
  p_item_pesoLiquido             IN NUMBER,
  p_item_pesoBruto               IN NUMBER,
  p_item_valorProdutoServicoBrut IN NUMBER,
  p_item_valorDescontoItem       IN NUMBER,
  p_item_valorAcrescimoItem      IN NUMBER,
  p_item_controleEntrega         IN NUMBER,
  p_item_valorFreteGeral         IN NUMBER,
  p_contrEntr_habilitaFrete      IN NUMBER,
  /* Retornos */
  r_mensagemAviso                OUT VARCHAR,
  r_calcularImpostos             OUT NUMBER,
  r_cab_modalidadeFrete          OUT CHAR,
  r_cab_transportadora           OUT NUMBER,
  r_cab_enderecoTransportadora   OUT NUMBER,
  r_cab_valorFreteGeral          OUT NUMBER,
  r_item_valorFreteGeral         OUT NUMBER)
IS
  v_a_cab_valorFreteItem         NUMBER;
  v_cab_valorFreteItem           NUMBER;
  v_a_cab_valorFreteGeral        NUMBER;
  v_somaItens_valorBaseFrete     NUMBER;
  v_somaItens_pesoLiquido        NUMBER;
  v_somaItens_pesoBruto          NUMBER;
  v_regra_transportadora         NUMBER;
  v_regra_enderecoTransportadora NUMBER;
  v_regra_percentualFrete        NUMBER;
  v_regra_valorFrete             NUMBER;
  v_regra_encrontrou             NUMBER;
  v_regra_utiliza                NUMBER;
  v_auxNumber                    NUMBER;
BEGIN
  r_mensagemAviso := ' ';
  r_calcularImpostos := p_calcularImpostos;
  r_item_valorFreteGeral := p_item_valorFreteGeral;
  IF p_buscarESalvarInternamente = 1 THEN
    SELECT
      modalidadeFrete,
      transportadora,
      enderecoTransportadora,
      valorFreteItem,
      valorFreteItem,
      valorFreteGeral,
      valorFreteGeral
    INTO
      r_cab_modalidadeFrete,
      r_cab_transportadora,
      r_cab_enderecoTransportadora,
      v_a_cab_valorFreteItem,
      v_cab_valorFreteItem,
      v_a_cab_valorFreteGeral,
      r_cab_valorFreteGeral
    FROM MOORCAMENTOS
    WHERE orcamento = p_cab_orcamento;
  ELSE
    r_cab_modalidadeFrete := p_cab_modalidadeFrete;
    r_cab_transportadora := p_cab_transportadora;
    r_cab_enderecoTransportadora := p_cab_enderecoTransportadora;
    v_a_cab_valorFreteItem := p_a_cab_valorFreteItem;
    v_cab_valorFreteItem := p_cab_valorFreteItem;
    v_a_cab_valorFreteGeral := p_a_cab_valorFreteGeral;
    r_cab_valorFreteGeral := p_cab_valorFreteGeral;
  END IF;
  SELECT
    COALESCE(SUM(a.valorProdutoServicoBruto - a.valorDescontoItem + a.valorAcrescimoItem),0),
    COALESCE(SUM(a.pesoLiquido),0),
    COALESCE(SUM(a.pesoBruto),0)
  INTO
    v_somaItens_valorBaseFrete,
    v_somaItens_pesoLiquido,
    v_somaItens_pesoBruto
  FROM MOORCAMENTOXITENS a
  JOIN PACONTROLESENTREGA b
  ON b.controleEntrega = a.controleEntrega
  WHERE a.orcamento = p_cab_orcamento
  AND a.idItemOrcamento <> p_item_idItemOrcamento
  AND a.cancelado = 0
  AND a.controleEntrega > 0
  AND b.habilitaFrete = 1;
  v_regra_transportadora := 0;
  v_regra_enderecoTransportadora := 0;
  v_regra_percentualFrete := 0;
  v_regra_valorFrete := 0;
  v_regra_encrontrou := 0;
  ADD_BUSCA_REGRA_FRETE (
    p_cab_estabelecimento,
    p_cab_pessoa,
    p_cab_enderecoEntregaPessoa,
    v_somaItens_valorBaseFrete +
      CASE
        WHEN p_item_idItemOrcamento = 0
          OR p_item_controleEntrega = 0
          OR p_contrEntr_habilitaFrete = 0
        THEN 0
        ELSE p_item_valorProdutoServicoBrut - p_item_valorDescontoItem + p_item_valorAcrescimoItem
      END,
    v_somaItens_pesoLiquido +
      CASE
        WHEN p_item_idItemOrcamento = 0
          OR p_item_controleEntrega = 0
          OR p_contrEntr_habilitaFrete = 0
        THEN 0
        ELSE p_item_pesoLiquido
      END,
    v_somaItens_pesoBruto +
      CASE
        WHEN p_item_idItemOrcamento = 0
          OR p_item_controleEntrega = 0
          OR p_contrEntr_habilitaFrete = 0
        THEN 0
        ELSE p_item_pesoBruto
      END,
    /* Retornos */
    v_regra_transportadora,
    v_regra_enderecoTransportadora,
    v_auxNumber,
    v_auxNumber,
    v_regra_percentualFrete,
    v_regra_valorFrete,
    v_regra_encrontrou);
  IF (v_somaItens_valorBaseFrete +
      CASE
        WHEN p_item_idItemOrcamento = 0
          OR p_item_controleEntrega = 0
          OR p_contrEntr_habilitaFrete = 0
        THEN 0
        ELSE p_item_valorProdutoServicoBrut - p_item_valorDescontoItem + p_item_valorAcrescimoItem
      END) = 0
  THEN
    v_regra_transportadora := 0;
    v_regra_enderecoTransportadora := 0;
    v_regra_percentualFrete := 0;
    v_regra_valorFrete := 0;
  END IF;
  v_regra_utiliza := v_regra_encrontrou;
  IF v_regra_utiliza = 0
  AND p_item_idItemOrcamento = 0
  THEN
    SELECT COALESCE (MAX (1), 0)
    INTO v_regra_utiliza
    FROM PAREGRASFRETE
    WHERE idRegraFrete > 0
    AND ativo = 1;
  END IF;
  IF v_regra_encrontrou = 1
    AND (p_item_idItemOrcamento = 0
      OR v_regra_percentualFrete <> 0
      OR v_a_cab_valorFreteGeral = 0
      AND v_regra_valorFrete > 0)
    OR v_regra_utiliza = 1
    AND v_a_cab_valorFreteGeral > 0
    AND v_regra_valorFrete = 0 
  THEN
    IF v_regra_transportadora <> 0 THEN
      r_cab_transportadora := v_regra_transportadora;
      r_cab_enderecoTransportadora := v_regra_enderecoTransportadora;
    END IF;
    r_cab_valorFreteGeral := v_regra_valorFrete;
    IF r_cab_valorFreteGeral <> v_a_cab_valorFreteGeral
    THEN
      r_calcularImpostos := 1;
      r_item_valorFreteGeral := 0;
      IF NOT (p_person_190_modeloFrete IS NULL)
        AND p_person_190_modeloFrete <> ' '
        AND p_modDoc_somaFreteSeguroPrUnit = 0
      THEN
        r_cab_modalidadeFrete := FUNC_ADD_BUSCA_MODALIDADE_FRET (
          p_person_190_modeloFrete,
          r_cab_modalidadeFrete,
          v_a_cab_valorFreteItem,
          v_cab_valorFreteItem,
          v_a_cab_valorFreteGeral,
          r_cab_valorFreteGeral,
          p_modDoc_somaFreteSeguroPrUnit);
      END IF;
      IF p_buscarESalvarInternamente = 1 THEN
        UPDATE MOORCAMENTOS SET
          modalidadeFrete = r_cab_modalidadeFrete,
          transportadora = r_cab_transportadora,
          enderecoTransportadora = r_cab_enderecoTransportadora,
          valorFreteGeral = r_cab_valorFreteGeral
        WHERE orcamento = p_cab_orcamento;
      END IF;
      IF r_cab_valorFreteGeral > v_a_cab_valorFreteGeral THEN
        r_mensagemAviso := 'Frete recalculado.
  
  Novo Frete: ' || TRIM (TO_CHAR (r_cab_valorFreteGeral, 'FM9G999G999G999G990D00')) || '.';
      ELSIF r_cab_valorFreteGeral <= 0 THEN
        r_mensagemAviso := 'Frete zerado.
  
  Frete anterior: ' || TRIM (TO_CHAR (v_a_cab_valorFreteGeral, 'FM9G999G999G999G990D00')) || '.';
      ELSE
        r_mensagemAviso := 'Frete recalculado.
  
  O novo frete reduziu de ' || TRIM (TO_CHAR (v_a_cab_valorFreteGeral, 'FM9G999G999G999G990D00')) || ' para ' || TRIM (TO_CHAR (r_cab_valorFreteGeral, 'FM9G999G999G999G990D00')) || '.';
      END IF;
    END IF;
  END IF;
END ADD_ORCAMENTO_CAB_BUSCA_FRETE;

/

UPDATE SIMENUS SET tipoMenu = 'CAD' WHERE menu = 163;
UPDATE SIMENUS SET tipoMenu = 'OCU' WHERE menu = 333;

COMMIT;

UPDATE SINCMS SET ativo = 0 WHERE idNcm IN (2071400000, 27109100000, 28201000000, 28273998000, 29299021000, 29299022000, 29299029000, 29314930000, 29398000000, 30024993000, 39072990000, 39172200000, 48119010000, 74094010000, 85045000000, 85059010000, 85441910000, 90029000000);

COMMIT;

INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (2071411000, '02071411','   ', 'Carnes e miudezas, comestíveis - Carnes e miudezas, comestíveis, frescas, refrigeradas ou congeladas, das aves da posição 0105 - De galos ou de galinhas: - Peitos', 1, '02071', 1708702, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (2071412000, '02071412','   ', 'Carnes e miudezas, comestíveis - Carnes e miudezas, comestíveis, frescas, refrigeradas ou congeladas, das aves da posição 0105 - De galos ou de galinhas: - Coxas com sobrecoxas', 1, '02071', 1708702, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (2071413000, '02071413','   ', 'Carnes e miudezas, comestíveis - Carnes e miudezas, comestíveis, frescas, refrigeradas ou congeladas, das aves da posição 0105 - De galos ou de galinhas: - Asas', 1, '02071', 1708702, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (2071419000, '02071419','   ', 'Carnes e miudezas, comestíveis - Carnes e miudezas, comestíveis, frescas, refrigeradas ou congeladas, das aves da posição 0105 - De galos ou de galinhas: - Outros', 1, '02071', 1708702, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (2071421000, '02071421','   ', 'Carnes e miudezas, comestíveis - Carnes e miudezas, comestíveis, frescas, refrigeradas ou congeladas, das aves da posição 0105 - De galos ou de galinhas: - Peitos, coxas e sobrecoxas, formando uma só peça', 1, '02071', 1708702, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (2071422000, '02071422','   ', 'Carnes e miudezas, comestíveis - Carnes e miudezas, comestíveis, frescas, refrigeradas ou congeladas, das aves da posição 0105 - De galos ou de galinhas: - Peitos', 1, '02071', 1708702, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (2071423000, '02071423','   ', 'Carnes e miudezas, comestíveis - Carnes e miudezas, comestíveis, frescas, refrigeradas ou congeladas, das aves da posição 0105 - De galos ou de galinhas: - Coxas com sobrecoxas', 1, '02071', 1708702, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (2071424000, '02071424','   ', 'Carnes e miudezas, comestíveis - Carnes e miudezas, comestíveis, frescas, refrigeradas ou congeladas, das aves da posição 0105 - De galos ou de galinhas: - Carne mecanicamente separada', 1, '02071', 1708702, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (2071429000, '02071429','   ', 'Carnes e miudezas, comestíveis - Carnes e miudezas, comestíveis, frescas, refrigeradas ou congeladas, das aves da posição 0105 - De galos ou de galinhas: - Outros', 1, '02071', 1708702, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (2071431000, '02071431','   ', 'Carnes e miudezas, comestíveis - Carnes e miudezas, comestíveis, frescas, refrigeradas ou congeladas, das aves da posição 0105 - De galos ou de galinhas: - Fígados', 1, '02071', 1708702, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (2071432000, '02071432','   ', 'Carnes e miudezas, comestíveis - Carnes e miudezas, comestíveis, frescas, refrigeradas ou congeladas, das aves da posição 0105 - De galos ou de galinhas: - Moelas', 1, '02071', 1708702, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (2071433000, '02071433','   ', 'Carnes e miudezas, comestíveis - Carnes e miudezas, comestíveis, frescas, refrigeradas ou congeladas, das aves da posição 0105 - De galos ou de galinhas: - Corações', 1, '02071', 1708702, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (2071434000, '02071434','   ', 'Carnes e miudezas, comestíveis - Carnes e miudezas, comestíveis, frescas, refrigeradas ou congeladas, das aves da posição 0105 - De galos ou de galinhas: - Pés e patas', 1, '02071', 1708702, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (2071439000, '02071439','   ', 'Carnes e miudezas, comestíveis - Carnes e miudezas, comestíveis, frescas, refrigeradas ou congeladas, das aves da posição 0105 - De galos ou de galinhas: - Outros', 1, '02071', 1708702, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (19012010000, '19012010','   ', 'Preparações à base de cereais, farinhas, amidos, féculas ou de leite; produtos de pastelaria - Extratos de malte; preparações alimentícias de farinhas, grumos, sêmolas, amidos, féculas ou de extratos de malte, que não contenham cacau ou que contenham me...', 1, '190190', 2806200, 'Preparações à base de cereais, farinhas, amidos, féculas ou de leite; produtos de pastelaria - Extratos de malte; preparações alimentícias de farinhas, grumos, sêmolas, amidos, féculas ou de extratos de malte, que não contenham cacau ou que contenham menos de 40 %, em peso, de cacau, calculado sobre uma base totalmente desengordurada, não especificadas nem compreendidas noutras posições; preparações alimentícias de produtos das posições 04.01 a 04.04, que não contenham cacau ou que contenham menosde5 %,empeso,decacau,calculadosobreumabasetotalmente desengordurada, não especificadas nem compreendidas noutras posições. - Massa para preparação de pão, sem adição de grãos ou sementes integrais, congelada.');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (19012020000, '19012020','   ', 'Preparações à base de cereais, farinhas, amidos, féculas ou de leite; produtos de pastelaria - Extratos de malte; preparações alimentícias de farinhas, grumos, sêmolas, amidos, féculas ou de extratos de malte, que não contenham cacau ou que contenham me...', 1, '190190', 2806200, 'Preparações à base de cereais, farinhas, amidos, féculas ou de leite; produtos de pastelaria - Extratos de malte; preparações alimentícias de farinhas, grumos, sêmolas, amidos, féculas ou de extratos de malte, que não contenham cacau ou que contenham menos de 40 %, em peso, de cacau, calculado sobre uma base totalmente desengordurada, não especificadas nem compreendidas noutras posições; preparações alimentícias de produtos das posições 04.01 a 04.04, que não contenham cacau ou que contenham menosde5 %,empeso,decacau,calculadosobreumabasetotalmente desengordurada, não especificadas nem compreendidas noutras posições. - Massa para preparação de pão, com adição de grãos ou sementes integrais, congelada.');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (19012090000, '19012090','   ', 'Preparações à base de cereais, farinhas, amidos, féculas ou de leite; produtos de pastelaria - Extratos de malte; preparações alimentícias de farinhas, grumos, sêmolas, amidos, féculas ou de extratos de malte, que não contenham cacau ou que contenham me...', 1, '190190', 2806200, 'Preparações à base de cereais, farinhas, amidos, féculas ou de leite; produtos de pastelaria - Extratos de malte; preparações alimentícias de farinhas, grumos, sêmolas, amidos, féculas ou de extratos de malte, que não contenham cacau ou que contenham menos de 40 %, em peso, de cacau, calculado sobre uma base totalmente desengordurada, não especificadas nem compreendidas noutras posições; preparações alimentícias de produtos das posições 04.01 a 04.04, que não contenham cacau ou que contenham menosde5 %,empeso,decacau,calculadosobreumabasetotalmente desengordurada, não especificadas nem compreendidas noutras posições. - Outras.');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (27109110000, '27109110','   ', 'Combustíveis minerais, óleos minerais e produtos de sua destilação; matérias betuminosas; ceras minerais - Óleos de petróleo ou de minerais betuminosos, exceto óleos brutos; preparações não especificadas nem compreendidas em outras posições, contendo, ...', 1, '27109', 2806300, 'Combustíveis minerais, óleos minerais e produtos de sua destilação; matérias betuminosas; ceras minerais - Óleos de petróleo ou de minerais betuminosos, exceto óleos brutos; preparações não especificadas nem compreendidas em outras posições, contendo, como constituintes básicos, 70% ou mais, em peso, de óleos de petróleo ou de minerais betuminosos; resíduos de óleos - Resíduos de óleos: - Que contenham bifenilas policloradas (PCB) numa concentração igual ou superior a 50 mg/kg');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (27109120000, '27109120','   ', 'Combustíveis minerais, óleos minerais e produtos de sua destilação; matérias betuminosas; ceras minerais - Óleos de petróleo ou de minerais betuminosos, exceto óleos brutos; preparações não especificadas nem compreendidas em outras posições, contendo, ...', 1, '27109', 2806300, 'Combustíveis minerais, óleos minerais e produtos de sua destilação; matérias betuminosas; ceras minerais - Óleos de petróleo ou de minerais betuminosos, exceto óleos brutos; preparações não especificadas nem compreendidas em outras posições, contendo, como constituintes básicos, 70% ou mais, em peso, de óleos de petróleo ou de minerais betuminosos; resíduos de óleos - Resíduos de óleos: - Outros, que contenham terfenilas policloradas (PCT) ou bifenilas polibromadas (PBB), mesmo que também contenham bifenilas policloradas (PCB) numa concentração inferior a 50 mg/kg');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (27109190000, '27109190','   ', 'Combustíveis minerais, óleos minerais e produtos de sua destilação; matérias betuminosas; ceras minerais - Óleos de petróleo ou de minerais betuminosos, exceto óleos brutos; preparações não especificadas nem compreendidas em outras posições, contendo, ...', 1, '27109', 2806300, 'Combustíveis minerais, óleos minerais e produtos de sua destilação; matérias betuminosas; ceras minerais - Óleos de petróleo ou de minerais betuminosos, exceto óleos brutos; preparações não especificadas nem compreendidas em outras posições, contendo, como constituintes básicos, 70% ou mais, em peso, de óleos de petróleo ou de minerais betuminosos; resíduos de óleos - Resíduos de óleos: - Outros');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (28201010000, '28201010','   ', 'Produtos químicos inorgânicos; compostos inorgânicos ou orgânicos de metais preciosos, de elementos radioativos, de metais das terras raras ou de isótopos - Óxidos de manganês. - Com um teor de MnO2 igual ou superior a 91 %, em peso (manganês eletrolítico)', 1, '282010', 2806300, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (28201090000, '28201090','   ', 'Produtos químicos inorgânicos; compostos inorgânicos ou orgânicos de metais preciosos, de elementos radioativos, de metais das terras raras ou de isótopos - Óxidos de manganês. - Outros', 1, '282010', 2806300, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (28273931000, '28273931','   ', 'Produtos químicos inorgânicos; compostos inorgânicos ou orgânicos de metais preciosos, de elementos radioativos, de metais das terras raras ou de isótopos - Cloretos,oxicloretosehidroxicloretos;brometoseoxibrometos;iodetose oxiiodetos. - Outros clore...', 1, '282739', 2806300, 'Produtos químicos inorgânicos; compostos inorgânicos ou orgânicos de metais preciosos, de elementos radioativos, de metais das terras raras ou de isótopos - Cloretos,oxicloretosehidroxicloretos;brometoseoxibrometos;iodetose oxiiodetos. - Outros cloretos: - Outros - Anidro, com um teor de ZnCl2 igual ou superior a 98 %, em peso');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (28273939000, '28273939','   ', 'Produtos químicos inorgânicos; compostos inorgânicos ou orgânicos de metais preciosos, de elementos radioativos, de metais das terras raras ou de isótopos - Cloretos,oxicloretosehidroxicloretos;brometoseoxibrometos;iodetose oxiiodetos. - Outros clore...', 1, '282739', 2806300, 'Produtos químicos inorgânicos; compostos inorgânicos ou orgânicos de metais preciosos, de elementos radioativos, de metais das terras raras ou de isótopos - Cloretos,oxicloretosehidroxicloretos;brometoseoxibrometos;iodetose oxiiodetos. - Outros cloretos: - Outros - Outros');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (28439040000, '28439040','   ', 'Produtos químicos inorgânicos; compostos inorgânicos ou orgânicos de metais preciosos, de elementos radioativos, de metais das terras raras ou de isótopos - Metais preciosos no estado coloidal; compostos inorgânicos ou orgânicos de metais preciosos, ...', 1, '284390', 2806300, 'Produtos químicos inorgânicos; compostos inorgânicos ou orgânicos de metais preciosos, de elementos radioativos, de metais das terras raras ou de isótopos - Metais preciosos no estado coloidal; compostos inorgânicos ou orgânicos de metais preciosos, de constituição química definida ou não; amálgamas de metais preciosos - Outros compostos; amálgamas - Tricloreto de rutênio, em pó');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (29299031000, '29299031','   ', 'Produtos químicos orgânicos - Compostos de outras funções nitrogenadas - Outros - Dicloreto de N,N-dimetilfosforoamídico', 1, '2929902', 2806300, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (29299039000, '29299039','   ', 'Produtos químicos orgânicos - Compostos de outras funções nitrogenadas - Outros - Outros', 1, '2929902', 2806300, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (29299039000, '29299039','   ', 'Produtos químicos orgânicos - Compostos de outras funções nitrogenadas - Outros - Outros', 1, '2929902', 2806300, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (29299040000, '29299040','   ', 'Produtos químicos orgânicos - Compostos de outras funções nitrogenadas - Outros - N,N-Dialquilfosforoamidatos de dialquila, com grupos alquila de C1 a C3', 1, '2929902', 2806300, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (29299050000, '29299050','   ', 'Produtos químicos orgânicos - Compostos de outras funções nitrogenadas - Outros - Fosfonamidofluoridatos de N-(1-(dialquila (de até C10, incluindo cicloalquila)amino))alquilideno (H ou de até C10, incluindo cicloalquila) e sais alquilados ou protonados...', 1, '2929902', 2806300, 'Produtos químicos orgânicos - Compostos de outras funções nitrogenadas - Outros - Fosfonamidofluoridatos de N-(1-(dialquila (de até C10, incluindo cicloalquila)amino))alquilideno (H ou de até C10, incluindo cicloalquila) e sais alquilados ou protonados destes produtos');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (29299060000, '29299060','   ', 'Produtos químicos orgânicos - Compostos de outras funções nitrogenadas - Outros - Fosforamidofluoridatos de O-alquila (H ou de até C10, incluindo cicloalquila) N-(1-(dialquila (de até C10, incluindo cicloalquila)amino))alquilideno (H ou de até C10, incl...', 1, '2929902', 2806300, 'Produtos químicos orgânicos - Compostos de outras funções nitrogenadas - Outros - Fosforamidofluoridatos de O-alquila (H ou de até C10, incluindo cicloalquila) N-(1-(dialquila (de até C10, incluindo cicloalquila)amino))alquilideno (H ou de até C10, incluindo cicloalquila) e sais alquilados ou protonados destes produtos');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (29314931000, '29314931','   ', 'Produtos químicos orgânicos - Outros compostos organo-inorgânicos. - - Derivados organofosforados não halogenados: - -- Outros - Metilfosfinato de butila', 1, '293149', 2806300, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (29314932000, '29314932','   ', 'Produtos químicos orgânicos - Outros compostos organo-inorgânicos. - - Derivados organofosforados não halogenados: - -- Outros - Metilfosfonato de bis(1-metilpentila)', 1, '293149', 2806300, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (29314939000, '29314939','   ', 'Produtos químicos orgânicos - Outros compostos organo-inorgânicos. - - Derivados organofosforados não halogenados: - -- Outros - Outros', 1, '293149', 2806300, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (29315995000, '29315995','   ', 'Produtos químicos orgânicos - Outros compostos organo-inorgânicos. - - Derivados organofosforados halogenados: - -- Outros - Outros - Fosfonamidofluoridatos de P-alquila (de até C10, incluindo cicloalquila) N-(1-(dialquila (de até C10, incluindo cicloal...', 1, '2931599', 2806300, 'Produtos químicos orgânicos - Outros compostos organo-inorgânicos. - - Derivados organofosforados halogenados: - -- Outros - Outros - Fosfonamidofluoridatos de P-alquila (de até C10, incluindo cicloalquila) N-(1-(dialquila (de até C10, incluindo cicloalquila)amino))alquilideno (H ou de até C10, incluindo cicloalquila) e sais alquilados ou protonados destes produtos');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (29315996000, '29315996','   ', 'Produtos químicos orgânicos - Outros compostos organo-inorgânicos. - - Derivados organofosforados halogenados: - -- Outros - Outros - (Bis(dietilamina)metileno)fosfonamidofluoridato de metila', 1, '2931599', 2806300, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (29315998000, '29315998','   ', 'Produtos químicos orgânicos - Outros compostos organo-inorgânicos. - - Derivados organofosforados halogenados: - -- Outros - Outros - Outros compostos que contenham um átomo de fósforo ligado a um grupo alquila (de C1 a C3) mas sem outros átomos de carbono', 1, '2931599', 2806300, ' ');
UPDATE SINCMS SET descricao = 'Produtos químicos orgânicos - Compostos heterocíclicos exclusivamente de heteroátomo(s) de nitrogênio (azoto). - Compostos cuja estrutura contém um ciclo piridina (hidrogenado ou não) não condensado: - Outros - Cuja estrutura contém funções álcool, ácid...', ativo = 1, observacoes = 'Produtos químicos orgânicos - Compostos heterocíclicos exclusivamente de heteroátomo(s) de nitrogênio (azoto). - Compostos cuja estrutura contém um ciclo piridina (hidrogenado ou não) não condensado: - Outros - Cuja estrutura contém funções álcool, ácido carboxílico ou ambas, mas não contém halogênios em ligação covalente - Dibrometo de 1-[N,N-dialquila (de até C10) -N-(n-hidroxialquil (de até C10))amônio]-n-[N-(3-dimetilcarbamoxi-alfa-picolinil)-N,N-dialquil (de até C10) amônio]decano (n=1-8)' WHERE idNcm = 29333936000;
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (29333941000, '29333941','   ', 'Produtos químicos orgânicos - Compostos heterocíclicos exclusivamente de heteroátomo(s) de nitrogênio (azoto). - Compostos cuja estrutura contém um ciclo piridina (hidrogenado ou não) não condensado: - Outros - Cuja estrutura contém funções éter, éster...', 1, '2933393', 2806300, 'Produtos químicos orgânicos - Compostos heterocíclicos exclusivamente de heteroátomo(s) de nitrogênio (azoto). - Compostos cuja estrutura contém um ciclo piridina (hidrogenado ou não) não condensado: - Outros - Cuja estrutura contém funções éter, éster ou ambas, mas não contém funções álcool ou ácido carboxílico nem halogênios em ligação covalente - Dibrometo de 1-[N,N-dialquila (de até C10) -N-(n-(ciano, acetoxi)alquil (de até C10))amônio]-n-[N-(3-dimetilcarbamoxi-alfa-picolinil)-N,N-dialquil (de até C10) amônio]decano (n=1-8)');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (29333942000, '29333942','   ', 'Produtos químicos orgânicos - Compostos heterocíclicos exclusivamente de heteroátomo(s) de nitrogênio (azoto). - Compostos cuja estrutura contém um ciclo piridina (hidrogenado ou não) não condensado: - Outros - Cuja estrutura contém funções éter, éster...', 1, '2933393', 2806300, 'Produtos químicos orgânicos - Compostos heterocíclicos exclusivamente de heteroátomo(s) de nitrogênio (azoto). - Compostos cuja estrutura contém um ciclo piridina (hidrogenado ou não) não condensado: - Outros - Cuja estrutura contém funções éter, éster ou ambas, mas não contém funções álcool ou ácido carboxílico nem halogênios em ligação covalente - Dibrometo de 1,n-bis[N-(3-dimetilcarbamoxi-alfa-picolil)-N,N-dialquila (de até C10) amônio]-alcano-(2,(n-1)-diona) (n=2-12)');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (29398010000, '29398010','   ', 'Produtos químicos orgânicos - Tiocompostos orgânicos. - Saxitoxina', 1, '293980', 2806300, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (29398090000, '29398090','   ', 'Produtos químicos orgânicos - Tiocompostos orgânicos. - Outros', 1, '293980', 2806300, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (38249961000, '38249961','   ', 'Produtos diversos das indústrias químicas - Aglutinantes químicos e preparações das indústrias químicas ou das indústrias conexas (incluindo os constituídos compreendidos noutras posições. - Outros: - Outros - À base de gadobenato de dimeglumina, de gad...', 1, '3824995', 2806300, 'Produtos diversos das indústrias químicas - Aglutinantes químicos e preparações das indústrias químicas ou das indústrias conexas (incluindo os constituídos compreendidos noutras posições. - Outros: - Outros - À base de gadobenato de dimeglumina, de gadobutrol, de gadopentetato de dimeglumina, de gadoterato de meglumina, de gadoteridol ou de gadoxetato dissódico');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (38249962000, '38249962','   ', 'Produtos diversos das indústrias químicas - Aglutinantes químicos e preparações das indústrias químicas ou das indústrias conexas (incluindo os constituídos compreendidos noutras posições. - Outros: - Outros - À base de hexafluoreto de enxofre', 1, '3824995', 2806300, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (38249969000, '38249969','   ', 'Produtos diversos das indústrias químicas - Aglutinantes químicos e preparações das indústrias químicas ou das indústrias conexas (incluindo os constituídos compreendidos noutras posições. - Outros: - Outros - Outros', 1, '3824995', 2806300, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (39072991000, '39072991','   ', 'Plásticos e suas obras - Poliacetais,outrospoliétereseresinasepóxidas,emformasprimárias; policarbonatos,resinasalquídicas,poliésteresalílicoseoutrospoliésteres,em formas primárias. - Outros poliéteres - -- Outros - Poliacetal poliéter (PAPE)', 1, '390729', 2806400, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (39072999000, '39072999','   ', 'Plásticos e suas obras - Poliacetais,outrospoliétereseresinasepóxidas,emformasprimárias; policarbonatos,resinasalquídicas,poliésteresalílicoseoutrospoliésteres,em formas primárias. - Outros poliéteres - -- Outros - Outros', 1, '390729', 2806400, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (39172210000, '39172210','   ', 'Plásticos e suas obras - Tuboseseusacessórios(porexemplo,juntas,cotovelos,flanges,uniões),de plástico. - Tubos rígidos: - De seção transversal interna redonda de diâmetro inferior a 6 mm e externa hexagonal', 1, '39172', 1000600, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (39172290000, '39172290','   ', 'Plásticos e suas obras - Tuboseseusacessórios(porexemplo,juntas,cotovelos,flanges,uniões),de plástico. - Tubos rígidos: - Outros', 1, '39172', 1000600, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (48119011000, '48119011','   ', 'Papel e cartão; obras de pasta de celulose, de papel ou de cartão - Papel, cartão, pasta (“ouate”) de celulose e mantas de fibras de celulose, revestidos, impregnados, recobertos, coloridos à superfície, decorados à superfície ou impressos, em rolos ou ...', 1, '481190', 2805800, 'Papel e cartão; obras de pasta de celulose, de papel ou de cartão - Papel, cartão, pasta (“ouate”) de celulose e mantas de fibras de celulose, revestidos, impregnados, recobertos, coloridos à superfície, decorados à superfície ou impressos, em rolos ou em folhas de forma quadrada ou retangular, de quaisquer dimensões, exceto os produtos dos tipos descritos nos textos das posições 4803, 4809 ou 4810 - Outros papéis, cartões, pasta ("ouate") de celulose e mantas de fibras de celulose - Recobertos de pasta eletrolítica à base de amido modificado, de peso igual ou superior a 75 g/m2, mas não superior a 120 g/m2');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (48119019000, '48119019','   ', 'Papel e cartão; obras de pasta de celulose, de papel ou de cartão - Papel, cartão, pasta (“ouate”) de celulose e mantas de fibras de celulose, revestidos, impregnados, recobertos, coloridos à superfície, decorados à superfície ou impressos, em rolos ou ...', 1, '481190', 2805800, 'Papel e cartão; obras de pasta de celulose, de papel ou de cartão - Papel, cartão, pasta (“ouate”) de celulose e mantas de fibras de celulose, revestidos, impregnados, recobertos, coloridos à superfície, decorados à superfície ou impressos, em rolos ou em folhas de forma quadrada ou retangular, de quaisquer dimensões, exceto os produtos dos tipos descritos nos textos das posições 4803, 4809 ou 4810 - Outros papéis, cartões, pasta ("ouate") de celulose e mantas de fibras de celulose - Outros');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (48119020000, '48119020','   ', 'Papel e cartão; obras de pasta de celulose, de papel ou de cartão - Papel, cartão, pasta (“ouate”) de celulose e mantas de fibras de celulose, revestidos, impregnados, recobertos, coloridos à superfície, decorados à superfície ou impressos, em rolos ou ...', 1, '481190', 2805800, 'Papel e cartão; obras de pasta de celulose, de papel ou de cartão - Papel, cartão, pasta (“ouate”) de celulose e mantas de fibras de celulose, revestidos, impregnados, recobertos, coloridos à superfície, decorados à superfície ou impressos, em rolos ou em folhas de forma quadrada ou retangular, de quaisquer dimensões, exceto os produtos dos tipos descritos nos textos das posições 4803, 4809 ou 4810 - Outros papéis, cartões, pasta ("ouate") de celulose e mantas de fibras de celulose - Outros, impregnados e revestidos em ambas as faces com látex numa proporção total, em peso, igual ou superior a 15 %, de peso igual ou superior a 105 g/m2, mas não superior a 135 g/m2, do tipo utilizado como suporte para fabricação de abrasivos (lixas), em rolos');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (74094011000, '74094011','   ', 'Cobre e suas obras - Chapas e tiras, de cobre, de espessura superior a 0,15mm - De ligas à base de cobreníquel (cuproníquel) ou de cobreníquelzinco (“maillechort”) - De liga de cobreniquelsilício, galvanizadas', 1, '740940', 0, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (74094019000, '74094019','   ', 'Cobre e suas obras - Chapas e tiras, de cobre, de espessura superior a 0,15mm - De ligas à base de cobreníquel (cuproníquel) ou de cobreníquelzinco (“maillechort”) - Outras', 1, '740940', 0, ' ');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (84502020000, '84502020','   ', 'Reatores nucleares, caldeiras, máquinas, aparelhos e instrumentos mecânicos, e suas partes - Máquinas de lavar roupa, mesmo com dispositivos de secagem - Máquinas de capacidade superior a 10kg, em peso de roupa seca - Outras máquinas, de capacidade não ...', 1, '845020', 2806300, 'Reatores nucleares, caldeiras, máquinas, aparelhos e instrumentos mecânicos, e suas partes - Máquinas de lavar roupa, mesmo com dispositivos de secagem - Máquinas de capacidade superior a 10kg, em peso de roupa seca - Outras máquinas, de capacidade não superior a 18 kg');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (85043193000, '85043193','   ', 'Máquinas, aparelhos e materiais elétricos, e suas partes; aparelhos de gravação ou de reprodução de som, aparelhos de gravação ou de reprodução de imagens e de som em televisão, e suas partes e acessórios - Transformadoreselétricos,conversoreselétricose...', 1, '8504319', 2806300, 'Máquinas, aparelhos e materiais elétricos, e suas partes; aparelhos de gravação ou de reprodução de som, aparelhos de gravação ou de reprodução de imagens e de som em televisão, e suas partes e acessórios - Transformadoreselétricos,conversoreselétricosestáticos(retificadores,por exemplo), bobinas de reatância e de auto-indução. - Outros transformadores: - De potência não superior a 1 kVA - Outros - Outros, de largura e comprimento não superior a 50 mm e altura não superior a 25 mm, próprios para montagem por inserção (PTH - Pin Through Hole) ou montagem em superfície (SMD - Surface Mounted Device)');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (85045010000, '85045010','   ', 'Máquinas, aparelhos e materiais elétricos, e suas partes; aparelhos de gravação ou de reprodução de som, aparelhos de gravação ou de reprodução de imagens e de som em televisão, e suas partes e acessórios - Transformadoreselétricos,conversoreselétricose...', 1, '850450', 2806300, 'Máquinas, aparelhos e materiais elétricos, e suas partes; aparelhos de gravação ou de reprodução de som, aparelhos de gravação ou de reprodução de imagens e de som em televisão, e suas partes e acessórios - Transformadoreselétricos,conversoreselétricosestáticos(retificadores,por exemplo), bobinas de reatância e de auto-indução. - De largura e comprimento não superior a 45 mm e altura não superior a 30 mm, próprias para montagem por inserção (PTH - Pin Through Hole) ou montagem em superfície (SMD - Surface Mounted Device)');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (85045090000, '85045090','   ', 'Máquinas, aparelhos e materiais elétricos, e suas partes; aparelhos de gravação ou de reprodução de som, aparelhos de gravação ou de reprodução de imagens e de som em televisão, e suas partes e acessórios - Transformadoreselétricos,conversoreselétricose...', 1, '850450', 2806300, 'Máquinas, aparelhos e materiais elétricos, e suas partes; aparelhos de gravação ou de reprodução de som, aparelhos de gravação ou de reprodução de imagens e de som em televisão, e suas partes e acessórios - Transformadoreselétricos,conversoreselétricosestáticos(retificadores,por exemplo), bobinas de reatância e de auto-indução. - Outras');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (85059011000, '85059011','   ', 'Máquinas, aparelhos e materiais elétricos, e suas partes; aparelhos de gravação ou de reprodução de som, aparelhos de gravação ou de reprodução de imagens e de som em televisão, e suas partes e acessórios - Eletroímãs; ímãs permanentes e artefatos desti...', 1, '850590', 2806300, 'Máquinas, aparelhos e materiais elétricos, e suas partes; aparelhos de gravação ou de reprodução de som, aparelhos de gravação ou de reprodução de imagens e de som em televisão, e suas partes e acessórios - Eletroímãs; ímãs permanentes e artefatos destinados a tornaremse ímãs permanentes após magnetização; placas, mandris e dispositivos semelhantes, magnéticos ou eletromagnéticos, de fixação; acoplamentos, embreagens, variadores de velocidade e freios, eletromagnéticos; cabeças de elevação eletromagnéticas - Outros, incluídas as partes - Do tipo utilizado em aparelhos de diagnóstico de imagem por ressonância magnética');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (85059019000, '85059019','   ', 'Máquinas, aparelhos e materiais elétricos, e suas partes; aparelhos de gravação ou de reprodução de som, aparelhos de gravação ou de reprodução de imagens e de som em televisão, e suas partes e acessórios - Eletroímãs; ímãs permanentes e artefatos desti...', 1, '850590', 2806300, 'Máquinas, aparelhos e materiais elétricos, e suas partes; aparelhos de gravação ou de reprodução de som, aparelhos de gravação ou de reprodução de imagens e de som em televisão, e suas partes e acessórios - Eletroímãs; ímãs permanentes e artefatos destinados a tornaremse ímãs permanentes após magnetização; placas, mandris e dispositivos semelhantes, magnéticos ou eletromagnéticos, de fixação; acoplamentos, embreagens, variadores de velocidade e freios, eletromagnéticos; cabeças de elevação eletromagnéticas - Outros, incluídas as partes - Outros');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (85441911000, '85441911','   ', 'Máquinas, aparelhos e materiais elétricos, e suas partes; aparelhos de gravação ou de reprodução de som, aparelhos de gravação ou de reprodução de imagens e de som em televisão, e suas partes e acessórios - Fios, cabos (incluídos os cabos coaxiais) e ou...', 1, '854419', 2806300, 'Máquinas, aparelhos e materiais elétricos, e suas partes; aparelhos de gravação ou de reprodução de som, aparelhos de gravação ou de reprodução de imagens e de som em televisão, e suas partes e acessórios - Fios, cabos (incluídos os cabos coaxiais) e outros condutores, isolados para usos elétricos (incluídos os envernizados ou oxidados anodicamente), mesmo com peças de conexão; cabos de fibras ópticas, constituídos de fibras embainhadas individualmente, mesmo com condutores elétricos ou munidos de peças de conexão - Fios para bobinar: - Outros - Revestido de cobre (CCA - Copper Clad Aluminum)');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (85441919000, '85441919','   ', 'Máquinas, aparelhos e materiais elétricos, e suas partes; aparelhos de gravação ou de reprodução de som, aparelhos de gravação ou de reprodução de imagens e de som em televisão, e suas partes e acessórios - Fios, cabos (incluídos os cabos coaxiais) e ou...', 1, '854419', 2806300, 'Máquinas, aparelhos e materiais elétricos, e suas partes; aparelhos de gravação ou de reprodução de som, aparelhos de gravação ou de reprodução de imagens e de som em televisão, e suas partes e acessórios - Fios, cabos (incluídos os cabos coaxiais) e outros condutores, isolados para usos elétricos (incluídos os envernizados ou oxidados anodicamente), mesmo com peças de conexão; cabos de fibras ópticas, constituídos de fibras embainhadas individualmente, mesmo com condutores elétricos ou munidos de peças de conexão - Fios para bobinar: - Outros - Outros');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (90029010000, '90029010','   ', 'Instrumentos e aparelhos de óptica, fotografia ou cinematografia, medida, controle ou de precisão; instrumentos e aparelhos médico-cirúrgicos; suas partes e acessórios - Lentes,prismas,espelhoseoutroselementosdeóptica,dequalquermatéria, montados,parains...', 1, '900290', 2805800, 'Instrumentos e aparelhos de óptica, fotografia ou cinematografia, medida, controle ou de precisão; instrumentos e aparelhos médico-cirúrgicos; suas partes e acessórios - Lentes,prismas,espelhoseoutroselementosdeóptica,dequalquermatéria, montados,parainstrumentosouaparelhos,excetoosdevidronãotrabalhado opticamente. - Comutadores (switches) optomecânicos, do tipo utilizado em redes ópticas de transmissão de dados, próprios para montagem por inserção (PTH - Pin Through Hole)');
INSERT INTO SINCMS (idNcm, ncm, excecaoTipi, descricao, ativo, grupoNcm, cest, observacoes) VALUES (90029090000, '90029090','   ', 'Instrumentos e aparelhos de óptica, fotografia ou cinematografia, medida, controle ou de precisão; instrumentos e aparelhos médico-cirúrgicos; suas partes e acessórios - Lentes,prismas,espelhoseoutroselementosdeóptica,dequalquermatéria, montados,parains...', 1, '900290', 2805800, 'Instrumentos e aparelhos de óptica, fotografia ou cinematografia, medida, controle ou de precisão; instrumentos e aparelhos médico-cirúrgicos; suas partes e acessórios - Lentes,prismas,espelhoseoutroselementosdeóptica,dequalquermatéria, montados,parainstrumentosouaparelhos,excetoosdevidronãotrabalhado opticamente. - Outros');

COMMIT;

INSERT INTO SIAREASMENU (areaMenu, descricao, ativo, observacoes) values (80, 'Contábil', 1, ' ');

COMMIT;

INSERT INTO SICATEGORIASMENU (categoriaMenu, descricao, ativo, ordenacao, observacoes) values (60, 'Contratos', 1, 60, ' ');

COMMIT;

UPDATE SIMENUS SET areaMenu = 80, ordenacao = 8060001320 WHERE menu = 132;
UPDATE SIMENUS SET areaMenu = 80, ordenacao = 8060001330 WHERE menu = 133;
UPDATE SIMENUS SET areaMenu = 80, ordenacao = 8080001340 WHERE menu = 134;
UPDATE SIMENUS SET areaMenu = 80, ordenacao = 8060001350 WHERE menu = 135;
UPDATE SIMENUS SET areaMenu = 80, ordenacao = 8060009110 WHERE menu = 911;
UPDATE SIMENUS SET areaMenu = 80, ordenacao = 8090009150 WHERE menu = 915;
UPDATE SIMENUS SET areaMenu = 80, ordenacao = 8090009160 WHERE menu = 916;
UPDATE SIMENUS SET areaMenu = 80, ordenacao = 8090009170 WHERE menu = 917;
UPDATE SIMENUS SET areaMenu = 80, ordenacao = 8090009180 WHERE menu = 918;
UPDATE SIMENUS SET areaMenu = 80, ordenacao = 8060009190 WHERE menu = 919;
UPDATE SIMENUS SET areaMenu = 80, ordenacao = 8080009200 WHERE menu = 920;
UPDATE SIMENUS SET areaMenu = 80, ordenacao = 8080009210 WHERE menu = 921;
UPDATE SIMENUS SET areaMenu = 80, ordenacao = 8080009220 WHERE menu = 922;
UPDATE SIMENUS SET areaMenu = 80, ordenacao = 8080009230 WHERE menu = 923;
UPDATE SIMENUS SET areaMenu = 80, ordenacao = 8060009240 WHERE menu = 924;
UPDATE SIMENUS SET areaMenu = 80, ordenacao = 8010009380 WHERE menu = 938;
UPDATE SIMENUS SET areaMenu = 80, ordenacao = 8010009390 WHERE menu = 939;

COMMIT;

INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (940, 'Razão', 1,85040009400, 80, 'REL', 0, 940, '%SYS_DIR%Versoes\%SYS_VER%\Relatorios.ecf', 'RelRazao', ' ', 0, 0, NULL, ' ');
INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (941, 'Balancete', 1,85040009410, 80, 'REL', 0, 941, '%SYS_DIR%Versoes\%SYS_VER%\Relatorios.ecf', 'RelBalancete', ' ', 0, 0, NULL, ' ');

COMMIT;

-- SIMODALIDADESCONTRATO
CREATE TABLE SIMODALIDADESCONTRATO
  (
    modalidadeContrato CHAR (1) DEFAULT ' ' NOT NULL,
    descricao          VARCHAR (60) DEFAULT ' ' NOT NULL,
    ativo              NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes        VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE SIMODALIDADESCONTRATO ADD CONSTRAINT SIMODALIDADESCONTRATO_PK1 PRIMARY KEY (modalidadeContrato);
CREATE INDEX SIMODALIDADESCONTRATO_K2 ON SIMODALIDADESCONTRATO (descricao);

INSERT INTO SIMODALIDADESCONTRATO (modalidadeContrato, descricao, ativo, observacoes) VALUES (' ', 'SELECIONE', 1, ' ');
INSERT INTO SIMODALIDADESCONTRATO (modalidadeContrato, descricao, ativo, observacoes) VALUES ('A', 'Antecipado', 1, ' ');
INSERT INTO SIMODALIDADESCONTRATO (modalidadeContrato, descricao, ativo, observacoes) VALUES ('R', 'Retroativo', 1, ' ');

COMMIT;

-- SIFATURAMENTOITEMCONTRATO
CREATE TABLE SIFATURAMENTOITEMCONTRATO
  (
    faturamentoItemContrato CHAR (1) DEFAULT ' ' NOT NULL,
    descricao               VARCHAR (60) DEFAULT ' ' NOT NULL,
    ativo                   NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes             VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE SIFATURAMENTOITEMCONTRATO ADD CONSTRAINT SIFATURAMENTOITEMCONTRATO_PK1 PRIMARY KEY (faturamentoItemContrato);
CREATE INDEX SIFATURAMENTOITEMCONTRATO_K2 ON SIFATURAMENTOITEMCONTRATO (descricao);

INSERT INTO SIFATURAMENTOITEMCONTRATO (faturamentoItemContrato, descricao, ativo, observacoes) VALUES (' ', 'SELECIONE', 1, ' ');
INSERT INTO SIFATURAMENTOITEMCONTRATO (faturamentoItemContrato, descricao, ativo, observacoes) VALUES ('P', 'Período', 1, ' ');
INSERT INTO SIFATURAMENTOITEMCONTRATO (faturamentoItemContrato, descricao, ativo, observacoes) VALUES ('Q', 'Quantidade Saldo', 1, ' ');

COMMIT;

-- SIPERIODICIDADECONTRATO
CREATE TABLE SIPERIODICIDADECONTRATO
  (
    periodicidadeContrato CHAR (1) DEFAULT ' ' NOT NULL,
    ordenacao             NUMERIC (11,0) DEFAULT 0 NOT NULL,
    descricao             VARCHAR (256) DEFAULT ' ' NOT NULL,
    ativo                 NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes           VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE SIPERIODICIDADECONTRATO ADD CONSTRAINT SIPERIODICIDADECONTRATO_PK1 PRIMARY KEY (periodicidadeContrato);
CREATE INDEX SIPERIODICIDADECONTRATO_K2 ON SIPERIODICIDADECONTRATO (descricao);
CREATE INDEX SIPERIODICIDADECONTRATO_K3 ON SIPERIODICIDADECONTRATO (ordenacao, periodicidadeContrato);

INSERT INTO SIPERIODICIDADECONTRATO (periodicidadeContrato, ordenacao, descricao, ativo, observacoes) values (' ', 0, 'SELECIONE', 1, ' ');
INSERT INTO SIPERIODICIDADECONTRATO (periodicidadeContrato, ordenacao, descricao, ativo, observacoes) values ('M', 1, 'Mensal', 1, ' ');
INSERT INTO SIPERIODICIDADECONTRATO (periodicidadeContrato, ordenacao, descricao, ativo, observacoes) values ('T', 2, 'Trimestral', 1, ' ');
INSERT INTO SIPERIODICIDADECONTRATO (periodicidadeContrato, ordenacao, descricao, ativo, observacoes) values ('S', 3, 'Semestral', 1, ' ');
INSERT INTO SIPERIODICIDADECONTRATO (periodicidadeContrato, ordenacao, descricao, ativo, observacoes) values ('A', 4, 'Anual', 1, ' ');

COMMIT;

-- SISITUACOESCONTRATO
CREATE TABLE SISITUACOESCONTRATO
  (
    situacaoContrato CHAR (1) DEFAULT ' ' NOT NULL,
    ordenacao        NUMERIC (11,0) DEFAULT 0 NOT NULL,
    descricao        VARCHAR (256) DEFAULT ' ' NOT NULL,
    ativo            NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes      VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE SISITUACOESCONTRATO ADD CONSTRAINT SISITUACOESCONTRATO_PK1 PRIMARY KEY (situacaoContrato);
CREATE INDEX SISITUACOESCONTRATO_K2 ON SISITUACOESCONTRATO (descricao);
CREATE INDEX SISITUACOESCONTRATO_K3 ON SISITUACOESCONTRATO (ordenacao, situacaoContrato);

INSERT INTO SISITUACOESCONTRATO (situacaoContrato, ordenacao, descricao, ativo, observacoes) values (' ', 0, 'SELECIONE', 1, ' ');
INSERT INTO SISITUACOESCONTRATO (situacaoContrato, ordenacao, descricao, ativo, observacoes) values ('P', 1, 'Pendente', 1, ' ');
INSERT INTO SISITUACOESCONTRATO (situacaoContrato, ordenacao, descricao, ativo, observacoes) values ('S', 2, 'Suspenso', 1, ' ');
INSERT INTO SISITUACOESCONTRATO (situacaoContrato, ordenacao, descricao, ativo, observacoes) values ('E', 3, 'Encerrado', 1, ' ');
INSERT INTO SISITUACOESCONTRATO (situacaoContrato, ordenacao, descricao, ativo, observacoes) values ('C', 4, 'Cancelado', 1, ' ');

COMMIT;

-- PACOBERTURASCONTRATOS
CREATE TABLE PACOBERTURASCONTRATOS
  (
    coberturaContrato NUMERIC (4,0) DEFAULT 0 NOT NULL,
    descricao         VARCHAR (120) DEFAULT ' ' NOT NULL,
    ativo             NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes       VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PACOBERTURASCONTRATOS ADD CONSTRAINT PACOBERTURASCONTRATOS_PK1 PRIMARY KEY (coberturaContrato);
CREATE INDEX PACOBERTURASCONTRATOS_K2 ON PACOBERTURASCONTRATOS (descricao);

INSERT INTO PACOBERTURASCONTRATOS (coberturaContrato, descricao, ativo, observacoes) VALUES (0, 'SELECIONE', 1, ' ');

COMMIT;

-- PAMODELOSCONTRATO
CREATE TABLE PAMODELOSCONTRATO
  (
    modeloContrato             NUMERIC (4,0) DEFAULT 0 NOT NULL,
    descricao                  VARCHAR (120) DEFAULT ' ' NOT NULL,
    ativo                      NUMERIC (1,0) DEFAULT 0 NOT NULL,
    modeloDocumento            NUMERIC (4,0) DEFAULT 0 NOT NULL,
    indexador                  VARCHAR (10) DEFAULT ' ' NOT NULL,
    modalidadeContrato         CHAR (1) DEFAULT ' ' NOT NULL,
    faturamentoItemContrato    CHAR (1) DEFAULT ' ' NOT NULL,
    periodicidadeContrato      CHAR (1) DEFAULT ' ' NOT NULL,
    coberturaContrato          NUMERIC (4,0) DEFAULT 0 NOT NULL,
    condicaoPagamento          NUMERIC (4,0) DEFAULT 0 NOT NULL,
    tipoDocumentoFaturamento   NUMERIC (3,0) DEFAULT 0 NOT NULL,
    descInformacaoComplementar VARCHAR (800) DEFAULT ' ' NOT NULL,
    observacoes                VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PAMODELOSCONTRATO ADD CONSTRAINT PAMODELOSCONTRATO_PK1 PRIMARY KEY (modeloContrato);
CREATE INDEX PAMODELOSCONTRATO_K2 ON PAMODELOSCONTRATO (descricao);
ALTER TABLE PAMODELOSCONTRATO ADD CONSTRAINT PAMODELOSCONTRATO_FK1 FOREIGN KEY (modeloDocumento) REFERENCES PAMODELOSDOCUMENTO (modeloDocumento);
ALTER TABLE PAMODELOSCONTRATO ADD CONSTRAINT PAMODELOSCONTRATO_FK2 FOREIGN KEY (indexador) REFERENCES PAINDEXADORES (indexador);
ALTER TABLE PAMODELOSCONTRATO ADD CONSTRAINT PAMODELOSCONTRATO_FK3 FOREIGN KEY (modalidadeContrato) REFERENCES SIMODALIDADESCONTRATO (modalidadeContrato);
ALTER TABLE PAMODELOSCONTRATO ADD CONSTRAINT PAMODELOSCONTRATO_FK4 FOREIGN KEY (faturamentoItemContrato) REFERENCES SIFATURAMENTOITEMCONTRATO (faturamentoItemContrato);
ALTER TABLE PAMODELOSCONTRATO ADD CONSTRAINT PAMODELOSCONTRATO_FK5 FOREIGN KEY (periodicidadeContrato) REFERENCES SIPERIODICIDADECONTRATO (periodicidadeContrato);
ALTER TABLE PAMODELOSCONTRATO ADD CONSTRAINT PAMODELOSCONTRATO_FK6 FOREIGN KEY (coberturaContrato) REFERENCES PACOBERTURASCONTRATOS (coberturaContrato);
ALTER TABLE PAMODELOSCONTRATO ADD CONSTRAINT PAMODELOSCONTRATO_FK7 FOREIGN KEY (condicaoPagamento) REFERENCES PACONDICOESPAGAMENTO (condicaoPagamento);
ALTER TABLE PAMODELOSCONTRATO ADD CONSTRAINT PAMODELOSCONTRATO_FK8 FOREIGN KEY (tipoDocumentoFaturamento) REFERENCES SITIPOSDOCUMENTO (tipoDocumento);

INSERT INTO PAMODELOSCONTRATO (modeloContrato, descricao, ativo, modeloDocumento, indexador, modalidadeContrato, faturamentoItemContrato, periodicidadeContrato, coberturaContrato, condicaoPagamento, tipoDocumentoFaturamento, descInformacaoComplementar, observacoes) VALUES (0, 'SELECIONE', 1, 0, ' ', ' ', ' ', ' ', 0, 0, 0, ' ', ' ');

COMMIT;

ALTER TABLE PAMODELOSCONTRATO DROP CONSTRAINT PAMODELOSCONTRATO_FK8;
ALTER TABLE PAMODELOSDOCUMENTO DROP CONSTRAINT PAMODELOSDOCUMENTO_FK17;
ALTER TABLE PAMODELOSDOCUMENTO DROP CONSTRAINT PAMODELOSDOCUMENTO_FK19;
ALTER TABLE PACONTROLESENTREGA DROP CONSTRAINT PACONTROLESENTREGA_FK9;
ALTER TABLE MOORCAMENTOS DROP CONSTRAINT MOORCAMENTOS_FK2;
ALTER TABLE MOPREDOCUMENTOS DROP CONSTRAINT MOPREDOCUMENTOS_FK2;
ALTER TABLE MODOCUMENTOSFISCAIS DROP CONSTRAINT MODOCUMENTOSFISCAIS_FK2;
ALTER TABLE MODISTRIBUICOESDFE DROP CONSTRAINT MODISTRIBUICOESDFE_FK2;
ALTER TABLE MOSEPARACOES DROP CONSTRAINT MOSEPARACOES_FK4;
ALTER TABLE MODOCUMENTOSTRANSFERENCIA DROP CONSTRAINT MODOCUMENTOSTRANSFERENCIA_FK8;
ALTER TABLE MODOCUMENTOSTRANSFERENCIA DROP CONSTRAINT MODOCUMENTOSTRANSFERENCIA_FK9;
ALTER TABLE MOMOTIVOSBLOQUEIOS DROP CONSTRAINT MOMOTIVOSBLOQUEIOS_FK1;
ALTER TABLE MOINGRESSOS DROP CONSTRAINT MOINGRESSOS_FK2;

DROP TABLE SITIPOSDOCUMENTO;

-- SITIPOSDOCUMENTO
CREATE TABLE SITIPOSDOCUMENTO
  (
    tipoDocumento              NUMERIC (3,0) DEFAULT 0 NOT NULL,
    descricao                  VARCHAR (60) DEFAULT ' ' NOT NULL,
    abreviacao                 VARCHAR (11) DEFAULT ' ' NOT NULL,
    ativo                      NUMERIC (1,0) DEFAULT 0 NOT NULL,
    entradaSaida               CHAR (1) DEFAULT ' ' NOT NULL,
    permiteTransferencia       NUMERIC (1,0) DEFAULT 0 NOT NULL,
    permiteRemessaLogistica    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    permiteFaturamentoContrato NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes                VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE SITIPOSDOCUMENTO ADD CONSTRAINT SITIPOSDOCUMENTO_PK1 PRIMARY KEY (tipoDocumento);
CREATE INDEX SITIPOSDOCUMENTO_K2 ON SITIPOSDOCUMENTO (descricao);
ALTER TABLE SITIPOSDOCUMENTO ADD CONSTRAINT SITIPOSDOCUMENTO_FK1 FOREIGN KEY (entradaSaida) REFERENCES SIENTRADASAIDA (entradaSaida);

INSERT INTO SITIPOSDOCUMENTO (tipoDocumento, descricao, abreviacao, ativo, entradaSaida, permiteTransferencia, permiteRemessaLogistica, permiteFaturamentoContrato, observacoes) values (0, 'SELECIONE', ' ', 1, ' ', 1, 1, 1, ' ');
INSERT INTO SITIPOSDOCUMENTO (tipoDocumento, descricao, abreviacao, ativo, entradaSaida, permiteTransferencia, permiteRemessaLogistica, permiteFaturamentoContrato, observacoes) values (1, 'Não Considera Saída', 'Sem Doc.S.', 1, 'S', 1, 0, 0, ' ');
INSERT INTO SITIPOSDOCUMENTO (tipoDocumento, descricao, abreviacao, ativo, entradaSaida, permiteTransferencia, permiteRemessaLogistica, permiteFaturamentoContrato, observacoes) values (2, 'Não Considera Entrada', 'Sem Doc.E.', 1, 'E', 1, 0, 0, ' ');
INSERT INTO SITIPOSDOCUMENTO (tipoDocumento, descricao, abreviacao, ativo, entradaSaida, permiteTransferencia, permiteRemessaLogistica, permiteFaturamentoContrato, observacoes) values (101, 'Orçamento', 'Orçamento', 1, 'S', 1, 0, 0, ' ');
INSERT INTO SITIPOSDOCUMENTO (tipoDocumento, descricao, abreviacao, ativo, entradaSaida, permiteTransferencia, permiteRemessaLogistica, permiteFaturamentoContrato, observacoes) values (102, 'Ordem Serviço', 'Ord. Serv.', 1, 'S', 0, 0, 0, ' ');
INSERT INTO SITIPOSDOCUMENTO (tipoDocumento, descricao, abreviacao, ativo, entradaSaida, permiteTransferencia, permiteRemessaLogistica, permiteFaturamentoContrato, observacoes) values (103, 'Fatura Contrato', 'Fat.Contr.', 1, 'S', 0, 0, 0, ' ');
INSERT INTO SITIPOSDOCUMENTO (tipoDocumento, descricao, abreviacao, ativo, entradaSaida, permiteTransferencia, permiteRemessaLogistica, permiteFaturamentoContrato, observacoes) values (201, 'Pedido Compra', 'Ped.Compra', 1, 'E', 1, 0, 0, ' ');
INSERT INTO SITIPOSDOCUMENTO (tipoDocumento, descricao, abreviacao, ativo, entradaSaida, permiteTransferencia, permiteRemessaLogistica, permiteFaturamentoContrato, observacoes) values (301, 'Pré-Documento Saída', 'Pré.Doc.S.', 1, 'S', 1, 1, 1, ' ');
INSERT INTO SITIPOSDOCUMENTO (tipoDocumento, descricao, abreviacao, ativo, entradaSaida, permiteTransferencia, permiteRemessaLogistica, permiteFaturamentoContrato, observacoes) values (302, 'Devolução de Pré-Documento Entrada', 'Dev.Pré.E.', 1, 'S', 0, 0, 0, ' ');
INSERT INTO SITIPOSDOCUMENTO (tipoDocumento, descricao, abreviacao, ativo, entradaSaida, permiteTransferencia, permiteRemessaLogistica, permiteFaturamentoContrato, observacoes) values (401, 'Pré-Documento Entrada', 'Pré.Doc.E.', 1, 'E', 1, 0, 0, ' ');
INSERT INTO SITIPOSDOCUMENTO (tipoDocumento, descricao, abreviacao, ativo, entradaSaida, permiteTransferencia, permiteRemessaLogistica, permiteFaturamentoContrato, observacoes) values (402, 'Devolução de Pré-Documento Saída', 'Dev.Pré.S.', 1, 'E', 0, 0, 0, ' ');
INSERT INTO SITIPOSDOCUMENTO (tipoDocumento, descricao, abreviacao, ativo, entradaSaida, permiteTransferencia, permiteRemessaLogistica, permiteFaturamentoContrato, observacoes) values (501, 'Nota Fiscal Saída', 'NF Saída', 1, 'S', 1, 1, 1, ' ');
INSERT INTO SITIPOSDOCUMENTO (tipoDocumento, descricao, abreviacao, ativo, entradaSaida, permiteTransferencia, permiteRemessaLogistica, permiteFaturamentoContrato, observacoes) values (502, 'Devolução de Nota Fiscal Entrada', 'Dev.Doc.E.', 1, 'S', 0, 0, 0, ' ');
INSERT INTO SITIPOSDOCUMENTO (tipoDocumento, descricao, abreviacao, ativo, entradaSaida, permiteTransferencia, permiteRemessaLogistica, permiteFaturamentoContrato, observacoes) values (503, 'NFC-e', 'NFCe Saída', 1, 'S', 0, 1, 0, ' ');
INSERT INTO SITIPOSDOCUMENTO (tipoDocumento, descricao, abreviacao, ativo, entradaSaida, permiteTransferencia, permiteRemessaLogistica, permiteFaturamentoContrato, observacoes) values (504, 'Cupom Fiscal', 'Cupom Fisc', 1, 'S', 0, 0, 0, ' ');
INSERT INTO SITIPOSDOCUMENTO (tipoDocumento, descricao, abreviacao, ativo, entradaSaida, permiteTransferencia, permiteRemessaLogistica, permiteFaturamentoContrato, observacoes) values (505, 'MDF-e Manifesto Documentos Fiscais Eletrônico', 'MDFe Saída', 1, 'S', 0, 0, 0, ' ');
INSERT INTO SITIPOSDOCUMENTO (tipoDocumento, descricao, abreviacao, ativo, entradaSaida, permiteTransferencia, permiteRemessaLogistica, permiteFaturamentoContrato, observacoes) values (506, 'NFS-e', 'NFSe Saída', 1, 'S', 0, 0, 0, ' ');
INSERT INTO SITIPOSDOCUMENTO (tipoDocumento, descricao, abreviacao, ativo, entradaSaida, permiteTransferencia, permiteRemessaLogistica, permiteFaturamentoContrato, observacoes) values (551, 'Estorno de Nota Fiscal de Entrada', 'Estorno Ent', 1, 'S', 0, 0, 0, ' ');
INSERT INTO SITIPOSDOCUMENTO (tipoDocumento, descricao, abreviacao, ativo, entradaSaida, permiteTransferencia, permiteRemessaLogistica, permiteFaturamentoContrato, observacoes) values (601, 'Nota Fiscal Entrada', 'NF Entrada', 1, 'E', 1, 0, 0, ' ');
INSERT INTO SITIPOSDOCUMENTO (tipoDocumento, descricao, abreviacao, ativo, entradaSaida, permiteTransferencia, permiteRemessaLogistica, permiteFaturamentoContrato, observacoes) values (602, 'Devolução Venda', 'Dev.Doc.S.', 1, 'E', 0, 0, 0, ' ');
INSERT INTO SITIPOSDOCUMENTO (tipoDocumento, descricao, abreviacao, ativo, entradaSaida, permiteTransferencia, permiteRemessaLogistica, permiteFaturamentoContrato, observacoes) values (603, 'Nota Fiscal Entrada - Importação XML', 'NF Entrada', 1, 'E', 1, 0, 0, ' ');
INSERT INTO SITIPOSDOCUMENTO (tipoDocumento, descricao, abreviacao, ativo, entradaSaida, permiteTransferencia, permiteRemessaLogistica, permiteFaturamentoContrato, observacoes) values (604, 'Conhecimento Transporte Eletrônico - Importação XML', 'CT-e Entr.', 1, 'E', 0, 0, 0, ' ');
INSERT INTO SITIPOSDOCUMENTO (tipoDocumento, descricao, abreviacao, ativo, entradaSaida, permiteTransferencia, permiteRemessaLogistica, permiteFaturamentoContrato, observacoes) values (651, 'Estorno de Nota Fiscal de Saída', 'Estorno Sai', 1, 'E', 0, 0, 0, ' ');
INSERT INTO SITIPOSDOCUMENTO (tipoDocumento, descricao, abreviacao, ativo, entradaSaida, permiteTransferencia, permiteRemessaLogistica, permiteFaturamentoContrato, observacoes) values (801, 'Integração Site', 'Integ.Site', 1, 'S', 0, 0, 0, ' ');
INSERT INTO SITIPOSDOCUMENTO (tipoDocumento, descricao, abreviacao, ativo, entradaSaida, permiteTransferencia, permiteRemessaLogistica, permiteFaturamentoContrato, observacoes) values (802, 'Lote Ingresso', 'Lote Ingr.', 1, 'S', 0, 0, 0, ' ');
INSERT INTO SITIPOSDOCUMENTO (tipoDocumento, descricao, abreviacao, ativo, entradaSaida, permiteTransferencia, permiteRemessaLogistica, permiteFaturamentoContrato, observacoes) values (803, 'Documento Transferência', 'Transf.', 1, 'S', 0, 0, 0, ' ');
INSERT INTO SITIPOSDOCUMENTO (tipoDocumento, descricao, abreviacao, ativo, entradaSaida, permiteTransferencia, permiteRemessaLogistica, permiteFaturamentoContrato, observacoes) values (804, 'Balanço Estoque', 'Balanço', 1, 'S', 0, 0, 0, ' ');
INSERT INTO SITIPOSDOCUMENTO (tipoDocumento, descricao, abreviacao, ativo, entradaSaida, permiteTransferencia, permiteRemessaLogistica, permiteFaturamentoContrato, observacoes) values (805, 'Contrato', 'Contrato', 1, 'S', 0, 0, 0, ' ');
INSERT INTO SITIPOSDOCUMENTO (tipoDocumento, descricao, abreviacao, ativo, entradaSaida, permiteTransferencia, permiteRemessaLogistica, permiteFaturamentoContrato, observacoes) values (901, 'Movimento Avulso Saída', 'Mov. Saída', 1, 'S', 1, 0, 0, ' ');
INSERT INTO SITIPOSDOCUMENTO (tipoDocumento, descricao, abreviacao, ativo, entradaSaida, permiteTransferencia, permiteRemessaLogistica, permiteFaturamentoContrato, observacoes) values (902, 'Movimento Avulso Entrada', 'Mov. Entr.', 1, 'E', 1, 0, 0, ' ');
INSERT INTO SITIPOSDOCUMENTO (tipoDocumento, descricao, abreviacao, ativo, entradaSaida, permiteTransferencia, permiteRemessaLogistica, permiteFaturamentoContrato, observacoes) values (903, 'Inventário Estoque Gerencial', 'Inv.Est.Ger', 1, 'E', 0, 0, 0, ' ');
INSERT INTO SITIPOSDOCUMENTO (tipoDocumento, descricao, abreviacao, ativo, entradaSaida, permiteTransferencia, permiteRemessaLogistica, permiteFaturamentoContrato, observacoes) values (904, 'Inventário Estoque Fiscal', 'Inv.Est.Fis', 1, 'E', 0, 0, 0, ' ');

COMMIT;

ALTER TABLE PAMODELOSCONTRATO ADD CONSTRAINT PAMODELOSCONTRATO_FK8 FOREIGN KEY (tipoDocumentoFaturamento) REFERENCES SITIPOSDOCUMENTO (tipoDocumento);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK17 FOREIGN KEY (transfTipoDocumentoSaida) REFERENCES SITIPOSDOCUMENTO (tipoDocumento);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK19 FOREIGN KEY (transfTipoDocumentoEntrada) REFERENCES SITIPOSDOCUMENTO (tipoDocumento);
ALTER TABLE PACONTROLESENTREGA ADD CONSTRAINT PACONTROLESENTREGA_FK9 FOREIGN KEY (tipoDocumentoEntrega) REFERENCES SITIPOSDOCUMENTO (tipoDocumento);
ALTER TABLE MOORCAMENTOS ADD CONSTRAINT MOORCAMENTOS_FK2 FOREIGN KEY (tipoDocumento) REFERENCES SITIPOSDOCUMENTO (tipoDocumento);
ALTER TABLE MOPREDOCUMENTOS ADD CONSTRAINT MOPREDOCUMENTOS_FK2 FOREIGN KEY (tipoDocumento) REFERENCES SITIPOSDOCUMENTO (tipoDocumento);
ALTER TABLE MODOCUMENTOSFISCAIS ADD CONSTRAINT MODOCUMENTOSFISCAIS_FK2 FOREIGN KEY (tipoDocumento) REFERENCES SITIPOSDOCUMENTO (tipoDocumento);
ALTER TABLE MODISTRIBUICOESDFE ADD CONSTRAINT MODISTRIBUICOESDFE_FK2 FOREIGN KEY (tipoDocumento) REFERENCES SITIPOSDOCUMENTO (tipoDocumento);
ALTER TABLE MOSEPARACOES ADD CONSTRAINT MOSEPARACOES_FK4 FOREIGN KEY (tipoDocumento) REFERENCES SITIPOSDOCUMENTO (tipoDocumento);
ALTER TABLE MODOCUMENTOSTRANSFERENCIA ADD CONSTRAINT MODOCUMENTOSTRANSFERENCIA_FK8 FOREIGN KEY (tipoDocumentoSaida) REFERENCES SITIPOSDOCUMENTO (tipoDocumento);
ALTER TABLE MODOCUMENTOSTRANSFERENCIA ADD CONSTRAINT MODOCUMENTOSTRANSFERENCIA_FK9 FOREIGN KEY (tipoDocumentoEntrada) REFERENCES SITIPOSDOCUMENTO (tipoDocumento);
ALTER TABLE MOMOTIVOSBLOQUEIOS ADD CONSTRAINT MOMOTIVOSBLOQUEIOS_FK1 FOREIGN KEY (tipoDocumento) REFERENCES SITIPOSDOCUMENTO (tipoDocumento);
ALTER TABLE MOINGRESSOS ADD CONSTRAINT MOINGRESSOS_FK2 FOREIGN KEY (tipoDocumento) REFERENCES SITIPOSDOCUMENTO (tipoDocumento);

CREATE TABLE PAETAPASORCAMENTO_2401 AS SELECT * FROM PAETAPASORCAMENTO;

ALTER TABLE PAMODELOSDOCUMENTO DROP CONSTRAINT PAMODELOSDOCUMENTO_FK18;
ALTER TABLE PAMODELOSDOCUMENTO DROP CONSTRAINT PAMODELOSDOCUMENTO_FK20;
ALTER TABLE PAETAPASORCAMENTODEPARA DROP CONSTRAINT PAETAPASORCAMENTODEPARA_FK4;
ALTER TABLE PAETAPASORCAMENTODEPARA DROP CONSTRAINT PAETAPASORCAMENTODEPARA_FK5;
ALTER TABLE PAETAPASORCAMENTOPERMITID DROP CONSTRAINT PAETAPASORCAMENTOPERMITID_FK4;
ALTER TABLE PAIMPRESSORAXDOCUMENTO DROP CONSTRAINT PAIMPRESSORAXDOCUMENTO_FK7;
ALTER TABLE MOORCAMENTOS DROP CONSTRAINT MOORCAMENTOS_FK30;
ALTER TABLE MOORCAMENTOXETAPAS DROP CONSTRAINT MOORCAMENTOXETAPAS_FK3;

DROP TABLE PAETAPASORCAMENTO;

-- PAETAPASORCAMENTO
CREATE TABLE PAETAPASORCAMENTO
  (
    etapaOrcamento                NUMERIC (4,0) DEFAULT 0 NOT NULL,
    descricao                     VARCHAR (60) DEFAULT ' ' NOT NULL,
    ativo                         NUMERIC (1,0) DEFAULT 0 NOT NULL,
    ordenacao                     NUMERIC (11,0) DEFAULT 0 NOT NULL,
    situacaoOrcamento             NUMERIC (2,0) DEFAULT 0 NOT NULL,
    financeiro                    CHAR (1) DEFAULT ' ' NOT NULL,
    transferencia                 CHAR (1) DEFAULT ' ' NOT NULL,
    habilitaImprimirManual        NUMERIC (1,0) DEFAULT 0 NOT NULL,
    imprimirTrocaEtapa            CHAR (1) DEFAULT ' ' NOT NULL,
    corLegenda                    NUMERIC (3,0) DEFAULT 0 NOT NULL,
    etapaObrigatoriaReceitaOculos NUMERIC (1,0) DEFAULT 0 NOT NULL,
    solicitarConfirmacao          NUMERIC (1,0) DEFAULT 0 NOT NULL,
    textoConfirmacao              VARCHAR (256) DEFAULT ' ' NOT NULL,
    enviarSms                     NUMERIC (1,0) DEFAULT 0 NOT NULL,
    enviarEmail                   NUMERIC (1,0) DEFAULT 0 NOT NULL,
    assuntoEmailSms               VARCHAR (256) DEFAULT ' ' NOT NULL,
    corpoEmail                    VARCHAR (4000) DEFAULT ' ' NOT NULL,
    informarEvento                NUMERIC (1,0) DEFAULT 0 NOT NULL,
    tipoEvento                    NUMERIC (4,0) DEFAULT 0 NOT NULL,
    validoOrcamento               NUMERIC (1,0) DEFAULT 0 NOT NULL,
    validoPedidoCompra            NUMERIC (1,0) DEFAULT 0 NOT NULL,
    validoOrdemServico            NUMERIC (1,0) DEFAULT 0 NOT NULL,
    validoContrato                NUMERIC (1,0) DEFAULT 0 NOT NULL,
    imprimirFinanceiro            NUMERIC (1,0) DEFAULT 0 NOT NULL,
    imprimirCondPagamentoSinal    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    imprimirCondPagamentoAReceber NUMERIC (1,0) DEFAULT 0 NOT NULL,
    imprimirObservacoesEtapa      NUMERIC (1,0) DEFAULT 0 NOT NULL,
    efetivarObservacoesEtapa      NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes                   VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PAETAPASORCAMENTO ADD CONSTRAINT PAETAPASORCAMENTO_PK1 PRIMARY KEY (etapaOrcamento);
CREATE INDEX PAETAPASORCAMENTO_K2 ON PAETAPASORCAMENTO (descricao);
CREATE INDEX PAETAPASORCAMENTO_K3 ON PAETAPASORCAMENTO (ordenacao, etapaOrcamento);
CREATE INDEX PAETAPASORCAMENTO_K4 ON PAETAPASORCAMENTO (situacaoOrcamento);
ALTER TABLE PAETAPASORCAMENTO ADD CONSTRAINT PAETAPASORCAMENTO_FK1 FOREIGN KEY (situacaoOrcamento) REFERENCES SISITUACOESORCAMENTO (situacaoOrcamento);
ALTER TABLE PAETAPASORCAMENTO ADD CONSTRAINT PAETAPASORCAMENTO_FK2 FOREIGN KEY (financeiro) REFERENCES SISOLICITAOBRIGANAOINFORMA (solicitaObrigaNaoInforma);
ALTER TABLE PAETAPASORCAMENTO ADD CONSTRAINT PAETAPASORCAMENTO_FK3 FOREIGN KEY (transferencia) REFERENCES SISOLICITAOBRIGANAOINFORMA (solicitaObrigaNaoInforma);
ALTER TABLE PAETAPASORCAMENTO ADD CONSTRAINT PAETAPASORCAMENTO_FK4 FOREIGN KEY (imprimirTrocaEtapa) REFERENCES SISIMNAOPERGUNTAR (simNaoPerguntar);
ALTER TABLE PAETAPASORCAMENTO ADD CONSTRAINT PAETAPASORCAMENTO_FK5 FOREIGN KEY (tipoEvento) REFERENCES PATIPOSEVENTO (tipoEvento);

INSERT INTO PAETAPASORCAMENTO (etapaOrcamento, descricao, ativo, ordenacao, situacaoOrcamento, financeiro, transferencia, habilitaImprimirManual, imprimirTrocaEtapa, corLegenda, etapaObrigatoriaReceitaOculos, solicitarConfirmacao, textoConfirmacao, enviarSms, enviarEmail, assuntoEmailSms, corpoEmail, informarEvento, tipoEvento, validoOrcamento, validoPedidoCompra, validoOrdemServico, validoContrato, imprimirFinanceiro, imprimirCondPagamentoSinal, imprimirCondPagamentoAReceber, imprimirObservacoesEtapa, efetivarObservacoesEtapa, observacoes) VALUES (0, 'SELECIONE', 1, 0, 0, ' ', ' ', 0, ' ', 0, 0, 0, ' ', 0, 0, ' ', ' ', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ' ');
INSERT INTO PAETAPASORCAMENTO (etapaOrcamento, descricao, ativo, ordenacao, situacaoOrcamento, financeiro, transferencia, habilitaImprimirManual, imprimirTrocaEtapa, corLegenda, etapaObrigatoriaReceitaOculos, solicitarConfirmacao, textoConfirmacao, enviarSms, enviarEmail, assuntoEmailSms, corpoEmail, informarEvento, tipoEvento, validoOrcamento, validoPedidoCompra, validoOrdemServico, validoContrato, imprimirFinanceiro, imprimirCondPagamentoSinal, imprimirCondPagamentoAReceber, imprimirObservacoesEtapa, efetivarObservacoesEtapa, observacoes) SELECT etapaOrcamento, descricao, ativo, ordenacao, situacaoOrcamento, financeiro, 'N', habilitaImprimirManual, imprimirTrocaEtapa, corLegenda, etapaObrigatoriaReceitaOculos, solicitarConfirmacao, textoConfirmacao, enviarSms, enviarEmail, assuntoEmailSms, corpoEmail, informarEvento, tipoEvento, validoOrcamento, validoPedidoCompra, validoOrdemServico, 0, imprimirFinanceiro, imprimirCondPagamentoSinal, imprimirCondPagamentoAReceber, imprimirObservacoesEtapa, efetivarObservacoesEtapa, observacoes FROM PAETAPASORCAMENTO_2401 WHERE etapaOrcamento > 0;

COMMIT;

ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK18 FOREIGN KEY (transfEtapaOrcamentoSaida) REFERENCES PAETAPASORCAMENTO (etapaOrcamento);
ALTER TABLE PAMODELOSDOCUMENTO ADD CONSTRAINT PAMODELOSDOCUMENTO_FK20 FOREIGN KEY (transfEtapaOrcamentoEntrada) REFERENCES PAETAPASORCAMENTO (etapaOrcamento);
ALTER TABLE PAETAPASORCAMENTODEPARA ADD CONSTRAINT PAETAPASORCAMENTODEPARA_FK4 FOREIGN KEY (etapaOrcamentoDe) REFERENCES PAETAPASORCAMENTO (etapaOrcamento);
ALTER TABLE PAETAPASORCAMENTODEPARA ADD CONSTRAINT PAETAPASORCAMENTODEPARA_FK5 FOREIGN KEY (etapaOrcamentoPara) REFERENCES PAETAPASORCAMENTO (etapaOrcamento);
ALTER TABLE PAETAPASORCAMENTOPERMITID ADD CONSTRAINT PAETAPASORCAMENTOPERMITID_FK4 FOREIGN KEY (etapaOrcamento) REFERENCES PAETAPASORCAMENTO (etapaOrcamento);
ALTER TABLE PAIMPRESSORAXDOCUMENTO ADD CONSTRAINT PAIMPRESSORAXDOCUMENTO_FK7 FOREIGN KEY (etapaOrcamento) REFERENCES PAETAPASORCAMENTO (etapaOrcamento);
ALTER TABLE MOORCAMENTOS ADD CONSTRAINT MOORCAMENTOS_FK30 FOREIGN KEY (etapaOrcamento) REFERENCES PAETAPASORCAMENTO (etapaOrcamento);
ALTER TABLE MOORCAMENTOXETAPAS ADD CONSTRAINT MOORCAMENTOXETAPAS_FK3 FOREIGN KEY (etapaOrcamento) REFERENCES PAETAPASORCAMENTO (etapaOrcamento);

-- MOCONTRATOS
CREATE TABLE MOCONTRATOS
  (
    idContrato                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    modeloContrato             NUMERIC (4,0) DEFAULT 0 NOT NULL,
    estabelecimento            NUMERIC (4,0) DEFAULT 0 NOT NULL,
    dataEmissao                DATE,
    dataVigenciaInicio         DATE,
    dataVigenciaTermino        DATE,
    dataProximoReajuste        DATE,
    diaFaturamento             NUMERIC (2,0) DEFAULT 0 NOT NULL,
    diaVencimento              NUMERIC (2,0) DEFAULT 0 NOT NULL,
    pessoa                     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    cobranca                   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    faturarClienteOrdemServico NUMERIC (1,0) DEFAULT 0 NOT NULL,
    projeto                    VARCHAR (60) DEFAULT ' ' NOT NULL,
    colaboradorResponsavel     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    vendedor                   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    comissionadoB              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    comissionadoC              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    contratoTerceiro           VARCHAR (15) DEFAULT ' ' NOT NULL,
    situacaoContrato           CHAR (1) DEFAULT ' ' NOT NULL,
    observacoes                VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_PK1 PRIMARY KEY (idContrato);
CREATE INDEX MOCONTRATOS_K2 ON MOCONTRATOS (pessoa);
CREATE INDEX MOCONTRATOS_K3 ON MOCONTRATOS (dataEmissao);
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_FK1 FOREIGN KEY (modeloContrato) REFERENCES PAMODELOSCONTRATO (modeloContrato);
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_FK2 FOREIGN KEY (estabelecimento) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_FK3 FOREIGN KEY (diaFaturamento) REFERENCES SIDIAS (dia);
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_FK4 FOREIGN KEY (diaVencimento) REFERENCES SIDIAS (dia);
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_FK5 FOREIGN KEY (pessoa) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_FK6 FOREIGN KEY (cobranca) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_FK7 FOREIGN KEY (projeto) REFERENCES PAPROJETOS (projeto);
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_FK8 FOREIGN KEY (colaboradorResponsavel) REFERENCES CACOLABORADORES (colaborador);
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_FK9 FOREIGN KEY (vendedor) REFERENCES CAVENDEDORES (vendedor);
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_FK10 FOREIGN KEY (comissionadoB) REFERENCES CACOMISSIONADOSB (comissionadoB);
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_FK11 FOREIGN KEY (comissionadoC) REFERENCES CACOMISSIONADOSC (comissionadoC);
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_FK12 FOREIGN KEY (situacaoContrato) REFERENCES SISITUACOESCONTRATO (situacaoContrato);

INSERT INTO MOCONTRATOS (idContrato, modeloContrato, estabelecimento, dataEmissao, dataVigenciaInicio, dataVigenciaTermino, dataProximoReajuste, diaFaturamento, diaVencimento, pessoa, cobranca, faturarClienteOrdemServico, projeto, colaboradorResponsavel, vendedor, comissionadoB, comissionadoC, contratoTerceiro, situacaoContrato, observacoes) VALUES (0, 0, 0, NULL, NULL, NULL, NULL, 0, 0, 0, 0, 0, ' ', 0, 0, 0, 0, ' ', ' ', ' ');

COMMIT;

-- MOCONTRATOXITENS
CREATE TABLE MOCONTRATOXITENS
  (
    idItemContrato          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idContrato              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sequencia               NUMERIC (3,0) DEFAULT 0 NOT NULL,
    cancelado               NUMERIC (1,0) DEFAULT 0 NOT NULL,
    vendedor                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    gradeProduto            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    faturamentoItemContrato CHAR (1) DEFAULT ' ' NOT NULL,
    vencimentoInicial       DATE,
    vencimentoFinal         DATE,
    quantidade              NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeSaldo         NUMERIC (15,6) DEFAULT 0 NOT NULL,
    tipoPreco               CHAR (1) DEFAULT ' ' NOT NULL,
    tabelaPreco             VARCHAR (10) DEFAULT ' ' NOT NULL,
    precoUnitario           NUMERIC (15,7) DEFAULT 0 NOT NULL,
    valorProdutoServico     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    observacoes             VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MOCONTRATOXITENS ADD CONSTRAINT MOCONTRATOXITENS_PK1 PRIMARY KEY (idItemContrato);
CREATE UNIQUE INDEX MOCONTRATOXITENS_K2 ON MOCONTRATOXITENS (idContrato, sequencia);
CREATE INDEX MOCONTRATOXITENS_K3 ON MOCONTRATOXITENS (gradeProduto);
ALTER TABLE MOCONTRATOXITENS ADD CONSTRAINT MOCONTRATOXITENS_FK1 FOREIGN KEY (idContrato) REFERENCES MOCONTRATOS (idContrato);
ALTER TABLE MOCONTRATOXITENS ADD CONSTRAINT MOCONTRATOXITENS_FK2 FOREIGN KEY (vendedor) REFERENCES CAVENDEDORES (vendedor);
ALTER TABLE MOCONTRATOXITENS ADD CONSTRAINT MOCONTRATOXITENS_FK3 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE MOCONTRATOXITENS ADD CONSTRAINT MOCONTRATOXITENS_FK4 FOREIGN KEY (faturamentoItemContrato) REFERENCES SIFATURAMENTOITEMCONTRATO (faturamentoItemContrato);
ALTER TABLE MOCONTRATOXITENS ADD CONSTRAINT MOCONTRATOXITENS_FK5 FOREIGN KEY (tipoPreco) REFERENCES SITIPOSPRECO (tipoPreco);
ALTER TABLE MOCONTRATOXITENS ADD CONSTRAINT MOCONTRATOXITENS_FK6 FOREIGN KEY (tabelaPreco) REFERENCES PATABELASPRECO (tabelaPreco);

INSERT INTO MOCONTRATOXITENS (idItemContrato, idContrato, sequencia, cancelado, vendedor, gradeProduto, faturamentoItemContrato, vencimentoInicial, vencimentoFinal, quantidade, quantidadeSaldo, tipoPreco, tabelaPreco, precoUnitario, valorProdutoServico, observacoes) VALUES (0, 0, 0, 0, 0, 0, ' ', NULL, NULL, 0, 0, ' ', ' ', 0, 0, ' ');

COMMIT;

-- MOCONTRATOXORCAMENTO
CREATE TABLE MOCONTRATOXORCAMENTO
  (
    id              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idItemContrato  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idItemOrcamento NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quantidade      NUMERIC (15,6) DEFAULT 0 NOT NULL
  );
ALTER TABLE MOCONTRATOXORCAMENTO ADD CONSTRAINT MOCONTRATOXORCAMENTO_PK1 PRIMARY KEY (id);
CREATE UNIQUE INDEX MOCONTRATOXORCAMENTO_K2 ON MOCONTRATOXORCAMENTO (idItemContrato, idItemOrcamento);
CREATE INDEX MOCONTRATOXORCAMENTO_K3 ON MOCONTRATOXORCAMENTO (idItemContrato);
CREATE INDEX MOCONTRATOXORCAMENTO_K4 ON MOCONTRATOXORCAMENTO (idItemOrcamento);
ALTER TABLE MOCONTRATOXORCAMENTO ADD CONSTRAINT MOCONTRATOXORCAMENTO_FK1 FOREIGN KEY (idItemContrato) REFERENCES MOCONTRATOXITENS (idItemContrato);
ALTER TABLE MOCONTRATOXORCAMENTO ADD CONSTRAINT MOCONTRATOXORCAMENTO_FK2 FOREIGN KEY (idItemOrcamento) REFERENCES MOORCAMENTOXITENS (idItemOrcamento);

INSERT INTO MOCONTRATOXORCAMENTO (id, idItemContrato, idItemOrcamento, quantidade) VALUES (0, 0, 0, 0);

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('SIMODALIDADESCONTRATO', 'Modalidades Contrato', 1, 614, 'SI', 'modalidadeContrato', 'A', 1, 'descricao', 0, ' ', 0, 999999, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqModalidadesContrato', 1, 1, ' '); 
INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('SIFATURAMENTOITEMCONTRATO', 'Faturamento Item Contrato', 1, 616, 'SI', 'faturamentoItemContrato', 'A', 1, 'descricao', 0, ' ', 0, 999999, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqFaturamentoItemContrato', 1, 1, ' '); 
INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('SIPERIODICIDADECONTRATO', 'Periodicidade Contrato', 1, 617, 'SI', 'periodicidadeContrato', 'A', 1, 'descricao', 0, ' ', 0, 999999, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqPeriodicidadeContrato', 1, 1, ' '); 
INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('SISITUACOESCONTRATO', 'Situações Contratos', 1, 618, 'SI', 'situacaoContrato', 'A', 1, 'descricao', 0, ' ', 0, 999999, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqSituacoesContratos', 1, 1, ' '); 
INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('PACOBERTURASCONTRATOS', 'Coberturas Contratos', 1, 31515, 'PA', 'coberturaContrato', 'N', 4, ' ', 1, ' ', 0, 100001, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqCoberturasContratos', 1, 1, ' '); 
INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('PAMODELOSCONTRATO', 'Modelos Contrato', 1, 31516, 'PA', 'modeloContrato', 'N', 4, ' ', 1, ' ', 0, 100001, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqModelosContrato', 1, 1, ' '); 
INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MOCONTRATOS', 'Contratos', 1, 50200, 'MO', 'idContrato', 'N', 14, ' ', 1, ' ', 0, 100002, ' ', ' ', 1, 1, ' '); 
INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MOCONTRATOXITENS', 'Contrato X Itens', 1, 50210, 'MO', 'idItemContrato', 'N', 14, ' ', 1, ' ', 0, 100002, ' ', ' ', 1, 1, ' '); 
INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MOCONTRATOXORCAMENTO', 'Contrato X Orçamento', 1, 50220, 'MO', 'id', 'N', 14, ' ', 1, ' ', 0, 100002, ' ', ' ', 1, 1, ' '); 

COMMIT;

INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (942, 'Modalidades Contrato', 1, 5090609420, 50, 'SIS', 60, 942, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqModalidadesContrato', ' ', 0, 0, NULL, ' ');
INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (943, 'Faturamento Item Contrato', 1, 5090609420, 50, 'SIS', 60, 943, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqFaturamentoItemContrato', ' ', 0, 0, NULL, ' ');
INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (944, 'Periodicidade Contrato', 1, 5090609420, 50, 'SIS', 60, 944, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqPeriodicidadeContrato', ' ', 0, 0, NULL, ' ');
INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (945, 'Situações Contratos', 1, 5090609420, 50, 'SIS', 60, 945, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqSituacoesContratos', ' ', 0, 0, NULL, ' ');
INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (946, 'Coberturas Contratos', 1, 5060609460, 50, 'PAR', 60, 946, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqCoberturasContratos', ' ', 0, 0, NULL, ' ');
INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (947, 'Modelos Contrato', 1, 5060609470, 50, 'PAR', 60, 947, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqModelosContrato', ' ', 0, 0, NULL, ' ');
INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (948, 'Contrato', 1, 5010609480, 50, 'MOV', 60, 949, '%SYS_DIR%Versoes\%SYS_VER%\Movimentos.ecf', 'DetContrato', ' ', 0, 0, NULL, ' ');
INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (949, 'Pesquisa Contratos', 1, 5010609490, 50, 'MOV', 60, 948, '%SYS_DIR%Versoes\%SYS_VER%\Movimentos.ecf', 'PesqContratos', 'DetContrato', 0, 0, NULL, ' ');
INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (950, 'Fatura Contrato', 1, 5010609500, 50, 'MOV', 60, 951, '%SYS_DIR%Versoes\%SYS_VER%\Movimentos.ecf', 'DetFaturaContrato', ' ', 3, 3, NULL, ' ');
INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (951, 'Pesquisa Faturas Contratos', 1, 5010609510, 50, 'MOV', 60, 950, '%SYS_DIR%Versoes\%SYS_VER%\Movimentos.ecf', 'PesqFaturasContratos', 'DetFaturaContrato', 3, 3, NULL, ' ');

COMMIT;

INSERT INTO SICONFIGURACOES (configuracao, descricao, ativo, subcategoriaConfiguracao, tipoCampo, mascara, exibirCampo, tipoArquivo, conteudoSugestao, tabelaSistema, observacoes) values (415, 'Ao cancelar documento, passar a etapa da fatura do contrato para', 1, 30003, 'N', '4', 'P', 0, ' ', 'PAETAPASORCAMENTO', ' ');
INSERT INTO SICONFIGURACOES (configuracao, descricao, ativo, subcategoriaConfiguracao, tipoCampo, mascara, exibirCampo, tipoArquivo, conteudoSugestao, tabelaSistema, observacoes) values (416, 'Ao efetivar parcial, passar a etapa da fatura do contrato para', 1, 30003, 'N', '4', 'P', 0, ' ', 'PAETAPASORCAMENTO', ' ');

COMMIT;

INSERT INTO SISUBCATEGORIASPERSCAMPOS (subcategoriaPersonalCampo, descricao, ativo, categoriaPersonalCampo, observacoes) VALUES (50002, 'Contratos', 1, 5, ' ');

COMMIT;

INSERT INTO SIPERSONALIZACOESCAMPOS (personalizacaoCampo, ordenacao, descricao, ativo, subcategoriaPersonalCampo, tipoCampo, mascara, exibirCampo, tipoArquivo, alteraTipoCampo, alteraExibirCampo, visivelSugestao, modificavelSugestao, obrigatorioSugestao, nomeCampoSugestao, conteudoSugestao, tabelaSistema, observacoes) VALUES (240, 30001009, 'Etapa Fatura Contrato', 1, 30001, 'N', '4', 'P', 0, 0, 0, 1, 1, 1, 'Etapa Fatura Contrato', ' ', 'PAETAPASORCAMENTO', ' ');
INSERT INTO SIPERSONALIZACOESCAMPOS (personalizacaoCampo, ordenacao, descricao, ativo, subcategoriaPersonalCampo, tipoCampo, mascara, exibirCampo, tipoArquivo, alteraTipoCampo, alteraExibirCampo, visivelSugestao, modificavelSugestao, obrigatorioSugestao, nomeCampoSugestao, conteudoSugestao, tabelaSistema, observacoes) VALUES (241, 50002001, 'Contrato Terceiro', 1, 50002, 'A', '15', 'E', 0, 0, 0, 1, 1, 0, 'Contrato Terceiro', ' ', ' ', ' ');
INSERT INTO SIPERSONALIZACOESCAMPOS (personalizacaoCampo, ordenacao, descricao, ativo, subcategoriaPersonalCampo, tipoCampo, mascara, exibirCampo, tipoArquivo, alteraTipoCampo, alteraExibirCampo, visivelSugestao, modificavelSugestao, obrigatorioSugestao, nomeCampoSugestao, conteudoSugestao, tabelaSistema, observacoes) VALUES (242, 10001001, 'Desde', 1, 10001, 'D', 'DD/MM/YYYYA', 'E', 0, 0, 0, 1, 0, 1, 'Desde', ' ', ' ', ' ');

COMMIT;

DROP TABLE TEMPAGENDAAUXILIAR;

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_config_415_etapaFatContrCanc 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;
  ELSIF v_tipoDocumento = 103 THEN
    v_novaEtapaOrcamento := p_config_415_etapaFatContrCanc;
    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 validoContrato = 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_PRE_DOC_ITEM_EXCLUI (
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_person_184_tipoEventoCancCon IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_95_etapaOrcamentoCanc IN NUMBER,
  p_config_96_etapaOrdemServCanc IN NUMBER,
  p_config_97_etapaPedCompraCanc IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_415_etapaFatContrCanc IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemPreDocumento      IN NUMBER,
  p_cancelando_Excluindo         IN CHAR,
  p_cancelandoExcluindoDocumento IN NUMBER,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_atualizaUltimaCompra     NUMBER;
  v_cab_estabelecimento          NUMBER;
  v_cab_documentoFiscal          NUMBER;
  v_cab_dataEntradaSaida         DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  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_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota NUMBER;
  v_cab_promocaoExiste           NUMBER;
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  FOR a IN (
    SELECT
      item.preDocumento,
      item.gradeProduto,
      item.cancelado,
      item.usarPrecoAVista,
      item.geraFinanceiro,
      item.controleQuantidade,
      item.loteMultiplo,
      item.quantidade,
      item.quantidadeConvertida,
      item.quantidadeDevolvidaRetornada,
      item.pesoLiquido,
      item.pesoBruto,
      item.valorProdutoServicoBruto,
      item.valorProdutoServico,
      item.valorDescontoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      item.valorFreteGeral,
      item.valorSeguroGeral,
      item.valorDescontoGeral,
      item.valorOutrasDespesasGeral,
      item.valorAdicFreteMarinhaMerGeral,
      item.valorDespesasAduaneirasGeral,
      item.valorBasePagamento,
      item.valorDescontoPagamento,
      item.valorOutrasDespesasPagamento,
      item.valorJurosPagamento,
      item.valorFreteTotal,
      item.valorSeguroTotal,
      item.valorDescontoTotal,
      item.valorOutrasDespesasTotal,
      item.valorAdicFreteMarinhaMerTotal,
      item.valorDespesasAduaneirasTotal,
      item.valorLiquidoItem,
      item.valorDescontoCustoOpItem,
      item.valorDescontoCustoOpGeral,
      item.valorDescontoCustoOpTotal,
      item.valorAcrescimoCustoOpItem,
      item.valorAcrescimoCustoOpGeral,
      item.valorAcrescimoCustoOpTotal,
      item.valorCustoOperacao,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.valorAcrescimoExtempSubtotal,
      item.valorAcrescimoExtempItem,
      item.valorAcrescimoExtempGeral,
      item.valorAcrescimoExtempTotal,
      gradProd.produto,
      prod.tipoProduto
    FROM MOPREDOCUMXITENS item
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE item.idItemPreDocumento = p_item_idItemPreDocumento)
  LOOP
    SELECT
      cab.origemDocumento,
      cab.tipoDocumento,
      cab.entradaSaida,
      cab.devolucaoAnulacaoRetorno,
      cab.atualizaCustoMedio,
      cab.atualizaUltimaCompra,
      cab.estabelecimento,
      cab.documentoFiscal,
      cab.dataEntradaSaida,
      cab.pessoa,
      cab.modalidadeFrete,
      cab.tipoPagamentoFrete,
      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,
      cab.valorDescontoCustoOpItem,
      cab.valorDescontoCustoOpGeral,
      cab.valorDescontoCustoOpTotal,
      cab.valorAcrescimoCustoOpItem,
      cab.valorAcrescimoCustoOpGeral,
      cab.valorAcrescimoCustoOpTotal,
      cab.valorCustoOperacao,
      cab.valorCMV,
      cab.quantidadeExtemporanea,
      cab.valorAcrescimoExtempSubtotal,
      cab.valorAcrescimoExtempItem,
      cab.valorAcrescimoExtempGeral,
      cab.valorAcrescimoExtempTotal
    INTO
      v_cab_origemDocumento,
      v_cab_tipoDocumento,
      v_cab_entradaSaida,
      v_cab_devolucaoAnulacaoRetorno,
      v_cab_atualizaCustoMedio,
      v_cab_atualizaUltimaCompra,
      v_cab_estabelecimento,
      v_cab_documentoFiscal,
      v_cab_dataEntradaSaida,
      v_cab_pessoa,
      v_cab_modalidadeFrete,
      v_cab_tipoPagamentoFrete,
      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_cab_valorDescontoCustoOpItem,
      v_cab_valorDescontoCustoOpGera,
      v_cab_valorDescontoCustoOpTota,
      v_cab_valorAcrescimoCustoOpIte,
      v_cab_valorAcrescimoCustoOpGer,
      v_cab_valorAcrescimoCustoOpTot,
      v_cab_valorCustoOperacao,
      v_cab_valorCMV,
      v_cab_quantidadeExtemporanea,
      v_cab_valorAcrescimoExtempSubt,
      v_cab_valorAcrescimoExtempItem,
      v_cab_valorAcrescimoExtempGera,
      v_cab_valorAcrescimoExtempTota
    FROM MOPREDOCUMENTOS cab
    WHERE cab.preDocumento = a.preDocumento;
    IF p_cancelandoExcluindoDocumento = 0
      AND a.cancelado = 0
    THEN
      SELECT COALESCE (MAX(1), 0)
      INTO v_cab_promocaoExiste
      FROM MOPREDOCUMXPROMOCOES
      WHERE preDocumento = a.preDocumento;
      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 NOT(p_person_190_modeloFrete IS NULL)
        AND p_person_190_modeloFrete <> ' '
        AND a.valorFreteTotal <> 0
        AND v_cab_valorFreteTotal - a.valorFreteTotal <= 0
      THEN
        v_cab_modalidadeFrete := '9';
      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;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      IF v_cab_valorDescontoGeral <> 0
        OR v_cab_valorOutrasDespesasGeral <> 0
        OR v_cab_valorPagamentoBruto <> 0
        OR v_cab_promocaoExiste = 1
      THEN
        ADD_PRE_DOC_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          a.preDocumento,
          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;
      UPDATE MOPREDOCUMENTOS SET
        modalidadeFrete               = v_cab_modalidadeFrete,
        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,
        valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
        valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
        valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
        valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
        valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
        valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
        valorCustoOperacao            = v_cab_valorCustoOperacao,
        valorCMV                      = v_cab_valorCMV,
        quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
        valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
        valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
        valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
        valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
      WHERE preDocumento = a.preDocumento;
    END IF;
    -- Cancela / Exclui Transferências vinculadas.
    FOR b IN (
      SELECT
        itemTransf.documentoTransferencia,
        docXTransf.entradaSaidaOriginal
      FROM MODOCTRANSFXPREDOCUM docXTransf
      JOIN MODOCUMENTOTRANSFXITENS itemTransf
      ON itemTransf.idItemDocTransferencia = docXTransf.idItemDocTransferencia
      WHERE docXTransf.idItemPreDocumento = p_item_idItemPreDocumento
      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 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 docXTransf2.idItemPreDocumento <> docXTransf.idItemPreDocumento)
      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 = 'C' THEN
        ADD_DOCTRANSF_CAB_SIT_GRAVA (
          p_estabelecimentoAtivo,
          b.documentoTransferencia,
          'C',
          'Cancelamento Automático');
      END IF;
    END LOOP;
    IF v_cab_entradaSaida='E'
      AND v_cab_devolucaoAnulacaoRetorno = 0
      AND v_cab_atualizaUltimaCompra = 1
    THEN
      ADD_PRODUTO_CUSTO_DATA_EXCLUI (
        a.produto,
        v_cab_dataEntradaSaida);
    END IF;
    ADD_MOTIVO_PRE_DOC_ITE_EXCLUI (
      p_item_idItemPreDocumento,
      0,
      v_auxNumber);
    ADD_ESTOQUE_PRE_DOC_EXCLUI (
      p_item_idItemPreDocumento,
      '',
      v_auxVarchar);
    ADD_VALEDESCONTO_PRE_ITE_EXCL (
      p_item_idItemPreDocumento,
      '',
      v_auxVarchar);
    ADD_SEPARACAO_ITEM_PRE_EXCLUI (p_item_idItemPreDocumento);
    DELETE MOPREDOCUMXPRODUTOFILHO
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    DELETE MOPREDOCUMXPROMOCOES
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    DELETE MOINGRESSOS
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    DELETE CATABELAPRECOXFORMACOESPR
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    FOR b IN (
      SELECT
        entrega,
        idItemOrcamento,
        quantidade
      FROM MOENTREGAS
      WHERE idItemPreDocumentoRemessa = p_item_idItemPreDocumento)
    LOOP
      ADD_ENTREGA_SITUACAO_TROCA (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        b.idItemOrcamento,
        b.entrega,
        b.quantidade,
        1, -- p_situacaoEntrega
        'ADD_PRE_DOC_ITEM_EXCLUI');
    END LOOP;
    FOR b IN (
      SELECT idConserto
      FROM MOCONSERTOS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      IF p_cancelando_Excluindo = 'C' THEN
        ADD_CONSERTO_CANCELA(
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_person_184_tipoEventoCancCon,
          b.idConserto);
      ELSE
        ADD_CONSERTO_EXCLUI(b.idConserto);
      END IF;
    END LOOP;
    UPDATE MOCONSERTOS SET
      idItemPreDocumentoDevolucao = 0,
      situacaoConserto = 'I'
    WHERE idItemPreDocumentoDevolucao = p_item_idItemPreDocumento;
    FOR b IN (
      SELECT
        id,
        idItemOrcamento,
        quantidade
      FROM MOPREDOCUMXORCAMENTOITEM
      WHERE idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      IF b.quantidade <> 0 THEN
        ADD_ORCAMENTO_ITEM_SALDO_VOLTA (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_person_184_tipoEventoCancCon,
          p_config_95_etapaOrcamentoCanc,
          p_config_96_etapaOrdemServCanc,
          p_config_97_etapaPedCompraCanc,
          p_config_415_etapaFatContrCanc,
          b.idItemOrcamento,
          b.quantidade);
      END IF;
      DELETE MOPREDOCUMXORCAMENTOITEM c
      WHERE c.id = b.id;
    END LOOP;
    FOR b IN (
      SELECT
        docXDoc.id,
        docXDoc.idItemPreDocReferenciado,
        docXDoc.quantidade,
        itemPre.preDocumento,
        cabPre.statusPreDocumento
      FROM MOPREDOCUMXPREDOCUM docXDoc
      JOIN MOPREDOCUMXITENS itemPre
      ON itemPre.idItemPreDocumento = docXDoc.idItemPreDocReferenciado
      JOIN MOPREDOCUMENTOS cabPre
      ON cabPre.predocumento = itemPre.preDocumento
      WHERE docXDoc.idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      IF v_cab_devolucaoAnulacaoRetorno = 1 THEN
        FOR c IN (
          SELECT
            c.entrega,
            c.idItemOrcamento,
            c.quantidade,
            c.situacaoEntrega
          FROM MOENTREGAS c
          WHERE c.idItemPreDocumentoRemessa = b.idItemPreDocReferenciado
          AND c.situacaoEntrega IN (6,7))
        LOOP
          ADD_ENTREGA_SITUACAO_TROCA (
            p_usuarioLogado,
            p_estabelecimentoAtivo,
            c.idItemOrcamento,
            c.entrega,
            c.quantidade,
            c.situacaoEntrega - 1,
            'ADD_PRE_DOC_ITEM_EXCLUI');
        END LOOP;
      END IF;
      IF b.quantidade <> 0 THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_devolucaoAnulacaoRetorno,
          'P',
          p_item_idItemPreDocumento,
          - b.quantidade,
          - a.quantidadeConvertida,
          'P',
          b.idItemPreDocReferenciado);
      END IF;
      IF b.statusPreDocumento = 'F' THEN
        UPDATE MOPREDOCUMENTOS c
        SET c.statusPreDocumento = 'A'
        WHERE c.preDocumento = b.preDocumento;
      END IF;
      DELETE MOPREDOCUMXPREDOCUM c
      WHERE c.id = b.id;
    END LOOP;
    DELETE MOPREDOCUMXPREDOCUM
    WHERE idItemPreDocReferenciado = p_item_idItemPreDocumento;
    FOR b IN (
      SELECT
        id,
        idItemDocFiscalReferenciado,
        quantidade
      FROM MOPREDOCUMXDOCFISCAL
      WHERE idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      IF v_cab_devolucaoAnulacaoRetorno = 1 THEN
        FOR c IN (
          SELECT
            c.entrega,
            c.idItemOrcamento,
            c.quantidade,
            c.situacaoEntrega
          FROM MOENTREGAS c
          WHERE c.idItemDocFiscalRemessa = b.idItemDocFiscalReferenciado
          AND c.situacaoEntrega IN (6,7))
        LOOP
          ADD_ENTREGA_SITUACAO_TROCA (
            p_usuarioLogado,
            p_estabelecimentoAtivo,
            c.idItemOrcamento,
            c.entrega,
            c.quantidade,
            c.situacaoEntrega - 1,
            'ADD_PRE_DOC_ITEM_EXCLUI');
        END LOOP;
      END IF;
      IF b.quantidade <> 0 THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_devolucaoAnulacaoRetorno,
          'P',
          p_item_idItemPreDocumento,
          - b.quantidade,
          - a.quantidadeConvertida,
          'D',
          b.idItemDocFiscalReferenciado);
      END IF;
      DELETE MOPREDOCUMXDOCFISCAL c
      WHERE c.id = b.id;
    END LOOP;
    DELETE MODOCFISCALXPREDOCUM
    WHERE idItemPreDocReferenciado = p_item_idItemPreDocumento;
    DELETE MODOCTRANSFXPREDOCUM
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    IF p_cancelando_Excluindo = 'C' THEN
      UPDATE MOPREDOCUMXITENS
      SET cancelado = 1
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    ELSE
      DELETE MOPREDOCUMXCOMPOSICOESPR
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXNUMEROSSERIE
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXNUMEROSSERIE b
      WHERE b.idEnderecoEstoquePreDocumento > 0
      AND EXISTS (
        SELECT 1
        FROM MOPREDOCUMXENDERECOESTOQ c
        WHERE c.idEnderecoEstoquePreDocumento = b.idEnderecoEstoquePreDocumento
        AND c.idItemPreDocumento = p_item_idItemPreDocumento);
      DELETE MOPREDOCUMXENDERECOESTOQ
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXEMBALAGENSTIN
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXCENTROSCUSTOS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXPROJETOS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MODOCTROCAXITENS
      WHERE idItemPreDocumentoSaida = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXITENS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      IF p_cancelandoExcluindoDocumento = 0 THEN
        v_auxNumber := 0;
        FOR b IN (
          SELECT idItemPreDocumento
          FROM MOPREDOCUMXITENS b
          WHERE b.preDocumento = a.preDocumento
          AND b.idItemPreDocumento <> p_item_idItemPreDocumento
          ORDER BY b.sequencia)
        LOOP
          v_auxNumber := v_auxNumber + 1;
          UPDATE MOPREDOCUMXITENS c
          SET c.sequencia = v_auxNumber
          WHERE c.idItemPreDocumento = b.idItemPreDocumento;
        END LOOP;
      END IF;
    END IF;
  END LOOP;
END ADD_PRE_DOC_ITEM_EXCLUI;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_EXCLUI (
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_person_184_tipoEventoCancCon IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_95_etapaOrcamentoCanc IN NUMBER,
  p_config_96_etapaOrdemServCanc IN NUMBER,
  p_config_97_etapaPedCompraCanc IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_415_etapaFatContrCanc IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_cancelando_Excluindo         IN CHAR,
  p_cancelandoExcluindoDocumento IN NUMBER,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_atualizaUltimaCompra     NUMBER;
  v_cab_estabelecimento          NUMBER;
  v_cab_nfFornecedor             NUMBER;
  v_cab_documentoFiscal          NUMBER;
  v_cab_dataEntradaSaida         DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  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_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota NUMBER;
  v_cab_promocaoExiste           NUMBER;
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  FOR a IN (
    SELECT
      item.idDocumentoFiscal,
      item.gradeProduto,
      item.cancelado,
      item.usarPrecoAVista,
      item.geraFinanceiro,
      item.controleQuantidade,
      item.loteMultiplo,
      item.quantidade,
      item.quantidadeConvertida,
      item.pesoLiquido,
      item.pesoBruto,
      item.valorProdutoServicoBruto,
      item.valorProdutoServico,
      item.valorDescontoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      item.valorFreteGeral,
      item.valorSeguroGeral,
      item.valorDescontoGeral,
      item.valorOutrasDespesasGeral,
      item.valorAdicFreteMarinhaMerGeral,
      item.valorDespesasAduaneirasGeral,
      item.valorBasePagamento,
      item.valorDescontoPagamento,
      item.valorOutrasDespesasPagamento,
      item.valorJurosPagamento,
      item.valorFreteTotal,
      item.valorSeguroTotal,
      item.valorDescontoTotal,
      item.valorOutrasDespesasTotal,
      item.valorAdicFreteMarinhaMerTotal,
      item.valorDespesasAduaneirasTotal,
      item.valorLiquidoItem,
      item.valorDescontoCustoOpItem,
      item.valorDescontoCustoOpGeral,
      item.valorDescontoCustoOpTotal,
      item.valorAcrescimoCustoOpItem,
      item.valorAcrescimoCustoOpGeral,
      item.valorAcrescimoCustoOpTotal,
      item.valorCustoOperacao,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.valorAcrescimoExtempSubtotal,
      item.valorAcrescimoExtempItem,
      item.valorAcrescimoExtempGeral,
      item.valorAcrescimoExtempTotal,
      gradProd.produto,
      prod.tipoProduto
    FROM MODOCFISCALXITENS item
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE item.idItemDocFiscal = p_item_idItemDocFiscal)
  LOOP
    SELECT
      cab.origemDocumento,
      cab.tipoDocumento,
      cab.entradaSaida,
      cab.devolucaoAnulacaoRetorno,
      cab.atualizaCustoMedio,
      cab.atualizaUltimaCompra,
      cab.estabelecimento,
      cab.nfFornecedor,
      cab.documentoFiscal,
      cab.dataEntradaSaida,
      cab.pessoa,
      cab.modalidadeFrete,
      cab.tipoPagamentoFrete,
      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,
      cab.valorDescontoCustoOpItem,
      cab.valorDescontoCustoOpGeral,
      cab.valorDescontoCustoOpTotal,
      cab.valorAcrescimoCustoOpItem,
      cab.valorAcrescimoCustoOpGeral,
      cab.valorAcrescimoCustoOpTotal,
      cab.valorCustoOperacao,
      cab.valorCMV,
      cab.quantidadeExtemporanea,
      cab.valorAcrescimoExtempSubtotal,
      cab.valorAcrescimoExtempItem,
      cab.valorAcrescimoExtempGeral,
      cab.valorAcrescimoExtempTotal
    INTO
      v_cab_origemDocumento,
      v_cab_tipoDocumento,
      v_cab_entradaSaida,
      v_cab_devolucaoAnulacaoRetorno,
      v_cab_atualizaCustoMedio,
      v_cab_atualizaUltimaCompra,
      v_cab_estabelecimento,
      v_cab_nfFornecedor,
      v_cab_documentoFiscal,
      v_cab_dataEntradaSaida,
      v_cab_pessoa,
      v_cab_modalidadeFrete,
      v_cab_tipoPagamentoFrete,
      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_cab_valorDescontoCustoOpItem,
      v_cab_valorDescontoCustoOpGera,
      v_cab_valorDescontoCustoOpTota,
      v_cab_valorAcrescimoCustoOpIte,
      v_cab_valorAcrescimoCustoOpGer,
      v_cab_valorAcrescimoCustoOpTot,
      v_cab_valorCustoOperacao,
      v_cab_valorCMV,
      v_cab_quantidadeExtemporanea,
      v_cab_valorAcrescimoExtempSubt,
      v_cab_valorAcrescimoExtempItem,
      v_cab_valorAcrescimoExtempGera,
      v_cab_valorAcrescimoExtempTota
    FROM MODOCUMENTOSFISCAIS cab
    WHERE cab.idDocumentoFiscal = a.idDocumentoFiscal;
    IF p_cancelandoExcluindoDocumento = 0
      AND a.cancelado = 0
    THEN
      SELECT COALESCE (MAX(1), 0)
      INTO v_cab_promocaoExiste
      FROM MODOCFISCALXPROMOCOES
      WHERE idDocumentoFiscal = a.idDocumentoFiscal;
      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 NOT(p_person_190_modeloFrete IS NULL)
        AND p_person_190_modeloFrete <> ' '
        AND a.valorFreteTotal <> 0
        AND v_cab_valorFreteTotal - a.valorFreteTotal <= 0
      THEN
        v_cab_modalidadeFrete := '9';
      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;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      IF v_cab_valorDescontoGeral <> 0
        OR v_cab_valorOutrasDespesasGeral <> 0
        OR v_cab_valorPagamentoBruto <> 0
        OR v_cab_promocaoExiste = 1
      THEN
        ADD_DOC_FISC_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          a.idDocumentoFiscal,
          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;
      UPDATE MODOCUMENTOSFISCAIS SET
        modalidadeFrete               = v_cab_modalidadeFrete,
        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,
        valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
        valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
        valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
        valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
        valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
        valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
        valorCustoOperacao            = v_cab_valorCustoOperacao,
        valorCMV                      = v_cab_valorCMV,
        quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
        valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
        valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
        valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
        valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
      WHERE idDocumentoFiscal = a.idDocumentoFiscal;
    END IF;
    -- Cancela / Exclui Transferências vinculadas.
    FOR b IN (
      SELECT
        itemTransf.documentoTransferencia,
        docXTransf.entradaSaidaOriginal
      FROM MODOCTRANSFXDOCFISCAL docXTransf
      JOIN MODOCUMENTOTRANSFXITENS itemTransf
      ON itemTransf.idItemDocTransferencia = docXTransf.idItemDocTransferencia
      WHERE docXTransf.idItemDocFiscal = p_item_idItemDocFiscal
      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 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'
        AND docXTransf2.idItemDocFiscal <> docXTransf.idItemDocFiscal)
      GROUP BY
        itemTransf.documentoTransferencia,
        docXTransf.entradaSaidaOriginal)
    LOOP
      IF b.entradaSaidaOriginal = 'O' THEN
        ADD_DOCTRANSF_CAB_EXCLUI (b.documentoTransferencia);
      ELSIF p_cancelando_Excluindo = 'C' THEN
        ADD_DOCTRANSF_CAB_SIT_GRAVA (
          p_estabelecimentoAtivo,
          b.documentoTransferencia,
          'C',
          'Cancelamento Automático');
      END IF;
    END LOOP;
    IF v_cab_entradaSaida='E'
      AND v_cab_devolucaoAnulacaoRetorno = 0
      AND v_cab_atualizaUltimaCompra = 1
    THEN
      ADD_PRODUTO_CUSTO_DATA_EXCLUI (
        a.produto,
        v_cab_dataEntradaSaida);
    END IF;
    ADD_MOTIVO_DOC_FISC_ITE_EXCLUI (
      p_item_idItemDocFiscal,
      0,
      v_auxNumber);
    ADD_ESTOQUE_DOC_FISC_EXCLUI (
      p_item_idItemDocFiscal,
      '',
      v_auxVarchar);
    ADD_VALEDESCONTO_DOC_ITE_EXCL (
      p_item_idItemDocFiscal,
      '',
      v_auxVarchar);
    ADD_SEPARACAO_ITEM_DOC_EXCLUI (p_item_idItemDocFiscal);
    DELETE MODOCFISCALXPRODUTOFILHO
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    DELETE MODOCFISCALXPROMOCOES
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    DELETE MOINGRESSOS
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    DELETE CATABELAPRECOXFORMACOESPR
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    FOR b IN (
      SELECT
        entrega,
        idItemOrcamento,
        quantidade
      FROM MOENTREGAS
      WHERE idItemDocFiscalRemessa = p_item_idItemDocFiscal)
    LOOP
      ADD_ENTREGA_SITUACAO_TROCA (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        b.idItemOrcamento,
        b.entrega,
        b.quantidade,
        1, -- p_situacaoEntrega
        'ADD_DOC_FISC_ITEM_EXCLUI');
    END LOOP;
    FOR b IN (
      SELECT idConserto
      FROM MOCONSERTOS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      IF p_cancelando_Excluindo = 'C' THEN
        ADD_CONSERTO_CANCELA (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_person_184_tipoEventoCancCon,
          b.idConserto);
      ELSE
        ADD_CONSERTO_EXCLUI (b.idConserto);
      END IF;
    END LOOP;
    UPDATE MOCONSERTOS SET
      idItemDocFiscalDevolucao = 0,
      situacaoConserto = 'I'
    WHERE idItemDocFiscalDevolucao = p_item_idItemDocFiscal;
    FOR b IN (
      SELECT
        id,
        idItemOrcamento,
        quantidade
      FROM MODOCFISCALXORCAMENTOITEM
      WHERE idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      IF b.quantidade <> 0 THEN
        ADD_ORCAMENTO_ITEM_SALDO_VOLTA (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_person_184_tipoEventoCancCon,
          p_config_95_etapaOrcamentoCanc,
          p_config_96_etapaOrdemServCanc,
          p_config_97_etapaPedCompraCanc,
          p_config_415_etapaFatContrCanc,
          b.idItemOrcamento,
          b.quantidade);
      END IF;
      DELETE MODOCFISCALXORCAMENTOITEM c
      WHERE c.id = b.id;
    END LOOP;
    FOR b IN (
      SELECT
        docXDoc.id,
        docXDoc.idItemPreDocReferenciado,
        docXDoc.quantidade,
        itemPre.preDocumento,
        cabPre.statusPreDocumento
      FROM MODOCFISCALXPREDOCUM docXDoc
      JOIN MOPREDOCUMXITENS itemPre
      ON itemPre.idItemPreDocumento = docXDoc.idItemPreDocReferenciado
      JOIN MOPREDOCUMENTOS cabPre
      ON cabPre.predocumento = itemPre.preDocumento
      WHERE docXDoc.idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      IF v_cab_devolucaoAnulacaoRetorno = 1 THEN
        FOR c IN (
          SELECT
            c.entrega,
            c.idItemOrcamento,
            c.quantidade,
            c.situacaoEntrega
          FROM MOENTREGAS c
          WHERE c.idItemPreDocumentoRemessa = b.idItemPreDocReferenciado
          AND c.situacaoEntrega IN (6,7))
        LOOP
          ADD_ENTREGA_SITUACAO_TROCA (
            p_usuarioLogado,
            p_estabelecimentoAtivo,
            c.idItemOrcamento,
            c.entrega,
            c.quantidade,
            c.situacaoEntrega - 1,
            'ADD_DOC_FISC_ITEM_EXCLUI');
        END LOOP;
      END IF;
      IF b.quantidade <> 0 THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_devolucaoAnulacaoRetorno,
          'D',
          p_item_idItemDocFiscal,
          - b.quantidade,
          - a.quantidadeConvertida,
          'P',
          b.idItemPreDocReferenciado);
      END IF;
      IF v_cab_origemDocumento IN (10,13)
        AND b.statusPreDocumento = 'F'
      THEN
        UPDATE MOPREDOCUMENTOS c
        SET c.statusPreDocumento = 'A'
        WHERE c.preDocumento = b.preDocumento;
      END IF;
      DELETE MODOCFISCALXPREDOCUM c
      WHERE c.id = b.id;
    END LOOP;
    DELETE MOPREDOCUMXDOCFISCAL
    WHERE idItemDocFiscalReferenciado = p_item_idItemDocFiscal;
    FOR b IN (
      SELECT
        id,
        idItemDocFiscalReferenciado,
        quantidade
      FROM MODOCFISCALXDOCFISCAL a
      WHERE idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      IF v_cab_devolucaoAnulacaoRetorno = 1 THEN
        FOR c IN (
          SELECT
            c.entrega,
            c.idItemOrcamento,
            c.quantidade,
            c.situacaoEntrega
          FROM MOENTREGAS c
          WHERE c.idItemDocFiscalRemessa = b.idItemDocFiscalReferenciado
          AND c.situacaoEntrega IN (6,7))
        LOOP
          ADD_ENTREGA_SITUACAO_TROCA (
            p_usuarioLogado,
            p_estabelecimentoAtivo,
            c.idItemOrcamento,
            c.entrega,
            c.quantidade,
            c.situacaoEntrega - 1,
            'ADD_DOC_FISC_ITEM_EXCLUI');
        END LOOP;
      END IF;
      IF b.quantidade <> 0 THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_devolucaoAnulacaoRetorno,
          'D',
          p_item_idItemDocFiscal,
          - b.quantidade,
          - a.quantidadeConvertida,
          'D',
          b.idItemDocFiscalReferenciado);
      END IF;
      DELETE MODOCFISCALXDOCFISCAL c
      WHERE c.id = b.id;
    END LOOP;
    DELETE MODOCFISCALXDOCFISCAL
    WHERE idItemDocFiscalReferenciado = p_item_idItemDocFiscal;
    DELETE MODOCTRANSFXDOCFISCAL
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    DELETE MOBALANCOXDOCFISCAL
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    UPDATE MODISTRIBUICAODFEXGRADE
    SET idItemDocFiscal = 0
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    IF p_cancelando_Excluindo = 'C' THEN
      UPDATE MODOCFISCALXITENS
      SET cancelado = 1
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    ELSE
      DELETE MODOCFISCALXCOMPOSICOESPR
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXNUMEROSSERIE
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXNUMEROSSERIE b
      WHERE b.idEnderecoEstoqueDocFiscal > 0
      AND EXISTS (
        SELECT 1
        FROM MODOCFISCALXENDERECOESTOQ c
        WHERE c.idEnderecoEstoqueDocFiscal = b.idEnderecoEstoqueDocFiscal
        AND c.idItemDocFiscal = p_item_idItemDocFiscal);
      DELETE MODOCFISCALXENDERECOESTOQ
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXEMBALAGENSTIN
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXCENTROSCUSTOS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXPROJETOS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCTROCAXITENS
      WHERE idItemDocFiscalSaida = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXITENS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      IF p_cancelandoExcluindoDocumento = 0 THEN
        v_auxNumber := 0;
        FOR b IN (
          SELECT idItemDocFiscal
          FROM MODOCFISCALXITENS b
          WHERE b.idDocumentoFiscal = a.idDocumentoFiscal
          AND b.idItemDocFiscal <> p_item_idItemDocFiscal
          ORDER BY b.sequencia)
        LOOP
          v_auxNumber := v_auxNumber + 1;
          UPDATE MODOCFISCALXITENS c
          SET c.sequencia = v_auxNumber
          WHERE c.idItemDocFiscal = b.idItemDocFiscal;
        END LOOP;
      END IF;
    END IF;
  END LOOP;
END ADD_DOC_FISC_ITEM_EXCLUI;

/

create or replace PROCEDURE ADD_GERA_TEMP_INVENTARIO (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_335_cmvGerencIgualFis IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_sessaoClient                 IN VARCHAR2,
  p_contadorSessaoFiscal         IN NUMBER,
  p_contadorSessaoGerencial      IN NUMBER,
  p_gerandoInventario            IN NUMBER,
  p_buscarPrecoUnitarioCMV       IN NUMBER,
  p_buscarPrecoUnitUltimaCompra  IN NUMBER,
  p_buscarPrecoCustoUltimaCompra IN NUMBER,
  p_buscarPrecoCustoUltimaFormac IN NUMBER,
  p_buscarICMS                   IN NUMBER,
  p_invEst_data                  IN DATE,
  p_invEst_motivoInventario      IN CHAR,
  p_inEstabelecimentos           IN VARCHAR2,
  p_produto                      IN NUMBER,
  p_prod_join                    IN VARCHAR2,
  p_prod_andWhere                IN VARCHAR2,
  p_filtroProduto                IN NUMBER,
  p_inventario_join              IN VARCHAR2,
  p_inventario_andWhere          IN VARCHAR2,
  p_movimentos_join              IN VARCHAR2,
  p_movimentos_andWhere          IN VARCHAR2,
  p_docFiscal_join               IN VARCHAR2,
  p_docFiscal_andWhere           IN VARCHAR2,
  p_docFiscalFilho_join          IN VARCHAR2,
  p_docFiscalFilho_andWhere      IN VARCHAR2)
IS
  v_prod_join     CLOB;
  v_prod_andWhere CLOB;
BEGIN
  v_prod_join := '
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto'
|| CASE
     WHEN p_prod_join IS NULL OR p_prod_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_prod_join)
   END
|| CASE
     WHEN p_produto <> 0 OR p_filtroProduto = 0
     THEN ''
     ELSE '
    JOIN PAFILTROSPRODUTO filtrProd
    ON filtrProd.filtroProduto = ' || TO_CHAR(p_filtroProduto)
   END;
  v_prod_andWhere := '
      AND gradProd.produto '
|| CASE
     WHEN  p_produto = 0
     THEN '> 0'
       || CASE
            WHEN p_prod_andWhere IS NULL OR p_prod_andWhere = ' '
            THEN '
    AND prod.controleEstoque IN (1,5,11,12,13)'
            ELSE '
    ' || RTRIM(p_prod_andWhere)
          END
       || CASE
            WHEN p_filtroProduto = 0
            THEN ''
            ELSE '
    AND filtrProd.filtrarVendedores              = 0
    AND filtrProd.filtrarLocaisEstoque           = 0
    AND filtrProd.filtrarPersonalizacoes         = 0
    AND (filtrProd.filtrarProdutos               = 0
      AND filtrProd.filtrarCategoriasProdutos    = 0
      AND filtrProd.filtrarSubcategoriasProdutos = 0
      AND filtrProd.filtrarMarcas                = 0
      AND filtrProd.filtrarCaracteristicasA      = 0
      AND filtrProd.filtrarCaracteristicasB      = 0
      AND filtrProd.filtrarCaracteristicasC      = 0
      AND filtrProd.filtrarCaracteristicasD      = 0
      AND filtrProd.filtrarCaracteristicasE      = 0
      AND filtrProd.filtrarCores                 = 0
      AND filtrProd.filtrarTamanhos              = 0
      AND filtrProd.filtrarNCMs                  = 0
      AND filtrProd.filtrarListasServicos        = 0
      OR filtrProd.filtrarProdutos               = 1
      AND EXISTS (
        SELECT 1
        FROM PAFILTROPRODUTOXPRODUTOS filtrProdX
        WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
        AND filtrProdX.produto = prod.produto
        AND filtrProdX.ativo = 1)
      OR (filtrProd.filtrarCategoriasProdutos     = 1
        OR filtrProd.filtrarSubcategoriasProdutos = 1
        OR filtrProd.filtrarMarcas                = 1
        OR filtrProd.filtrarCaracteristicasA      = 1
        OR filtrProd.filtrarCaracteristicasB      = 1
        OR filtrProd.filtrarCaracteristicasC      = 1
        OR filtrProd.filtrarCaracteristicasD      = 1
        OR filtrProd.filtrarCaracteristicasE      = 1
        OR filtrProd.filtrarCores                 = 1
        OR filtrProd.filtrarTamanhos              = 1
        OR filtrProd.filtrarNCMs                  = 1
        OR filtrProd.filtrarListasServicos        = 1)
      AND (filtrProd.filtrarCategoriasProdutos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCATEGPROD filtrProdX
          JOIN PASUBCATEGORIASPRODUTO subCatX
          ON subCatX.categoriaProduto = filtrProdX.categoriaProduto
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND subCatX.subcategoriaProduto = prod.subcategoriaProduto
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarSubcategoriasProdutos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXSUBCAPROD filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.subcategoriaProduto = prod.subcategoriaProduto
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarMarcas = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXMARCAS filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.marca = prod.marca
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarCaracteristicasA = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERA filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.caracteristicaA = prod.caracteristicaA
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarCaracteristicasB = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERB filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.caracteristicaB = prod.caracteristicaB
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarCaracteristicasC = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERC filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.caracteristicaC = prod.caracteristicaC
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarCaracteristicasD = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERD filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.caracteristicaD = prod.caracteristicaD
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarCaracteristicasE = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERE filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.caracteristicaE = prod.caracteristicaE
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarCores = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCORES filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.cor = gradProd.Cor
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarTamanhos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXTAMANHOS filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.tamanho = gradProd.tamanho
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarNCMs = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXNCMS filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.idNcm = prod.idNcm
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarListasServicos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXLISTASSE filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.listaServicos = prod.listaServicos
          AND filtrProdX.ativo = 1)))'
          END
     ELSE ' = ' || TO_CHAR(p_produto)
   END;
  IF p_contadorSessaoFiscal <> 0 THEN
    DELETE TEMPINVENTARIOESTXFISCAL
    WHERE sessaoClient = p_sessaoClient
    AND contadorSessao = p_contadorSessaoFiscal;
    EXECUTE IMMEDIATE 'INSERT INTO TEMPINVENTARIOESTXFISCAL (
  sessaoClient,
  contadorSessao,
  contador,
  estabelecimento,
  gradeProduto,
  indicadorPropriedadePosseItem,
  pessoaParticipante,
  quantidade,
  precoUnitarioCMV,
  stICMS,
  baseICMS,
  valorICMS)
WITH
DATAINVENTARIOSESTOQUE AS (
  SELECT
    a.inventarioEstoque,
    a.estabelecimento,
    TRUNC(a.data) data
  FROM (
    SELECT
      inventarioEstoque,
      estabelecimento,
      data,
      ROW_NUMBER() OVER (
        PARTITION BY estabelecimento
        ORDER BY
          estabelecimento ASC,
          data DESC,
          inventarioEstoque DESC
        ) ordenacao
    FROM MOINVENTARIOSESTOQUE
    WHERE motivoInventarioEstoque = ''01''
    AND data < TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')'
|| CASE
     WHEN p_gerandoInventario = 0
     THEN ' + 1'
     ELSE ''
   END
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
    AND estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| ') a
  WHERE a.ordenacao = 1),
DATAINVENTARIOESTOQUEXFISC AS (
  SELECT
    a.inventarioEstoque,
    a.estabelecimento,
    a.produto,
    TRUNC(a.data) data
  FROM (
    SELECT
      invEst.inventarioEstoque,
      invEst.estabelecimento,
      gradProd.produto,
      invEst.data,
      ROW_NUMBER() OVER (
        PARTITION BY
          invEst.estabelecimento,
          gradProd.produto
        ORDER BY
          invEst.estabelecimento ASC,
          gradProd.produto ASC,
          invEst.data DESC,
          itemInv.inventarioEstoque DESC
        ) ordenacao
    FROM MOINVENTARIOESTOQUEXFISC itemInv
    JOIN MOINVENTARIOSESTOQUE invEst
    ON invEst.inventarioEstoque = itemInv.inventarioEstoque
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = itemInv.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_inventario_join IS NULL OR p_inventario_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_join)
   END
|| '
    WHERE invEst.motivoInventarioEstoque <> ''01''
    AND invEst.data < TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')
    AND invEst.data >= COALESCE((
      SELECT MAX (dataInv.data) + 1
      FROM DATAINVENTARIOSESTOQUE dataInv
      WHERE dataInv.estabelecimento = invEst.estabelecimento),
      TO_DATE (''01/01/1900'',''DD/MM/YYYY''))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
    AND invEst.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_inventario_andWhere IS NULL OR p_inventario_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_andWhere)
   END
|| ') a
  WHERE a.ordenacao = 1),
DATAESTOQUEINICIAL AS (
  SELECT
    a.estabelecimento,
    TRUNC(a.data) data,
    a.produto
  FROM (
    SELECT
      mov.estabelecimento,
      mov.data,
      gradProd.produto,
      ROW_NUMBER() OVER (
        PARTITION BY
          mov.estabelecimento,
          gradProd.produto
        ORDER BY
          mov.estabelecimento ASC,
          gradProd.produto ASC,
          mov.data DESC,
          mov.idEstoque DESC
        ) ordenacao
    FROM MOESTOQUES mov
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = mov.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_movimentos_join IS NULL OR p_movimentos_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_movimentos_join)
   END
|| '
    WHERE mov.operacaoInternaEstoque = 1
    AND mov.data < TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') + 1
    AND mov.data >= COALESCE((
      SELECT MAX (dataInvFisc.data) + 1
      FROM DATAINVENTARIOESTOQUEXFISC dataInvFisc
      WHERE dataInvFisc.estabelecimento = mov.estabelecimento
      AND dataInvFisc.produto = gradProd.produto),
      COALESCE((
        SELECT MAX (dataInv.data) + 1
        FROM DATAINVENTARIOSESTOQUE dataInv
        WHERE dataInv.estabelecimento = mov.estabelecimento),
        TO_DATE (''01/01/1900'',''DD/MM/YYYY'')))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
    AND mov.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_movimentos_andWhere IS NULL OR p_movimentos_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_movimentos_andWhere)
   END
|| ') a
  WHERE a.ordenacao = 1)
SELECT
  ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || ''',
  ' || TO_CHAR(p_contadorSessaoFiscal) || ',
  ROW_NUMBER() OVER (
    ORDER BY
      a.estabelecimento,
      a.gradeProduto,
      a.indicadorPropriedadePosseItem,
      a.pessoaParticipante),
  a.estabelecimento,
  a.gradeProduto,
  a.indicadorPropriedadePosseItem,
  a.pessoaParticipante,
  SUM (a.quantidade),
  0 precoUnitarioCMV,
  ''00'' stICMS,
  0 baseICMS,
  0 valorICMS
FROM (
  SELECT DISTINCT
    itemInv.id,
    invEst.estabelecimento,
    itemInv.indicadorPropriedadePosseItem,
    itemInv.pessoaParticipante,
    itemInv.gradeProduto,
    itemInv.quantidade,
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MOINVENTARIOESTOQUEXFISC itemInv
  JOIN MOINVENTARIOSESTOQUE invEst
  ON invEst.inventarioEstoque = itemInv.inventarioEstoque
  JOIN DATAINVENTARIOSESTOQUE dataInv
  ON dataInv.inventarioEstoque = itemInv.inventarioEstoque
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = itemInv.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_inventario_join IS NULL OR p_inventario_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_join)
   END
|| '
  WHERE NOT (EXISTS(
    SELECT 1
    FROM DATAINVENTARIOESTOQUEXFISC dataInvFisc
    WHERE dataInvFisc.estabelecimento = invEst.estabelecimento
    AND dataInvFisc.produto = gradProd.produto))
  AND NOT (EXISTS(
    SELECT 1
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = invEst.estabelecimento
    AND dataEstInic.produto = gradProd.produto))'
|| v_prod_andWhere
|| CASE
     WHEN p_inventario_andWhere IS NULL OR p_inventario_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_andWhere)
   END
|| '
  UNION ALL
  SELECT DISTINCT
    itemInv.id,
    invEst.estabelecimento,
    itemInv.indicadorPropriedadePosseItem,
    itemInv.pessoaParticipante,
    itemInv.gradeProduto,
    itemInv.quantidade,
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MOINVENTARIOESTOQUEXFISC itemInv
  JOIN MOINVENTARIOSESTOQUE invEst
  ON invEst.inventarioEstoque = itemInv.inventarioEstoque
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = itemInv.gradeProduto
  JOIN DATAINVENTARIOESTOQUEXFISC dataInvFisc
  ON dataInvFisc.inventarioEstoque = itemInv.inventarioEstoque
  AND dataInvFisc.produto = gradProd.produto'
|| v_prod_join
|| CASE
     WHEN p_inventario_join IS NULL OR p_inventario_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_join)
   END
|| '
  WHERE NOT (EXISTS(
    SELECT 1
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = dataInvFisc.estabelecimento
    AND dataEstInic.produto = gradProd.produto))'
|| v_prod_andWhere
|| CASE
     WHEN p_inventario_andWhere IS NULL OR p_inventario_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_andWhere)
   END
|| '
  UNION ALL
  SELECT DISTINCT
    mov.idEstoque id,
    mov.estabelecimento,
    mov.indicadorPropriedadePosseItem,
    mov.pessoaParticipante,
    mov.gradeProduto,
    mov.quantidade * CASE WHEN mov.entradaSaida = ''S'' THEN -1 ELSE 1 END quantidade,
    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.operacaoInternaEstoque IN (1,102,900)
  AND mov.data < TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') + 1
  AND mov.data >= COALESCE((
    SELECT MAX (dataEstInic.data)
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = mov.estabelecimento
    AND dataEstInic.produto = gradProd.produto),
    COALESCE((
      SELECT MAX (dataInvFisc.data) + 1
      FROM DATAINVENTARIOESTOQUEXFISC dataInvFisc
      WHERE dataInvFisc.estabelecimento = mov.estabelecimento
      AND dataInvFisc.produto = gradProd.produto),
      COALESCE((
        SELECT MAX (dataInv.data) + 1
        FROM DATAINVENTARIOSESTOQUE dataInv
        WHERE dataInv.estabelecimento = mov.estabelecimento),
        TO_DATE (''01/01/1900'',''DD/MM/YYYY''))))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
  AND mov.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_movimentos_andWhere IS NULL OR p_movimentos_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_movimentos_andWhere)
   END
|| '
  UNION ALL
  SELECT DISTINCT
    itemDoc.idItemDocFiscal id,
    cabDoc.estabelecimento,
    locEst.indicadorPropriedadePosseItem,
    itemDoc.pessoaParticipante,
    itemDoc.gradeProduto,
    itemDoc.quantidade * CASE WHEN cabDoc.entradaSaida = ''S'' THEN -1 ELSE 1 END quantidade,
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MODOCFISCALXITENS itemDoc
  JOIN MODOCUMENTOSFISCAIS cabDoc
  ON cabDoc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = itemDoc.gradeProduto
  JOIN PALOCAISESTOQUE locEst
  ON locEst.localEstoque = itemDoc.localEstoque'
|| v_prod_join
|| CASE
     WHEN p_docFiscal_join IS NULL OR p_docFiscal_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_docFiscal_join)
   END
|| '
  WHERE itemDoc.cancelado = 0
  AND itemDoc.movimentaEstoqueFiscal = 1
  AND cabDoc.situacaoDocumentoFiscal BETWEEN 21 AND 23
  AND cabDoc.dataEntradaSaida < TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') + 1
  AND cabDoc.dataEntradaSaida >= COALESCE((
    SELECT MAX (dataEstInic.data)
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = cabDoc.estabelecimento
    AND dataEstInic.produto = gradProd.produto),
    COALESCE((
      SELECT MAX (dataInvFisc.data) + 1
      FROM DATAINVENTARIOESTOQUEXFISC dataInvFisc
      WHERE dataInvFisc.estabelecimento = cabDoc.estabelecimento
      AND dataInvFisc.produto = gradProd.produto),
      COALESCE((
        SELECT MAX (dataInv.data) + 1
        FROM DATAINVENTARIOSESTOQUE dataInv
        WHERE dataInv.estabelecimento = cabDoc.estabelecimento),
        TO_DATE (''01/01/1900'',''DD/MM/YYYY''))))
  AND NOT(EXISTS(
    SELECT 1
    FROM MODOCFISCALXPRODUTOFILHO filhoDoc
    WHERE filhoDoc.idItemDocFiscal = itemDoc.idItemDocFiscal))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
  AND cabDoc.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_docFiscal_andWhere IS NULL OR p_docFiscal_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_docFiscal_andWhere)
   END
|| '
  UNION ALL
  SELECT DISTINCT
    filhoDoc.id,
    cabDoc.estabelecimento,
    locEst.indicadorPropriedadePosseItem,
    itemDoc.pessoaParticipante,
    filhoDoc.gradeProduto,
    filhoDoc.quantidade * CASE WHEN cabDoc.entradaSaida = ''S'' THEN -1 ELSE 1 END quantidade,
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MODOCFISCALXPRODUTOFILHO filhoDoc
  JOIN MODOCFISCALXITENS itemDoc
  ON itemDoc.idItemDocFiscal = filhoDoc.idItemDocFiscal
  JOIN MODOCUMENTOSFISCAIS cabDoc
  ON cabDoc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = filhoDoc.gradeProduto
  JOIN PALOCAISESTOQUE locEst
  ON locEst.localEstoque = itemDoc.localEstoque'
|| v_prod_join
|| CASE
     WHEN p_inventario_join IS NULL OR p_inventario_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_join)
   END
|| '
  WHERE itemDoc.cancelado = 0
  AND itemDoc.movimentaEstoqueFiscal = 1
  AND cabDoc.situacaoDocumentoFiscal BETWEEN 21 AND 23
  AND cabDoc.dataEntradaSaida < TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') + 1
  AND cabDoc.dataEntradaSaida >= COALESCE((
    SELECT MAX (dataEstInic.data)
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = cabDoc.estabelecimento
    AND dataEstInic.produto = gradProd.produto),
    COALESCE((
      SELECT MAX (dataInvFisc.data) + 1
      FROM DATAINVENTARIOESTOQUEXFISC dataInvFisc
      WHERE dataInvFisc.estabelecimento = cabDoc.estabelecimento
      AND dataInvFisc.produto = gradProd.produto),
      COALESCE((
        SELECT MAX (dataInv.data) + 1
        FROM DATAINVENTARIOSESTOQUE dataInv
        WHERE dataInv.estabelecimento = cabDoc.estabelecimento),
        TO_DATE (''01/01/1900'',''DD/MM/YYYY''))))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
  AND cabDoc.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_inventario_andWhere IS NULL OR p_inventario_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_andWhere)
   END
|| ') a
GROUP BY
  a.gradeProduto,
  a.estabelecimento,
  a.indicadorPropriedadePosseItem,
  a.pessoaParticipante,
  a.produto,
  a.cor,
  a.tamanho';
    IF p_buscarPrecoUnitarioCMV = 1 THEN
      EXECUTE IMMEDIATE 'BEGIN
  FOR a IN (
    SELECT
      a.sessaoClient,
      a.contadorSessao,
      a.estabelecimento,
      a.indicadorPropriedadePosseItem,
      a.pessoaParticipante,
      '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'a.gradeProduto'
           ELSE 'a.produto'
          END
      || ',
      FUNC_ADD_BUSCA_PRECO_MEDIO_FIS(
        ' || TO_CHAR(p_config_209_filtrarGrupoEcon) || ', -- p_config_209_filtrarGrupoEcon
        ' || TO_CHAR(p_config_362_calcCustoPorGrade) || ', -- p_config_362_calcCustoPorGrade
        a.estabelecimento,
        TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY''), -- p_dataFinal
        a.pessoaParticipante,
        a.produto,
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.cor' ELSE '0' END || ',
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.tamanho' ELSE ''' ''' END || ',
        a.indicadorPropriedadePosseItem,
        ' || TO_CHAR(p_gerandoInventario) || ' -- p_gerandoInventario
      ) precoUnitarioCMV
    FROM (
      SELECT
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        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_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
      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_ORCAMENTO_CAB_RESERVA_GRAV (
  p_orcamento            IN NUMBER,
  p_estabelecimentoAtivo IN NUMBER)
IS
  v_bufferIdReservaEstoque VARCHAR2 (32000);
BEGIN
  v_bufferIdReservaEstoque := '';
  FOR a IN (
    SELECT idItemOrcamento
    FROM MOORCAMENTOXITENS
    WHERE orcamento = p_orcamento
    ORDER BY sequencia)
  LOOP
    ADD_ORCAMENTO_ITEM_RES_ITEM(
      a.idItemOrcamento,
      p_estabelecimentoAtivo, 
      v_bufferIdReservaEstoque, 
      v_bufferIdReservaEstoque);
  END LOOP;
END ADD_ORCAMENTO_CAB_RESERVA_GRAV;

/

create or replace PROCEDURE ADD_ORCAMENTO_CAB_ETAPA_TROCA (
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_378_calcularVolumes   IN NUMBER,
  p_orcamento                    IN NUMBER,
  p_usuario                      IN NUMBER,
  p_novaEtapaOrcamento           IN NUMBER,
  p_justificativaCancelamento    IN VARCHAR,
  p_cancelandoOrcamento          IN NUMBER,
  p_colaboradorRespRecebimento   IN NUMBER,
  /* Retornos */
  r_cab_etapaOrcamento           OUT NUMBER,
  r_etOrc_descricao              OUT VARCHAR,
  r_etOrc_situacaoOrcamento      OUT NUMBER,
  r_etOrc_financeiro             OUT CHAR,
  r_etOrc_habilitaImprimirManual OUT NUMBER)
IS
  v_auxNumber  NUMBER;
  v_auxVarchar VARCHAR2 (32000);
BEGIN
  SELECT
    descricao,
    situacaoOrcamento,
    financeiro,
    habilitaImprimirManual
  INTO
    r_etOrc_descricao,
    r_etOrc_situacaoOrcamento,
    r_etOrc_financeiro,
    r_etOrc_habilitaImprimirManual
  FROM PAETAPASORCAMENTO
  WHERE etapaOrcamento = p_novaEtapaOrcamento;
  SELECT etapaOrcamento
  INTO r_cab_etapaOrcamento
  FROM MOORCAMENTOS
  WHERE orcamento = p_orcamento;
  IF r_cab_etapaOrcamento <> p_novaEtapaOrcamento THEN
    IF p_cancelandoOrcamento = 1
      OR r_etOrc_situacaoOrcamento = 90
    THEN
      IF NOT (p_justificativaCancelamento IS NULL)
        AND p_justificativaCancelamento <> ' '
      THEN
        ADD_ORCAMENTO_INFO_CRIA (
          p_estabelecimentoAtivo,
          p_orcamento,
          0,
          0,
          0,
          0,
          p_justificativaCancelamento);
      END IF;
      FOR a IN (
        SELECT idItemOrcamento
        FROM MOORCAMENTOXITENS
        WHERE orcamento = p_orcamento
        AND cancelado = 0)
      LOOP
        ADD_ORCAMENTO_ITEM_EXCLUI (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_person_190_modeloFrete,
          p_config_378_calcularVolumes,
          0,
          a.idItemOrcamento,
          'C',
          1,
          v_auxVarchar,
          v_auxNumber);
      END LOOP;
      FOR a IN (
        SELECT idPagamentoOrcamento
        FROM MOORCAMENTOXPAGAMENTOS
        WHERE orcamento = p_orcamento)
      LOOP
        ADD_ORCAMENTO_PAG_EXCLUI_CORR (a.idPagamentoOrcamento);
        UPDATE MOORCAMENTOXPAGAMENTOS b
        SET b.saldoEfetivar = 0
        WHERE b.idPagamentoOrcamento = a.idPagamentoOrcamento;
      END LOOP;
    ELSIF r_etOrc_situacaoOrcamento <= 30 THEN
      FOR a IN (
        SELECT b.entrega
        FROM MOORCAMENTOXITENS a
        JOIN MOENTREGAS b
        ON b.idItemOrcamento = a.idItemOrcamento
        WHERE a.orcamento = p_orcamento
        AND a.cancelado = 0
        AND b.situacaoEntrega <= 4)
      LOOP
        ADD_ENTREGA_EXCLUI (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          a.entrega,
          0,
          'ADD_ORCAMENTO_CAB_ETAPA_TROCA');
      END LOOP;
    END IF;
    UPDATE MOORCAMENTOS
    SET etapaOrcamento = p_novaEtapaOrcamento
    WHERE orcamento = p_orcamento;
    r_cab_etapaOrcamento := p_novaEtapaOrcamento;    
    ADD_ORCAMENTO_CAB_ETAPA_CRIA (
      p_usuarioLogado,
      p_estabelecimentoAtivo,
      p_orcamento,
      p_usuario,
      p_novaEtapaOrcamento,
      ' ');
  END IF;
  ADD_ORCAMENTO_CAB_RESERVA_GRAV (
    p_orcamento,
    p_estabelecimentoAtivo);
  IF NOT (r_etOrc_situacaoOrcamento IN(11,90))
    AND p_cancelandoOrcamento = 0
  THEN
    FOR a IN (
      SELECT itemTransf.documentoTransferencia
      FROM MODOCUMENTOTRANSFXITENS itemTransf
      JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
      ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
      JOIN MODOCTRANSFXORCAMENTOITEM transfXDoc
      ON transfXDoc.idItemDocTransferencia = itemTransf.idItemDocTransferencia
      JOIN MOORCAMENTOXITENS itemDoc
      ON itemDoc.idItemOrcamento = transfXDoc.idItemOrcamento
      WHERE itemDoc.orcamento = p_orcamento
      AND itemTransf.documentoTransferencia > 0
      AND transfXDoc.entradaSaidaOriginal = 'E'
      AND (cabTransf.colaboradorResponsavelRetirada = 0
        OR cabTransf.colaboradorResponsavelRecebim = 0)
      GROUP BY itemTransf.documentoTransferencia)
    LOOP
      ADD_DOCTRANSF_CAB_ENCERRA_REC (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        a.documentoTransferencia,
        p_colaboradorRespRecebimento);
    END LOOP;
  END IF;
END ADD_ORCAMENTO_CAB_ETAPA_TROCA;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_REF_ORCAMEN (
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_cab_preDocumento             IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_documentoFiscal          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_item_idItemPreDocumento      IN NUMBER,
  p_item_sequencia               IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  p_idItemOrcamento              IN NUMBER,
  p_quantidadeBaixar             IN NUMBER,
  p_atualizarObservacoes         IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes         OUT NUMBER)
IS
  v_id                    NUMBER;
  v_orcamentoReferenciado NUMBER;
  v_sequenciaReferenciado NUMBER;
  v_orc_pessoa            NUMBER;
  v_auxAlpha              VARCHAR (3200);
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  ADD_PRE_DOC_ITEM_N_SER_ORCAMEN (
    p_estabelecimentoAtivo,
    p_idItemOrcamento,
    p_item_idItemPreDocumento,
    CASE WHEN p_quantidadeBaixar > 0 THEN 1 ELSE 0 END,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  ADD_PRE_DOC_ITEM_CUSTO_ORCAMEN (
    p_estabelecimentoAtivo,
    p_idItemOrcamento,
    p_item_idItemPreDocumento);
  ADD_PRE_DOC_ITEM_COMP_ORCAMEN (
    p_estabelecimentoAtivo,
    p_idItemOrcamento,
    p_item_idItemPreDocumento,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  SELECT COALESCE (MAX (id),0)
  INTO v_id
  FROM MOPREDOCUMXORCAMENTOITEM
  WHERE idItemPreDocumento = p_item_idItemPreDocumento
  AND idItemOrcamento = p_idItemOrcamento;
  IF v_id > 0 THEN
    IF p_quantidadeBaixar <> 0 THEN
      UPDATE MOPREDOCUMXORCAMENTOITEM SET
        quantidade = quantidade + p_quantidadeBaixar
      WHERE id = v_id;
    END IF;
  ELSE
    v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MOPREDOCUMXORCAMENTOITEM', 'id', 14, p_estabelecimentoAtivo, NULL);
    INSERT INTO MOPREDOCUMXORCAMENTOITEM (
      id,
      idItemPreDocumento,
      idItemOrcamento,
      quantidade,
      efetivacao)
    VALUES (
      v_id,
      p_item_idItemPreDocumento,
      p_idItemOrcamento,
      p_quantidadeBaixar,
      1);
  END IF;
  IF p_quantidadeBaixar <> 0 THEN
    SELECT
      orcamento,
      sequencia
    INTO
      v_orcamentoReferenciado,
      v_sequenciaReferenciado
    FROM MOORCAMENTOXITENS
    WHERE idItemOrcamento = p_idItemOrcamento;
    ADD_PRE_DOC_ITEM_BLOEST_ORC (
      p_estabelecimentoAtivo,
      v_orcamentoReferenciado,
      v_sequenciaReferenciado,
      p_cab_preDocumento,
      p_item_sequencia);
    v_orc_pessoa := 0;
    IF p_config_227_manterPessoaOrcam = 1 THEN
      SELECT COALESCE(MAX(orc.pessoa),0)
      INTO v_orc_pessoa
      FROM MOPREDOCUMXITENS itemDoc
      JOIN MOPREDOCUMXORCAMENTOITEM docXOrc
      ON docXOrc.idItemPreDocumento = itemDoc.idItemPreDocumento
      JOIN MOORCAMENTOXITENS itemOrc
      ON itemOrc.idItemOrcamento = docXOrc.idItemOrcamento
      JOIN MOORCAMENTOS orc
      ON orc.orcamento = itemOrc.orcamento
      WHERE itemDoc.preDocumento = p_cab_preDocumento
      AND docXOrc.quantidade <> 0;
    END IF;
    ADD_PRE_DOC_ITEM_MOT_ORCAMEN (
      p_estabelecimentoAtivo,
      p_config_227_manterPessoaOrcam,
      p_cab_preDocumento,
      p_cab_tipoDocumento,
      p_cab_documentoFiscal,
      p_cab_estabelecimento,
      p_cab_pessoa,
      v_orc_pessoa,
      p_item_idItemPreDocumento,
      p_item_sequencia,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_unidadeMedidaConversao,
      p_item_quantidadeConvertida,
      p_item_valorLiquidoItem,
      p_idItemOrcamento);
    UPDATE MOORCAMENTOXITENS
    SET quantidadeSaldo = quantidadeSaldo - p_quantidadeBaixar
    WHERE idItemOrcamento = p_idItemOrcamento;
    UPDATE MOCONSERTOS cons
    SET cons.situacaoConserto = 'R'
    WHERE cons.documentoTransferenciaFornec > 0
    AND cons.situacaoConserto = 'E'
    AND EXISTS (
      SELECT 1 FROM MODOCUMENTOTRANSFXITENS itemTransf
      JOIN MODOCTRANSFXORCAMENTOITEM transfXDoc
      ON transfXDoc.idItemDocTransferencia = itemTransf.idItemDocTransferencia
      WHERE itemTransf.documentoTransferencia = cons.documentoTransferenciaFornec
      AND transfXDoc.entradaSaidaOriginal = 'E'
      AND transfXDoc.idItemOrcamento = p_idItemOrcamento);
    ADD_ENTREGA_CRIA_PENDENTE (
      p_usuarioLogado,
      p_estabelecimentoAtivo,
      p_idItemOrcamento);
    ADD_ORCAMENTO_ITEM_RES_ITEM (
      p_idItemOrcamento,
      p_estabelecimentoAtivo,
      '',
      v_auxAlpha);
  END IF;
END ADD_PRE_DOC_ITEM_REF_ORCAMEN;

/

create or replace PROCEDURE ADD_PRE_DOC_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_227_manterPessoaOrcam IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     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, -- D = Documento Fiscal, O = Orçamento, P, Pré-Documento, T = Transferência
  p_idItemReferenciado           IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_tempComp_nomeTempComposicao  IN VARCHAR2,
  p_tempComp_sequencia           IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemPreDocumento      IN NUMBER,
  p_item_preDocumento            IN NUMBER,
  p_item_pedidoCompraFornecedor  IN VARCHAR2,
  p_item_sequenciaPedidoCompraFo IN NUMBER,
  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_quantidadeExtemporanea  IN NUMBER,
  p_item_acrescimoUnitarioExtemp IN NUMBER,
  p_item_valorAcrescimoExtempIte IN NUMBER,
  p_item_valorDescontoCustoOpIte IN NUMBER,
  p_item_valorAcrescimoCustoOpIt 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_valorAcrescimoExtempGer IN NUMBER,
  p_item_valorDescontoCustoOpGer IN NUMBER,
  p_item_valorAcrescimoCustoOpGe IN NUMBER,
  p_item_valorDescontoPagamento  IN NUMBER,
  p_item_valorOutrasDespPagament IN NUMBER,
  p_item_valorJurosPagamento     IN NUMBER,
  p_item_percentualDevolucao     IN NUMBER,
  p_item_valorIPIDevolucao       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_idItemPreDocumento    IN VARCHAR2,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER,
  r_item_idItemPreDocumento      OUT NUMBER,
  r_buffer_idItemPreDocumento    OUT VARCHAR2,
  r_valorInserido                OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_finalidadeNota           CHAR (1);
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_documentoFiscal          NUMBER;
  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_statusPreDocumento       CHAR (1);
  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_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota 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_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_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_item_sequencia               NUMBER;
  v_item_cancelado               NUMBER;
  v_item_quantidadeDevolvidaRet  NUMBER;
  v_item_precoUnitario           NUMBER;
  v_item_precoUnitarioConvertido NUMBER;
  v_item_valorProdutoServicoBrut NUMBER;
  v_item_valorProdutoServico     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_item_valorDescontoCustoOpTot NUMBER;
  v_item_valorAcrescimoCustoOpTo NUMBER;
  v_item_precoCustoOperacao      NUMBER;
  v_item_valorCustoOperacao      NUMBER;
  v_item_precoCMV                NUMBER;
  v_item_valorCMV                NUMBER;
  v_item_valorAcrescimoExtempSub NUMBER;
  v_item_valorAcrescimoExtempTot 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_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_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  r_item_idItemPreDocumento := p_item_idItemPreDocumento;
  r_buffer_idItemPreDocumento := p_buffer_idItemPreDocumento;
  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.devolucaoAnulacaoRetorno,
    cab.finalidadeNota,
    cab.atualizaCustoMedio,
    cab.documentoFiscal,
    cab.estabelecimento,
    cab.dataEmissao,
    cab.pessoa,
    cab.enderecoEntregaPessoa,
    cab.municipioFatoGerador,
    cab.localDestinoOperacao,
    cab.indicadorConsumidorFinal,
    cab.modalidadeFrete,
    cab.tipoPagamentoFrete,
    cab.statusPreDocumento,
    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,
    cab.valorDescontoCustoOpItem,
    cab.valorDescontoCustoOpGeral,
    cab.valorDescontoCustoOpTotal,
    cab.valorAcrescimoCustoOpItem,
    cab.valorAcrescimoCustoOpGeral,
    cab.valorAcrescimoCustoOpTotal,
    cab.valorCustoOperacao,
    cab.valorCMV,
    cab.quantidadeExtemporanea,
    cab.valorAcrescimoExtempSubtotal,
    cab.valorAcrescimoExtempItem,
    cab.valorAcrescimoExtempGeral,
    cab.valorAcrescimoExtempTotal,
    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
  INTO
    v_cab_origemDocumento,
    v_cab_tipoDocumento,
    v_cab_entradaSaida,
    v_cab_devolucaoAnulacaoRetorno,
    v_cab_finalidadeNota,
    v_cab_atualizaCustoMedio,
    v_cab_documentoFiscal,
    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_statusPreDocumento,
    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_cab_valorDescontoCustoOpItem,
    v_cab_valorDescontoCustoOpGera,
    v_cab_valorDescontoCustoOpTota,
    v_cab_valorAcrescimoCustoOpIte,
    v_cab_valorAcrescimoCustoOpGer,
    v_cab_valorAcrescimoCustoOpTot,
    v_cab_valorCustoOperacao,
    v_cab_valorCMV,
    v_cab_quantidadeExtemporanea,
    v_cab_valorAcrescimoExtempSubt,
    v_cab_valorAcrescimoExtempItem,
    v_cab_valorAcrescimoExtempGera,
    v_cab_valorAcrescimoExtempTota,
    v_est_grupoFiscal,
    v_pessEst_regimeTributario,
    v_munEndEst_uf,
    v_pess_indicadorInscricaoEstad,
    v_endPess_enderecoPessoa,
    v_munEndPess_uf,
    v_munEndEntr_uf
  FROM MOPREDOCUMENTOS 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
  WHERE cab.preDocumento = p_item_preDocumento;
  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_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_item_quantidadeDevolvidaRet  := 0;
  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_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;
  IF p_manterFinanceiro_Retotalizar = 0 THEN
    SELECT COALESCE (MAX(1), 0)
    INTO v_cab_promocaoExiste
    FROM MOPREDOCUMXPROMOCOES
    WHERE preDocumento = p_item_preDocumento;
  END IF;
  IF p_item_idItemPreDocumento > 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.quantidadeDevolvidaRetornada,
        a.pesoLiquido,
        a.pesoBruto,
        a.valorProdutoServicoBruto,
        a.valorProdutoServico,
        a.valorDescontoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.quantidadeExtemporanea,
        a.valorAcrescimoExtempSubtotal,
        a.valorAcrescimoExtempItem,
        a.valorDescontoCustoOpItem,
        a.valorAcrescimoCustoOpItem,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorAcrescimoExtempGeral,
        a.valorDescontoCustoOpGeral,
        a.valorAcrescimoCustoOpGeral,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.valorFreteTotal,
        a.valorSeguroTotal,
        a.valorDescontoTotal,
        a.valorOutrasDespesasTotal,
        a.valorAdicFreteMarinhaMerTotal,
        a.valorDespesasAduaneirasTotal,
        a.valorAcrescimoExtempTotal,
        a.valorDescontoCustoOpTotal,
        a.valorAcrescimoCustoOpTotal,
        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,
        a.valorCustoOperacao,
        a.valorCMV,
        prod.tipoProduto
      FROM MOPREDOCUMXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      WHERE a.idItemPreDocumento = p_item_idItemPreDocumento)
    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_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_item_quantidadeDevolvidaRet := a.quantidadeDevolvidaRetornada;
      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 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 <> p_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;
        v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
        v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
        v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
        v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
        v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
        v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
        v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
        v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
        v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
        v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
        v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
        v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
        v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      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,
    p_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);
  v_item_valorAcrescimoExtempSub := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
    p_item_quantidade,
    v_item_precoUnitario,
    p_item_quantidadeExtemporanea,
    p_item_acrescimoUnitarioExtemp);
  v_item_valorAcrescimoExtempTot := FUNC_ADD_CALC_EXTEMP_TOTAL(
    v_item_valorAcrescimoExtempSub,
    p_item_valorAcrescimoExtempIte,
    p_item_valorAcrescimoExtempGer);
  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 = CASE WHEN v_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
      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,
        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_PRE_DOC_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_227_manterPessoaOrcam,
        p_config_362_calcCustoPorGrade,
        p_config_378_calcularVolumes,
        p_config_413_obs_add_marca,
        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, -- D = Documento Fiscal, G = Grade DF-e, O = Orçamento, 'P', Pré-Documento, T = Transferência
        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_calcularImpostos,
        0, -- p_item_idItemPreDocumento
        p_item_preDocumento,
        p_item_pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo,
        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
        CASE
          WHEN p_item_quantidade = 0
          THEN 0
          ELSE ROUND(p_item_quantidadeExtemporanea * a.quantidade / p_item_quantidade, 2)
        END, -- p_item_quantidadeExtemporanea
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_acrescimoUnitarioExtemp
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_acrescimoUnitarioExtemp
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoExtempIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpIt
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpIt
        p_item_observacoesDigitadas,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorFreteGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_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_valorAcrescimoExtempGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpGe
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpGe
        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
        p_item_percentualDevolucao,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorIPIDevolucao
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorIPIDevolucao,
        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_idItemPreDocumento,
        /* Retornos */
        r_calcularImpostos,
        v_auxNumber, -- idItemPreDocumento
        r_buffer_idItemPreDocumento,
        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_PRE_DOC_ITEM_COMBO_RESIDUO (
        p_item_preDocumento,
        v_item_valorProdutoServico,
        p_item_valorDescontoItem,
        p_item_valorAcrescimoItem,
        v_modDoc_diminuiDescontoPrUnit,
        v_modDoc_somaAcrescimosPrUnit,
        r_buffer_idItemPreDocumento,
        r_valorInserido);
      r_calcularImpostos := 1;
    END IF;
  ELSE
    IF r_item_idItemPreDocumento <= 0 THEN
      r_item_idItemPreDocumento := FUNC_ADD_BUSCA_PROXIMO_ID ('MOPREDOCUMXITENS', 'idItemPreDocumento', 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
          OR p_item_valorAcrescimoExtempGer <> 0
          OR p_item_valorDescontoCustoOpGer <> 0
          OR p_item_valorAcrescimoCustoOpGe <> 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_PRE_DOC_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          p_item_preDocumento,
          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 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,
        p_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,
        v_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,
        v_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
        p_item_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,
      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
      v_item_valorAcrescimoExtempTot,
      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,
      p_item_valorIPIDevolucao,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      v_item_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0 -- p_item_somarICMSST
      );
    ADD_CALCULA_CUSTO_CMV (
      v_cab_atualizaCustoMedio,
      v_cab_estabelecimento,
      0, -- p_cab_nfFornecedor
      p_item_modeloDocumento,
      p_item_quantidade,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      p_item_valorIPIDevolucao,
      v_item_valorPIS,
      v_item_valorPISST,
      v_item_valorCOFINS,
      v_item_valorCOFINSST,
      v_item_valorCreditoSimplesNac,
      v_item_valorICMS,
      v_item_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      v_item_valorLiquidoItem,
      p_item_valorDescontoCustoOpIte,
      p_item_valorDescontoCustoOpGer,
      p_item_valorAcrescimoCustoOpIt,
      p_item_valorAcrescimoCustoOpGe,
      v_item_valorAcrescimoExtempTot,
      v_item_valorDescontoCustoOpTot,
      v_item_valorAcrescimoCustoOpTo,
      v_item_precoCustoOperacao,
      v_item_valorCustoOperacao,
      v_item_precoCMV,
      v_item_valorCMV);
    IF v_inserindoItem = 1 THEN
      SELECT COALESCE (MAX (sequencia),0) + 1
      INTO v_item_sequencia
      FROM MOPREDOCUMXITENS
      WHERE preDocumento = p_item_preDocumento;
      v_cab_ultimoVendedorItem := p_item_vendedor;
    END IF;
    IF v_item_cancelado = 0 THEN
      IF p_manterFinanceiro_Retotalizar <> 2 THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume + TRUNC(CASE WHEN p_item_controleQuantidade = 1 AND p_item_loteMultiplo <> 0 THEN p_item_quantidade / p_item_loteMultiplo ELSE p_item_quantidadeConvertida END,0);
        END IF;
        v_cab_pesoLiquido := v_cab_pesoLiquido + p_item_pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto + p_item_pesoBruto;
      END IF;
      v_cab_quantidade := v_cab_quantidade + p_item_quantidadeConvertida;
      IF v_prod_tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorServicos := v_cab_valorServicos + v_item_valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos + p_item_valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorProdutos := v_cab_valorProdutos + v_item_valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos + p_item_valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem + p_item_valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem + p_item_valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem + p_item_valorAdicFreteMarItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem + p_item_valorDespesasAduanItem;
      v_cab_valorFreteGeral := v_cab_valorFreteGeral + p_item_valorFreteGeral;
      v_cab_valorSeguroGeral := v_cab_valorSeguroGeral + p_item_valorSeguroGeral;
      v_cab_valorDescontoGeral := v_cab_valorDescontoGeral + v_item_valorDescontoGeral;
      v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral + p_item_valorOutrasDespesasGer;
      v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral + p_item_valorAdicFreteMarGeral;
      v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral + p_item_valorDespesasAduanGeral;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento + v_item_valorBasePagamento;
      IF p_item_usarPrecoAVista = 1
        AND v_item_geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo + v_item_valorProdutoServico - v_item_valorDescontoTotal + v_item_valorOutrasDespesasTot;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento + v_item_valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento + v_item_valorOutrasDespPagament;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento + v_item_valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal + v_item_valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal + v_item_valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal + v_item_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_item_valorOutrasDespesasTot;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal + v_item_valorAdicFreteMarTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal + v_item_valorDespesasAduanTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem + v_item_valorLiquidoItem;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem + p_item_valorDescontoCustoOpIte;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera + p_item_valorDescontoCustoOpGer;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota + v_item_valorDescontoCustoOpTot;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte + p_item_valorAcrescimoCustoOpIt;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer + p_item_valorAcrescimoCustoOpGe;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot + v_item_valorAcrescimoCustoOpTo;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao + v_item_valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV + v_item_valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea + p_item_quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt + v_item_valorAcrescimoExtempSub;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem + p_item_valorAcrescimoExtempIte;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera + p_item_valorAcrescimoExtempGer;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota + v_item_valorAcrescimoExtempTot;
    END IF;
    UPDATE MOPREDOCUMENTOS SET
      modalidadeFrete               = v_cab_modalidadeFrete,
      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,
      valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
      valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
      valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
      valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
      valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
      valorCustoOperacao            = v_cab_valorCustoOperacao,
      valorCMV                      = v_cab_valorCMV,
      quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
      valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
      valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
      valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
    WHERE preDocumento = p_item_preDocumento;
    IF p_item_idItemPreDocumento > 0 THEN
      DELETE MOPREDOCUMXCOMPOSICOESPR compDoc
      WHERE compDoc.idItemPreDocumento = p_item_idItemPreDocumento
      AND EXISTS(
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.produto = comp.produto
        WHERE comp.composicaoPreco = compDoc.composicaoPreco
        AND gradProd.gradeProduto <> p_item_gradeProduto);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      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_413_obs_add_marca,
      ' ',
      0,
      'P',
      p_item_idItemPreDocumento,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    MERGE INTO MOPREDOCUMXITENS a USING (
      SELECT
        r_item_idItemPreDocumento      idItemPreDocumento,
        p_item_preDocumento            preDocumento,
        v_item_sequencia               sequencia,
        v_item_cancelado               cancelado,
        p_item_pedidoCompraFornecedor  pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo sequenciaPedidoCompraFornec,
        p_item_modeloDocumento         modeloDocumento,
        p_item_estabelecimentoOriginal estabelecimentoOriginal,
        p_item_vendedor                vendedor,
        p_item_gradeProduto            gradeProduto,
        p_item_idFormulaTinta          idFormulaTinta,
        p_item_personalizacao          personalizacao,
        p_item_idLoteEstoque           idLoteEstoque,
        p_item_operacaoFiscal          operacaoFiscal,
        v_item_movimentaEstoque        movimentaEstoque,
        v_item_geraFinanceiro          geraFinanceiro,
        p_item_localEstoque            localEstoque,
        p_item_pessoaParticipante      pessoaParticipante,
        p_item_controleQuantidade      controleQuantidade,
        p_item_unidadeMedidaConversao  unidadeMedidaConversao,
        p_item_conversorQuantidade     conversorQuantidade,
        p_item_loteMinimo              loteMinimo,
        p_item_loteMultiplo            loteMultiplo,
        p_item_altura                  altura,
        p_item_largura                 largura,
        p_item_comprimento             comprimento,
        p_item_pecas                   pecas,
        p_item_quantidade              quantidade,
        p_item_quantidadeConvertida    quantidadeConvertida,
        v_item_quantidadeDevolvidaRet  quantidadeDevolvidaRetornada,
        p_item_percentualDevolucao     percentualDevolucao,
        p_item_pesoLiquido             pesoLiquido,
        p_item_pesoBruto               pesoBruto,
        p_item_tipoPreco               tipoPreco,
        p_item_tabelaPreco             tabelaPreco,
        p_item_precoSugestaoAPrazo     precoSugestaoAPrazo,
        p_item_precoSugestaoAVista     precoSugestaoAVista,
        p_item_precoDesconto           precoDesconto,
        p_item_precoMinimo             precoMinimo,
        p_item_usarPrecoAVista         usarPrecoAVista,
        p_item_precoUnitarioBruto      precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos acrescimoUnitarioComposicao,
        v_item_precoUnitario           precoUnitario,
        v_item_precoUnitarioConvertido precoUnitarioConvertido,
        v_item_valorProdutoServicoBrut valorProdutoServicoBruto,
        v_item_valorProdutoServico     valorProdutoServico,
        p_item_percDescontoItem        percDescontoItem,
        p_item_valorDescontoItem       valorDescontoItem,
        p_item_percAcrescimoItem       percAcrescimoItem,
        p_item_valorAcrescimoItem      valorAcrescimoItem,
        p_item_valorFreteItem          valorFreteItem,
        p_item_valorSeguroItem         valorSeguroItem,
        p_item_valorAdicFreteMarItem   valorAdicFreteMarinhaMerItem,
        p_item_valorDespesasAduanItem  valorDespesasAduaneirasItem,
        p_item_valorFreteGeral         valorFreteGeral,
        p_item_valorSeguroGeral        valorSeguroGeral,
        v_item_valorDescontoGeral      valorDescontoGeral,
        p_item_valorOutrasDespesasGer  valorOutrasDespesasGeral,
        p_item_valorAdicFreteMarGeral  valorAdicFreteMarinhaMerGeral,
        p_item_valorDespesasAduanGeral valorDespesasAduaneirasGeral,
        v_item_valorBasePagamento      valorBasePagamento,
        v_item_valorDescontoPagamento  valorDescontoPagamento,
        v_item_valorOutrasDespPagament valorOutrasDespesasPagamento,
        v_item_valorJurosPagamento     valorJurosPagamento,
        v_item_valorFreteTotal         valorFreteTotal,
        v_item_valorSeguroTotal        valorSeguroTotal,
        v_item_valorDescontoTotal      valorDescontoTotal,
        v_item_valorOutrasDespesasTot  valorOutrasDespesasTotal,
        v_item_valorAdicFreteMarTotal  valorAdicFreteMarinhaMerTotal,
        v_item_valorDespesasAduanTotal valorDespesasAduaneirasTotal,
        v_item_cfop                    cfop,
        v_item_indicadorISSQN          indicadorISSQN,
        v_item_aliquotaISSQN           aliquotaISSQN,
        v_item_retidoISSQN             retidoISSQN,
        v_item_tributadoForaMunicipio  tributadoForaMunicipio,
        v_item_incentivoFiscal         incentivoFiscal,
        v_item_listaServicos           listaServicos,
        v_item_cnae                    cnae,
        v_item_idServicoMunicipio      idServicoMunicipio,
        v_item_numeroProcessoAdministr numeroProcessoAdministrativo,
        v_item_baseISSQN               baseISSQN,
        v_item_valorISSQN              valorISSQN,
        v_item_retencaoIRRF            retencaoIRRF,
        v_item_baseRetIRRF             baseRetIRRF,
        v_item_valorRetIRRF            valorRetIRRF,
        v_item_retencaoINSS            retencaoINSS,
        v_item_baseRetINSS             baseRetINSS,
        v_item_valorRetINSS            valorRetINSS,
        v_item_retencaoPIS             retencaoPIS,
        v_item_baseRetPIS              baseRetPIS,
        v_item_valorRetPIS             valorRetPIS,
        v_item_retencaoCOFINS          retencaoCOFINS,
        v_item_baseRetCOFINS           baseRetCOFINS,
        v_item_valorRetCOFINS          valorRetCOFINS,
        v_item_retencaoCSLL            retencaoCSLL,
        v_item_baseRetCSLL             baseRetCSLL,
        v_item_valorRetCSLL            valorRetCSLL,
        v_item_retencaoOutros          retencaoOutros,
        v_item_baseRetOutros           baseRetOutros,
        v_item_valorRetOutros          valorRetOutros,
        v_item_aliquotaII              aliquotaII,
        v_item_baseII                  baseII,
        v_item_valorII                 valorII,
        v_item_aliquotaIOF             aliquotaIOF,
        v_item_baseIOF                 baseIOF,
        v_item_valorIOF                valorIOF,
        v_item_codigoEnquadramentoIPI  codigoEnquadramentoIPI,
        v_item_stIPI                   stIPI,
        v_item_aliquotaIPI             aliquotaIPI,
        v_item_valorAliquotaIPI        valorAliquotaIPI,
        v_item_baseIPI                 baseIPI,
        v_item_valorIPI                valorIPI,
        p_item_valorIPIDevolucao       valorIPIDevolucao,
        v_item_stPIS                   stPIS,
        v_item_aliquotaPIS             aliquotaPIS,
        v_item_valorAliquotaPIS        valorAliquotaPIS,
        v_item_basePIS                 basePIS,
        v_item_valorPIS                valorPIS,
        v_item_aliquotaPISST           aliquotaPISST,
        v_item_valorAliquotaPISST      valorAliquotaPISST,
        v_item_basePISST               basePISST,
        v_item_valorPISST              valorPISST,
        v_item_stCOFINS                stCOFINS,
        v_item_aliquotaCOFINS          aliquotaCOFINS,
        v_item_valorAliquotaCOFINS     valorAliquotaCOFINS,
        v_item_baseCOFINS              baseCOFINS,
        v_item_valorCOFINS             valorCOFINS,
        v_item_aliquotaCOFINSST        aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST   valorAliquotaCOFINSST,
        v_item_baseCOFINSST            baseCOFINSST,
        v_item_valorCOFINSST           valorCOFINSST,
        v_item_stSimplesNacional       stSimplesNacional,
        v_item_creditoSimplesNacional  creditoSimplesNacional,
        v_item_baseCreditoSimplesNac   baseCreditoSimplesNacional,
        v_item_valorCreditoSimplesNac  valorCreditoSimplesNacional,
        v_item_stICMS                  stICMS,
        v_item_modalBaseCalcICMS       modalidadeBaseCalcICMS,
        v_item_reducaoBaseICMS         reducaoBaseICMS,
        v_item_aliquotaICMS            aliquotaICMS,
        v_item_diferimentoICMS         diferimentoICMS,
        v_item_motivoDesoneracaoICMS   motivoDesoneracaoICMS,
        v_item_idBeneficio             idBeneficio,
        v_item_baseICMS                baseICMS,
        v_item_valorICMSOperacao       valorICMSOperacao,
        v_item_valorICMSDiferido       valorICMSDiferido,
        v_item_valorICMS               valorICMS,
        v_item_valorICMSDesoneracao    valorICMSDesoneracao,
        v_item_modalBaseCalcICMSST     modalidadeBaseCalcICMSST,
        v_item_margemValorAdicionadoST margemValorAdicionadoST,
        v_item_reducaoBaseST           reducaoBaseST,
        v_item_aliquotaICMSST          aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin aliquotaSTSuportConsFinal,
        v_item_baseICMSST              baseICMSST,
        v_item_valorICMSST             valorICMSST,
        v_item_baseICMSSTAnteriormente baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment valorICMSSTAnteriormente,
        v_item_valorICMSProprioSubstit valorICMSProprioSubstituto,
        v_item_reducaoBaseICMSEfetivo  reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo     aliquotaICMSEfetivo,
        v_item_baseICMSEfetivo         baseICMSEfetivo,
        v_item_valorICMSEfetivo        valorICMSEfetivo,
        v_item_aliquotaICMSUFDestinat  aliquotaICMSUFDestinatario,
        v_item_aliquotaICMSInterestad  aliquotaICMSInterestadual,
        v_item_partilhaICMSInterestad  partilhaICMSInterestadual,
        v_item_baseICMSUFDestinatario  baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente     baseICMSUFRemetente,
        v_item_valorICMSUFRemetente    valorICMSUFRemetente,
        v_item_aliquotaFCP             aliquotaFCP,
        v_item_baseFCP                 baseFCP,
        v_item_valorFCP                valorFCP,
        v_item_aliquotaFCPST           aliquotaFCPST,
        v_item_baseFCPST               baseFCPST,
        v_item_valorFCPST              valorFCPST,
        v_item_aliquotaFCPSTAnteriorm  aliquotaFCPSTAnteriormente,
        v_item_baseFCPSTAnteriormente  baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente valorFCPSTAnteriormente,
        v_item_aliquotaFCPUFDestinat   aliquotaFCPUFDestinatario,
        v_item_baseFCPUFDestinatario   baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario  valorFCPUFDestinatario,
        v_item_aliquotaEstImpFederais  aliquotaEstimadaImpFederais,
        v_item_aliquotaEstImpEstaduais aliquotaEstimadaImpEstaduais,
        v_item_aliquotaEstImpMunicipai aliquotaEstimadaImpMunicipais,
        v_item_baseEstimadaImpostos    baseEstimadaImpostos,
        v_item_valorEstImpFederais     valorEstimadoImpFederais,
        v_item_valorEstImpEstaduais    valorEstimadoImpEstaduais,
        v_item_valorEstImpMunicipais   valorEstimadoImpMunicipais,
        v_item_valorLiquidoItem        valorLiquidoItem,
        p_item_valorDescontoCustoOpIte valorDescontoCustoOpItem,
        p_item_valorDescontoCustoOpGer valorDescontoCustoOpGeral,
        v_item_valorDescontoCustoOpTot valorDescontoCustoOpTotal,
        p_item_valorAcrescimoCustoOpIt valorAcrescimoCustoOpItem,
        p_item_valorAcrescimoCustoOpGe valorAcrescimoCustoOpGeral,
        v_item_valorAcrescimoCustoOpTo valorAcrescimoCustoOpTotal,
        v_item_precoCustoOperacao      precoCustoOperacao,
        v_item_valorCustoOperacao      valorCustoOperacao,
        v_item_precoCMV                precoCMV,
        v_item_valorCMV                valorCMV,
        p_item_quantidadeExtemporanea  quantidadeExtemporanea,
        p_item_acrescimoUnitarioExtemp acrescimoUnitarioExtemporaneo,
        v_item_valorAcrescimoExtempSub valorAcrescimoExtempSubtotal,
        p_item_valorAcrescimoExtempIte valorAcrescimoExtempItem,
        p_item_valorAcrescimoExtempGer valorAcrescimoExtempGeral,
        v_item_valorAcrescimoExtempTot valorAcrescimoExtempTotal,
        p_item_observacoesDigitadas    observacoesDigitadas,
        v_observacoes                  observacoes
      FROM DUAL) b
    ON (a.idItemPreDocumento = b.idItemPreDocumento)
    WHEN MATCHED THEN UPDATE SET
      a.preDocumento                  = b.preDocumento,
      a.sequencia                     = b.sequencia,
      a.cancelado                     = b.cancelado,
      a.pedidoCompraFornecedor        = b.pedidoCompraFornecedor,
      a.sequenciaPedidoCompraFornec   = b.sequenciaPedidoCompraFornec,
      a.vendedor                      = b.vendedor,
      a.modeloDocumento               = b.modeloDocumento,
      a.estabelecimentoOriginal       = b.estabelecimentoOriginal,
      a.gradeProduto                  = b.gradeProduto,
      a.idFormulaTinta                = b.idFormulaTinta,
      a.personalizacao                = b.personalizacao,
      a.idLoteEstoque                 = b.idLoteEstoque,
      a.operacaoFiscal                = b.operacaoFiscal,
      a.movimentaEstoque              = b.movimentaEstoque,
      a.geraFinanceiro                = b.geraFinanceiro,
      a.localEstoque                  = b.localEstoque,
      a.pessoaParticipante            = b.pessoaParticipante,
      a.controleQuantidade            = b.controleQuantidade,
      a.unidadeMedidaConversao        = b.unidadeMedidaConversao,
      a.conversorQuantidade           = b.conversorQuantidade,
      a.loteMinimo                    = b.loteMinimo,
      a.loteMultiplo                  = b.loteMultiplo,
      a.altura                        = b.altura,
      a.largura                       = b.largura,
      a.comprimento                   = b.comprimento,
      a.pecas                         = b.pecas,
      a.quantidade                    = b.quantidade,
      a.quantidadeConvertida          = b.quantidadeConvertida,
      a.quantidadeDevolvidaRetornada  = b.quantidadeDevolvidaRetornada,
      a.percentualDevolucao           = b.percentualDevolucao,
      a.pesoLiquido                   = b.pesoLiquido,
      a.pesoBruto                     = b.pesoBruto,
      a.tipoPreco                     = b.tipoPreco,
      a.tabelaPreco                   = b.tabelaPreco,
      a.precoSugestaoAPrazo           = b.precoSugestaoAPrazo,
      a.precoSugestaoAVista           = b.precoSugestaoAVista,
      a.precoDesconto                 = b.precoDesconto,
      a.precoMinimo                   = b.precoMinimo,
      a.usarPrecoAVista               = b.usarPrecoAVista,
      a.precoUnitarioBruto            = b.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao   = b.acrescimoUnitarioComposicao,
      a.precoUnitario                 = b.precoUnitario,
      a.precoUnitarioConvertido       = b.precounitarioConvertido,
      a.valorProdutoServicoBruto      = b.valorProdutoServicoBruto,
      a.valorProdutoServico           = b.valorProdutoServico,
      a.percDescontoItem              = b.percDescontoItem,
      a.valorDescontoItem             = b.valorDescontoItem,
      a.percAcrescimoItem             = b.percAcrescimoItem,
      a.valorAcrescimoItem            = b.valorAcrescimoItem,
      a.valorFreteItem                = b.valorFreteItem,
      a.valorSeguroItem               = b.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem  = b.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem   = b.valorDespesasAduaneirasItem,
      a.valorFreteGeral               = b.valorFreteGeral,
      a.valorSeguroGeral              = b.valorSeguroGeral,
      a.valorDescontoGeral            = b.valorDescontoGeral,
      a.valorOutrasDespesasGeral      = b.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral = b.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral  = b.valorDespesasAduaneirasGeral,
      a.valorBasePagamento            = b.valorBasePagamento,
      a.valorDescontoPagamento        = b.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento  = b.valorOutrasDespesasPagamento,
      a.valorJurosPagamento           = b.valorJurosPagamento,
      a.valorFreteTotal               = b.valorFreteTotal,
      a.valorSeguroTotal              = b.valorSeguroTotal,
      a.valorDescontoTotal            = b.valorDescontoTotal,
      a.valorOutrasDespesasTotal      = b.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal = b.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal  = b.valorDespesasAduaneirasTotal,
      a.cfop                          = b.cfop,
      a.indicadorISSQN                = b.indicadorISSQN,
      a.aliquotaISSQN                 = b.aliquotaISSQN,
      a.retidoISSQN                   = b.retidoISSQN,
      a.tributadoForaMunicipio        = b.tributadoForaMunicipio,
      a.incentivoFiscal               = b.incentivoFiscal,
      a.listaServicos                 = b.listaServicos,
      a.cnae                          = b.cnae,
      a.idServicoMunicipio            = b.idServicoMunicipio,
      a.numeroProcessoAdministrativo  = b.numeroProcessoAdministrativo,
      a.baseISSQN                     = b.baseISSQN,
      a.valorISSQN                    = b.valorISSQN,
      a.retencaoIRRF                  = b.retencaoIRRF,
      a.baseRetIRRF                   = b.baseRetIRRF,
      a.valorRetIRRF                  = b.valorRetIRRF,
      a.retencaoINSS                  = b.retencaoINSS,
      a.baseRetINSS                   = b.baseRetINSS,
      a.valorRetINSS                  = b.valorRetINSS,
      a.retencaoPIS                   = b.retencaoPIS,
      a.baseRetPIS                    = b.baseRetPIS,
      a.valorRetPIS                   = b.valorRetPIS,
      a.retencaoCOFINS                = b.retencaoCOFINS,
      a.baseRetCOFINS                 = b.baseRetCOFINS,
      a.valorRetCOFINS                = b.valorRetCOFINS,
      a.retencaoCSLL                  = b.retencaoCSLL,
      a.baseRetCSLL                   = b.baseRetCSLL,
      a.valorRetCSLL                  = b.valorRetCSLL,
      a.retencaoOutros                = b.retencaoOutros,
      a.baseRetOutros                 = b.baseRetOutros,
      a.valorRetOutros                = b.valorRetOutros,
      a.aliquotaII                    = b.aliquotaII,
      a.baseII                        = b.baseII,
      a.valorII                       = b.valorII,
      a.aliquotaIOF                   = b.aliquotaIOF,
      a.baseIOF                       = b.baseIOF,
      a.valorIOF                      = b.valorIOF,
      a.codigoEnquadramentoIPI        = b.codigoEnquadramentoIPI,
      a.stIPI                         = b.stIPI,
      a.aliquotaIPI                   = b.aliquotaIPI,
      a.valorAliquotaIPI              = b.valorAliquotaIPI,
      a.baseIPI                       = b.baseIPI,
      a.valorIPI                      = b.valorIPI,
      a.valorIPIDevolucao             = b.valorIPIDevolucao,
      a.stPIS                         = b.stPIS,
      a.aliquotaPIS                   = b.aliquotaPIS,
      a.valorAliquotaPIS              = b.valorAliquotaPIS,
      a.basePIS                       = b.basePIS,
      a.valorPIS                      = b.valorPIS,
      a.aliquotaPISST                 = b.aliquotaPISST,
      a.valorAliquotaPISST            = b.valorAliquotaPISST,
      a.basePISST                     = b.basePISST,
      a.valorPISST                    = b.valorPISST,
      a.stCOFINS                      = b.stCOFINS,
      a.aliquotaCOFINS                = b.aliquotaCOFINS,
      a.valorAliquotaCOFINS           = b.valorAliquotaCOFINS,
      a.baseCOFINS                    = b.baseCOFINS,
      a.valorCOFINS                   = b.valorCOFINS,
      a.aliquotaCOFINSST              = b.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST         = b.valorAliquotaCOFINSST,
      a.baseCOFINSST                  = b.baseCOFINSST,
      a.valorCOFINSST                 = b.valorCOFINSST,
      a.stSimplesNacional             = b.stSimplesNacional,
      a.creditoSimplesNacional        = b.creditoSimplesNacional,
      a.baseCreditoSimplesNacional    = b.baseCreditoSimplesNacional,
      a.valorCreditoSimplesNacional   = b.valorCreditoSimplesNacional,
      a.stICMS                        = b.stICMS,
      a.modalidadeBaseCalcICMS        = b.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS               = b.reducaoBaseICMS,
      a.aliquotaICMS                  = b.aliquotaICMS,
      a.diferimentoICMS               = b.diferimentoICMS,
      a.motivoDesoneracaoICMS         = b.motivoDesoneracaoICMS,
      a.idBeneficio                   = b.idBeneficio,
      a.baseICMS                      = b.baseICMS,
      a.valorICMSoperacao             = b.valorICMSoperacao,
      a.valorICMSdiferido             = b.valorICMSdiferido,
      a.valorICMS                     = b.valorICMS,
      a.valorICMSdesoneracao          = b.valorICMSdesoneracao,
      a.modalidadeBaseCalcICMSST      = b.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST       = b.margemValorAdicionadoST,
      a.reducaoBaseST                 = b.reducaoBaseST,
      a.aliquotaICMSST                = b.aliquotaICMSST,
      a.aliquotaSTSuportConsFinal     = b.aliquotaSTSuportConsFinal,
      a.baseICMSST                    = b.baseICMSST,
      a.valorICMSST                   = b.valorICMSST,
      a.baseICMSSTAnteriormente       = b.baseICMSSTAnteriormente,
      a.valorICMSSTAnteriormente      = b.valorICMSSTAnteriormente,
      a.valorICMSProprioSubstituto    = b.valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo        = b.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo           = b.aliquotaICMSEfetivo,
      a.baseICMSEfetivo               = b.baseICMSEfetivo,
      a.valorICMSEfetivo              = b.valorICMSEfetivo,
      a.aliquotaICMSUFDestinatario    = b.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual     = b.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual     = b.partilhaICMSInterestadual,
      a.baseICMSUFDestinatario        = b.baseICMSUFDestinatario,
      a.valorICMSUFDestinatario       = b.valorICMSUFDestinatario,
      a.baseICMSUFRemetente           = b.baseICMSUFRemetente,
      a.valorICMSUFRemetente          = b.valorICMSUFRemetente,
      a.aliquotaFCP                   = b.aliquotaFCP,
      a.baseFCP                       = b.baseFCP,
      a.valorFCP                      = b.valorFCP,
      a.aliquotaFCPST                 = b.aliquotaFCPST,
      a.baseFCPST                     = b.baseFCPST,
      a.valorFCPST                    = b.valorFCPST,
      a.aliquotaFCPSTAnteriormente    = b.aliquotaFCPSTAnteriormente,
      a.baseFCPSTAnteriormente        = b.baseFCPSTAnteriormente,
      a.valorFCPSTAnteriormente       = b.valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario     = b.aliquotaFCPUFDestinatario,
      a.baseFCPUFDestinatario         = b.baseFCPUFDestinatario,
      a.valorFCPUFDestinatario        = b.valorFCPUFDestinatario,
      a.aliquotaestimadaimpfederais   = b.aliquotaestimadaimpfederais,
      a.aliquotaestimadaimpestaduais  = b.aliquotaestimadaimpestaduais,
      a.aliquotaestimadaimpmunicipais = b.aliquotaestimadaimpmunicipais,
      a.baseestimadaimpostos          = b.baseestimadaimpostos,
      a.valorestimadoimpfederais      = b.valorestimadoimpfederais,
      a.valorEstimadoImpEstaduais     = b.valorEstimadoImpEstaduais,
      a.valorEstimadoImpMunicipais    = b.valorEstimadoImpMunicipais,
      a.valorLiquidoItem              = b.valorLiquidoItem,
      a.valorDescontoCustoOpItem      = b.valorDescontoCustoOpItem,
      a.valorDescontoCustoOpGeral     = b.valorDescontoCustoOpGeral,
      a.valorDescontoCustoOpTotal     = b.valorDescontoCustoOpTotal,
      a.valorAcrescimoCustoOpItem     = b.valorAcrescimoCustoOpItem,
      a.valorAcrescimoCustoOpGeral    = b.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoCustoOpTotal    = b.valorAcrescimoCustoOpTotal,
      a.precoCustoOperacao            = b.precoCustoOperacao,
      a.valorCustoOperacao            = b.valorCustoOperacao,
      a.precoCMV                      = b.precoCMV,
      a.valorCMV                      = b.valorCMV,
      a.quantidadeExtemporanea        = b.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo = b.acrescimoUnitarioExtemporaneo,
      a.valorAcrescimoExtempSubtotal  = b.valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem      = b.valorAcrescimoExtempItem,
      a.valorAcrescimoExtempGeral     = b.valorAcrescimoExtempGeral,
      a.valorAcrescimoExtempTotal     = b.valorAcrescimoExtempTotal,
      a.observacoesDigitadas          = b.observacoesDigitadas,
      a.observacoes                   = b.observacoes
    WHEN NOT MATCHED THEN INSERT (
      idItemPreDocumento,
      preDocumento,
      sequencia,
      cancelado,
      pedidoCompraFornecedor,
      sequenciaPedidoCompraFornec,
      modeloDocumento,
      estabelecimentoOriginal,
      vendedor,
      gradeProduto,
      idFormulaTinta,
      personalizacao,
      idLoteEstoque,
      operacaoFiscal,
      movimentaEstoque,
      geraFinanceiro,
      localEstoque,
      pessoaParticipante,
      controleQuantidade,
      unidadeMedidaConversao,
      conversorQuantidade,
      loteMinimo,
      loteMultiplo,
      altura,
      largura,
      comprimento,
      pecas,
      quantidade,
      quantidadeConvertida,
      quantidadeDevolvidaRetornada,
      percentualDevolucao,
      pesoLiquido,
      pesoBruto,
      tipoPreco,
      tabelaPreco,
      precoSugestaoAPrazo,
      precoSugestaoAVista,
      precoDesconto,
      precoMinimo,
      usarPrecoAVista,
      precoUnitarioBruto,
      acrescimoUnitarioComposicao,
      precoUnitario,
      precoUnitarioConvertido,
      valorProdutoServicoBruto,
      valorProdutoServico,
      percDescontoItem,
      valorDescontoItem,
      percAcrescimoItem,
      valorAcrescimoItem,
      valorFreteItem,
      valorSeguroItem,
      valorAdicFreteMarinhaMerItem,
      valorDespesasAduaneirasItem,
      valorFreteGeral,
      valorSeguroGeral,
      valorDescontoGeral,
      valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral,
      valorDespesasAduaneirasGeral,
      valorBasePagamento,
      valorDescontoPagamento,
      valorOutrasDespesasPagamento,
      valorJurosPagamento,
      valorFreteTotal,
      valorSeguroTotal,
      valorDescontoTotal,
      valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal,
      valorDespesasAduaneirasTotal,
      cfop,
      indicadorISSQN,
      aliquotaISSQN,
      retidoISSQN,
      tributadoForaMunicipio,
      incentivoFiscal,
      listaServicos,
      cnae,
      idServicoMunicipio,
      numeroProcessoAdministrativo,
      baseISSQN,
      valorISSQN,
      retencaoIRRF,
      baseRetIRRF,
      valorRetIRRF,
      retencaoINSS,
      baseRetINSS,
      valorRetINSS,
      retencaoPIS,
      baseRetPIS,
      valorRetPIS,
      retencaoCOFINS,
      baseRetCOFINS,
      valorRetCOFINS,
      retencaoCSLL,
      baseRetCSLL,
      valorRetCSLL,
      retencaoOutros,
      baseRetOutros,
      valorRetOutros,
      aliquotaII,
      baseII,
      valorII,
      aliquotaIOF,
      baseIOF,
      valorIOF,
      codigoEnquadramentoIPI,
      stIPI,
      aliquotaIPI,
      valorAliquotaIPI,
      baseIPI,
      valorIPI,
      valorIPIDevolucao,
      stPIS,
      aliquotaPIS,
      valorAliquotaPIS,
      basePIS,
      valorPIS,
      aliquotaPISST,
      valorAliquotaPISST,
      basePISST,
      valorPISST,
      stCOFINS,
      aliquotaCOFINS,
      valorAliquotaCOFINS,
      baseCOFINS,
      valorCOFINS,
      aliquotaCOFINSST,
      valorAliquotaCOFINSST,
      baseCOFINSST,
      valorCOFINSST,
      stSimplesNacional,
      creditoSimplesNacional,
      baseCreditoSimplesNacional,
      valorCreditoSimplesNacional,
      stICMS,
      modalidadeBaseCalcICMS,
      reducaoBaseICMS,
      aliquotaICMS,
      diferimentoICMS,
      motivoDesoneracaoICMS,
      idBeneficio,
      baseICMS,
      valorICMSOperacao,
      valorICMSDiferido,
      valorICMS,
      valorICMSDesoneracao,
      modalidadeBaseCalcICMSST,
      margemValorAdicionadoST,
      reducaoBaseST,
      aliquotaICMSST,
      aliquotaSTSuportConsFinal,
      baseICMSST,
      valorICMSST,
      baseICMSSTAnteriormente,
      valorICMSSTAnteriormente,
      valorICMSProprioSubstituto,
      reducaoBaseICMSEfetivo,
      aliquotaICMSEfetivo,
      baseICMSEfetivo,
      valorICMSEfetivo,
      aliquotaICMSUFDestinatario,
      aliquotaICMSInterestadual,
      partilhaICMSInterestadual,
      baseICMSUFDestinatario,
      valorICMSUFDestinatario,
      baseICMSUFRemetente,
      valorICMSUFRemetente,
      aliquotaFCP,
      baseFCP,
      valorFCP,
      aliquotaFCPST,
      baseFCPST,
      valorFCPST,
      aliquotaFCPSTAnteriormente,
      baseFCPSTAnteriormente,
      valorFCPSTAnteriormente,
      aliquotaFCPUFDestinatario,
      baseFCPUFDestinatario,
      valorFCPUFDestinatario,
      aliquotaEstimadaImpFederais,
      aliquotaEstimadaImpEstaduais,
      aliquotaEstimadaImpMunicipais,
      baseEstimadaImpostos,
      valorEstimadoImpFederais,
      valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais,
      valorLiquidoItem,
      valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral,
      valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpItem,
      valorAcrescimoCustoOpGeral,
      valorAcrescimoCustoOpTotal,
      precoCustoOperacao,
      valorCustoOperacao,
      precoCMV,
      valorCMV,
      quantidadeExtemporanea,
      acrescimoUnitarioExtemporaneo,
      valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral,
      valorAcrescimoExtempTotal,
      observacoesDigitadas,
      observacoes)
    VALUES (
      b.idItemPreDocumento,
      b.preDocumento,
      b.sequencia,
      b.cancelado,
      b.pedidoCompraFornecedor,
      b.sequenciaPedidoCompraFornec,
      b.modeloDocumento,
      b.estabelecimentoOriginal,
      b.vendedor,
      b.gradeProduto,
      b.idFormulaTinta,
      b.personalizacao,
      b.idLoteEstoque,
      b.operacaoFiscal,
      b.movimentaEstoque,
      b.geraFinanceiro,
      b.localEstoque,
      b.pessoaParticipante,
      b.controleQuantidade,
      b.unidadeMedidaConversao,
      b.conversorQuantidade,
      b.loteMinimo,
      b.loteMultiplo,
      b.altura,
      b.largura,
      b.comprimento,
      b.pecas,
      b.quantidade,
      b.quantidadeConvertida,
      b.quantidadeDevolvidaRetornada,
      b.percentualDevolucao,
      b.pesoLiquido,
      b.pesoBruto,
      b.tipoPreco,
      b.tabelaPreco,
      b.precoSugestaoAPrazo,
      b.precoSugestaoAVista,
      b.precoDesconto,
      b.precoMinimo,
      b.usarPrecoAVista,
      b.precoUnitarioBruto,
      b.acrescimoUnitarioComposicao,
      b.precoUnitario,
      b.precoUnitarioConvertido,
      b.valorProdutoServicoBruto,
      b.valorProdutoServico,
      b.percDescontoItem,
      b.valorDescontoItem,
      b.percAcrescimoItem,
      b.valorAcrescimoItem,
      b.valorFreteItem,
      b.valorSeguroItem,
      b.valorAdicFreteMarinhaMerItem,
      b.valorDespesasAduaneirasItem,
      b.valorFreteGeral,
      b.valorSeguroGeral,
      b.valorDescontoGeral,
      b.valorOutrasDespesasGeral,
      b.valorAdicFreteMarinhaMerGeral,
      b.valorDespesasAduaneirasGeral,
      b.valorBasePagamento,
      b.valorDescontoPagamento,
      b.valorOutrasDespesasPagamento,
      b.valorJurosPagamento,
      b.valorFreteTotal,
      b.valorSeguroTotal,
      b.valorDescontoTotal,
      b.valorOutrasDespesasTotal,
      b.valorAdicFreteMarinhaMerTotal,
      b.valorDespesasAduaneirasTotal,
      b.cfop,
      b.indicadorISSQN,
      b.aliquotaISSQN,
      b.retidoISSQN,
      b.tributadoForaMunicipio,
      b.incentivoFiscal,
      b.listaServicos,
      b.cnae,
      b.idServicoMunicipio,
      b.numeroProcessoAdministrativo,
      b.baseISSQN,
      b.valorISSQN,
      b.retencaoIRRF,
      b.baseRetIRRF,
      b.valorRetIRRF,
      b.retencaoINSS,
      b.baseRetINSS,
      b.valorRetINSS,
      b.retencaoPIS,
      b.baseRetPIS,
      b.valorRetPIS,
      b.retencaoCOFINS,
      b.baseRetCOFINS,
      b.valorRetCOFINS,
      b.retencaoCSLL,
      b.baseRetCSLL,
      b.valorRetCSLL,
      b.retencaoOutros,
      b.baseRetOutros,
      b.valorRetOutros,
      b.aliquotaII,
      b.baseII,
      b.valorII,
      b.aliquotaIOF,
      b.baseIOF,
      b.valorIOF,
      b.codigoEnquadramentoIPI,
      b.stIPI,
      b.aliquotaIPI,
      b.valorAliquotaIPI,
      b.baseIPI,
      b.valorIPI,
      b.valorIPIDevolucao,
      b.stPIS,
      b.aliquotaPIS,
      b.valorAliquotaPIS,
      b.basePIS,
      b.valorPIS,
      b.aliquotaPISST,
      b.valorAliquotaPISST,
      b.basePISST,
      b.valorPISST,
      b.stCOFINS,
      b.aliquotaCOFINS,
      b.valorAliquotaCOFINS,
      b.baseCOFINS,
      b.valorCOFINS,
      b.aliquotaCOFINSST,
      b.valorAliquotaCOFINSST,
      b.baseCOFINSST,
      b.valorCOFINSST,
      b.stSimplesNacional,
      b.creditoSimplesNacional,
      b.baseCreditoSimplesNacional,
      b.valorCreditoSimplesNacional,
      b.stICMS,
      b.modalidadeBaseCalcICMS,
      b.reducaoBaseICMS,
      b.aliquotaICMS,
      b.diferimentoICMS,
      b.motivoDesoneracaoICMS,
      b.idBeneficio,
      b.baseICMS,
      b.valorICMSOperacao,
      b.valorICMSDiferido,
      b.valorICMS,
      b.valorICMSDesoneracao,
      b.modalidadeBaseCalcICMSST,
      b.margemValorAdicionadoST,
      b.reducaoBaseST,
      b.aliquotaICMSST,
      b.aliquotaSTSuportConsFinal,
      b.baseICMSST,
      b.valorICMSST,
      b.baseICMSSTAnteriormente,
      b.valorICMSSTAnteriormente,
      b.valorICMSProprioSubstituto,
      b.reducaoBaseICMSEfetivo,
      b.aliquotaICMSEfetivo,
      b.baseICMSEfetivo,
      b.valorICMSEfetivo,
      b.aliquotaICMSUFDestinatario,
      b.aliquotaICMSInterestadual,
      b.partilhaICMSInterestadual,
      b.baseICMSUFDestinatario,
      b.valorICMSUFDestinatario,
      b.baseICMSUFRemetente,
      b.valorICMSUFRemetente,
      b.aliquotaFCP,
      b.baseFCP,
      b.valorFCP,
      b.aliquotaFCPST,
      b.baseFCPST,
      b.valorFCPST,
      b.aliquotaFCPSTAnteriormente,
      b.baseFCPSTAnteriormente,
      b.valorFCPSTAnteriormente,
      b.aliquotaFCPUFDestinatario,
      b.baseFCPUFDestinatario,
      b.valorFCPUFDestinatario,
      b.aliquotaEstimadaImpFederais,
      b.aliquotaEstimadaImpEstaduais,
      b.aliquotaEstimadaImpMunicipais,
      b.baseEstimadaImpostos,
      b.valorEstimadoImpFederais,
      b.valorEstimadoImpEstaduais,
      b.valorEstimadoImpMunicipais,
      b.valorLiquidoItem,
      b.valorDescontoCustoOpItem,
      b.valorDescontoCustoOpGeral,
      b.valorDescontoCustoOpTotal,
      b.valorAcrescimoCustoOpItem,
      b.valorAcrescimoCustoOpGeral,
      b.valorAcrescimoCustoOpTotal,
      b.precoCustoOperacao,
      b.valorCustoOperacao,
      b.precoCMV,
      b.valorCMV,
      b.quantidadeExtemporanea,
      b.acrescimoUnitarioExtemporaneo,
      b.valorAcrescimoExtempSubtotal,
      b.valorAcrescimoExtempItem,
      b.valorAcrescimoExtempGeral,
      b.valorAcrescimoExtempTotal,
      b.observacoesDigitadas,
      b.observacoes);
    v_atualizarObservacoes := 0;
    IF p_idItemReferenciado > 0 THEN
      IF p_tipoDocumentoReferenciado IN ('D','P') THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV(
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_devolucaoAnulacaoRetorno,
          'P',
          r_item_idItemPreDocumento,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          p_tipoDocumentoReferenciado,
          p_idItemReferenciado);
      END IF;
      IF p_tipoDocumentoReferenciado = 'D' THEN
        ADD_PRE_DOC_ITEM_REF_DOC_FIS (
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_preDocumento,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemPreDocumento,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'O' THEN
        ADD_PRE_DOC_ITEM_REF_ORCAMEN (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_preDocumento,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemPreDocumento,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'P' THEN
        ADD_PRE_DOC_ITEM_REF_PRE_DOC (
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_preDocumento,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemPreDocumento,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'T' THEN
        ADD_PRE_DOC_ITEM_TRANS_GRAVA (
          p_estabelecimentoAtivo,
          v_cab_entradaSaida,
          p_idItemReferenciado,
          r_item_idItemPreDocumento,
          p_quantidadeReferenciada);
      END IF;
    END IF;
    IF p_tempComp_nomeTempComposicao <> ' '
      AND (NOT (p_tipoDocumentoReferenciado IN ('D','O','P'))
        OR p_idItemReferenciado <= 0)
    THEN
      ADD_PRE_DOC_ITEM_COMP_TEMP (
        p_sessaoClient,
        p_estabelecimentoAtivo,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        r_item_idItemPreDocumento,
        v_atualizarObservacoes,
        v_atualizarObservacoes);
    END IF;
    v_idEnderecoEstoque := 0;
    IF p_item_idEnderecoEstoque > 0 THEN
      ADD_PRE_DOC_ITEM_ENDER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemPreDocumento,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_quantidade,
        ' ',
        v_idEnderecoEstoque);
    END IF;
    IF p_item_idNumeroSerie > 0 THEN
      ADD_PRE_DOC_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemPreDocumento,
        v_idEnderecoEstoque,
        p_item_gradeProduto,
        p_item_idNumeroSerie,
        0,
        v_auxNumber);
      v_atualizarObservacoes := 1;
    END IF;
    IF v_atualizarObservacoes = 1 THEN
      v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
        p_sessaoClient,
        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_413_obs_add_marca,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        'P',
        r_item_idItemPreDocumento,
        p_item_gradeProduto,
        p_item_idFormulaTinta,
        p_item_personalizacao,
        p_item_idLoteEstoque,
        p_item_controleQuantidade,
        p_item_loteMultiplo,
        p_item_altura,
        p_item_largura,
        p_item_comprimento,
        p_item_quantidade,
        p_item_observacoesDigitadas);
      UPDATE MOPREDOCUMXITENS
      SET observacoes = v_observacoes
      WHERE idItemPreDocumento = r_item_idItemPreDocumento;
    END IF;
    IF v_cab_statusPreDocumento = 'A' THEN
      ADD_PRE_DOC_ITEM_EST_ATUALIZA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_item_idItemPreDocumento,
        p_estabelecimentoAtivo);
      ADD_PRE_DOC_ITEM_FIL_ATUALIZA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_item_idItemPreDocumento,
        p_estabelecimentoAtivo);
    END IF;
    r_buffer_idItemPreDocumento := CASE WHEN (r_buffer_idItemPreDocumento IS NULL OR r_buffer_idItemPreDocumento = '' OR r_buffer_idItemPreDocumento = ' ') THEN '' ELSE RTRIM (r_buffer_idItemPreDocumento) || ';' END || TO_CHAR (LPAD(r_item_idItemPreDocumento,14,'0'));
    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;
  END IF;
END ADD_PRE_DOC_ITEM_GRAVA;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_REF_ORCAMEN (
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_cab_idDocumentoFiscal        IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_documentoFiscal          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_sequencia               IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  p_idItemOrcamento              IN NUMBER,
  p_quantidadeBaixar             IN NUMBER,
  p_atualizarObservacoes         IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes         OUT NUMBER)
IS
  v_id                    NUMBER;
  v_orcamentoReferenciado NUMBER;
  v_sequenciaReferenciado NUMBER;
  v_orc_pessoa            NUMBER;
  v_auxAlpha              VARCHAR (3200);
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  ADD_DOC_FISC_ITEM_N_SER_ORCAM (
    p_estabelecimentoAtivo,
    p_idItemOrcamento,
    p_item_idItemDocFiscal,
    CASE WHEN p_quantidadeBaixar > 0 THEN 1 ELSE 0 END,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  ADD_DOC_FISC_ITEM_CUSTO_ORCAM (
    p_estabelecimentoAtivo,
    p_idItemOrcamento,
    p_item_idItemDocFiscal);
  ADD_DOC_FISC_ITEM_COMP_ORCAMEN (
    p_estabelecimentoAtivo,
    p_idItemOrcamento,
    p_item_idItemDocFiscal,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  SELECT COALESCE (MAX (id),0)
  INTO v_id
  FROM MODOCFISCALXORCAMENTOITEM
  WHERE idItemDocFiscal = p_item_idItemDocFiscal
  AND idItemOrcamento = p_idItemOrcamento;
  IF v_id > 0 THEN
    IF p_quantidadeBaixar <> 0 THEN
      UPDATE MODOCFISCALXORCAMENTOITEM SET
        quantidade = quantidade + p_quantidadeBaixar
      WHERE id = v_id;
    END IF;
  ELSE
    v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MODOCFISCALXORCAMENTOITEM', 'id', 14, p_estabelecimentoAtivo, NULL);
    INSERT INTO MODOCFISCALXORCAMENTOITEM (
      id,
      idItemDocFiscal,
      idItemOrcamento,
      quantidade,
      efetivacao)
    VALUES (
      v_id,
      p_item_idItemDocFiscal,
      p_idItemOrcamento,
      p_quantidadeBaixar,
      1);
  END IF;
  IF p_quantidadeBaixar <> 0 THEN
    SELECT
      orcamento,
      sequencia
    INTO
      v_orcamentoReferenciado,
      v_sequenciaReferenciado
    FROM MOORCAMENTOXITENS
    WHERE idItemOrcamento = p_idItemOrcamento;
    ADD_DOC_FISC_ITEM_BLOEST_ORC (
      p_estabelecimentoAtivo,
      v_orcamentoReferenciado,
      v_sequenciaReferenciado,
      p_cab_idDocumentoFiscal,
      p_item_sequencia);
    v_orc_pessoa := 0;
    IF p_config_227_manterPessoaOrcam = 1 THEN
      SELECT COALESCE(MAX(orc.pessoa),0)
      INTO v_orc_pessoa
      FROM MODOCFISCALXITENS itemDoc
      JOIN MODOCFISCALXORCAMENTOITEM docXOrc
      ON docXOrc.idItemDocFiscal = itemDoc.idItemDocFiscal
      JOIN MOORCAMENTOXITENS itemOrc
      ON itemOrc.idItemOrcamento = docXOrc.idItemOrcamento
      JOIN MOORCAMENTOS orc
      ON orc.orcamento = itemOrc.orcamento
      WHERE itemDoc.idDocumentoFiscal = p_cab_idDocumentoFiscal
      AND docXOrc.quantidade <> 0;
    END IF;
    ADD_DOC_FISC_ITEM_MOT_ORCAMEN (
      p_estabelecimentoAtivo,
      p_config_227_manterPessoaOrcam,
      p_cab_idDocumentoFiscal,
      p_cab_tipoDocumento,
      p_cab_documentoFiscal,
      p_cab_estabelecimento,
      p_cab_pessoa,
      v_orc_pessoa,
      p_item_idItemDocFiscal,
      p_item_sequencia,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_unidadeMedidaConversao,
      p_item_quantidadeConvertida,
      p_item_valorLiquidoItem,
      p_idItemOrcamento);
    UPDATE MOORCAMENTOXITENS
    SET quantidadeSaldo = quantidadeSaldo - p_quantidadeBaixar
    WHERE idItemOrcamento = p_idItemOrcamento;
    UPDATE MOCONSERTOS cons
    SET cons.situacaoConserto = 'R'
    WHERE cons.documentoTransferenciaFornec > 0
    AND cons.situacaoConserto = 'E'
    AND EXISTS (
      SELECT 1 FROM MODOCUMENTOTRANSFXITENS itemTransf
      JOIN MODOCTRANSFXORCAMENTOITEM transfXDoc
      ON transfXDoc.idItemDocTransferencia = itemTransf.idItemDocTransferencia
      WHERE itemTransf.documentoTransferencia = cons.documentoTransferenciaFornec
      AND transfXDoc.entradaSaidaOriginal = 'E'
      AND transfXDoc.idItemOrcamento = p_idItemOrcamento);
    ADD_ENTREGA_CRIA_PENDENTE (
      p_usuarioLogado,
      p_estabelecimentoAtivo,
      p_idItemOrcamento);
    ADD_ORCAMENTO_ITEM_RES_ITEM (
      p_idItemOrcamento,
      p_estabelecimentoAtivo,
      '',
      v_auxAlpha);
  END IF;
END ADD_DOC_FISC_ITEM_REF_ORCAMEN;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_REF_DFE_GRAD (
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_config_230_etapaPedComprParc IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_cab_idDocumentoFiscal        IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_documentoFiscal          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_sequencia               IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  p_gradeDistribuicaoDFe         IN NUMBER,
  p_atualizarObservacoes         IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes         OUT NUMBER)
IS
  v_novaEtapaOrcamento NUMBER;
  v_quantidadeSaldo    NUMBER;
  v_auxNumber          NUMBER;
  v_auxChar            CHAR (1);
  v_auxVarchar         VARCHAR2 (32000);
BEGIN
  FOR a IN (
    SELECT
      a.idItemOrcamento,
      a.quantidadeSaldo,
      a.quantidadeBaixar,
      a.zerarSaldo,
      b.orcamento
    FROM MODISTRIBUICAODFEXORCAM a
    JOIN MOORCAMENTOXITENS b
    ON b.idItemOrcamento = a.idItemOrcamento
    WHERE a.gradeDistribuicaoDFe = p_gradeDistribuicaoDFe
    AND a.quantidadeBaixar > 0
    ORDER BY a.sequencia)
  LOOP
    UPDATE MODISTRIBUICAODFEXGRADE
    SET idItemDocFiscal = p_item_idItemDocFiscal
    WHERE gradeDistribuicaoDFe = p_gradeDistribuicaoDFe;
    ADD_DOC_FISC_ITEM_REF_ORCAMEN (
      p_usuarioLogado,
      p_estabelecimentoAtivo,
      p_config_227_manterPessoaOrcam,
      p_cab_idDocumentoFiscal,
      p_cab_tipoDocumento,
      p_cab_documentoFiscal,
      p_cab_estabelecimento,
      p_cab_pessoa,
      p_item_idItemDocFiscal,
      p_item_sequencia,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_unidadeMedidaConversao,
      p_item_quantidadeConvertida,
      p_item_valorLiquidoItem,
      a.idItemOrcamento,
      CASE WHEN a.zerarSaldo = 1 THEN a.quantidadeSaldo ELSE a.quantidadeBaixar END,
      r_atualizarObservacoes,
      r_atualizarObservacoes);  
    SELECT COALESCE (SUM(b.quantidadeSaldo),0)
    INTO v_quantidadeSaldo
    FROM MOORCAMENTOXITENS b
    WHERE b.orcamento = a.orcamento
    AND b.cancelado = 0;
    IF v_quantidadeSaldo <= 0 THEN
      SELECT COALESCE(MAX(etapaOrcamento),0)
      INTO v_novaEtapaOrcamento
      FROM PAETAPASORCAMENTO
      WHERE etapaOrcamento > 0
      AND ativo = 1
      AND situacaoOrcamento = 80;      
      ADD_ORCAMENTO_CAB_ETAPA_TROCA (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        p_person_190_modeloFrete,
        p_config_378_calcularVolumes,
        a.orcamento,
        p_usuarioLogado,
        v_novaEtapaOrcamento,
        ' ',
        0,
        0,
        v_auxNumber,
        v_auxVarchar,
        v_auxNumber,
        v_auxChar,
        v_auxNumber);
    ELSE
      v_novaEtapaOrcamento := p_config_230_etapaPedComprParc;
    END IF;  
    IF v_novaEtapaOrcamento <> 0 THEN
      ADD_ORCAMENTO_CAB_ETAPA_TROCA (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        p_person_190_modeloFrete,
        p_config_378_calcularVolumes,
        a.orcamento,
        p_usuarioLogado,
        v_novaEtapaOrcamento,
        ' ',
        0,
        0,
        v_auxNumber,
        v_auxVarchar,
        v_auxNumber,
        v_auxChar,
        v_auxNumber);
    END IF;
  END LOOP;
END ADD_DOC_FISC_ITEM_REF_DFE_GRAD;

/

create or replace PROCEDURE ADD_DOC_FISC_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_227_manterPessoaOrcam IN NUMBER,
  p_config_230_etapaPedComprParc IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     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, -- B = Balanço, D = Documento Fiscal, G = Grade DF-e, O = Orçamento, P, Pré-Documento, T = Transferência
  p_idItemReferenciado           IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_tempComp_nomeTempComposicao  IN VARCHAR2,
  p_tempComp_sequencia           IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_idDocumentoFiscal       IN NUMBER,
  p_item_pedidoCompraFornecedor  IN VARCHAR2,
  p_item_sequenciaPedidoCompraFo IN NUMBER,
  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_quantidadeExtemporanea  IN NUMBER,
  p_item_acrescimoUnitarioExtemp IN NUMBER,
  p_item_valorAcrescimoExtempIte IN NUMBER,
  p_item_valorDescontoCustoOpIte IN NUMBER,
  p_item_valorAcrescimoCustoOpIt 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_valorAcrescimoExtempGer IN NUMBER,
  p_item_valorDescontoCustoOpGer IN NUMBER,
  p_item_valorAcrescimoCustoOpGe IN NUMBER,
  p_item_valorDescontoPagamento  IN NUMBER,
  p_item_valorOutrasDespPagament IN NUMBER,
  p_item_valorJurosPagamento     IN NUMBER,
  p_item_percentualDevolucao     IN NUMBER,
  p_item_valorIPIDevolucao       IN NUMBER,
  p_item_operacaoFiscal          IN NUMBER,
  p_item_movimentaEstoque        IN NUMBER,
  p_item_movimentaEstoqueFiscal  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_stICMSEscrituracao      IN CHAR,
  p_item_reducaoBaseICMSEscritur IN NUMBER,
  p_item_aliquotaICMSEscrituraca IN NUMBER,
  p_item_diferimentoICMSEscritur IN NUMBER,
  p_item_margemValorAdicSTEscrit IN NUMBER,
  p_item_reducaoBaseSTEscriturac IN NUMBER,
  p_item_aliquotaICMSSTEscritura IN NUMBER,
  p_item_somarICMSST             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_baseICMSEscrituracao    IN NUMBER,
  p_item_valorICMSEscrituracao   IN NUMBER,
  p_item_valorICMSDesonEscritura IN NUMBER,
  p_item_baseICMSSTEscrituracao  IN NUMBER,
  p_item_valorICMSSTEscrituracao 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_idItemDocFiscal       IN VARCHAR2,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER,
  r_item_idItemDocFiscal         OUT NUMBER,
  r_buffer_idItemDocFiscal       OUT VARCHAR2,
  r_valorInserido                OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_finalidadeNota           CHAR (1);
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_nfFornecedor             NUMBER;
  v_cab_documentoFiscal          NUMBER;
  v_cab_estabelecimento          NUMBER;
  v_cab_dataEmissao              DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_vendaConsumidor          NUMBER;
  v_cab_enderecoEntregaPessoa    NUMBER;
  v_cab_municipioFatoGerador     NUMBER;
  v_cab_localDestinoOperacao     CHAR (1);
  v_cab_indicadorConsumidorFinal CHAR (1);
  v_cab_projeto                  VARCHAR2 (60);
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  v_cab_situacaoDocumentoFiscal  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_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota 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_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_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_item_sequencia               NUMBER;
  v_item_cancelado               NUMBER;
  v_item_quantidadeDevolvidaRet  NUMBER;
  v_item_precoUnitario           NUMBER;
  v_item_precoUnitarioConvertido NUMBER;
  v_item_valorProdutoServicoBrut NUMBER;
  v_item_valorProdutoServico     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_movimentaEstoqueFiscal  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_stICMSEscrituracao      CHAR (2);
  v_item_reducaoBaseICMSEscritur NUMBER;
  v_item_aliquotaICMSEscrituraca NUMBER;
  v_item_diferimentoICMSEscritur NUMBER;
  v_item_margemValorAdicSTEscrit NUMBER;
  v_item_reducaoBaseSTEscriturac NUMBER;
  v_item_aliquotaICMSSTEscritura NUMBER;
  v_item_somarICMSST             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_baseICMSEscrituracao    NUMBER;
  v_item_valorICMSEscrituracao   NUMBER;
  v_item_valorICMSDesonEscritura NUMBER;
  v_item_baseICMSSTEscrituracao  NUMBER;
  v_item_valorICMSSTEscrituracao 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_item_valorDescontoCustoOpTot NUMBER;
  v_item_valorAcrescimoCustoOpTo NUMBER;
  v_item_precoCustoOperacao      NUMBER;
  v_item_valorCustoOperacao      NUMBER;
  v_item_precoCMV                NUMBER;
  v_item_valorCMV                NUMBER;
  v_item_valorAcrescimoExtempSub NUMBER;
  v_item_valorAcrescimoExtempTot 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_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_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  r_item_idItemDocFiscal := p_item_idItemDocFiscal;
  r_buffer_idItemDocFiscal := p_buffer_idItemDocFiscal;
  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.devolucaoAnulacaoRetorno,
    cab.finalidadeNota,
    cab.atualizaCustoMedio,
    cab.nfFornecedor,
    cab.documentoFiscal,
    cab.estabelecimento,
    cab.dataEmissao,
    cab.pessoa,
    cab.vendaConsumidor,
    cab.enderecoEntregaPessoa,
    cab.municipioFatoGerador,
    cab.localDestinoOperacao,
    cab.indicadorConsumidorFinal,
    cab.projeto,
    cab.modalidadeFrete,
    cab.tipoPagamentoFrete,
    cab.situacaoDocumentoFiscal,
    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,
    cab.valorDescontoCustoOpItem,
    cab.valorDescontoCustoOpGeral,
    cab.valorDescontoCustoOpTotal,
    cab.valorAcrescimoCustoOpItem,
    cab.valorAcrescimoCustoOpGeral,
    cab.valorAcrescimoCustoOpTotal,
    cab.valorCustoOperacao,
    cab.valorCMV,
    cab.quantidadeExtemporanea,
    cab.valorAcrescimoExtempSubtotal,
    cab.valorAcrescimoExtempItem,
    cab.valorAcrescimoExtempGeral,
    cab.valorAcrescimoExtempTotal,
    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
  INTO
    v_cab_origemDocumento,
    v_cab_tipoDocumento,
    v_cab_entradaSaida,
    v_cab_devolucaoAnulacaoRetorno,
    v_cab_finalidadeNota,
    v_cab_atualizaCustoMedio,
    v_cab_nfFornecedor,
    v_cab_documentoFiscal,
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_pessoa,
    v_cab_vendaConsumidor,
    v_cab_enderecoEntregaPessoa,
    v_cab_municipioFatoGerador,
    v_cab_localDestinoOperacao,
    v_cab_indicadorConsumidorFinal,
    v_cab_projeto,
    v_cab_modalidadeFrete,
    v_cab_tipoPagamentoFrete,
    v_cab_situacaoDocumentoFiscal,
    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_cab_valorDescontoCustoOpItem,
    v_cab_valorDescontoCustoOpGera,
    v_cab_valorDescontoCustoOpTota,
    v_cab_valorAcrescimoCustoOpIte,
    v_cab_valorAcrescimoCustoOpGer,
    v_cab_valorAcrescimoCustoOpTot,
    v_cab_valorCustoOperacao,
    v_cab_valorCMV,
    v_cab_quantidadeExtemporanea,
    v_cab_valorAcrescimoExtempSubt,
    v_cab_valorAcrescimoExtempItem,
    v_cab_valorAcrescimoExtempGera,
    v_cab_valorAcrescimoExtempTota,
    v_est_grupoFiscal,
    v_pessEst_regimeTributario,
    v_munEndEst_uf,
    v_pess_indicadorInscricaoEstad,
    v_endPess_enderecoPessoa,
    v_munEndPess_uf,
    v_munEndEntr_uf
  FROM MODOCUMENTOSFISCAIS 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
  WHERE cab.idDocumentoFiscal = p_item_idDocumentoFiscal;
  v_ini_cab_valorFreteItem := v_cab_valorFreteItem;
  v_ini_cab_valorFreteGeral := v_cab_valorFreteGeral;
  SELECT
    diminuiDescontoPrUnit,
    somaAcrescimosPrUnit,
    somaFreteSeguroPrUnit
  INTO
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit
  FROM PAMODELOSDOCUMENTO
  WHERE modeloDocumento = p_item_modeloDocumento;
  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_valorFreteTotal          := 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_item_quantidadeDevolvidaRet  := 0;
  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_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_movimentaEstoqueFiscal  := p_item_movimentaEstoqueFiscal;
  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_stICMSEscrituracao      := p_item_stICMSEscrituracao;
  v_item_reducaoBaseICMSEscritur := p_item_reducaoBaseICMSEscritur;
  v_item_aliquotaICMSEscrituraca := p_item_aliquotaICMSEscrituraca;
  v_item_diferimentoICMSEscritur := p_item_diferimentoICMSEscritur;
  v_item_margemValorAdicSTEscrit := p_item_margemValorAdicSTEscrit;
  v_item_reducaoBaseSTEscriturac := p_item_reducaoBaseSTEscriturac;
  v_item_aliquotaICMSSTEscritura := p_item_aliquotaICMSSTEscritura;
  v_item_somarICMSST             := p_item_somarICMSST;
  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_baseICMSEscrituracao    := p_item_baseICMSEscrituracao;
  v_item_valorICMSEscrituracao   := p_item_valorICMSEscrituracao;
  v_item_valorICMSDesonEscritura := p_item_valorICMSDesonEscritura;
  v_item_baseICMSSTEscrituracao  := p_item_baseICMSSTEscrituracao;
  v_item_valorICMSSTEscrituracao := p_item_valorICMSSTEscrituracao;
  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;
  IF p_manterFinanceiro_Retotalizar = 0 THEN
    SELECT COALESCE (MAX(1), 0)
    INTO v_cab_promocaoExiste
    FROM MODOCFISCALXPROMOCOES
    WHERE idDocumentoFiscal = p_item_idDocumentoFiscal;
  END IF;
  IF p_item_idItemDocFiscal > 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.quantidadeDevolvidaRetornada,
        a.pesoLiquido,
        a.pesoBruto,
        a.valorProdutoServicoBruto,
        a.valorProdutoServico,
        a.valorDescontoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.quantidadeExtemporanea,
        a.valorAcrescimoExtempSubtotal,
        a.valorAcrescimoExtempItem,
        a.valorDescontoCustoOpItem,
        a.valorAcrescimoCustoOpItem,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorAcrescimoExtempGeral,
        a.valorDescontoCustoOpGeral,
        a.valorAcrescimoCustoOpGeral,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.valorFreteTotal,
        a.valorSeguroTotal,
        a.valorDescontoTotal,
        a.valorOutrasDespesasTotal,
        a.valorAdicFreteMarinhaMerTotal,
        a.valorDespesasAduaneirasTotal,
        a.valorAcrescimoExtempTotal,
        a.valorDescontoCustoOpTotal,
        a.valorAcrescimoCustoOpTotal,
        a.operacaoFiscal,
        a.movimentaEstoque,
        a.movimentaEstoqueFiscal,
        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.stICMSEscrituracao,
        a.reducaoBaseICMSEscrituracao,
        a.aliquotaICMSEscrituracao,
        a.diferimentoICMSEscrituracao,
        a.margemValorAdicSTEscrituracao,
        a.reducaoBaseSTEscrituracao,
        a.aliquotaICMSSTEscrituracao,
        a.somarICMSST,
        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.baseICMSEscrituracao,
        a.valorICMSEscrituracao,
        a.valorICMSDesonEscrituracao,
        a.baseICMSSTEscrituracao,
        a.valorICMSSTEscrituracao,
        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,
        a.valorCustoOperacao,
        a.valorCMV,
        prod.tipoProduto
      FROM MODOCFISCALXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      WHERE a.idItemDocFiscal = p_item_idItemDocFiscal)
    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_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_item_quantidadeDevolvidaRet := a.quantidadeDevolvidaRetornada;
      IF p_buscarAliquotas_CalcularImp ='T'
      THEN
        v_item_movimentaEstoque        := a.movimentaEstoque;
        v_item_movimentaEstoqueFiscal  := a.movimentaEstoqueFiscal;
        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_stICMSEscrituracao      := a.stICMSEscrituracao;
        v_item_reducaoBaseICMSEscritur := a.reducaoBaseICMSEscrituracao;
        v_item_aliquotaICMSEscrituraca := a.aliquotaICMSEscrituracao;
        v_item_diferimentoICMSEscritur := a.diferimentoICMSEscrituracao;
        v_item_margemValorAdicSTEscrit := a.margemValorAdicSTEscrituracao;
        v_item_reducaoBaseSTEscriturac := a.reducaoBaseSTEscrituracao;
        v_item_aliquotaICMSSTEscritura := a.aliquotaICMSSTEscrituracao;
        v_item_somarICMSST             := a.somarICMSST;
        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_baseICMSEscrituracao    := a.baseICMSEscrituracao;
        v_item_valorICMSEscrituracao   := a.valorICMSEscrituracao;
        v_item_valorICMSDesonEscritura := a.valorICMSDesonEscrituracao;
        v_item_baseICMSSTEscrituracao  := a.baseICMSSTEscrituracao;
        v_item_valorICMSSTEscrituracao := a.valorICMSSTEscrituracao;
        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 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 <> p_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;
        v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
        v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
        v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
        v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
        v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
        v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
        v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
        v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
        v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
        v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
        v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
        v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
        v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      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,
    p_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);
  v_item_valorAcrescimoExtempSub := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
    p_item_quantidade,
    v_item_precoUnitario,
    p_item_quantidadeExtemporanea,
    p_item_acrescimoUnitarioExtemp);
  v_item_valorAcrescimoExtempTot := FUNC_ADD_CALC_EXTEMP_TOTAL(
    v_item_valorAcrescimoExtempSub,
    p_item_valorAcrescimoExtempIte,
    p_item_valorAcrescimoExtempGer);
  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,
        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 = CASE WHEN v_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
      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 / ((v_combo_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 / ((v_combo_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,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_estabelecimento,
        NULL, -- p_cab_dataPrecoInicial
        TRUNC (SYSDATE), -- p_cab_dataPrecoFinal
        v_cab_pessoa,
        v_cab_projeto,
        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_DOC_FISC_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_227_manterPessoaOrcam,
        p_config_230_etapaPedComprParc,
        p_config_362_calcCustoPorGrade,
        p_config_378_calcularVolumes,
        p_config_413_obs_add_marca,
        p_manterFinanceiro_Retotalizar,
        'S', -- p_buscarAliquotas_CalcularImp
        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_calcularImpostos,
        0, -- p_item_idItemDocFiscal
        p_item_idDocumentoFiscal,
        p_item_pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo,
        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
        CASE
          WHEN p_item_quantidade = 0
          THEN 0
          ELSE ROUND(p_item_quantidadeExtemporanea * a.quantidade / p_item_quantidade, 2)
        END, -- p_item_quantidadeExtemporanea
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_acrescimoUnitarioExtemp
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_acrescimoUnitarioExtemp
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoExtempIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpIt
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpIt
        p_item_observacoesDigitadas,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorFreteGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_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_valorAcrescimoExtempGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpGe
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpGe
        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
        p_item_percentualDevolucao,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorIPIDevolucao
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorIPIDevolucao,
        v_combo_operacaoFiscal,
        p_item_movimentaEstoque,
        p_item_movimentaEstoqueFiscal,
        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
        '  ', -- p_item_stICMSEscrituracao
        0, -- p_item_reducaoBaseICMSEscritur
        0, -- p_item_aliquotaICMSEscrituraca
        0, -- p_item_diferimentoICMSEscritur
        0, -- p_item_margemValorAdicSTEscrit
        0, -- p_item_reducaoBaseSTEscriturac
        0, -- p_item_aliquotaICMSSTEscritura
        0, -- p_item_somarICMSST
        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_baseICMSEscrituracao
        0, -- p_item_valorICMSEscrituracao
        0, -- p_item_valorICMSDesonEscritura
        0, -- p_item_baseICMSSTEscrituracao
        0, -- p_item_valorICMSSTEscrituracao
        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_idItemDocFiscal,
        /* Retornos */
        r_calcularImpostos,
        v_auxNumber, -- r_item_idItemDocFiscal
        r_buffer_idItemDocFiscal,
        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_DOC_FISC_ITEM_COMBO_RESID (
        p_item_idDocumentoFiscal,
        v_item_valorProdutoServico,
        p_item_valorDescontoItem,
        p_item_valorAcrescimoItem,
        v_modDoc_diminuiDescontoPrUnit,
        v_modDoc_somaAcrescimosPrUnit,
        r_buffer_idItemDocFiscal,
        r_valorInserido);
      r_calcularImpostos := 1;
    END IF;
  ELSE
    IF r_item_idItemDocFiscal <= 0 THEN
      r_item_idItemDocFiscal := FUNC_ADD_BUSCA_PROXIMO_ID ('MODOCFISCALXITENS', 'idItemDocFiscal', 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
          OR p_item_valorAcrescimoExtempGer <> 0
          OR p_item_valorDescontoCustoOpGer <> 0
          OR p_item_valorAcrescimoCustoOpGe <> 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_DOC_FISC_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          p_item_idDocumentoFiscal,
          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 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,
        p_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,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_finalidadeNota,
        v_cab_estabelecimento,
        v_cab_nfFornecedor,
        SYSDATE, -- p_cab_dataEmissao
        v_cab_pessoa,
        v_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,
        p_item_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
        1, -- 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_item_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_item_stICMSEscrituracao,
        v_item_reducaoBaseICMSEscritur,
        v_item_aliquotaICMSEscrituraca,
        v_item_diferimentoICMSEscritur,
        v_item_margemValorAdicSTEscrit,
        v_item_reducaoBaseSTEscriturac,
        v_item_aliquotaICMSSTEscritura,
        v_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,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_estabelecimento,
        v_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
        p_item_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
        1, -- p_calcularICMSEscrituracao
        v_item_stICMSEscrituracao,
        v_item_reducaoBaseICMSEscritur,
        v_item_aliquotaICMSEscrituraca,
        v_item_diferimentoICMSEscritur,
        0, -- p_baseICMSEscrituracao
        0, -- p_valorICMSEscrituracao
        0, -- p_valorICMSDesonEscrituracao
        1, -- p_calcularICMSSTEscrituracao
        v_item_margemValorAdicSTEscrit,
        v_item_reducaoBaseSTEscriturac,
        v_item_aliquotaICMSSTEscritura,
        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_item_baseICMSEscrituracao,
        v_item_valorICMSEscrituracao,
        v_item_valorICMSDesonEscritura,
        v_item_baseICMSSTEscrituracao,
        v_item_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,
      v_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,
      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,
      v_item_valorICMSSTEscrituracao,
      v_item_somarICMSST,
      v_item_valorAcrescimoExtempTot,
      v_modDoc_geraFinanceiro);
    v_item_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
      v_cab_nfFornecedor,
      v_cab_tipoPagamentoFrete,
      v_item_valorProdutoServico,
      v_item_valorFreteTotal,
      v_item_valorSeguroTotal,
      v_item_valorDescontoTotal,
      v_item_valorOutrasDespesasTot,
      p_item_valorIPIDevolucao,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      v_item_valorICMSST,
      v_item_valorICMSSTEscrituracao,
      v_item_somarICMSST);
    ADD_CALCULA_CUSTO_CMV (
      v_cab_atualizaCustoMedio,
      v_cab_estabelecimento,
      v_cab_nfFornecedor,
      p_item_modeloDocumento,
      p_item_quantidade,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      p_item_valorIPIDevolucao,
      v_item_valorPIS,
      v_item_valorPISST,
      v_item_valorCOFINS,
      v_item_valorCOFINSST,
      v_item_valorCreditoSimplesNac,
      v_item_valorICMS,
      v_item_valorICMSST,
      v_item_valorICMSSTEscrituracao,
      v_item_valorLiquidoItem,
      p_item_valorDescontoCustoOpIte,
      p_item_valorDescontoCustoOpGer,
      p_item_valorAcrescimoCustoOpIt,
      p_item_valorAcrescimoCustoOpGe,
      v_item_valorAcrescimoExtempTot,
      v_item_valorDescontoCustoOpTot,
      v_item_valorAcrescimoCustoOpTo,
      v_item_precoCustoOperacao,
      v_item_valorCustoOperacao,
      v_item_precoCMV,
      v_item_valorCMV);
    IF v_inserindoItem = 1 THEN
      SELECT COALESCE (MAX (sequencia),0) + 1
      INTO v_item_sequencia
      FROM MODOCFISCALXITENS
      WHERE idDocumentoFiscal = p_item_idDocumentoFiscal;
      v_cab_ultimoVendedorItem := p_item_vendedor;
    END IF;
    IF v_item_cancelado = 0 THEN
      IF p_manterFinanceiro_Retotalizar <> 2 THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume + TRUNC(CASE WHEN p_item_controleQuantidade = 1 AND p_item_loteMultiplo <> 0 THEN p_item_quantidade / p_item_loteMultiplo ELSE p_item_quantidadeConvertida END,0);
        END IF;
        v_cab_pesoLiquido := v_cab_pesoLiquido + p_item_pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto + p_item_pesoBruto;
      END IF;
      v_cab_quantidade := v_cab_quantidade + p_item_quantidadeConvertida;
      IF v_prod_tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorServicos := v_cab_valorServicos + v_item_valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos + p_item_valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorProdutos := v_cab_valorProdutos + v_item_valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos + p_item_valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem + p_item_valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem + p_item_valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem + p_item_valorAdicFreteMarItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem + p_item_valorDespesasAduanItem;
      v_cab_valorFreteGeral := v_cab_valorFreteGeral + p_item_valorFreteGeral;
      v_cab_valorSeguroGeral := v_cab_valorSeguroGeral + p_item_valorSeguroGeral;
      v_cab_valorDescontoGeral := v_cab_valorDescontoGeral + v_item_valorDescontoGeral;
      v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral + p_item_valorOutrasDespesasGer;
      v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral + p_item_valorAdicFreteMarGeral;
      v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral + p_item_valorDespesasAduanGeral;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento + v_item_valorBasePagamento;
      IF p_item_usarPrecoAVista = 1
        AND v_item_geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo + v_item_valorProdutoServico - v_item_valorDescontoTotal + v_item_valorOutrasDespesasTot;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento + v_item_valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento + v_item_valorOutrasDespPagament;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento + v_item_valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal + v_item_valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal + v_item_valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal + v_item_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_item_valorOutrasDespesasTot;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal + v_item_valorAdicFreteMarTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal + v_item_valorDespesasAduanTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem + v_item_valorLiquidoItem;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem + p_item_valorDescontoCustoOpIte;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera + p_item_valorDescontoCustoOpGer;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota + v_item_valorDescontoCustoOpTot;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte + p_item_valorAcrescimoCustoOpIt;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer + p_item_valorAcrescimoCustoOpGe;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot + v_item_valorAcrescimoCustoOpTo;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao + v_item_valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV + v_item_valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea + p_item_quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt + v_item_valorAcrescimoExtempSub;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem + p_item_valorAcrescimoExtempIte;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera + p_item_valorAcrescimoExtempGer;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota + v_item_valorAcrescimoExtempTot;
    END IF;
    UPDATE MODOCUMENTOSFISCAIS SET
      modalidadeFrete               = v_cab_modalidadeFrete,
      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,
      valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
      valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
      valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
      valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
      valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
      valorCustoOperacao            = v_cab_valorCustoOperacao,
      valorCMV                      = v_cab_valorCMV,
      quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
      valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
      valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
      valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
    WHERE idDocumentoFiscal = p_item_idDocumentoFiscal;
    IF p_item_idItemDocFiscal > 0 THEN
      DELETE MODOCFISCALXCOMPOSICOESPR compDoc
      WHERE compDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND EXISTS(
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.produto = comp.produto
        WHERE comp.composicaoPreco = compDoc.composicaoPreco
        AND gradProd.gradeProduto <> p_item_gradeProduto);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      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_413_obs_add_marca,
      ' ',
      0,
      'D',
      p_item_idItemDocFiscal,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    MERGE INTO MODOCFISCALXITENS a USING (
      SELECT
        r_item_idItemDocFiscal         idItemDocFiscal,
        p_item_idDocumentoFiscal       idDocumentoFiscal,
        v_item_sequencia               sequencia,
        v_item_cancelado               cancelado,
        p_item_pedidoCompraFornecedor  pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo sequenciaPedidoCompraFornec,
        p_item_modeloDocumento         modeloDocumento,
        p_item_estabelecimentoOriginal estabelecimentoOriginal,
        p_item_vendedor                vendedor,
        p_item_gradeProduto            gradeProduto,
        p_item_idFormulaTinta          idFormulaTinta,
        p_item_personalizacao          personalizacao,
        p_item_idLoteEstoque           idLoteEstoque,
        p_item_operacaoFiscal          operacaoFiscal,
        v_item_movimentaEstoque        movimentaEstoque,
        v_item_movimentaEstoqueFiscal  movimentaEstoqueFiscal,
        v_item_geraFinanceiro          geraFinanceiro,
        p_item_localEstoque            localEstoque,
        p_item_pessoaParticipante      pessoaParticipante,
        p_item_controleQuantidade      controleQuantidade,
        p_item_unidadeMedidaConversao  unidadeMedidaConversao,
        p_item_conversorQuantidade     conversorQuantidade,
        p_item_loteMinimo              loteMinimo,
        p_item_loteMultiplo            loteMultiplo,
        p_item_altura                  altura,
        p_item_largura                 largura,
        p_item_comprimento             comprimento,
        p_item_pecas                   pecas,
        p_item_quantidade              quantidade,
        p_item_quantidadeConvertida    quantidadeConvertida,
        v_item_quantidadeDevolvidaRet  quantidadeDevolvidaRetornada,
        p_item_percentualDevolucao     percentualDevolucao,
        p_item_pesoLiquido             pesoLiquido,
        p_item_pesoBruto               pesoBruto,
        p_item_tipoPreco               tipoPreco,
        p_item_tabelaPreco             tabelaPreco,
        p_item_precoSugestaoAPrazo     precoSugestaoAPrazo,
        p_item_precoSugestaoAVista     precoSugestaoAVista,
        p_item_precoDesconto           precoDesconto,
        p_item_precoMinimo             precoMinimo,
        p_item_usarPrecoAVista         usarPrecoAVista,
        p_item_precoUnitarioBruto      precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos acrescimoUnitarioComposicao,
        v_item_precoUnitario           precoUnitario,
        v_item_precoUnitarioConvertido precoUnitarioConvertido,
        v_item_valorProdutoServicoBrut valorProdutoServicoBruto,
        v_item_valorProdutoServico     valorProdutoServico,
        p_item_percDescontoItem        percDescontoItem,
        p_item_valorDescontoItem       valorDescontoItem,
        p_item_percAcrescimoItem       percAcrescimoItem,
        p_item_valorAcrescimoItem      valorAcrescimoItem,
        p_item_valorFreteItem          valorFreteItem,
        p_item_valorSeguroItem         valorSeguroItem,
        p_item_valorAdicFreteMarItem   valorAdicFreteMarinhaMerItem,
        p_item_valorDespesasAduanItem  valorDespesasAduaneirasItem,
        p_item_valorFreteGeral         valorFreteGeral,
        p_item_valorSeguroGeral        valorSeguroGeral,
        v_item_valorDescontoGeral      valorDescontoGeral,
        p_item_valorOutrasDespesasGer  valorOutrasDespesasGeral,
        p_item_valorAdicFreteMarGeral  valorAdicFreteMarinhaMerGeral,
        p_item_valorDespesasAduanGeral valorDespesasAduaneirasGeral,
        v_item_valorBasePagamento      valorBasePagamento,
        v_item_valorDescontoPagamento  valorDescontoPagamento,
        v_item_valorOutrasDespPagament valorOutrasDespesasPagamento,
        v_item_valorJurosPagamento     valorJurosPagamento,
        v_item_valorFreteTotal         valorFreteTotal,
        v_item_valorSeguroTotal        valorSeguroTotal,
        v_item_valorDescontoTotal      valorDescontoTotal,
        v_item_valorOutrasDespesasTot  valorOutrasDespesasTotal,
        v_item_valorAdicFreteMarTotal  valorAdicFreteMarinhaMerTotal,
        v_item_valorDespesasAduanTotal valorDespesasAduaneirasTotal,
        v_item_cfop                    cfop,
        v_item_indicadorISSQN          indicadorISSQN,
        v_item_aliquotaISSQN           aliquotaISSQN,
        v_item_retidoISSQN             retidoISSQN,
        v_item_tributadoForaMunicipio  tributadoForaMunicipio,
        v_item_incentivoFiscal         incentivoFiscal,
        v_item_listaServicos           listaServicos,
        v_item_cnae                    cnae,
        v_item_idServicoMunicipio      idServicoMunicipio,
        v_item_numeroProcessoAdministr numeroProcessoAdministrativo,
        v_item_baseISSQN               baseISSQN,
        v_item_valorISSQN              valorISSQN,
        v_item_retencaoIRRF            retencaoIRRF,
        v_item_baseRetIRRF             baseRetIRRF,
        v_item_valorRetIRRF            valorRetIRRF,
        v_item_retencaoINSS            retencaoINSS,
        v_item_baseRetINSS             baseRetINSS,
        v_item_valorRetINSS            valorRetINSS,
        v_item_retencaoPIS             retencaoPIS,
        v_item_baseRetPIS              baseRetPIS,
        v_item_valorRetPIS             valorRetPIS,
        v_item_retencaoCOFINS          retencaoCOFINS,
        v_item_baseRetCOFINS           baseRetCOFINS,
        v_item_valorRetCOFINS          valorRetCOFINS,
        v_item_retencaoCSLL            retencaoCSLL,
        v_item_baseRetCSLL             baseRetCSLL,
        v_item_valorRetCSLL            valorRetCSLL,
        v_item_retencaoOutros          retencaoOutros,
        v_item_baseRetOutros           baseRetOutros,
        v_item_valorRetOutros          valorRetOutros,
        v_item_aliquotaII              aliquotaII,
        v_item_baseII                  baseII,
        v_item_valorII                 valorII,
        v_item_aliquotaIOF             aliquotaIOF,
        v_item_baseIOF                 baseIOF,
        v_item_valorIOF                valorIOF,
        v_item_codigoEnquadramentoIPI  codigoEnquadramentoIPI,
        v_item_stIPI                   stIPI,
        v_item_aliquotaIPI             aliquotaIPI,
        v_item_valorAliquotaIPI        valorAliquotaIPI,
        v_item_baseIPI                 baseIPI,
        v_item_valorIPI                valorIPI,
        p_item_valorIPIDevolucao       valorIPIDevolucao,
        v_item_stPIS                   stPIS,
        v_item_aliquotaPIS             aliquotaPIS,
        v_item_valorAliquotaPIS        valorAliquotaPIS,
        v_item_basePIS                 basePIS,
        v_item_valorPIS                valorPIS,
        v_item_aliquotaPISST           aliquotaPISST,
        v_item_valorAliquotaPISST      valorAliquotaPISST,
        v_item_basePISST               basePISST,
        v_item_valorPISST              valorPISST,
        v_item_stCOFINS                stCOFINS,
        v_item_aliquotaCOFINS          aliquotaCOFINS,
        v_item_valorAliquotaCOFINS     valorAliquotaCOFINS,
        v_item_baseCOFINS              baseCOFINS,
        v_item_valorCOFINS             valorCOFINS,
        v_item_aliquotaCOFINSST        aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST   valorAliquotaCOFINSST,
        v_item_baseCOFINSST            baseCOFINSST,
        v_item_valorCOFINSST           valorCOFINSST,
        v_item_stSimplesNacional       stSimplesNacional,
        v_item_creditoSimplesNacional  creditoSimplesNacional,
        v_item_baseCreditoSimplesNac   baseCreditoSimplesNacional,
        v_item_valorCreditoSimplesNac  valorCreditoSimplesNacional,
        v_item_stICMS                  stICMS,
        v_item_modalBaseCalcICMS       modalidadeBaseCalcICMS,
        v_item_reducaoBaseICMS         reducaoBaseICMS,
        v_item_aliquotaICMS            aliquotaICMS,
        v_item_diferimentoICMS         diferimentoICMS,
        v_item_motivoDesoneracaoICMS   motivoDesoneracaoICMS,
        v_item_idBeneficio             idBeneficio,
        v_item_baseICMS                baseICMS,
        v_item_valorICMSOperacao       valorICMSOperacao,
        v_item_valorICMSDiferido       valorICMSDiferido,
        v_item_valorICMS               valorICMS,
        v_item_valorICMSDesoneracao    valorICMSDesoneracao,
        v_item_modalBaseCalcICMSST     modalidadeBaseCalcICMSST,
        v_item_margemValorAdicionadoST margemValorAdicionadoST,
        v_item_reducaoBaseST           reducaoBaseST,
        v_item_aliquotaICMSST          aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin aliquotaSTSuportConsFinal,
        v_item_baseICMSST              baseICMSST,
        v_item_valorICMSST             valorICMSST,
        v_item_baseICMSSTAnteriormente baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment valorICMSSTAnteriormente,
        v_item_valorICMSProprioSubstit valorICMSProprioSubstituto,
        v_item_reducaoBaseICMSEfetivo  reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo     aliquotaICMSEfetivo,
        v_item_baseICMSEfetivo         baseICMSEfetivo,
        v_item_valorICMSEfetivo        valorICMSEfetivo,
        v_item_stICMSEscrituracao      stICMSEscrituracao,
        v_item_reducaoBaseICMSEscritur reducaoBaseICMSEscrituracao,
        v_item_aliquotaICMSEscrituraca aliquotaICMSEscrituracao,
        v_item_diferimentoICMSEscritur diferimentoICMSEscrituracao,
        v_item_baseICMSEscrituracao    baseICMSEscrituracao,
        v_item_valorICMSEscrituracao   valorICMSEscrituracao,
        v_item_valorICMSDesonEscritura valorICMSDesonEscrituracao,
        v_item_margemValorAdicSTEscrit margemValorAdicSTEscrituracao,
        v_item_reducaoBaseSTEscriturac reducaoBaseSTEscrituracao,
        v_item_aliquotaICMSSTEscritura aliquotaICMSSTEscrituracao,
        v_item_baseICMSSTEscrituracao  baseICMSSTEscrituracao,
        v_item_valorICMSSTEscrituracao valorICMSSTEscrituracao,
        v_item_somarICMSST             somarICMSST,
        v_item_aliquotaICMSUFDestinat  aliquotaICMSUFDestinatario,
        v_item_aliquotaICMSInterestad  aliquotaICMSInterestadual,
        v_item_partilhaICMSInterestad  partilhaICMSInterestadual,
        v_item_baseICMSUFDestinatario  baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente     baseICMSUFRemetente,
        v_item_valorICMSUFRemetente    valorICMSUFRemetente,
        v_item_aliquotaFCP             aliquotaFCP,
        v_item_baseFCP                 baseFCP,
        v_item_valorFCP                valorFCP,
        v_item_aliquotaFCPST           aliquotaFCPST,
        v_item_baseFCPST               baseFCPST,
        v_item_valorFCPST              valorFCPST,
        v_item_aliquotaFCPSTAnteriorm  aliquotaFCPSTAnteriormente,
        v_item_baseFCPSTAnteriormente  baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente valorFCPSTAnteriormente,
        v_item_aliquotaFCPUFDestinat   aliquotaFCPUFDestinatario,
        v_item_baseFCPUFDestinatario   baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario  valorFCPUFDestinatario,
        v_item_aliquotaEstImpFederais  aliquotaEstimadaImpFederais,
        v_item_aliquotaEstImpEstaduais aliquotaEstimadaImpEstaduais,
        v_item_aliquotaEstImpMunicipai aliquotaEstimadaImpMunicipais,
        v_item_baseEstimadaImpostos    baseEstimadaImpostos,
        v_item_valorEstImpFederais     valorEstimadoImpFederais,
        v_item_valorEstImpEstaduais    valorEstimadoImpEstaduais,
        v_item_valorEstImpMunicipais   valorEstimadoImpMunicipais,
        v_item_valorLiquidoItem        valorLiquidoItem,
        p_item_valorDescontoCustoOpIte valorDescontoCustoOpItem,
        p_item_valorDescontoCustoOpGer valorDescontoCustoOpGeral,
        v_item_valorDescontoCustoOpTot valorDescontoCustoOpTotal,
        p_item_valorAcrescimoCustoOpIt valorAcrescimoCustoOpItem,
        p_item_valorAcrescimoCustoOpGe valorAcrescimoCustoOpGeral,
        v_item_valorAcrescimoCustoOpTo valorAcrescimoCustoOpTotal,
        v_item_precoCustoOperacao      precoCustoOperacao,
        v_item_valorCustoOperacao      valorCustoOperacao,
        v_item_precoCMV                precoCMV,
        v_item_valorCMV                valorCMV,
        p_item_quantidadeExtemporanea  quantidadeExtemporanea,
        p_item_acrescimoUnitarioExtemp acrescimoUnitarioExtemporaneo,
        v_item_valorAcrescimoExtempSub valorAcrescimoExtempSubtotal,
        p_item_valorAcrescimoExtempIte valorAcrescimoExtempItem,
        p_item_valorAcrescimoExtempGer valorAcrescimoExtempGeral,
        v_item_valorAcrescimoExtempTot valorAcrescimoExtempTotal,
        p_item_observacoesDigitadas    observacoesDigitadas,
        v_observacoes                  observacoes
      FROM DUAL) b
    ON (a.idItemDocFiscal = b.idItemDocFiscal)
    WHEN MATCHED THEN UPDATE SET
      a.idDocumentoFiscal             = b.idDocumentoFiscal,
      a.sequencia                     = b.sequencia,
      a.cancelado                     = b.cancelado,
      a.pedidoCompraFornecedor        = b.pedidoCompraFornecedor,
      a.sequenciaPedidoCompraFornec   = b.sequenciaPedidoCompraFornec,
      a.vendedor                      = b.vendedor,
      a.modeloDocumento               = b.modeloDocumento,
      a.estabelecimentoOriginal       = b.estabelecimentoOriginal,
      a.gradeProduto                  = b.gradeProduto,
      a.idFormulaTinta                = b.idFormulaTinta,
      a.personalizacao                = b.personalizacao,
      a.idLoteEstoque                 = b.idLoteEstoque,
      a.operacaoFiscal                = b.operacaoFiscal,
      a.movimentaEstoque              = b.movimentaEstoque,
      a.movimentaEstoqueFiscal        = b.movimentaEstoqueFiscal,
      a.geraFinanceiro                = b.geraFinanceiro,
      a.localEstoque                  = b.localEstoque,
      a.pessoaParticipante            = b.pessoaParticipante,
      a.controleQuantidade            = b.controleQuantidade,
      a.unidadeMedidaConversao        = b.unidadeMedidaConversao,
      a.conversorQuantidade           = b.conversorQuantidade,
      a.loteMinimo                    = b.loteMinimo,
      a.loteMultiplo                  = b.loteMultiplo,
      a.altura                        = b.altura,
      a.largura                       = b.largura,
      a.comprimento                   = b.comprimento,
      a.pecas                         = b.pecas,
      a.quantidade                    = b.quantidade,
      a.quantidadeConvertida          = b.quantidadeConvertida,
      a.quantidadeDevolvidaRetornada  = b.quantidadeDevolvidaRetornada,
      a.percentualDevolucao           = b.percentualDevolucao,
      a.pesoLiquido                   = b.pesoLiquido,
      a.pesoBruto                     = b.pesoBruto,
      a.tipoPreco                     = b.tipoPreco,
      a.tabelaPreco                   = b.tabelaPreco,
      a.precoSugestaoAPrazo           = b.precoSugestaoAPrazo,
      a.precoSugestaoAVista           = b.precoSugestaoAVista,
      a.precoDesconto                 = b.precoDesconto,
      a.precoMinimo                   = b.precoMinimo,
      a.usarPrecoAVista               = b.usarPrecoAVista,
      a.precoUnitarioBruto            = b.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao   = b.acrescimoUnitarioComposicao,
      a.precoUnitario                 = b.precoUnitario,
      a.precoUnitarioConvertido       = b.precounitarioConvertido,
      a.valorProdutoServicoBruto      = b.valorProdutoServicoBruto,
      a.valorProdutoServico           = b.valorProdutoServico,
      a.percDescontoItem              = b.percDescontoItem,
      a.valorDescontoItem             = b.valorDescontoItem,
      a.percAcrescimoItem             = b.percAcrescimoItem,
      a.valorAcrescimoItem            = b.valorAcrescimoItem,
      a.valorFreteItem                = b.valorFreteItem,
      a.valorSeguroItem               = b.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem  = b.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem   = b.valorDespesasAduaneirasItem,
      a.valorFreteGeral               = b.valorFreteGeral,
      a.valorSeguroGeral              = b.valorSeguroGeral,
      a.valorDescontoGeral            = b.valorDescontoGeral,
      a.valorOutrasDespesasGeral      = b.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral = b.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral  = b.valorDespesasAduaneirasGeral,
      a.valorBasePagamento            = b.valorBasePagamento,
      a.valorDescontoPagamento        = b.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento  = b.valorOutrasDespesasPagamento,
      a.valorJurosPagamento           = b.valorJurosPagamento,
      a.valorFreteTotal               = b.valorFreteTotal,
      a.valorSeguroTotal              = b.valorSeguroTotal,
      a.valorDescontoTotal            = b.valorDescontoTotal,
      a.valorOutrasDespesasTotal      = b.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal = b.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal  = b.valorDespesasAduaneirasTotal,
      a.cfop                          = b.cfop,
      a.indicadorISSQN                = b.indicadorISSQN,
      a.aliquotaISSQN                 = b.aliquotaISSQN,
      a.retidoISSQN                   = b.retidoISSQN,
      a.tributadoForaMunicipio        = b.tributadoForaMunicipio,
      a.incentivoFiscal               = b.incentivoFiscal,
      a.listaServicos                 = b.listaServicos,
      a.cnae                          = b.cnae,
      a.idServicoMunicipio            = b.idServicoMunicipio,
      a.numeroProcessoAdministrativo  = b.numeroProcessoAdministrativo,
      a.baseISSQN                     = b.baseISSQN,
      a.valorISSQN                    = b.valorISSQN,
      a.retencaoIRRF                  = b.retencaoIRRF,
      a.baseRetIRRF                   = b.baseRetIRRF,
      a.valorRetIRRF                  = b.valorRetIRRF,
      a.retencaoINSS                  = b.retencaoINSS,
      a.baseRetINSS                   = b.baseRetINSS,
      a.valorRetINSS                  = b.valorRetINSS,
      a.retencaoPIS                   = b.retencaoPIS,
      a.baseRetPIS                    = b.baseRetPIS,
      a.valorRetPIS                   = b.valorRetPIS,
      a.retencaoCOFINS                = b.retencaoCOFINS,
      a.baseRetCOFINS                 = b.baseRetCOFINS,
      a.valorRetCOFINS                = b.valorRetCOFINS,
      a.retencaoCSLL                  = b.retencaoCSLL,
      a.baseRetCSLL                   = b.baseRetCSLL,
      a.valorRetCSLL                  = b.valorRetCSLL,
      a.retencaoOutros                = b.retencaoOutros,
      a.baseRetOutros                 = b.baseRetOutros,
      a.valorRetOutros                = b.valorRetOutros,
      a.aliquotaII                    = b.aliquotaII,
      a.baseII                        = b.baseII,
      a.valorII                       = b.valorII,
      a.aliquotaIOF                   = b.aliquotaIOF,
      a.baseIOF                       = b.baseIOF,
      a.valorIOF                      = b.valorIOF,
      a.codigoEnquadramentoIPI        = b.codigoEnquadramentoIPI,
      a.stIPI                         = b.stIPI,
      a.aliquotaIPI                   = b.aliquotaIPI,
      a.valorAliquotaIPI              = b.valorAliquotaIPI,
      a.baseIPI                       = b.baseIPI,
      a.valorIPI                      = b.valorIPI,
      a.valorIPIDevolucao             = b.valorIPIDevolucao,
      a.stPIS                         = b.stPIS,
      a.aliquotaPIS                   = b.aliquotaPIS,
      a.valorAliquotaPIS              = b.valorAliquotaPIS,
      a.basePIS                       = b.basePIS,
      a.valorPIS                      = b.valorPIS,
      a.aliquotaPISST                 = b.aliquotaPISST,
      a.valorAliquotaPISST            = b.valorAliquotaPISST,
      a.basePISST                     = b.basePISST,
      a.valorPISST                    = b.valorPISST,
      a.stCOFINS                      = b.stCOFINS,
      a.aliquotaCOFINS                = b.aliquotaCOFINS,
      a.valorAliquotaCOFINS           = b.valorAliquotaCOFINS,
      a.baseCOFINS                    = b.baseCOFINS,
      a.valorCOFINS                   = b.valorCOFINS,
      a.aliquotaCOFINSST              = b.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST         = b.valorAliquotaCOFINSST,
      a.baseCOFINSST                  = b.baseCOFINSST,
      a.valorCOFINSST                 = b.valorCOFINSST,
      a.stSimplesNacional             = b.stSimplesNacional,
      a.creditoSimplesNacional        = b.creditoSimplesNacional,
      a.baseCreditoSimplesNacional    = b.baseCreditoSimplesNacional,
      a.valorCreditoSimplesNacional   = b.valorCreditoSimplesNacional,
      a.stICMS                        = b.stICMS,
      a.modalidadeBaseCalcICMS        = b.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS               = b.reducaoBaseICMS,
      a.aliquotaICMS                  = b.aliquotaICMS,
      a.diferimentoICMS               = b.diferimentoICMS,
      a.motivoDesoneracaoICMS         = b.motivoDesoneracaoICMS,
      a.idBeneficio                   = b.idBeneficio,
      a.baseICMS                      = b.baseICMS,
      a.valorICMSoperacao             = b.valorICMSoperacao,
      a.valorICMSdiferido             = b.valorICMSdiferido,
      a.valorICMS                     = b.valorICMS,
      a.valorICMSdesoneracao          = b.valorICMSdesoneracao,
      a.modalidadeBaseCalcICMSST      = b.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST       = b.margemValorAdicionadoST,
      a.reducaoBaseST                 = b.reducaoBaseST,
      a.aliquotaICMSST                = b.aliquotaICMSST,
      a.aliquotaSTSuportConsFinal     = b.aliquotaSTSuportConsFinal,
      a.baseICMSST                    = b.baseICMSST,
      a.valorICMSST                   = b.valorICMSST,
      a.baseICMSSTAnteriormente       = b.baseICMSSTAnteriormente,
      a.valorICMSSTAnteriormente      = b.valorICMSSTAnteriormente,
      a.valorICMSProprioSubstituto    = b.valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo        = b.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo           = b.aliquotaICMSEfetivo,
      a.baseICMSEfetivo               = b.baseICMSEfetivo,
      a.valorICMSEfetivo              = b.valorICMSEfetivo,
      a.stICMSEscrituracao            = b.stICMSEscrituracao,
      a.reducaoBaseICMSEscrituracao   = b.reducaoBaseICMSEscrituracao,
      a.aliquotaICMSEscrituracao      = b.aliquotaICMSEscrituracao,
      a.diferimentoICMSEscrituracao   = b.diferimentoICMSEscrituracao,
      a.baseICMSEscrituracao          = b.baseICMSEscrituracao,
      a.valorICMSEscrituracao         = b.valorICMSEscrituracao,
      a.valorICMSDesonEscrituracao    = b.valorICMSDesonEscrituracao,
      a.margemValorAdicSTEscrituracao = b.margemValorAdicSTEscrituracao,
      a.reducaoBaseSTEscrituracao     = b.reducaoBaseSTEscrituracao,
      a.aliquotaICMSSTEscrituracao    = b.aliquotaICMSSTEscrituracao,
      a.baseICMSSTEscrituracao        = b.baseICMSSTEscrituracao,
      a.valorICMSSTEscrituracao       = b.valorICMSSTEscrituracao,
      a.somarICMSST                   = b.somarICMSST,
      a.aliquotaICMSUFDestinatario    = b.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual     = b.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual     = b.partilhaICMSInterestadual,
      a.baseICMSUFDestinatario        = b.baseICMSUFDestinatario,
      a.valorICMSUFDestinatario       = b.valorICMSUFDestinatario,
      a.baseICMSUFRemetente           = b.baseICMSUFRemetente,
      a.valorICMSUFRemetente          = b.valorICMSUFRemetente,
      a.aliquotaFCP                   = b.aliquotaFCP,
      a.baseFCP                       = b.baseFCP,
      a.valorFCP                      = b.valorFCP,
      a.aliquotaFCPST                 = b.aliquotaFCPST,
      a.baseFCPST                     = b.baseFCPST,
      a.valorFCPST                    = b.valorFCPST,
      a.aliquotaFCPSTAnteriormente    = b.aliquotaFCPSTAnteriormente,
      a.baseFCPSTAnteriormente        = b.baseFCPSTAnteriormente,
      a.valorFCPSTAnteriormente       = b.valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario     = b.aliquotaFCPUFDestinatario,
      a.baseFCPUFDestinatario         = b.baseFCPUFDestinatario,
      a.valorFCPUFDestinatario        = b.valorFCPUFDestinatario,
      a.aliquotaestimadaimpfederais   = b.aliquotaestimadaimpfederais,
      a.aliquotaestimadaimpestaduais  = b.aliquotaestimadaimpestaduais,
      a.aliquotaestimadaimpmunicipais = b.aliquotaestimadaimpmunicipais,
      a.baseestimadaimpostos          = b.baseestimadaimpostos,
      a.valorestimadoimpfederais      = b.valorestimadoimpfederais,
      a.valorEstimadoImpEstaduais     = b.valorEstimadoImpEstaduais,
      a.valorEstimadoImpMunicipais    = b.valorEstimadoImpMunicipais,
      a.valorLiquidoItem              = b.valorLiquidoItem,
      a.valorDescontoCustoOpItem      = b.valorDescontoCustoOpItem,
      a.valorDescontoCustoOpGeral     = b.valorDescontoCustoOpGeral,
      a.valorDescontoCustoOpTotal     = b.valorDescontoCustoOpTotal,
      a.valorAcrescimoCustoOpItem     = b.valorAcrescimoCustoOpItem,
      a.valorAcrescimoCustoOpGeral    = b.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoCustoOpTotal    = b.valorAcrescimoCustoOpTotal,
      a.precoCustoOperacao            = b.precoCustoOperacao,
      a.valorCustoOperacao            = b.valorCustoOperacao,
      a.precoCMV                      = b.precoCMV,
      a.valorCMV                      = b.valorCMV,
      a.quantidadeExtemporanea        = b.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo = b.acrescimoUnitarioExtemporaneo,
      a.valorAcrescimoExtempSubtotal  = b.valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem      = b.valorAcrescimoExtempItem,
      a.valorAcrescimoExtempGeral     = b.valorAcrescimoExtempGeral,
      a.valorAcrescimoExtempTotal     = b.valorAcrescimoExtempTotal,
      a.observacoesDigitadas          = b.observacoesDigitadas,
      a.observacoes                   = b.observacoes
    WHEN NOT MATCHED THEN INSERT (
      idItemDocFiscal,
      idDocumentoFiscal,
      sequencia,
      cancelado,
      pedidoCompraFornecedor,
      sequenciaPedidoCompraFornec,
      modeloDocumento,
      estabelecimentoOriginal,
      vendedor,
      gradeProduto,
      idFormulaTinta,
      personalizacao,
      idLoteEstoque,
      operacaoFiscal,
      movimentaEstoque,
      movimentaEstoqueFiscal,
      geraFinanceiro,
      localEstoque,
      pessoaParticipante,
      controleQuantidade,
      unidadeMedidaConversao,
      conversorQuantidade,
      loteMinimo,
      loteMultiplo,
      altura,
      largura,
      comprimento,
      pecas,
      quantidade,
      quantidadeConvertida,
      quantidadeDevolvidaRetornada,
      percentualDevolucao,
      pesoLiquido,
      pesoBruto,
      tipoPreco,
      tabelaPreco,
      precoSugestaoAPrazo,
      precoSugestaoAVista,
      precoDesconto,
      precoMinimo,
      usarPrecoAVista,
      precoUnitarioBruto,
      acrescimoUnitarioComposicao,
      precoUnitario,
      precoUnitarioConvertido,
      valorProdutoServicoBruto,
      valorProdutoServico,
      percDescontoItem,
      valorDescontoItem,
      percAcrescimoItem,
      valorAcrescimoItem,
      valorFreteItem,
      valorSeguroItem,
      valorAdicFreteMarinhaMerItem,
      valorDespesasAduaneirasItem,
      valorFreteGeral,
      valorSeguroGeral,
      valorDescontoGeral,
      valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral,
      valorDespesasAduaneirasGeral,
      valorBasePagamento,
      valorDescontoPagamento,
      valorOutrasDespesasPagamento,
      valorJurosPagamento,
      valorFreteTotal,
      valorSeguroTotal,
      valorDescontoTotal,
      valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal,
      valorDespesasAduaneirasTotal,
      cfop,
      indicadorISSQN,
      aliquotaISSQN,
      retidoISSQN,
      tributadoForaMunicipio,
      incentivoFiscal,
      listaServicos,
      cnae,
      idServicoMunicipio,
      numeroProcessoAdministrativo,
      baseISSQN,
      valorISSQN,
      retencaoIRRF,
      baseRetIRRF,
      valorRetIRRF,
      retencaoINSS,
      baseRetINSS,
      valorRetINSS,
      retencaoPIS,
      baseRetPIS,
      valorRetPIS,
      retencaoCOFINS,
      baseRetCOFINS,
      valorRetCOFINS,
      retencaoCSLL,
      baseRetCSLL,
      valorRetCSLL,
      retencaoOutros,
      baseRetOutros,
      valorRetOutros,
      aliquotaII,
      baseII,
      valorII,
      aliquotaIOF,
      baseIOF,
      valorIOF,
      codigoEnquadramentoIPI,
      stIPI,
      aliquotaIPI,
      valorAliquotaIPI,
      baseIPI,
      valorIPI,
      valorIPIDevolucao,
      stPIS,
      aliquotaPIS,
      valorAliquotaPIS,
      basePIS,
      valorPIS,
      aliquotaPISST,
      valorAliquotaPISST,
      basePISST,
      valorPISST,
      stCOFINS,
      aliquotaCOFINS,
      valorAliquotaCOFINS,
      baseCOFINS,
      valorCOFINS,
      aliquotaCOFINSST,
      valorAliquotaCOFINSST,
      baseCOFINSST,
      valorCOFINSST,
      stSimplesNacional,
      creditoSimplesNacional,
      baseCreditoSimplesNacional,
      valorCreditoSimplesNacional,
      stICMS,
      modalidadeBaseCalcICMS,
      reducaoBaseICMS,
      aliquotaICMS,
      diferimentoICMS,
      motivoDesoneracaoICMS,
      idBeneficio,
      baseICMS,
      valorICMSOperacao,
      valorICMSDiferido,
      valorICMS,
      valorICMSDesoneracao,
      modalidadeBaseCalcICMSST,
      margemValorAdicionadoST,
      reducaoBaseST,
      aliquotaICMSST,
      aliquotaSTSuportConsFinal,
      baseICMSST,
      valorICMSST,
      baseICMSSTAnteriormente,
      valorICMSSTAnteriormente,
      valorICMSProprioSubstituto,
      reducaoBaseICMSEfetivo,
      aliquotaICMSEfetivo,
      baseICMSEfetivo,
      valorICMSEfetivo,
      stICMSEscrituracao,
      reducaoBaseICMSEscrituracao,
      aliquotaICMSEscrituracao,
      diferimentoICMSEscrituracao,
      baseICMSEscrituracao,
      valorICMSEscrituracao,
      valorICMSDesonEscrituracao,
      margemValorAdicSTEscrituracao,
      reducaoBaseSTEscrituracao,
      aliquotaICMSSTEscrituracao,
      baseICMSSTEscrituracao,
      valorICMSSTEscrituracao,
      somarICMSST,
      aliquotaICMSUFDestinatario,
      aliquotaICMSInterestadual,
      partilhaICMSInterestadual,
      baseICMSUFDestinatario,
      valorICMSUFDestinatario,
      baseICMSUFRemetente,
      valorICMSUFRemetente,
      aliquotaFCP,
      baseFCP,
      valorFCP,
      aliquotaFCPST,
      baseFCPST,
      valorFCPST,
      aliquotaFCPSTAnteriormente,
      baseFCPSTAnteriormente,
      valorFCPSTAnteriormente,
      aliquotaFCPUFDestinatario,
      baseFCPUFDestinatario,
      valorFCPUFDestinatario,
      aliquotaEstimadaImpFederais,
      aliquotaEstimadaImpEstaduais,
      aliquotaEstimadaImpMunicipais,
      baseEstimadaImpostos,
      valorEstimadoImpFederais,
      valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais,
      valorLiquidoItem,
      valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral,
      valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpItem,
      valorAcrescimoCustoOpGeral,
      valorAcrescimoCustoOpTotal,
      precoCustoOperacao,
      valorCustoOperacao,
      precoCMV,
      valorCMV,
      quantidadeExtemporanea,
      acrescimoUnitarioExtemporaneo,
      valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral,
      valorAcrescimoExtempTotal,
      observacoesDigitadas,
      observacoes)
    VALUES (
      b.idItemDocFiscal,
      b.idDocumentoFiscal,
      b.sequencia,
      b.cancelado,
      b.pedidoCompraFornecedor,
      b.sequenciaPedidoCompraFornec,
      b.modeloDocumento,
      b.estabelecimentoOriginal,
      b.vendedor,
      b.gradeProduto,
      b.idFormulaTinta,
      b.personalizacao,
      b.idLoteEstoque,
      b.operacaoFiscal,
      b.movimentaEstoque,
      b.movimentaEstoqueFiscal,
      b.geraFinanceiro,
      b.localEstoque,
      b.pessoaParticipante,
      b.controleQuantidade,
      b.unidadeMedidaConversao,
      b.conversorQuantidade,
      b.loteMinimo,
      b.loteMultiplo,
      b.altura,
      b.largura,
      b.comprimento,
      b.pecas,
      b.quantidade,
      b.quantidadeConvertida,
      b.quantidadeDevolvidaRetornada,
      b.percentualDevolucao,
      b.pesoLiquido,
      b.pesoBruto,
      b.tipoPreco,
      b.tabelaPreco,
      b.precoSugestaoAPrazo,
      b.precoSugestaoAVista,
      b.precoDesconto,
      b.precoMinimo,
      b.usarPrecoAVista,
      b.precoUnitarioBruto,
      b.acrescimoUnitarioComposicao,
      b.precoUnitario,
      b.precoUnitarioConvertido,
      b.valorProdutoServicoBruto,
      b.valorProdutoServico,
      b.percDescontoItem,
      b.valorDescontoItem,
      b.percAcrescimoItem,
      b.valorAcrescimoItem,
      b.valorFreteItem,
      b.valorSeguroItem,
      b.valorAdicFreteMarinhaMerItem,
      b.valorDespesasAduaneirasItem,
      b.valorFreteGeral,
      b.valorSeguroGeral,
      b.valorDescontoGeral,
      b.valorOutrasDespesasGeral,
      b.valorAdicFreteMarinhaMerGeral,
      b.valorDespesasAduaneirasGeral,
      b.valorBasePagamento,
      b.valorDescontoPagamento,
      b.valorOutrasDespesasPagamento,
      b.valorJurosPagamento,
      b.valorFreteTotal,
      b.valorSeguroTotal,
      b.valorDescontoTotal,
      b.valorOutrasDespesasTotal,
      b.valorAdicFreteMarinhaMerTotal,
      b.valorDespesasAduaneirasTotal,
      b.cfop,
      b.indicadorISSQN,
      b.aliquotaISSQN,
      b.retidoISSQN,
      b.tributadoForaMunicipio,
      b.incentivoFiscal,
      b.listaServicos,
      b.cnae,
      b.idServicoMunicipio,
      b.numeroProcessoAdministrativo,
      b.baseISSQN,
      b.valorISSQN,
      b.retencaoIRRF,
      b.baseRetIRRF,
      b.valorRetIRRF,
      b.retencaoINSS,
      b.baseRetINSS,
      b.valorRetINSS,
      b.retencaoPIS,
      b.baseRetPIS,
      b.valorRetPIS,
      b.retencaoCOFINS,
      b.baseRetCOFINS,
      b.valorRetCOFINS,
      b.retencaoCSLL,
      b.baseRetCSLL,
      b.valorRetCSLL,
      b.retencaoOutros,
      b.baseRetOutros,
      b.valorRetOutros,
      b.aliquotaII,
      b.baseII,
      b.valorII,
      b.aliquotaIOF,
      b.baseIOF,
      b.valorIOF,
      b.codigoEnquadramentoIPI,
      b.stIPI,
      b.aliquotaIPI,
      b.valorAliquotaIPI,
      b.baseIPI,
      b.valorIPI,
      b.valorIPIDevolucao,
      b.stPIS,
      b.aliquotaPIS,
      b.valorAliquotaPIS,
      b.basePIS,
      b.valorPIS,
      b.aliquotaPISST,
      b.valorAliquotaPISST,
      b.basePISST,
      b.valorPISST,
      b.stCOFINS,
      b.aliquotaCOFINS,
      b.valorAliquotaCOFINS,
      b.baseCOFINS,
      b.valorCOFINS,
      b.aliquotaCOFINSST,
      b.valorAliquotaCOFINSST,
      b.baseCOFINSST,
      b.valorCOFINSST,
      b.stSimplesNacional,
      b.creditoSimplesNacional,
      b.baseCreditoSimplesNacional,
      b.valorCreditoSimplesNacional,
      b.stICMS,
      b.modalidadeBaseCalcICMS,
      b.reducaoBaseICMS,
      b.aliquotaICMS,
      b.diferimentoICMS,
      b.motivoDesoneracaoICMS,
      b.idBeneficio,
      b.baseICMS,
      b.valorICMSOperacao,
      b.valorICMSDiferido,
      b.valorICMS,
      b.valorICMSDesoneracao,
      b.modalidadeBaseCalcICMSST,
      b.margemValorAdicionadoST,
      b.reducaoBaseST,
      b.aliquotaICMSST,
      b.aliquotaSTSuportConsFinal,
      b.baseICMSST,
      b.valorICMSST,
      b.baseICMSSTAnteriormente,
      b.valorICMSSTAnteriormente,
      b.valorICMSProprioSubstituto,
      b.reducaoBaseICMSEfetivo,
      b.aliquotaICMSEfetivo,
      b.baseICMSEfetivo,
      b.valorICMSEfetivo,
      b.stICMSEscrituracao,
      b.reducaoBaseICMSEscrituracao,
      b.aliquotaICMSEscrituracao,
      b.diferimentoICMSEscrituracao,
      b.baseICMSEscrituracao,
      b.valorICMSEscrituracao,
      b.valorICMSDesonEscrituracao,
      b.margemValorAdicSTEscrituracao,
      b.reducaoBaseSTEscrituracao,
      b.aliquotaICMSSTEscrituracao,
      b.baseICMSSTEscrituracao,
      b.valorICMSSTEscrituracao,
      b.somarICMSST,
      b.aliquotaICMSUFDestinatario,
      b.aliquotaICMSInterestadual,
      b.partilhaICMSInterestadual,
      b.baseICMSUFDestinatario,
      b.valorICMSUFDestinatario,
      b.baseICMSUFRemetente,
      b.valorICMSUFRemetente,
      b.aliquotaFCP,
      b.baseFCP,
      b.valorFCP,
      b.aliquotaFCPST,
      b.baseFCPST,
      b.valorFCPST,
      b.aliquotaFCPSTAnteriormente,
      b.baseFCPSTAnteriormente,
      b.valorFCPSTAnteriormente,
      b.aliquotaFCPUFDestinatario,
      b.baseFCPUFDestinatario,
      b.valorFCPUFDestinatario,
      b.aliquotaEstimadaImpFederais,
      b.aliquotaEstimadaImpEstaduais,
      b.aliquotaEstimadaImpMunicipais,
      b.baseEstimadaImpostos,
      b.valorEstimadoImpFederais,
      b.valorEstimadoImpEstaduais,
      b.valorEstimadoImpMunicipais,
      b.valorLiquidoItem,
      b.valorDescontoCustoOpItem,
      b.valorDescontoCustoOpGeral,
      b.valorDescontoCustoOpTotal,
      b.valorAcrescimoCustoOpItem,
      b.valorAcrescimoCustoOpGeral,
      b.valorAcrescimoCustoOpTotal,
      b.precoCustoOperacao,
      b.valorCustoOperacao,
      b.precoCMV,
      b.valorCMV,
      b.quantidadeExtemporanea,
      b.acrescimoUnitarioExtemporaneo,
      b.valorAcrescimoExtempSubtotal,
      b.valorAcrescimoExtempItem,
      b.valorAcrescimoExtempGeral,
      b.valorAcrescimoExtempTotal,
      b.observacoesDigitadas,
      b.observacoes);
    v_atualizarObservacoes := 0;
    IF p_idItemReferenciado > 0 THEN
      IF p_tipoDocumentoReferenciado IN ('D','P') THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV(
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_devolucaoAnulacaoRetorno,
          'D',
          r_item_idItemDocFiscal,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          p_tipoDocumentoReferenciado,
          p_idItemReferenciado);
      END IF;
      IF p_tipoDocumentoReferenciado = 'B' THEN
        ADD_DOC_FISC_ITEM_BALANC_GRAVA (
          p_estabelecimentoAtivo,
          p_idItemReferenciado,
          r_item_idItemDocFiscal);
      ELSIF p_tipoDocumentoReferenciado = 'D' THEN
        ADD_DOC_FISC_ITEM_REF_DOC_FIS (
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'G' THEN
        ADD_DOC_FISC_ITEM_REF_DFE_GRAD (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_person_190_modeloFrete,
          p_config_227_manterPessoaOrcam,
          p_config_230_etapaPedComprParc,
          p_config_378_calcularVolumes,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'O' THEN
        ADD_DOC_FISC_ITEM_REF_ORCAMEN (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'P' THEN
        ADD_DOC_FISC_ITEM_REF_PRE_DOC (
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'T' THEN
        ADD_DOC_FISC_ITEM_TRANS_GRAVA (
          p_estabelecimentoAtivo,
          v_cab_entradaSaida,
          p_idItemReferenciado,
          r_item_idItemDocFiscal,
          p_quantidadeReferenciada);
      END IF;
    END IF;
    IF p_tempComp_nomeTempComposicao <> ' '
      AND (NOT (p_tipoDocumentoReferenciado IN ('D','O','P'))
        OR p_idItemReferenciado <= 0)
    THEN
      ADD_DOC_FISC_ITEM_COMP_TEMP (
        p_sessaoClient,
        p_estabelecimentoAtivo,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        r_item_idItemDocFiscal,
        v_atualizarObservacoes,
        v_atualizarObservacoes);
    END IF;
    v_idEnderecoEstoque := 0;
    IF p_item_idEnderecoEstoque > 0 THEN
      ADD_DOC_FISC_ITEM_ENDER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemDocFiscal,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_quantidade,
        ' ',
        v_idEnderecoEstoque);
    END IF;
    IF p_item_idNumeroSerie > 0 THEN
      ADD_DOC_FISC_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemDocFiscal,
        v_idEnderecoEstoque,
        p_item_gradeProduto,
        p_item_idNumeroSerie,
        0,
        v_auxNumber);
      v_atualizarObservacoes := 1;
    END IF;
    IF v_atualizarObservacoes = 1 THEN
      v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
        p_sessaoClient,
        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_413_obs_add_marca,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        'D',
        r_item_idItemDocFiscal,
        p_item_gradeProduto,
        p_item_idFormulaTinta,
        p_item_personalizacao,
        p_item_idLoteEstoque,
        p_item_controleQuantidade,
        p_item_loteMultiplo,
        p_item_altura,
        p_item_largura,
        p_item_comprimento,
        p_item_quantidade,
        p_item_observacoesDigitadas);
      UPDATE MODOCFISCALXITENS
      SET observacoes = v_observacoes
      WHERE idItemDocFiscal = r_item_idItemDocFiscal;
    END IF;
    IF v_cab_situacaoDocumentoFiscal > 20 THEN
      ADD_DOC_FISC_ITEM_EST_ATUALIZA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_item_idItemDocFiscal,
        p_estabelecimentoAtivo);
      ADD_DOC_FISC_ITEM_FIL_ATUALIZA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_item_idItemDocFiscal,
        p_estabelecimentoAtivo);
    END IF;
    r_buffer_idItemDocFiscal := CASE WHEN (r_buffer_idItemDocFiscal IS NULL OR r_buffer_idItemDocFiscal = '' OR r_buffer_idItemDocFiscal = ' ') THEN '' ELSE RTRIM (r_buffer_idItemDocFiscal) || ';' END || TO_CHAR (LPAD(r_item_idItemDocFiscal,14,'0'));
    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;
  END IF;
END ADD_DOC_FISC_ITEM_GRAVA;

/

create or replace PROCEDURE ADD_ATEND_ORCAMENTO_BUSCA (
  p_usuario             IN NUMBER,
  p_estabelecimento     IN NUMBER,
  p_modeloDocumento     IN NUMBER,
  p_atendimento         IN VARCHAR2,
  /* Retornos */
  r_orcamento           OUT NUMBER)
IS
BEGIN
  SELECT COALESCE (MAX (a.orcamento), 0)
  INTO r_orcamento
  FROM MOORCAMENTOS a
  JOIN PAETAPASORCAMENTO etOrc
  ON etOrc.etapaOrcamento = a.etapaOrcamento
  WHERE a.estabelecimento = p_estabelecimento
  AND TRUNC(a.dataEmissao) = TRUNC (SYSDATE)
  AND a.atendimento = p_atendimento
  AND a.tipoDocumento = 101
  AND a.modeloDocumento = p_modeloDocumento
  AND etOrc.situacaoOrcamento <= 60
  AND EXISTS (
    SELECT 1
    FROM PAETAPASORCAMENTODEPARA etOrcDePara
    WHERE (etOrcDePara.estabelecimento = 0
      OR etOrcDePara.estabelecimento = p_estabelecimento)
    AND (etOrcDePara.perfilUsuario = 0
      OR etOrcDePara.perfilUsuario = (
      SELECT COALESCE (MAX (usu.perfilUsuario), 0)
      FROM CAUSUARIOS usu
      WHERE usu.usuario = p_usuario))
    AND (etOrcDePara.usuario = 0
      OR etOrcDePara.usuario = p_usuario)
    AND (etOrcDePara.etapaOrcamentoDe = 0
      OR etOrcDePara.etapaOrcamentoDe = a.etapaOrcamento)
    AND (etOrcDePara.etapaOrcamentoPara = 0
      OR etOrcDePara.etapaOrcamentoPara = a.etapaOrcamento));
END ADD_ATEND_ORCAMENTO_BUSCA;


/

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

/

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

/

-- FIM BETA 1 - 10/4/24

create or replace FUNCTION FUNC_ADD_GERA_XML_ENVIO (
  p_idDocumentoFiscal      IN NUMBER,
  p_seqLoteWebServiceEnvio IN NUMBER,
  p_loteWebService         IN VARCHAR)
  RETURN CLOB
/*  
  Todas as alterações realizadas estão comentadas como CK
  1º Efetuada alteração na exigilidadeISSqn que estava fixa como 3 e foi aplicado para utlizar o IndicadorISSqn do item da nota fiscal
*/  
IS
  v_xml                         CLOB;
  v_tecnologiaNFSe              NUMBER;
  v_versaoNFSe                  VARCHAR(20);
  v_estab_nomeRazaoSocial       VARCHAR(60);
  v_estab_indicadorPessoa       CHAR(1);
  v_estab_cnpjCpfIdEstrangeiro  VARCHAR(20);
  v_estab_inscricaoMunicipal    VARCHAR(15);
  v_estab_municipio             NUMBER;
  v_estab_pais                  VARCHAR(4);
  v_estab_uf                    CHAR(2);
  v_regimeEspecialTributacao    CHAR (1);
  v_indicadorIssqn              CHAR (1);
  v_optanteSimplesNacional      NUMBER;
  v_incentivadorCultural        NUMBER;
  v_incentivoFiscal             NUMBER;
  v_intermediario               NUMBER;
  v_pess_nomeRazaoSocial        VARCHAR(60);
  v_pess_apelidoFantasia        VARCHAR(60);
  v_pess_indicadorPessoa        CHAR(1);
  v_pess_cnpjCpfIdEstrangeiro   VARCHAR(20);
  v_pess_inscricaoEstadual      VARCHAR(14);
  v_pess_inscricaoMunicipal     VARCHAR(15);
  v_pess_logradouro             VARCHAR(60);
  v_pess_numero                 VARCHAR(60);
  v_pess_complemento            VARCHAR(60);
  v_pess_bairroDistrito         VARCHAR(60);
  v_pess_municipio              NUMBER;
  v_pess_cep                    NUMBER;
  v_pess_pais                   VARCHAR(4);
  v_pess_uf                     CHAR(2);
  v_pess_observacoesEndereco    VARCHAR(4000);
  v_pess_fone                   VARCHAR(14);
  v_pess_email                  VARCHAR(60);
  v_interm_nomeRazaoSocial      VARCHAR(60);
  v_interm_indicadorPessoa      CHAR(1);
  v_interm_cnpjCpfIdEstrangeiro VARCHAR(20);
  v_interm_inscricaoMunicipal   VARCHAR(15);
  v_municipioFatoGerador        NUMBER;
  v_documentoFiscal             VARCHAR(15);
  v_serieFiscal                 VARCHAR(4);
  v_dataEmissao                 DATE;
  v_dataCompetencia             DATE;
  v_baseCalculoCrs              NUMBER;
  v_valorServicos               NUMBER;
  v_valorDeducoes               NUMBER;
  v_valorPis                    NUMBER;
  v_valorCofins                 NUMBER;
  v_valorInss                   NUMBER;
  v_valorIrrf                   NUMBER;
  v_valorCsll                   NUMBER;
  v_valorOutrasRetencoes        NUMBER;
  v_valorIssqn                  NUMBER;
  v_aliquotaIssqn               NUMBER;
  v_percentualCargaTributariaFe NUMBER;
  v_valorCargaTributariaFederal NUMBER;
  v_percentualCargaTributariaEs NUMBER;
  v_valorCargaTributariaEstad   NUMBER;
  v_percentualCargaTributariaMu NUMBER;
  v_valorCargaTributariaMunicip NUMBER;
  v_valorDescontoTotal          NUMBER;
  v_valorDescontoCondicionado   NUMBER;
  v_irrfIndenizacao             NUMBER;
  v_issRetido                   NUMBER;
  v_tributadoForaMunicipio      NUMBER;
  v_responsavelRetencao         NUMBER;
  v_listaServicos               NUMBER;
  v_cnae                        NUMBER;
  v_produtoImpresso             VARCHAR(60);
  v_quantidade                  NUMBER;
  v_precoUnitario               NUMBER;
  v_codigoTributacaoMunicipio   VARCHAR(60);
  v_discriminacao               VARCHAR(4000);
  v_numeroProcesso              VARCHAR(60);
  v_codigoObra                  VARCHAR(60);
  v_art                         VARCHAR(60);
  v_outrasInformacoes           VARCHAR(4000);
  v_formaPagamento              NUMBER;
  v_numeroParcelas              NUMBER;

BEGIN
  -- NÃO DESENVOLVIDO
  v_baseCalculoCrs              := 0;
  v_valorDeducoes               := 0;
  v_valorDescontoCondicionado   := 0;
  v_irrfIndenizacao             := 0;
  v_responsavelRetencao         := 0;
  v_formaPagamento              := 0;
  v_numeroParcelas              := 0;

  -- DOCUMENTO
  SELECT
    CASE
      WHEN munEst.versaoNFSe = '1.00'
      THEN TO_CHAR (a.dataEmissao, 'YYYY') || LPAD (a.documentoFiscal, 11, '0')
      ELSE TO_CHAR (a.documentoFiscal)
    END,
    a.serieFiscal,
    a.dataEmissao,
    a.municipioFatoGerador,
    a.valorServicos,
    a.valorDescontoTotal,
    COALESCE (SUBSTR( TRIM(
      COALESCE ((SELECT LISTAGG(UPPER(infCompl.descInformacaoComplementar), ' ')
        WITHIN GROUP (ORDER BY infCompl.sequencia)
        FROM MODOCFISCALXINFOCOMPLEMEN infCompl
        WHERE infCompl.idDocumentoFiscal = a.idDocumentoFiscal
        AND infCompl.geradoPeloSistema = 1
        AND infCompl.descInformacaoComplementar <> ' '),
        ' ')),1,4000),' '),
    COALESCE (docXServ.dataCompetencia, a.dataEmissao),
    FUNC_ADD_REMOVE_CARACT_ESPEC (obra.codigoObra),
    FUNC_ADD_REMOVE_CARACT_ESPEC (obra.art),
    FUNC_ADD_REMOVE_CARACT_ESPEC (pessEst.nomeRazaoSocial),
    pessEst.indicadorPessoa,
    CASE
      WHEN pessEst.cnpjCpfIdEstrangeiro <> ' '
      THEN pessEst.cnpjCpfIdEstrangeiro
      WHEN pessEst.indicadorPessoa = 'J'
      THEN '00000000000000'
      ELSE '00000000000'
    END,
    FUNC_ADD_REMOVE_CARACT_ESPEC (pessEst.inscricaoMunicipal),
    CASE WHEN pessEst.regimeTributario IN ('1', '2') THEN 1 ELSE 2 END,
    endEst.municipio,
    endEst.pais,
    munEst.uf,
    munEst.tecnologiaNFSe,
    munEst.versaoNFSe,
    COALESCE (estXnfse.regimeEspecialTributacao, ' '),
    CASE WHEN estXnfse.incentivadorCultural = 1 THEN 1 ELSE 2 END,
    COALESCE (docXServ.intermediario, 0),
    CASE WHEN a.pessoa = 0 THEN ' ' ELSE FUNC_ADD_REMOVE_CARACT_ESPEC (pess.nomeRazaoSocial) END,
    CASE WHEN a.pessoa = 0 THEN ' ' ELSE FUNC_ADD_REMOVE_CARACT_ESPEC (pess.apelidoFantasia) END,
    pess.indicadorPessoa,
    CASE
      WHEN pess.cnpjCpfIdEstrangeiro <> ' '
      THEN pess.cnpjCpfIdEstrangeiro
      WHEN pess.indicadorPessoa = 'J'
      THEN '00000000000000'
      ELSE '00000000000'
    END,
    FUNC_ADD_REMOVE_CARACT_ESPEC (pess.inscricaoEstadual),
    FUNC_ADD_REMOVE_CARACT_ESPEC (pess.inscricaoMunicipal),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endPess.logradouro),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endPess.numero),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endPess.complemento),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endPess.bairroDistrito),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endPess.municipio),
    endPess.cep,
    endPess.pais,
    munPess.uf,
    FUNC_ADD_REMOVE_CARACT_ESPEC (endPess.observacoes),
    fonPess.fone,
    emailPess.email,
    CASE WHEN COALESCE (docXServ.intermediario, 0) = 0 THEN ' ' ELSE FUNC_ADD_REMOVE_CARACT_ESPEC (interm.nomeRazaoSocial) END,
    interm.indicadorPessoa,
    CASE
      WHEN interm.cnpjCpfIdEstrangeiro <> ' '
      THEN interm.cnpjCpfIdEstrangeiro
      WHEN interm.indicadorPessoa = 'J'
      THEN '00000000000000'
      ELSE '00000000000'
    END,
    FUNC_ADD_REMOVE_CARACT_ESPEC (interm.inscricaoMunicipal)
  INTO
    v_documentoFiscal,
    v_serieFiscal,
    v_dataEmissao,
    v_municipioFatoGerador,
    v_valorServicos,
    v_valorDescontoTotal,
    v_outrasInformacoes,
    v_dataCompetencia,
    v_codigoObra,
    v_art,
    v_estab_nomeRazaoSocial,
    v_estab_indicadorPessoa,
    v_estab_cnpjCpfIdEstrangeiro,
    v_estab_inscricaoMunicipal,
    v_optanteSimplesNacional,
    v_estab_municipio,
    v_estab_pais,
    v_estab_uf,
    v_tecnologiaNFSe,
    v_versaoNFSe,
    v_regimeEspecialTributacao,
    v_incentivadorCultural,
    v_intermediario,
    v_pess_nomeRazaoSocial,
    v_pess_apelidoFantasia,
    v_pess_indicadorPessoa,
    v_pess_cnpjCpfIdEstrangeiro,
    v_pess_inscricaoEstadual,
    v_pess_inscricaoMunicipal,
    v_pess_logradouro,
    v_pess_numero,
    v_pess_complemento,
    v_pess_bairroDistrito,
    v_pess_municipio,
    v_pess_cep,
    v_pess_pais,
    v_pess_uf,
    v_pess_observacoesEndereco,
    v_pess_fone,
    v_pess_email,
    v_interm_nomeRazaoSocial,
    v_interm_indicadorPessoa,
    v_interm_cnpjCpfIdEstrangeiro,
    v_interm_inscricaoMunicipal
  FROM MODOCUMENTOSFISCAIS a
  LEFT JOIN MODOCFISCALXSERVICO docXServ
  ON docXServ.idDocumentoFiscal = a.idDocumentoFiscal
  JOIN PAOBRAS obra
  ON obra.idObra = COALESCE (docXServ.idObra, 0)
  JOIN PAESTABELECIMENTOS est
  ON est.estabelecimento = a.estabelecimento
  LEFT JOIN PAESTABELECIMENTOXNFSE estXnfse
  ON estXnfse.estabelecimento = a.estabelecimento
  JOIN CAPESSOAS pessEst
  ON pessEst.pessoa = est.pessoaEstabelecimento
  JOIN CAENDERECOSPESSOA endEst
  ON endEst.enderecoPessoa = COALESCE ((
    SELECT MAX (end.enderecoPessoa)
    FROM CAENDERECOSPESSOA end
    WHERE end.pessoa = est.pessoaEstabelecimento
    AND end.ativo = 1
    AND end.principal = 1), 0)
  JOIN SIMUNICIPIOS munEst
  ON munEst.municipio = endEst.municipio
  JOIN CAPESSOAS pess
  ON pess.pessoa = a.pessoa
  JOIN CAENDERECOSPESSOA endPess
  ON endPess.enderecoPessoa = COALESCE ((
    SELECT MAX (end.enderecoPessoa)
    FROM CAENDERECOSPESSOA end
    WHERE end.pessoa = a.pessoa
    AND end.ativo = 1
    AND end.principal = 1), 0)
  JOIN SIMUNICIPIOS munPess
  ON munPess.municipio = endPess.municipio
  JOIN CAFONESPESSOA fonPess
  ON fonPess.idFonePessoa = COALESCE ((
    SELECT MAX (fon.idFonePessoa)
    FROM CAFONESPESSOA fon
    WHERE fon.pessoa = a.pessoa
    AND fon.ativo = 1
    AND fon.principal = 1), 0)
  JOIN CAEMAILSPESSOA emailPess
  ON emailPess.idEmailPessoa = COALESCE ((
    SELECT MAX (email.idEmailPessoa)
    FROM CAEMAILSPESSOA email
    WHERE email.pessoa = a.pessoa
    AND email.ativo = 1
    AND email.principal = 1), 0)
  JOIN CAPESSOAS interm
  ON interm.pessoa = COALESCE (docXServ.intermediario, 0)
  WHERE a.idDocumentoFiscal = p_idDocumentoFiscal;

  -- ITENS
  SELECT
    COALESCE (MAX (gradProd.produtoImpresso), ' '),
    COALESCE (SUM (a.quantidade), 0),
    COALESCE (MAX (a.precoUnitario), 0),
    COALESCE (MAX (a.indicadorIssqn), ' '),
    COALESCE (SUM (a.valorIssqn), 0),
    COALESCE (MAX (a.aliquotaIssqn), 0),
    CASE WHEN COALESCE (MAX (a.retidoIssqn), 0) = 1 THEN 1 ELSE 2 END,
    CASE WHEN COALESCE (MAX (a.tributadoForaMunicipio), 0) = 1 THEN 1 ELSE 2 END,
    CASE WHEN COALESCE (MAX (a.incentivoFiscal), 0) = 1 THEN 1 ELSE 2 END,
    COALESCE (MAX (a.listaServicos), 0),
    COALESCE (MAX (a.cnae), 0),
    COALESCE (MAX (servMun.codigoServicoMunicipio), ' '),
    COALESCE (MAX (a.numeroProcessoAdministrativo), ' '),
    COALESCE (SUM (a.valorRetInss), 0),
    COALESCE (SUM (a.valorRetIrrf), 0),
    COALESCE (SUM (a.valorRetPis), 0),
    COALESCE (SUM (a.valorRetCofins), 0),
    COALESCE (SUM (a.valorRetCsll), 0),
    COALESCE (SUM (a.valorRetOutros), 0),
    COALESCE (MAX (a.aliquotaEstimadaImpFederais), 0),
    COALESCE (SUM (a.valorEstimadoImpFederais), 0),
    COALESCE (MAX (a.aliquotaEstimadaImpEstaduais), 0),
    COALESCE (SUM (a.valorEstimadoImpEstaduais), 0),
    COALESCE (MAX (a.aliquotaEstimadaImpMunicipais), 0),
    COALESCE (SUM (a.valorEstimadoImpMunicipais), 0),
    FUNC_ADD_REMOVE_CARACT_ESPEC (COALESCE (MAX (
      CASE
        WHEN a.quantidadeConvertida = 1
          OR v_tecnologiaNFSe = 2
        THEN ''
        ELSE TO_CHAR(a.quantidadeConvertida)
          || ' '
          || a.unidadeMedidaConversao
          || ' X '
      END
      || TRIM (TRIM (gradProd.descricaoImpressa
      || ' '
      || a.observacoes)
      || CASE
           WHEN v_versaoNFSe = '1.00'
           THEN ' |||| Trib. Aprox.: R$ ' || TO_CHAR (a.valorEstimadoImpFederais, 'FM9999999999990D00') || ' Federal e R$ ' || TO_CHAR (a.valorEstimadoImpMunicipais, 'FM9999999999990D00') || ' Municipal'
           ELSE ''
         END)), ' '))
  INTO
    v_produtoImpresso,
    v_quantidade,
    v_precoUnitario,
    v_indicadorIssqn,
    v_valorIssqn,
    v_aliquotaIssqn,
    v_issRetido,
    v_tributadoForaMunicipio,
    v_incentivoFiscal,
    v_listaServicos,
    v_cnae,
    v_codigoTributacaoMunicipio,
    v_numeroProcesso,
    v_valorInss,
    v_valorIrrf,
    v_valorPis,
    v_valorCofins,
    v_valorCsll,
    v_valorOutrasRetencoes,
    v_percentualCargaTributariaFe,
    v_valorCargaTributariaFederal,
    v_percentualCargaTributariaEs,
    v_valorCargaTributariaEstad,
    v_percentualCargaTributariaMu,
    v_valorCargaTributariaMunicip,
    v_discriminacao
  FROM MODOCFISCALXITENS a
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = a.gradeProduto
  JOIN CAPRODUTOS prod
  ON prod.produto = gradProd.produto
  JOIN PASERVICOSMUNICIPIOS servMun
  ON servMun.idServicoMunicipio = a.idServicoMunicipio
  WHERE a.idDocumentoFiscal = p_idDocumentoFiscal
  AND a.cancelado = 0;

  IF v_tecnologiaNFSe = 2 THEN
    -- NFS-e
    v_xml := '<nfse id="rps_' || v_documentoFiscal || '">'
  || '<rps>'
    || FUNC_ADD_TAG_XML ('nro_recibo_provisorio', v_documentoFiscal)
    || FUNC_ADD_TAG_XML ('serie_recibo_provisorio', v_serieFiscal)
    || FUNC_ADD_TAG_XML ('data_emissao_recibo_provisorio', CASE WHEN v_dataEmissao IS NULL THEN '00/00/0000' ELSE TO_CHAR (v_dataEmissao, 'DD/MM/YYYY') END)
    || FUNC_ADD_TAG_XML ('hora_emissao_recibo_provisorio', CASE WHEN v_dataEmissao IS NULL THEN '00:00:00' ELSE TO_CHAR (v_dataEmissao, 'HH24:MI:SS') END)
  || '</rps>';

    -- NF
    v_xml := v_xml
  || '<nf>'
    || FUNC_ADD_TAG_XML ('valor_total', TO_CHAR (v_valorServicos - v_valorDescontoTotal, 'FM9999999999990D00'))
    || FUNC_ADD_TAG_XML ('valor_desconto', TO_CHAR (v_valorDescontoCondicionado, 'FM9999999999990D00'))
    || FUNC_ADD_TAG_XML ('valor_ir', TO_CHAR (v_valorIrrf, 'FM9999999999990D00'))
    || FUNC_ADD_TAG_XML ('valor_inss', TO_CHAR (v_valorInss, 'FM9999999999990D00'))
    || FUNC_ADD_TAG_XML ('valor_contribuicao_social', TO_CHAR (v_valorCsll, 'FM9999999999990D00'))
    || '<valor_rps>0,00</valor_rps>'
    || FUNC_ADD_TAG_XML ('valor_pis', TO_CHAR (v_valorPis, 'FM9999999999990D00'))
    || FUNC_ADD_TAG_XML ('valor_cofins', TO_CHAR (v_valorCofins, 'FM9999999999990D00'))
    || FUNC_ADD_TAG_XML ('observacao', v_outrasInformacoes)
  || '</nf>';

    -- Prestador
    v_xml := v_xml
  || '<prestador>'
    || FUNC_ADD_TAG_XML ('cpfcnpj', v_estab_cnpjCpfIdEstrangeiro)
    || FUNC_ADD_TAG_XML ('cidade', TO_CHAR (v_estab_municipio))
  || '</prestador>';

    -- Tomador (Cliente)
    v_xml := v_xml
  || '<tomador>'
    || FUNC_ADD_TAG_XML ('tipo', v_pess_indicadorPessoa)
    || FUNC_ADD_TAG_XML ('cpfcnpj', v_pess_cnpjCpfIdEstrangeiro)
    || FUNC_ADD_TAG_XML ('ie', v_pess_inscricaoEstadual)
    || FUNC_ADD_TAG_XML ('nome_razao_social', v_pess_nomeRazaoSocial)
    || FUNC_ADD_TAG_XML ('sobrenome_nome_fantasia', v_pess_apelidoFantasia)
    || FUNC_ADD_TAG_XML ('logradouro', v_pess_logradouro)
    || FUNC_ADD_TAG_XML ('email', v_pess_email)
    || FUNC_ADD_TAG_XML ('numero_residencia', v_pess_numero)
    || FUNC_ADD_TAG_XML ('complemento', v_pess_complemento)
    || FUNC_ADD_TAG_XML ('ponto_referencia', v_pess_observacoesEndereco)
    || FUNC_ADD_TAG_XML ('bairro', v_pess_bairroDistrito)
    || FUNC_ADD_TAG_XML ('cidade', TO_CHAR (v_pess_municipio))
    || FUNC_ADD_TAG_XML ('cep', TO_CHAR (v_pess_cep))
    || '<ddd_fone_comercial/>'
    || FUNC_ADD_TAG_XML ('fone_comercial', v_pess_fone)
    || '<ddd_fone_residencial/>'
    || '<fone_residencial/>'
    || '<ddd_fax/>'
    || '<fone_fax/>'
  || '</tomador>';

    -- Itens
    v_xml := v_xml
  || '<itens>'
    || '<lista>'
      || FUNC_ADD_TAG_XML ('codigo_local_prestacao_servico', TO_CHAR (v_municipioFatoGerador))
      || FUNC_ADD_TAG_XML ('codigo_item_lista_servico', TO_CHAR (v_listaServicos))
      || FUNC_ADD_TAG_XML ('descritivo', v_discriminacao)
      || FUNC_ADD_TAG_XML ('aliquota_item_lista_servico', TO_CHAR (v_aliquotaIssqn, 'FM9999999999990D00'))
      || FUNC_ADD_TAG_XML ('situacao_tributaria', '0')
      || FUNC_ADD_TAG_XML ('valor_tributavel', TO_CHAR (v_valorServicos - v_valorDescontoTotal, 'FM9999999999990D00'))
      || FUNC_ADD_TAG_XML ('valor_deducao', TO_CHAR (v_valorDeducoes, 'FM9999999999990D00'))
      || FUNC_ADD_TAG_XML ('valor_issrf', CASE WHEN v_issRetido = 1 THEN  TO_CHAR (v_valorIssqn, 'FM9999999999990D00') ELSE '0,00' END)
      || FUNC_ADD_TAG_XML ('tributa_municipio_prestador', CASE WHEN v_tributadoForaMunicipio = 1 THEN 'N' ELSE 'S' END)
      || '<unidade_codigo/>'
      || FUNC_ADD_TAG_XML ('unidade_quantidade', TO_CHAR (v_quantidade, 'FM9999999999990D00'))
      || FUNC_ADD_TAG_XML ('unidade_valor_unitario', TO_CHAR (v_precoUnitario - (v_valorDescontoTotal / v_quantidade), 'FM9999999999990D00'))
    || '</lista>'
  || '</itens>'
  -- Assinar Aqui
|| '</nfse>';

  ELSIF v_versaoNFSe = '1.00' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsEnvio xmlns="http://www.abrasf.org.br/nfse.xsd">'
      || '<LoteRps Id="lote" versao="1.00">'
        || FUNC_ADD_TAG_XML ('NumeroLote', p_loteWebService)
        || FUNC_ADD_TAG_XML (CASE WHEN v_estab_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_estab_cnpjCpfIdEstrangeiro)
        || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
        || FUNC_ADD_TAG_XML ('QuantidadeRps', '1')
        || '<ListaRps>'
          || '<Rps>'
            || '<InfRps Id="rps:' || v_documentoFiscal || TRIM(v_serieFiscal) || '">'
              || '<IdentificacaoRps>'
                || FUNC_ADD_TAG_XML ('Numero', v_documentoFiscal)
                || FUNC_ADD_TAG_XML ('Serie', v_serieFiscal)
                || FUNC_ADD_TAG_XML ('Tipo', '1')
              || '</IdentificacaoRps>'
              || FUNC_ADD_TAG_XML ('DataEmissao', CASE WHEN v_dataEmissao IS NULL THEN '0000-00-00T00:00:00' ELSE TO_CHAR (v_dataEmissao, 'YYYY-MM-DD') || 'T' || TO_CHAR (v_dataEmissao, 'HH24:MI:SS') END)
              || FUNC_ADD_TAG_XML ('NaturezaOperacao', v_indicadorIssqn)
              || CASE WHEN v_regimeEspecialTributacao = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('RegimeEspecialTributacao', v_regimeEspecialTributacao) END
              || FUNC_ADD_TAG_XML ('OptanteSimplesNacional', TO_CHAR (v_optanteSimplesNacional))
              || FUNC_ADD_TAG_XML ('IncentivadorCultural', TO_CHAR (v_incentivadorCultural))
              || FUNC_ADD_TAG_XML ('Status', '1');

    -- Serviço
    v_xml := v_xml
              || '<Servico>'
                || '<Valores>'
                  || FUNC_ADD_TAG_XML ('ValorServicos', REPLACE (TO_CHAR (v_valorServicos, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorDeducoes', REPLACE (TO_CHAR (v_valorDeducoes, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorPis', REPLACE (TO_CHAR (v_valorPis, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorCofins', REPLACE (TO_CHAR (v_valorCofins, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorInss', REPLACE (TO_CHAR (v_valorInss, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorIr', REPLACE (TO_CHAR (v_valorIrrf, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorCsll', REPLACE (TO_CHAR (v_valorCsll, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('IssRetido', TO_CHAR (v_issRetido))
                  || FUNC_ADD_TAG_XML ('ValorIss', REPLACE (TO_CHAR (v_valorIssqn, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('OutrasRetencoes', REPLACE (TO_CHAR (v_valorOutrasRetencoes, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('Aliquota', REPLACE (TO_CHAR (v_aliquotaIssqn, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('DescontoIncondicionado', REPLACE (TO_CHAR (v_valorDescontoTotal, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('DescontoCondicionado', REPLACE (TO_CHAR (v_valorDescontoCondicionado, 'FM9999999999990D00'), ',', '.'))
                || '</Valores>'
                || FUNC_ADD_TAG_XML ('ItemListaServico', SUBSTR (LPAD (v_listaServicos,4,'0'),1,2) || '.' || SUBSTR (LPAD (v_listaServicos,4,'0'),3,2))
                || FUNC_ADD_TAG_XML ('CodigoTributacaoMunicipio', v_codigoTributacaoMunicipio)
                || FUNC_ADD_TAG_XML ('Discriminacao', v_discriminacao)
                || FUNC_ADD_TAG_XML ('CodigoMunicipio', TO_CHAR (v_estab_municipio))
              || '</Servico>';

  -- Prestador (Estabelecimento)
  v_xml := v_xml
              || '<Prestador>'
                || FUNC_ADD_TAG_XML (CASE WHEN v_estab_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END , v_estab_cnpjCpfIdEstrangeiro)
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
              || '</Prestador>';

    -- Tomador (Cliente)
    v_xml := v_xml
              || '<Tomador>'
                || '<IdentificacaoTomador>'
                  || '<CpfCnpj>'
                    || FUNC_ADD_TAG_XML (CASE WHEN v_pess_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_pess_cnpjCpfIdEstrangeiro)
                  || '</CpfCnpj>'
                  || CASE WHEN v_pess_inscricaoMunicipal = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_pess_inscricaoMunicipal) END
                || '</IdentificacaoTomador>'
                || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
                || '<Endereco>'
                  || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
                  || CASE WHEN v_pess_numero = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Numero', v_pess_numero) END
                  || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Complemento', v_pess_complemento) END
                  || CASE WHEN v_pess_bairroDistrito = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Bairro', v_pess_bairroDistrito) END
                  || FUNC_ADD_TAG_XML ('CodigoMunicipio', TO_CHAR (v_pess_municipio))
                  || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
                  || FUNC_ADD_TAG_XML ('Cep', TO_CHAR (v_pess_cep))
                || '</Endereco>'
              || '</Tomador>';

    -- Intermediário
    IF v_intermediario > 0 THEN
      v_xml := v_xml
              || '<IntermediarioServico>'
                || FUNC_ADD_TAG_XML ('RazaoSocial', v_interm_nomeRazaoSocial)
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
              || '</IntermediarioServico>';
    END IF;

    -- Construção Civil
    IF v_codigoObra <> ' ' THEN
      v_xml := v_xml
              || '<ConstrucaoCivil>'
                || FUNC_ADD_TAG_XML ('CodigoObra', v_codigoObra)
                || FUNC_ADD_TAG_XML ('Art', v_art)
              || '</ConstrucaoCivil>';
    END IF;

    -- Outros
    v_xml := v_xml
            || '</InfRps>'
            -- Assinar aqui
          || '</Rps>'
        || '</ListaRps>'
      || '</LoteRps>'
      -- Assinar aqui
    || '</EnviarLoteRpsEnvio>';
  ELSIF v_versaoNFSe = '2.03' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsEnvio>'
  || '<LoteRps Id="'
  || CASE WHEN v_dataEmissao IS NULL THEN '00000000' ELSE TO_CHAR (v_dataEmissao, 'YYYYMMDD') END
  || LPAD (p_loteWebService, 4, '0')
  || '" versao="2.03">'
    || FUNC_ADD_TAG_XML ('NumeroLote', p_loteWebService)
    || '<CpfCnpj>'
      || FUNC_ADD_TAG_XML (CASE WHEN v_estab_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_estab_cnpjCpfIdEstrangeiro)
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || '<QuantidadeRps>1</QuantidadeRps>'
    || '<ListaRps>'
      || '<Rps>'
        || '<InfDeclaracaoPrestacaoServico>'
          || '<Rps>'
            || '<IdentificacaoRps>'
              || FUNC_ADD_TAG_XML ('Numero', v_documentoFiscal)
              || FUNC_ADD_TAG_XML ('Serie', '0')
              || FUNC_ADD_TAG_XML ('Tipo', '1')
            || '</IdentificacaoRps>'
            || FUNC_ADD_TAG_XML ('DataEmissao', CASE WHEN v_dataEmissao IS NULL THEN '0000-00-00' ELSE TO_CHAR (v_dataEmissao, 'YYYY-MM-DD') END)
            || FUNC_ADD_TAG_XML ('Status', '1')
          || '</Rps>'
          || FUNC_ADD_TAG_XML ('Competencia', CASE WHEN v_dataCompetencia IS NULL THEN '0000-00-00' ELSE TO_CHAR (v_dataCompetencia, 'YYYY-MM-DD') END);

    -- Serviço
    v_xml := v_xml
          || '<Servico>'
            || '<Valores>'
              || FUNC_ADD_TAG_XML ('ValorServicos', REPLACE (TO_CHAR (v_valorServicos, 'FM9999999999990D00'), ',', '.'))
              || FUNC_ADD_TAG_XML ('ValorDeducoes', REPLACE (TO_CHAR (v_valorDeducoes, 'FM9999999999990D00'), ',', '.'))
              || FUNC_ADD_TAG_XML ('ValorPis', REPLACE (TO_CHAR (v_valorPis, 'FM9999999999990D00'), ',', '.'))
              || FUNC_ADD_TAG_XML ('ValorCofins', REPLACE (TO_CHAR (v_valorCofins, 'FM9999999999990D00'), ',', '.'))
              || FUNC_ADD_TAG_XML ('ValorInss', REPLACE (TO_CHAR (v_valorInss, 'FM9999999999990D00'), ',', '.'))
              || FUNC_ADD_TAG_XML ('ValorIr', REPLACE (TO_CHAR (v_valorIrrf, 'FM9999999999990D00'), ',', '.'))
              || FUNC_ADD_TAG_XML ('ValorCsll', REPLACE (TO_CHAR (v_valorCsll, 'FM9999999999990D00'), ',', '.'))
              || FUNC_ADD_TAG_XML ('OutrasRetencoes', REPLACE (TO_CHAR (v_valorOutrasRetencoes, 'FM9999999999990D00'), ',', '.'))
              || FUNC_ADD_TAG_XML ('ValorIss', REPLACE (TO_CHAR (v_valorIssqn, 'FM9999999999990D00'), ',', '.'))
              || FUNC_ADD_TAG_XML ('DescontoCondicionado', REPLACE (TO_CHAR (v_valorDescontoCondicionado, 'FM9999999999990D00'), ',', '.'))
            || '</Valores>'
            || FUNC_ADD_TAG_XML ('IssRetido', TO_CHAR (v_issRetido))
            || FUNC_ADD_TAG_XML ('ItemListaServico', SUBSTR (LPAD (v_listaServicos, 4, '0'), 1, 2) || '.' || SUBSTR (LPAD (v_listaServicos, 4, '0'), 3, 2))
            || FUNC_ADD_TAG_XML ('CodigoCnae', LPAD (v_cnae, 7, '0'))
            || FUNC_ADD_TAG_XML ('CodigoTributacaoMunicipio', v_codigoTributacaoMunicipio)
            || FUNC_ADD_TAG_XML ('Discriminacao', v_discriminacao)
            || FUNC_ADD_TAG_XML ('CodigoMunicipio', TO_CHAR (v_estab_municipio))
            || FUNC_ADD_TAG_XML ('CodigoPais', v_estab_pais)
            || FUNC_ADD_TAG_XML ('ExigibilidadeISS', v_indicadorIssqn)
            || FUNC_ADD_TAG_XML ('MunicipioIncidencia', TO_CHAR (v_municipioFatoGerador))
          || '</Servico>';

    -- Prestador
    v_xml := v_xml
          || '<Prestador>'
            || '<CpfCnpj>'
              || FUNC_ADD_TAG_XML (CASE WHEN v_estab_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END , v_estab_cnpjCpfIdEstrangeiro)
            || '</CpfCnpj>'
            || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
          || '</Prestador>';

    -- Tomador
    v_xml := v_xml
          || '<Tomador>'
            || '<IdentificacaoTomador>'
              || '<CpfCnpj>'
                || FUNC_ADD_TAG_XML (CASE WHEN v_pess_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_pess_cnpjCpfIdEstrangeiro)
              || '</CpfCnpj>'
            || '</IdentificacaoTomador>'
            || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
            || '<Endereco>'
              || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
              || CASE WHEN v_pess_numero = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Numero', v_pess_numero) END
              || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Complemento', v_pess_complemento) END
              || CASE WHEN v_pess_bairroDistrito = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Bairro', v_pess_bairroDistrito) END
              || FUNC_ADD_TAG_XML ('CodigoMunicipio', TO_CHAR (v_pess_municipio))
              || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
              || FUNC_ADD_TAG_XML ('Cep', TO_CHAR (v_pess_cep))
            || '</Endereco>'
            || '<Contato>'
            || '</Contato>'
          || '</Tomador>';
    -- Outros
    v_xml := v_xml
          || FUNC_ADD_TAG_XML ('OptanteSimplesNacional', TO_CHAR (v_optanteSimplesNacional))
          || FUNC_ADD_TAG_XML ('IncentivoFiscal', TO_CHAR (v_incentivoFiscal))
        || '</InfDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
  -- Assinar aqui
|| '</EnviarLoteRpsEnvio>';
  ELSE
    -- NFS-e
    v_xml := '<EnviarLoteRpsSincronoEnvio xmlns="http://www.abrasf.org.br/nfse.xsd">'
  || '<LoteRps Id="1'
  || TO_CHAR (v_dataEmissao, 'YYYY')
  || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
  || LPAD (p_seqLoteWebServiceEnvio, 14, '0')
  || '" versao="20.01">'
    || FUNC_ADD_TAG_XML ('NumeroLote', p_loteWebService)
    || '<CpfCnpj>'
      || FUNC_ADD_TAG_XML (CASE WHEN v_estab_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_estab_cnpjCpfIdEstrangeiro)
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || FUNC_ADD_TAG_XML ('QuantidadeRps', '1')
    || '<ListaRps>'
      || '<Rps>'
        || '<tcDeclaracaoPrestacaoServico>'
          || '<InfDeclaracaoPrestacaoServico Id="1'
            || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
            || LPAD (p_loteWebService, 14, '0')
            || '">'          
            || '<Rps>'
              || '<IdentificacaoRps>'
                || FUNC_ADD_TAG_XML ('Numero', v_documentoFiscal)
                || FUNC_ADD_TAG_XML ('Serie', 'UNICA')
                || FUNC_ADD_TAG_XML ('Tipo', '1')
              || '</IdentificacaoRps>'
              || FUNC_ADD_TAG_XML ('DataEmissao', CASE WHEN v_dataEmissao IS NULL THEN '0000-00-00T00:00:00' ELSE TO_CHAR (v_dataEmissao, 'YYYY-MM-DD') || 'T' || TO_CHAR (v_dataEmissao, 'HH24:MI:SS') END)
              || FUNC_ADD_TAG_XML ('Status', '1')
            || '</Rps>'
            || FUNC_ADD_TAG_XML ('Competencia', CASE WHEN v_dataCompetencia IS NULL THEN '0000-00-00T00:00:00' ELSE TO_CHAR (v_dataCompetencia, 'YYYY-MM-DD') || 'T' || TO_CHAR (v_dataCompetencia, 'HH24:MI:SS') END)
            || FUNC_ADD_TAG_XML ('IdCidade', TO_CHAR (v_estab_municipio));

    -- Serviço
    v_xml := v_xml
            || '<Servico>'
              || '<tcDadosServico>'
                || '<Valores>'
                  || FUNC_ADD_TAG_XML ('BaseCalculoCRS', REPLACE (TO_CHAR (v_baseCalculoCrs, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorServicos', REPLACE (TO_CHAR (v_valorServicos, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorDeducoes', REPLACE (TO_CHAR (v_valorDeducoes, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorPis', REPLACE (TO_CHAR (v_valorPis, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorCofins', REPLACE (TO_CHAR (v_valorCofins, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorInss', REPLACE (TO_CHAR (v_valorInss, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorIr', REPLACE (TO_CHAR (v_valorIrrf, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorCsll', REPLACE (TO_CHAR (v_valorCsll, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('OutrasRetencoes', REPLACE (TO_CHAR (v_valorOutrasRetencoes, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorIss', REPLACE (TO_CHAR (v_valorIssqn, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('Aliquota', REPLACE (TO_CHAR (v_aliquotaIssqn, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('DescontoIncondicionado', REPLACE (TO_CHAR (v_valorDescontoTotal, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('DescontoCondicionado', REPLACE (TO_CHAR (v_valorDescontoCondicionado, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('IrrfIndenizacao', TO_CHAR (v_irrfIndenizacao))
                || '</Valores>'
                || FUNC_ADD_TAG_XML ('IssRetido', TO_CHAR (v_issRetido))
                || FUNC_ADD_TAG_XML ('ResponsavelRetencao', TO_CHAR (v_responsavelRetencao))
                || FUNC_ADD_TAG_XML ('ItemListaServico', SUBSTR (LPAD (v_listaServicos, 4, '0'), 1, 2) || '.' || SUBSTR (LPAD (v_listaServicos, 4, '0'), 3, 2))
                || FUNC_ADD_TAG_XML ('CodigoCnae', LPAD (v_cnae, 7, '0'))
                || FUNC_ADD_TAG_XML ('CodigoTributacaoMunicipio', v_codigoTributacaoMunicipio)
                || FUNC_ADD_TAG_XML ('Discriminacao', v_discriminacao)
                || FUNC_ADD_TAG_XML ('CodigoMunicipio', TO_CHAR (v_estab_municipio))
                || FUNC_ADD_TAG_XML ('CodigoPais', v_estab_pais)
                || FUNC_ADD_TAG_XML ('ExigibilidadeISS', v_indicadorIssqn)
                || FUNC_ADD_TAG_XML ('MunicipioIncidencia', TO_CHAR (v_municipioFatoGerador))
                || FUNC_ADD_TAG_XML ('NumeroProcesso', v_numeroProcesso)
              || '</tcDadosServico>'
            || '</Servico>';

    -- Prestador (Estabelecimento)
    v_xml := v_xml
            || '<Prestador>'
              || '<CpfCnpj>'
                || FUNC_ADD_TAG_XML (CASE WHEN v_estab_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END , v_estab_cnpjCpfIdEstrangeiro)
              || '</CpfCnpj>'
              || FUNC_ADD_TAG_XML ('RazaoSocial', v_estab_nomeRazaoSocial)
              || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
            || '</Prestador>';

    -- Tomador (Cliente)
    v_xml := v_xml
            || '<Tomador>'
              || '<IdentificacaoTomador>'
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (CASE WHEN v_pess_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_pess_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_pess_inscricaoMunicipal)
              || '</IdentificacaoTomador>'
              || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
              || '<Endereco>'
                || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
                || FUNC_ADD_TAG_XML ('Numero', v_pess_numero)
                || FUNC_ADD_TAG_XML ('Complemento', v_pess_complemento)
                || FUNC_ADD_TAG_XML ('Bairro', v_pess_bairroDistrito)
                || FUNC_ADD_TAG_XML ('CodigoMunicipio', TO_CHAR (v_pess_municipio))
                || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
                || FUNC_ADD_TAG_XML ('CodigoPais', v_pess_pais)
                || FUNC_ADD_TAG_XML ('Cep', TO_CHAR (v_pess_cep))
              || '</Endereco>'
              || '<Contato>'
                || FUNC_ADD_TAG_XML ('Telefone', v_pess_fone)
                || FUNC_ADD_TAG_XML ('Email', v_pess_email)
              || '</Contato>'
            || '</Tomador>';

    IF v_intermediario <> 0 THEN
      -- Intermediário
      v_xml := v_xml
            || '<Intermediario>'
              || '<IdentificacaoIntermediario>'
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
              || '</IdentificacaoIntermediario>'
              || FUNC_ADD_TAG_XML ('RazaoSocial', v_interm_nomeRazaoSocial)
            || '</Intermediario>';
    END IF;

    -- Construção Civil
    v_xml := v_xml
            || '<ConstrucaoCivil>'
              || FUNC_ADD_TAG_XML ('CodigoObra', v_codigoObra)
              || FUNC_ADD_TAG_XML ('Art', v_art)
            || '</ConstrucaoCivil>';

    -- Outros
    v_xml := v_xml
            || FUNC_ADD_TAG_XML ('RegimeEspecialTributacao', v_regimeEspecialTributacao)
            || FUNC_ADD_TAG_XML ('NaturezaOperacao', v_indicadorIssqn)
            || FUNC_ADD_TAG_XML ('OptanteSimplesNacional', TO_CHAR (v_optanteSimplesNacional))
            || FUNC_ADD_TAG_XML ('IncentivoFiscal', TO_CHAR (v_incentivoFiscal))
            || FUNC_ADD_TAG_XML ('PercentualCargaTributaria', TO_CHAR (v_percentualCargaTributariaFe))
            || FUNC_ADD_TAG_XML ('ValorCargaTributaria', TO_CHAR (v_valorCargaTributariaFederal))
            || FUNC_ADD_TAG_XML ('PercentualCargaTributariaEstadual', TO_CHAR (v_percentualCargaTributariaEs))
            || FUNC_ADD_TAG_XML ('ValorCargaTributariaEstadual', TO_CHAR (v_valorCargaTributariaEstad))
            || FUNC_ADD_TAG_XML ('PercentualCargaTributariaMunicipal', TO_CHAR (v_percentualCargaTributariaMu))
            || FUNC_ADD_TAG_XML ('ValorCargaTributariaMunicipal', TO_CHAR (v_valorCargaTributariaMunicip))
            || FUNC_ADD_TAG_XML ('OutrasInformacoes', v_outrasInformacoes)
            || FUNC_ADD_TAG_XML ('SiglaUF', v_estab_uf)
            || FUNC_ADD_TAG_XML ('IdCidade', TO_CHAR (v_estab_municipio))
            || FUNC_ADD_TAG_XML ('FormaPagamento', v_formaPagamento)
--                    <!--identificação da forma de pagamento-->
--                        <!--0-Não identificada-->
--                        <!--1-A Vista-->
--                        <!--2-Apresentação-->
--                        <!--3-A Prazo-->
--                        <!--4-Cartão de Débito-->
--                        <!--5-Cartão de Crédito-->
            || FUNC_ADD_TAG_XML ('NumeroParcelas', v_numeroParcelas)
--                    <!--Caso não houver parcelamento informar o 0 e não colocar as tags abaixo-->
--            || '<Parcelamento>'
--              || '<Parcelas>'
--                || '<tcParcela>'
--                  || '<Numero>1</Numero>'
--                  || '<Valor>20.00</Valor>'
--                  || '<DataVencimento>2019-05-02T00:00:00</DataVencimento>'
--                || '</tcParcela>'
--                || '<tcParcela>'
--                  || '<Numero>2</Numero>'
--                  || '<Valor>20.00</Valor>'
--                  || '<DataVencimento>2019-06-02T00:00:00</DataVencimento>'
--                || '</tcParcela>'
--              || '</Parcelas>'
--            || '</Parcelamento>'
          || '</InfDeclaracaoPrestacaoServico>'
        -- Assinar aqui
        || '</tcDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsSincronoEnvio>';

  END IF;
  RETURN v_xml;
END;

/

CREATE TABLE MOEVENTOS_2401B AS SELECT * FROM MOEVENTOS;

DROP TABLE MOEVENTOS;

CREATE TABLE MOEVENTOS
  (
    evento                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    pessoa                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    projeto                VARCHAR (60) DEFAULT ' ' NOT NULL,
    orcamento              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    preDocumento           NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idDocumentoFiscal      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idFinanceiro           NUMERIC (14,0) DEFAULT 0 NOT NULL,
    separacao              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    balanco                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    documentoTransferencia NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idConserto             NUMERIC (14,0) DEFAULT 0 NOT NULL,
    painelCompra           NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sessaoCaixa            NUMERIC (14,0) DEFAULT 0 NOT NULL,
    atividadeProjeto       NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idContrato             NUMERIC (14,0) DEFAULT 0 NOT NULL,
    data                   DATE,
    usuario                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sistema                NUMERIC (1,0) DEFAULT 0 NOT NULL,
    tipoEvento             NUMERIC (4,0) DEFAULT 0 NOT NULL,
    foneSms                VARCHAR (14) DEFAULT ' ' NOT NULL,
    deEmail                VARCHAR (256) DEFAULT ' ' NOT NULL,
    paraEmail              VARCHAR (4000) DEFAULT ' ' NOT NULL,
    comCopiaEmail          VARCHAR (4000) DEFAULT ' ' NOT NULL,
    comCopiaOcultaEmail    VARCHAR (4000) DEFAULT ' ' NOT NULL,
    assuntoEmailSms        VARCHAR (256) DEFAULT ' ' NOT NULL,
    corpoEmail             VARCHAR (4000) DEFAULT ' ' NOT NULL,
    tipoArquivoAnexoA      NUMERIC (3,0) DEFAULT 0 NOT NULL,
    arquivoAnexoA          VARCHAR (256) DEFAULT ' ' NOT NULL,
    tipoArquivoAnexoB      NUMERIC (3,0) DEFAULT 0 NOT NULL,
    arquivoAnexoB          VARCHAR (256) DEFAULT ' ' NOT NULL,
    tipoArquivoAnexoC      NUMERIC (3,0) DEFAULT 0 NOT NULL,
    arquivoAnexoC          VARCHAR (256) DEFAULT ' ' NOT NULL,
    tipoArquivoAnexoD      NUMERIC (3,0) DEFAULT 0 NOT NULL,
    arquivoAnexoD          VARCHAR (256) DEFAULT ' ' NOT NULL,
    tipoArquivoAnexoE      NUMERIC (3,0) DEFAULT 0 NOT NULL,
    arquivoAnexoE          VARCHAR (256) DEFAULT ' ' NOT NULL,
    tipoArquivoAnexoF      NUMERIC (3,0) DEFAULT 0 NOT NULL,
    arquivoAnexoF          VARCHAR (256) DEFAULT ' ' NOT NULL,
    tipoArquivoAnexoG      NUMERIC (3,0) DEFAULT 0 NOT NULL,
    arquivoAnexoG          VARCHAR (256) DEFAULT ' ' NOT NULL,
    tipoArquivoAnexoH      NUMERIC (3,0) DEFAULT 0 NOT NULL,
    arquivoAnexoH          VARCHAR (256) DEFAULT ' ' NOT NULL,
    tipoArquivoAnexoI      NUMERIC (3,0) DEFAULT 0 NOT NULL,
    arquivoAnexoI          VARCHAR (256) DEFAULT ' ' NOT NULL,
    tipoArquivoAnexoJ      NUMERIC (3,0) DEFAULT 0 NOT NULL,
    arquivoAnexoJ          VARCHAR (256) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MOEVENTOS ADD CONSTRAINT MOEVENTOS_PK1 PRIMARY KEY (evento);
CREATE INDEX MOEVENTOS_K2 ON MOEVENTOS (pessoa);
CREATE INDEX MOEVENTOS_K3 ON MOEVENTOS (projeto);
CREATE INDEX MOEVENTOS_K4 ON MOEVENTOS (orcamento);
CREATE INDEX MOEVENTOS_K5 ON MOEVENTOS (preDocumento);
CREATE INDEX MOEVENTOS_K6 ON MOEVENTOS (idDocumentoFiscal);
CREATE INDEX MOEVENTOS_K7 ON MOEVENTOS (idFinanceiro);
CREATE INDEX MOEVENTOS_K8 ON MOEVENTOS (separacao);
CREATE INDEX MOEVENTOS_K9 ON MOEVENTOS (balanco);
CREATE INDEX MOEVENTOS_K10 ON MOEVENTOS (documentoTransferencia);
CREATE INDEX MOEVENTOS_K11 ON MOEVENTOS (idConserto);
CREATE INDEX MOEVENTOS_K12 ON MOEVENTOS (painelCompra);
CREATE INDEX MOEVENTOS_K13 ON MOEVENTOS (sessaoCaixa);
CREATE INDEX MOEVENTOS_K14 ON MOEVENTOS (atividadeProjeto);
CREATE INDEX MOEVENTOS_K15 ON MOEVENTOS (idContrato);
CREATE INDEX MOEVENTOS_K16 ON MOEVENTOS (data DESC);
ALTER TABLE MOEVENTOS ADD CONSTRAINT MOEVENTOS_FK1 FOREIGN KEY (pessoa) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MOEVENTOS ADD CONSTRAINT MOEVENTOS_FK2 FOREIGN KEY (projeto) REFERENCES PAPROJETOS (projeto);
ALTER TABLE MOEVENTOS ADD CONSTRAINT MOEVENTOS_FK3 FOREIGN KEY (orcamento) REFERENCES MOORCAMENTOS (orcamento);
ALTER TABLE MOEVENTOS ADD CONSTRAINT MOEVENTOS_FK4 FOREIGN KEY (preDocumento) REFERENCES MOPREDOCUMENTOS (preDocumento);
ALTER TABLE MOEVENTOS ADD CONSTRAINT MOEVENTOS_FK5 FOREIGN KEY (idDocumentoFiscal) REFERENCES MODOCUMENTOSFISCAIS (idDocumentoFiscal);
ALTER TABLE MOEVENTOS ADD CONSTRAINT MOEVENTOS_FK6 FOREIGN KEY (idFinanceiro) REFERENCES MOFINANCEIROS (idFinanceiro);
ALTER TABLE MOEVENTOS ADD CONSTRAINT MOEVENTOS_FK7 FOREIGN KEY (separacao) REFERENCES MOSEPARACOES (separacao);
ALTER TABLE MOEVENTOS ADD CONSTRAINT MOEVENTOS_FK8 FOREIGN KEY (balanco) REFERENCES MOBALANCOS (balanco);
ALTER TABLE MOEVENTOS ADD CONSTRAINT MOEVENTOS_FK9 FOREIGN KEY (documentoTransferencia) REFERENCES MODOCUMENTOSTRANSFERENCIA (documentoTransferencia);
ALTER TABLE MOEVENTOS ADD CONSTRAINT MOEVENTOS_FK10 FOREIGN KEY (idConserto) REFERENCES MOCONSERTOS (idConserto);
ALTER TABLE MOEVENTOS ADD CONSTRAINT MOEVENTOS_FK11 FOREIGN KEY (sessaoCaixa) REFERENCES MOSESSOESCAIXA (sessaoCaixa);
ALTER TABLE MOEVENTOS ADD CONSTRAINT MOEVENTOS_FK12 FOREIGN KEY (atividadeProjeto) REFERENCES PAPROJETOXATIVIDADES (atividadeProjeto);
ALTER TABLE MOEVENTOS ADD CONSTRAINT MOEVENTOS_FK13 FOREIGN KEY (idContrato) REFERENCES MOCONTRATOS (idContrato);
ALTER TABLE MOEVENTOS ADD CONSTRAINT MOEVENTOS_FK14 FOREIGN KEY (usuario) REFERENCES CAUSUARIOS (usuario);
ALTER TABLE MOEVENTOS ADD CONSTRAINT MOEVENTOS_FK15 FOREIGN KEY (tipoEvento) REFERENCES PATIPOSEVENTO (tipoEvento);
ALTER TABLE MOEVENTOS ADD CONSTRAINT MOEVENTOS_FK16 FOREIGN KEY (foneSms) REFERENCES CAFONES (fone);
ALTER TABLE MOEVENTOS ADD CONSTRAINT MOEVENTOS_FK17 FOREIGN KEY (tipoArquivoAnexoA) REFERENCES SITIPOSARQUIVO (tipoArquivo);
ALTER TABLE MOEVENTOS ADD CONSTRAINT MOEVENTOS_FK18 FOREIGN KEY (tipoArquivoAnexoB) REFERENCES SITIPOSARQUIVO (tipoArquivo);
ALTER TABLE MOEVENTOS ADD CONSTRAINT MOEVENTOS_FK19 FOREIGN KEY (tipoArquivoAnexoC) REFERENCES SITIPOSARQUIVO (tipoArquivo);
ALTER TABLE MOEVENTOS ADD CONSTRAINT MOEVENTOS_FK20 FOREIGN KEY (tipoArquivoAnexoD) REFERENCES SITIPOSARQUIVO (tipoArquivo);
ALTER TABLE MOEVENTOS ADD CONSTRAINT MOEVENTOS_FK21 FOREIGN KEY (tipoArquivoAnexoE) REFERENCES SITIPOSARQUIVO (tipoArquivo);
ALTER TABLE MOEVENTOS ADD CONSTRAINT MOEVENTOS_FK22 FOREIGN KEY (tipoArquivoAnexoF) REFERENCES SITIPOSARQUIVO (tipoArquivo);
ALTER TABLE MOEVENTOS ADD CONSTRAINT MOEVENTOS_FK23 FOREIGN KEY (tipoArquivoAnexoG) REFERENCES SITIPOSARQUIVO (tipoArquivo);
ALTER TABLE MOEVENTOS ADD CONSTRAINT MOEVENTOS_FK24 FOREIGN KEY (tipoArquivoAnexoH) REFERENCES SITIPOSARQUIVO (tipoArquivo);
ALTER TABLE MOEVENTOS ADD CONSTRAINT MOEVENTOS_FK25 FOREIGN KEY (tipoArquivoAnexoI) REFERENCES SITIPOSARQUIVO (tipoArquivo);
ALTER TABLE MOEVENTOS ADD CONSTRAINT MOEVENTOS_FK26 FOREIGN KEY (tipoArquivoAnexoJ) REFERENCES SITIPOSARQUIVO (tipoArquivo);

INSERT INTO MOEVENTOS (evento, pessoa, projeto, orcamento, preDocumento, idDocumentoFiscal, idFinanceiro, separacao, balanco, documentoTransferencia, idConserto, painelCompra, sessaoCaixa, atividadeProjeto, idContrato, data, usuario, sistema, tipoEvento, foneSms, deEmail, paraEmail, comCopiaEmail, comCopiaOcultaEmail, assuntoEmailSms, corpoEmail, tipoArquivoAnexoA, arquivoAnexoA, tipoArquivoAnexoB, arquivoAnexoB, tipoArquivoAnexoC, arquivoAnexoC, tipoArquivoAnexoD, arquivoAnexoD, tipoArquivoAnexoE, arquivoAnexoE, tipoArquivoAnexoF, arquivoAnexoF, tipoArquivoAnexoG, arquivoAnexoG, tipoArquivoAnexoH, arquivoAnexoH, tipoArquivoAnexoI, arquivoAnexoI, tipoArquivoAnexoJ, arquivoAnexoJ) VALUES (0, 0, ' ', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, 0, 0, 0, ' ', ' ', ' ', ' ', ' ', ' ', ' ', 0, ' ', 0, ' ', 0, ' ', 0, ' ', 0, ' ', 0, ' ', 0, ' ', 0, ' ', 0, ' ', 0, ' ');
INSERT INTO MOEVENTOS (evento, pessoa, projeto, orcamento, preDocumento, idDocumentoFiscal, idFinanceiro, separacao, balanco, documentoTransferencia, idConserto, painelCompra, sessaoCaixa, atividadeProjeto, idContrato, data, usuario, sistema, tipoEvento, foneSms, deEmail, paraEmail, comCopiaEmail, comCopiaOcultaEmail, assuntoEmailSms, corpoEmail, tipoArquivoAnexoA, arquivoAnexoA, tipoArquivoAnexoB, arquivoAnexoB, tipoArquivoAnexoC, arquivoAnexoC, tipoArquivoAnexoD, arquivoAnexoD, tipoArquivoAnexoE, arquivoAnexoE, tipoArquivoAnexoF, arquivoAnexoF, tipoArquivoAnexoG, arquivoAnexoG, tipoArquivoAnexoH, arquivoAnexoH, tipoArquivoAnexoI, arquivoAnexoI, tipoArquivoAnexoJ, arquivoAnexoJ) SELECT evento, pessoa, projeto, orcamento, preDocumento, idDocumentoFiscal, idFinanceiro, separacao, balanco, documentoTransferencia, idConserto, painelCompra, sessaoCaixa, atividadeProjeto, 0, data, usuario, sistema, tipoEvento, foneSms, deEmail, paraEmail, comCopiaEmail, comCopiaOcultaEmail, assuntoEmailSms, corpoEmail, tipoArquivoAnexoA, arquivoAnexoA, tipoArquivoAnexoB, arquivoAnexoB, tipoArquivoAnexoC, arquivoAnexoC, tipoArquivoAnexoD, arquivoAnexoD, tipoArquivoAnexoE, arquivoAnexoE, tipoArquivoAnexoF, arquivoAnexoF, tipoArquivoAnexoG, arquivoAnexoG, tipoArquivoAnexoH, arquivoAnexoH, tipoArquivoAnexoI, arquivoAnexoI, tipoArquivoAnexoJ, arquivoAnexoJ FROM MOEVENTOS_2401B WHERE evento > 0;

COMMIT;

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

/

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

/

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

/

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

/

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

/

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

/

create or replace PROCEDURE ADD_TROCA_GRADEPRODUTO(
    p_gradeProdutoDe   IN NUMBER,
    p_gradeProdutoPara IN NUMBER)
IS
BEGIN
  UPDATE CAGRADEPRODUTOXPESSOAS a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT (EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXPESSOAS b
    WHERE b.gradeProduto = p_gradeProdutoPara
    AND b.pessoa = a.pessoa
    AND b.codigoProduto = a.codigoProduto));
  DELETE CAGRADEPRODUTOXPESSOAS
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXLOTESESTOQ a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT (EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXLOTESESTOQ b
    WHERE b.gradeProduto = p_gradeProdutoPara
    AND b.loteEstoque = a.loteEstoque));
  UPDATE CAGRADEPRODUTOXLOTESESTOQ
  SET ativo = 0
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXENDERECOS a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT (EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXENDERECOS b
    WHERE b.gradeProduto = p_gradeProdutoPara
    AND b.idLoteEstoque = a.idLoteEstoque
    AND b.idEnderecoEstoque = a.idEnderecoEstoque));
  DELETE CAGRADEPRODUTOXENDERECOS
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXNUMEROSSER a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT (EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXNUMEROSSER b
    WHERE b.gradeProduto = p_gradeProdutoPara
    AND b.numeroSerie = a.numeroSerie));
  UPDATE CAGRADEPRODUTOXNUMEROSSER
  SET ativo = 0
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXKITSCOMBOS a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT (EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXKITSCOMBOS b
    WHERE b.gradeProduto = p_gradeProdutoPara
    AND b.gradeProdutoFilho = a.gradeProdutoFilho));
  UPDATE CAGRADEPRODUTOXKITSCOMBOS
  SET ativo = 0
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXKITSCOMBOS a
  SET a.gradeProdutoFilho = p_gradeProdutoPara
  WHERE a.gradeProdutoFilho = p_gradeProdutoDe
  AND NOT (EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXKITSCOMBOS b
    WHERE b.gradeProdutoFilho = p_gradeProdutoPara
    AND b.gradeProduto = a.gradeProduto));
  UPDATE CAGRADEPRODUTOXKITSCOMBOS
  SET ativo = 0
  WHERE gradeProdutoFilho = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXKITSCOMBOS
  SET ativo = 0
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAPRODUTOXCOMPOSICOESPREC
  SET gradeProdutoEstoque = p_gradeProdutoPara
  WHERE gradeProdutoEstoque = p_gradeProdutoDe;
  UPDATE PAPRODUTOSLINHASTINTAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CABASESTINTAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CACOLORANTESTINTAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE PAATIVIDADESSERVICO
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE PAPROJETOS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOORCAMENTOXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOORCAMENTOXNUMEROSSERIE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOORCAMENTOXBLOQUEIOSEST
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOLISTAEVENTOXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOCONTRATOXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOPREDOCUMXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOPREDOCUMXNUMEROSSERIE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOPREDOCUMXBLOQUEIOSEST
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCFISCALXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCFISCALXPRODUTOFILHO
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCFISCALXNUMEROSSERIE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODISTRIBUICAODFEXGRADE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOSEPARACAOXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOSEPARACAOXNUMEROSSERIE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOSEPARACAOXBLOQUEIOSEST
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOINVENTARIOESTOQUEXITENS a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT (EXISTS (
    SELECT 1
    FROM MOINVENTARIOESTOQUEXITENS b
    WHERE b.inventarioEstoque = a.inventarioEstoque
    AND b.gradeProduto = p_gradeProdutoPara
    AND b.indicadorPropriedadePosseItem = a.indicadorPropriedadePosseItem
    AND b.pessoaParticipante = a.pessoaParticipante
    AND b.localEstoque = a.localEstoque
    AND b.personalizacao = a.personalizacao
    AND b.idLoteEstoque = a.idLoteEstoque
    AND b.idEnderecoEstoque = a.idEnderecoEstoque
    AND b.idNumeroSerie = a.idNumeroSerie));
  DELETE MOINVENTARIOESTOQUEXITENS
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOINVENTARIOESTOQUEXFISC a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT (EXISTS (
    SELECT 1
    FROM MOINVENTARIOESTOQUEXFISC b
    WHERE b.inventarioEstoque = a.inventarioEstoque
    AND b.gradeProduto = p_gradeProdutoPara
    AND b.indicadorPropriedadePosseItem = a.indicadorPropriedadePosseItem
    AND b.pessoaParticipante = a.pessoaParticipante));
  DELETE MOINVENTARIOESTOQUEXFISC
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOESTOQUES
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCTROCAXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOBALANCOXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOBALANCOXDIVERGENCIA
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCUMENTOTRANSFXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCTRANSFXNUMEROSSERIE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCTRANSFXBLOQUEIOSEST
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOORCAMENTOXCONFERENCIAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOPREDOCUMXCONFERENCIAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCFISCALXCONFERENCIAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCTRANSFXCONFERENCIAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOCONSERTOS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MORESERVASESTOQUE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOPAINELCOMPRAXGRADE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOMOTIVOSBLOQUEIOS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOINGRESSOS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADESPRODUTO
  SET ativo = 0
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAPRODUTOS a
  SET a.ativo = 0
  WHERE EXISTS (
    SELECT 1
    FROM CAGRADESPRODUTO b
    WHERE b.produto = a.produto
    AND b.gradeProduto = p_gradeProdutoDe)
  AND NOT (EXISTS (
    SELECT 1
    FROM CAGRADESPRODUTO b
    WHERE b.produto = a.produto
    AND b.ativo = 1));
END ADD_TROCA_GRADEPRODUTO;

/

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_CAB_ETAPA_TROCA (
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_378_calcularVolumes   IN NUMBER,
  p_orcamento                    IN NUMBER,
  p_usuario                      IN NUMBER,
  p_novaEtapaOrcamento           IN NUMBER,
  p_justificativaCancelamento    IN VARCHAR,
  p_cancelandoOrcamento          IN NUMBER,
  p_colaboradorRespRecebimento   IN NUMBER,
  /* Retornos */
  r_cab_etapaOrcamento           OUT NUMBER,
  r_etOrc_descricao              OUT VARCHAR,
  r_etOrc_situacaoOrcamento      OUT NUMBER,
  r_etOrc_financeiro             OUT CHAR,
  r_etOrc_habilitaImprimirManual OUT NUMBER)
IS
  v_auxNumber  NUMBER;
  v_auxVarchar VARCHAR2 (32000);
BEGIN
  SELECT
    descricao,
    situacaoOrcamento,
    financeiro,
    habilitaImprimirManual
  INTO
    r_etOrc_descricao,
    r_etOrc_situacaoOrcamento,
    r_etOrc_financeiro,
    r_etOrc_habilitaImprimirManual
  FROM PAETAPASORCAMENTO
  WHERE etapaOrcamento = p_novaEtapaOrcamento;
  SELECT etapaOrcamento
  INTO r_cab_etapaOrcamento
  FROM MOORCAMENTOS
  WHERE orcamento = p_orcamento;
  IF r_cab_etapaOrcamento <> p_novaEtapaOrcamento THEN
    IF p_cancelandoOrcamento = 1
      OR r_etOrc_situacaoOrcamento = 90
    THEN
      IF NOT (p_justificativaCancelamento IS NULL)
        AND p_justificativaCancelamento <> ' '
      THEN
        ADD_ORCAMENTO_INFO_CRIA (
          p_estabelecimentoAtivo,
          p_orcamento,
          0,
          0,
          0,
          0,
          p_justificativaCancelamento);
      END IF;
      FOR a IN (
        SELECT idItemOrcamento
        FROM MOORCAMENTOXITENS
        WHERE orcamento = p_orcamento
        AND cancelado = 0)
      LOOP
        ADD_ORCAMENTO_ITEM_EXCLUI (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_person_190_modeloFrete,
          p_config_378_calcularVolumes,
          0,
          a.idItemOrcamento,
          'C',
          1,
          v_auxVarchar,
          v_auxNumber);
      END LOOP;
      FOR a IN (
        SELECT idPagamentoOrcamento
        FROM MOORCAMENTOXPAGAMENTOS
        WHERE orcamento = p_orcamento)
      LOOP
        ADD_ORCAMENTO_PAG_EXCLUI_CORR (a.idPagamentoOrcamento);
        UPDATE MOORCAMENTOXPAGAMENTOS b
        SET b.saldoEfetivar = 0
        WHERE b.idPagamentoOrcamento = a.idPagamentoOrcamento;
      END LOOP;
    ELSIF r_etOrc_situacaoOrcamento <= 30 THEN
      FOR a IN (
        SELECT b.entrega
        FROM MOORCAMENTOXITENS a
        JOIN MOENTREGAS b
        ON b.idItemOrcamento = a.idItemOrcamento
        WHERE a.orcamento = p_orcamento
        AND a.cancelado = 0
        AND b.situacaoEntrega <= 4)
      LOOP
        ADD_ENTREGA_EXCLUI (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          a.entrega,
          0,
          'ADD_ORCAMENTO_CAB_ETAPA_TROCA');
      END LOOP;
    END IF;
    UPDATE MOORCAMENTOS
    SET etapaOrcamento = p_novaEtapaOrcamento
    WHERE orcamento = p_orcamento;
    r_cab_etapaOrcamento := p_novaEtapaOrcamento;    
    ADD_ORCAMENTO_CAB_ETAPA_CRIA (
      p_usuarioLogado,
      p_estabelecimentoAtivo,
      p_orcamento,
      p_usuario,
      p_novaEtapaOrcamento,
      ' ');
  END IF;
  ADD_ORCAMENTO_CAB_RESERVA_GRAV (
    p_orcamento,
    p_estabelecimentoAtivo);
  IF NOT (r_etOrc_situacaoOrcamento IN(11,90))
    AND p_cancelandoOrcamento = 0
  THEN
    FOR a IN (
      SELECT itemTransf.documentoTransferencia
      FROM MODOCUMENTOTRANSFXITENS itemTransf
      JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
      ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
      JOIN MODOCTRANSFXORCAMENTOITEM transfXDoc
      ON transfXDoc.idItemDocTransferencia = itemTransf.idItemDocTransferencia
      JOIN MOORCAMENTOXITENS itemDoc
      ON itemDoc.idItemOrcamento = transfXDoc.idItemOrcamento
      WHERE itemDoc.orcamento = p_orcamento
      AND itemTransf.documentoTransferencia > 0
      AND transfXDoc.entradaSaidaOriginal = 'E'
      AND (cabTransf.colaboradorResponsavelRetirada = 0
        OR cabTransf.colaboradorResponsavelRecebim = 0)
      GROUP BY itemTransf.documentoTransferencia)
    LOOP
      ADD_DOCTRANSF_CAB_ENCERRA_REC (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        a.documentoTransferencia,
        p_colaboradorRespRecebimento);
    END LOOP;
  END IF;
END ADD_ORCAMENTO_CAB_ETAPA_TROCA;

/

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

/

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

/

create or replace PROCEDURE ADD_PRE_DOC_PAG_EXCLUI_CORREL (
  p_idPagamentoPreDocumento IN NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  ADD_MOTIVO_PRE_DOC_PAG_EXCLUI (
    p_idPagamentoPreDocumento,
    0,
    v_auxNumber);
  FOR a IN (
    SELECT idFinanceiro
    FROM MOFINANCEIROS
    WHERE idPagamentoPreDocumento = p_idPagamentoPreDocumento)
  LOOP
    ADD_FINANC_EXCLUI (a.idFinanceiro);
  END LOOP;
  DELETE MOPREDOCUMXPROMOCOES
  WHERE idPagamentoPreDocumento = p_idPagamentoPreDocumento;
  UPDATE MOTRANSACOESTEF
  SET idPagamentoPreDocumento = 0
  WHERE idPagamentoPreDocumento = p_idPagamentoPreDocumento;
END ADD_PRE_DOC_PAG_EXCLUI_CORREL;

/

create or replace PROCEDURE ADD_PRE_DOC_PAG_EXCLUI_TROCA (
  p_calcularImpostos            IN NUMBER,
  p_cab_preDocumento            IN NUMBER,
  p_cab_valorDescontoGeral      IN NUMBER,
  p_cab_valorOutrasDespesasGer  IN NUMBER,
  p_cab_valorDescontoPagamento  IN NUMBER,
  p_cab_valorOutrasDespPag      IN NUMBER,
  p_cab_valorJurosPagamento     IN NUMBER,
  p_cab_promocaoExiste          IN NUMBER,
  p_item_valorDescontoGeral     IN NUMBER,
  p_item_valorDescontoPagamento IN NUMBER,
  p_item_valorOutrasDespPag     IN NUMBER,
  p_item_valorJurosPagamento    IN NUMBER,
  /* Retornos */
  r_calcularImpostos            OUT NUMBER,
  r_cab_valorDescontoGeral      OUT NUMBER,
  r_cab_condicaoPagamento       OUT NUMBER,
  r_cab_numeroParcelas          OUT NUMBER,
  r_cab_somaPrazoParcelas       OUT NUMBER,
  r_cab_valorXPrazoParcelas     OUT NUMBER,
  r_cab_prazoMedio              OUT NUMBER,
  r_cab_prazoMedioPonderado     OUT NUMBER,
  r_cab_valorEntradaMinima      OUT NUMBER,
  r_cab_valorAVistaEntrada      OUT NUMBER,
  r_cab_valorPagamentoBruto     OUT NUMBER,
  r_cab_valorDescontoPagamento  OUT NUMBER,
  r_cab_valorOutrasDespPag      OUT NUMBER,
  r_cab_valorJurosPagamento     OUT NUMBER,
  r_cab_valorPagamentoLiquido   OUT NUMBER,
  r_cab_valorTroco              OUT NUMBER,
  r_item_valorDescontoGeral     OUT NUMBER,
  r_item_valorDescontoPagamento OUT NUMBER,
  r_item_valorOutrasDespPag     OUT NUMBER,
  r_item_valorJurosPagamento    OUT NUMBER)    
IS
BEGIN
  r_calcularImpostos            := p_calcularImpostos;
  r_cab_valorDescontoGeral      := p_cab_valorDescontoGeral;
  r_cab_valorDescontoPagamento  := p_cab_valorDescontoPagamento;
  r_cab_valorOutrasDespPag      := p_cab_valorOutrasDespPag;
  r_cab_valorJurosPagamento     := p_cab_valorJurosPagamento;
  r_item_valorDescontoGeral     := p_item_valorDescontoGeral;
  r_item_valorDescontoPagamento := p_item_valorDescontoPagamento;
  r_item_valorOutrasDespPag     := p_item_valorOutrasDespPag;
  r_item_valorJurosPagamento    := p_item_valorJurosPagamento;
  IF (p_cab_valorDescontoGeral <> 0
    OR p_cab_valorOutrasDespesasGer <> 0
    OR r_cab_valorDescontoPagamento <> 0
    OR r_cab_valorOutrasDespPag <> 0
    OR r_cab_valorJurosPagamento <> 0
    OR r_item_valorDescontoPagamento <> 0
    OR r_item_valorOutrasDespPag <> 0
    OR r_item_valorJurosPagamento <> 0
    OR p_cab_promocaoExiste = 1)
  THEN
    IF p_cab_promocaoExiste = 1 THEN
      r_item_valorDescontoGeral := 0;
    END IF;
    r_calcularImpostos := 1;
    r_item_valorDescontoPagamento := 0;
    r_item_valorOutrasDespPag := 0;
    r_item_valorJurosPagamento := 0;
    /* Remove dados Pagamentos Itens */
    UPDATE MOPREDOCUMXITENS
    SET
      valorDescontoGeral = CASE WHEN p_cab_promocaoExiste = 1 THEN 0 ELSE valorDescontoGeral END,
      valorOutrasDespesasGeral = CASE WHEN p_cab_promocaoExiste = 1 THEN 0 ELSE valorOutrasDespesasGeral END,
      valorDescontoPagamento = 0,
      valorOutrasDespesasPagamento = 0,
      valorJurosPagamento = 0
    WHERE preDocumento = p_cab_preDocumento;
  END IF;
  IF p_cab_promocaoExiste = 1 THEN
    r_cab_valorDescontoGeral := 0;
  END IF;
  r_cab_condicaoPagamento := 0;
  r_cab_numeroParcelas := 0;
  r_cab_somaPrazoParcelas := 0;
  r_cab_valorXPrazoParcelas := 0;
  r_cab_prazoMedio := 0;
  r_cab_prazoMedioPonderado := 0;
  r_cab_valorEntradaMinima := 0;
  r_cab_valorAVistaEntrada := 0;
  r_cab_valorPagamentoBruto := 0;
  r_cab_valorDescontoPagamento := 0;
  r_cab_valorOutrasDespPag := 0;
  r_cab_valorJurosPagamento := 0;
  r_cab_valorPagamentoLiquido := 0;
  r_cab_valorTroco := 0;
  FOR a IN (
    SELECT
      idPagamentoPreDocumento,
      pagamentoTroco,
      valorDescontoPagamento,
      valorOutrasDespesasPagamento,
      valorJurosPagamento
    FROM MOPREDOCUMXPAGAMENTOS
    WHERE preDocumento = p_cab_preDocumento)
  LOOP
    IF (a.pagamentoTroco = 'P' 
      AND (a.valorDescontoPagamento <> 0 
        OR a.valorOutrasDespesasPagamento <> 0 
        OR a.valorJurosPagamento <> 0)) THEN
      r_calcularImpostos := 1;
    END IF;
    ADD_PRE_DOC_PAG_EXCLUI_CORREL (a.idPagamentoPreDocumento);
    DELETE MOPREDOCUMXPAGAMENTOS b
    WHERE b.idPagamentoPreDocumento = a.idPagamentoPreDocumento;
  END LOOP;
  DELETE MOPREDOCUMXPROMOCOES
  WHERE preDocumento = p_cab_preDocumento;  
END ADD_PRE_DOC_PAG_EXCLUI_TROCA;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_EXCLUI (
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_person_184_tipoEventoCancCon IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_95_etapaOrcamentoCanc IN NUMBER,
  p_config_96_etapaOrdemServCanc IN NUMBER,
  p_config_97_etapaPedCompraCanc IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_415_etapaFatContrCanc IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemPreDocumento      IN NUMBER,
  p_cancelando_Excluindo         IN CHAR,
  p_cancelandoExcluindoDocumento IN NUMBER,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_atualizaUltimaCompra     NUMBER;
  v_cab_estabelecimento          NUMBER;
  v_cab_documentoFiscal          NUMBER;
  v_cab_dataEntradaSaida         DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  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_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota NUMBER;
  v_cab_promocaoExiste           NUMBER;
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  FOR a IN (
    SELECT
      item.preDocumento,
      item.gradeProduto,
      item.cancelado,
      item.usarPrecoAVista,
      item.geraFinanceiro,
      item.controleQuantidade,
      item.loteMultiplo,
      item.quantidade,
      item.quantidadeConvertida,
      item.quantidadeDevolvidaRetornada,
      item.pesoLiquido,
      item.pesoBruto,
      item.valorProdutoServicoBruto,
      item.valorProdutoServico,
      item.valorDescontoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      item.valorFreteGeral,
      item.valorSeguroGeral,
      item.valorDescontoGeral,
      item.valorOutrasDespesasGeral,
      item.valorAdicFreteMarinhaMerGeral,
      item.valorDespesasAduaneirasGeral,
      item.valorBasePagamento,
      item.valorDescontoPagamento,
      item.valorOutrasDespesasPagamento,
      item.valorJurosPagamento,
      item.valorFreteTotal,
      item.valorSeguroTotal,
      item.valorDescontoTotal,
      item.valorOutrasDespesasTotal,
      item.valorAdicFreteMarinhaMerTotal,
      item.valorDespesasAduaneirasTotal,
      item.valorLiquidoItem,
      item.valorDescontoCustoOpItem,
      item.valorDescontoCustoOpGeral,
      item.valorDescontoCustoOpTotal,
      item.valorAcrescimoCustoOpItem,
      item.valorAcrescimoCustoOpGeral,
      item.valorAcrescimoCustoOpTotal,
      item.valorCustoOperacao,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.valorAcrescimoExtempSubtotal,
      item.valorAcrescimoExtempItem,
      item.valorAcrescimoExtempGeral,
      item.valorAcrescimoExtempTotal,
      gradProd.produto,
      prod.tipoProduto
    FROM MOPREDOCUMXITENS item
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE item.idItemPreDocumento = p_item_idItemPreDocumento)
  LOOP
    SELECT
      cab.origemDocumento,
      cab.tipoDocumento,
      cab.entradaSaida,
      cab.devolucaoAnulacaoRetorno,
      cab.atualizaCustoMedio,
      cab.atualizaUltimaCompra,
      cab.estabelecimento,
      cab.documentoFiscal,
      cab.dataEntradaSaida,
      cab.pessoa,
      cab.modalidadeFrete,
      cab.tipoPagamentoFrete,
      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,
      cab.valorDescontoCustoOpItem,
      cab.valorDescontoCustoOpGeral,
      cab.valorDescontoCustoOpTotal,
      cab.valorAcrescimoCustoOpItem,
      cab.valorAcrescimoCustoOpGeral,
      cab.valorAcrescimoCustoOpTotal,
      cab.valorCustoOperacao,
      cab.valorCMV,
      cab.quantidadeExtemporanea,
      cab.valorAcrescimoExtempSubtotal,
      cab.valorAcrescimoExtempItem,
      cab.valorAcrescimoExtempGeral,
      cab.valorAcrescimoExtempTotal
    INTO
      v_cab_origemDocumento,
      v_cab_tipoDocumento,
      v_cab_entradaSaida,
      v_cab_devolucaoAnulacaoRetorno,
      v_cab_atualizaCustoMedio,
      v_cab_atualizaUltimaCompra,
      v_cab_estabelecimento,
      v_cab_documentoFiscal,
      v_cab_dataEntradaSaida,
      v_cab_pessoa,
      v_cab_modalidadeFrete,
      v_cab_tipoPagamentoFrete,
      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_cab_valorDescontoCustoOpItem,
      v_cab_valorDescontoCustoOpGera,
      v_cab_valorDescontoCustoOpTota,
      v_cab_valorAcrescimoCustoOpIte,
      v_cab_valorAcrescimoCustoOpGer,
      v_cab_valorAcrescimoCustoOpTot,
      v_cab_valorCustoOperacao,
      v_cab_valorCMV,
      v_cab_quantidadeExtemporanea,
      v_cab_valorAcrescimoExtempSubt,
      v_cab_valorAcrescimoExtempItem,
      v_cab_valorAcrescimoExtempGera,
      v_cab_valorAcrescimoExtempTota
    FROM MOPREDOCUMENTOS cab
    WHERE cab.preDocumento = a.preDocumento;
    IF p_cancelandoExcluindoDocumento = 0
      AND a.cancelado = 0
    THEN
      SELECT COALESCE (MAX(1), 0)
      INTO v_cab_promocaoExiste
      FROM MOPREDOCUMXPROMOCOES
      WHERE preDocumento = a.preDocumento;
      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 NOT(p_person_190_modeloFrete IS NULL)
        AND p_person_190_modeloFrete <> ' '
        AND a.valorFreteTotal <> 0
        AND v_cab_valorFreteTotal - a.valorFreteTotal <= 0
      THEN
        v_cab_modalidadeFrete := '9';
      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;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      IF v_cab_valorDescontoGeral <> 0
        OR v_cab_valorOutrasDespesasGeral <> 0
        OR v_cab_valorPagamentoBruto <> 0
        OR v_cab_promocaoExiste = 1
      THEN
        ADD_PRE_DOC_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          a.preDocumento,
          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;
      UPDATE MOPREDOCUMENTOS SET
        modalidadeFrete               = v_cab_modalidadeFrete,
        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,
        valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
        valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
        valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
        valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
        valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
        valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
        valorCustoOperacao            = v_cab_valorCustoOperacao,
        valorCMV                      = v_cab_valorCMV,
        quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
        valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
        valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
        valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
        valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
      WHERE preDocumento = a.preDocumento;
    END IF;
    -- Cancela / Exclui Transferências vinculadas.
    FOR b IN (
      SELECT
        itemTransf.documentoTransferencia,
        docXTransf.entradaSaidaOriginal
      FROM MODOCTRANSFXPREDOCUM docXTransf
      JOIN MODOCUMENTOTRANSFXITENS itemTransf
      ON itemTransf.idItemDocTransferencia = docXTransf.idItemDocTransferencia
      WHERE docXTransf.idItemPreDocumento = p_item_idItemPreDocumento
      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 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 docXTransf2.idItemPreDocumento <> docXTransf.idItemPreDocumento)
      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 = 'C' THEN
        ADD_DOCTRANSF_CAB_SIT_GRAVA (
          p_estabelecimentoAtivo,
          b.documentoTransferencia,
          'C',
          'Cancelamento Automático');
      END IF;
    END LOOP;
    IF v_cab_entradaSaida='E'
      AND v_cab_devolucaoAnulacaoRetorno = 0
      AND v_cab_atualizaUltimaCompra = 1
    THEN
      ADD_PRODUTO_CUSTO_DATA_EXCLUI (
        a.produto,
        v_cab_dataEntradaSaida);
    END IF;
    ADD_MOTIVO_PRE_DOC_ITE_EXCLUI (
      p_item_idItemPreDocumento,
      0,
      v_auxNumber);
    ADD_ESTOQUE_PRE_DOC_EXCLUI (
      p_item_idItemPreDocumento,
      '',
      v_auxVarchar);
    ADD_VALEDESCONTO_PRE_ITE_EXCL (
      p_item_idItemPreDocumento,
      '',
      v_auxVarchar);
    ADD_SEPARACAO_ITEM_PRE_EXCLUI (p_item_idItemPreDocumento);
    DELETE MOPREDOCUMXPRODUTOFILHO
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    DELETE MOPREDOCUMXPROMOCOES
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    DELETE MOINGRESSOS
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    DELETE CATABELAPRECOXFORMACOESPR
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    FOR b IN (
      SELECT
        entrega,
        idItemOrcamento,
        quantidade
      FROM MOENTREGAS
      WHERE idItemPreDocumentoRemessa = p_item_idItemPreDocumento)
    LOOP
      ADD_ENTREGA_SITUACAO_TROCA (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        b.idItemOrcamento,
        b.entrega,
        b.quantidade,
        1, -- p_situacaoEntrega
        'ADD_PRE_DOC_ITEM_EXCLUI');
    END LOOP;
    FOR b IN (
      SELECT idConserto
      FROM MOCONSERTOS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      IF p_cancelando_Excluindo = 'C' THEN
        ADD_CONSERTO_CANCELA(
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_person_184_tipoEventoCancCon,
          b.idConserto);
      ELSE
        ADD_CONSERTO_EXCLUI(b.idConserto);
      END IF;
    END LOOP;
    UPDATE MOCONSERTOS SET
      idItemPreDocumentoDevolucao = 0,
      situacaoConserto = 'I'
    WHERE idItemPreDocumentoDevolucao = p_item_idItemPreDocumento;
    FOR b IN (
      SELECT
        id,
        idItemOrcamento,
        quantidade
      FROM MOPREDOCUMXORCAMENTOITEM
      WHERE idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      IF b.quantidade <> 0 THEN
        ADD_ORCAMENTO_ITEM_SALDO_VOLTA (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_person_184_tipoEventoCancCon,
          p_config_95_etapaOrcamentoCanc,
          p_config_96_etapaOrdemServCanc,
          p_config_97_etapaPedCompraCanc,
          p_config_415_etapaFatContrCanc,
          b.idItemOrcamento,
          b.quantidade);
      END IF;
      DELETE MOPREDOCUMXORCAMENTOITEM c
      WHERE c.id = b.id;
    END LOOP;
    FOR b IN (
      SELECT
        docXDoc.id,
        docXDoc.idItemPreDocReferenciado,
        docXDoc.quantidade,
        itemPre.preDocumento,
        cabPre.statusPreDocumento
      FROM MOPREDOCUMXPREDOCUM docXDoc
      JOIN MOPREDOCUMXITENS itemPre
      ON itemPre.idItemPreDocumento = docXDoc.idItemPreDocReferenciado
      JOIN MOPREDOCUMENTOS cabPre
      ON cabPre.predocumento = itemPre.preDocumento
      WHERE docXDoc.idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      IF v_cab_devolucaoAnulacaoRetorno = 1 THEN
        FOR c IN (
          SELECT
            c.entrega,
            c.idItemOrcamento,
            c.quantidade,
            c.situacaoEntrega
          FROM MOENTREGAS c
          WHERE c.idItemPreDocumentoRemessa = b.idItemPreDocReferenciado
          AND c.situacaoEntrega IN (6,7))
        LOOP
          ADD_ENTREGA_SITUACAO_TROCA (
            p_usuarioLogado,
            p_estabelecimentoAtivo,
            c.idItemOrcamento,
            c.entrega,
            c.quantidade,
            c.situacaoEntrega - 1,
            'ADD_PRE_DOC_ITEM_EXCLUI');
        END LOOP;
      END IF;
      IF b.quantidade <> 0 THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_devolucaoAnulacaoRetorno,
          'P',
          p_item_idItemPreDocumento,
          - b.quantidade,
          - a.quantidadeConvertida,
          'P',
          b.idItemPreDocReferenciado);
      END IF;
      IF b.statusPreDocumento = 'F' THEN
        UPDATE MOPREDOCUMENTOS c
        SET c.statusPreDocumento = 'A'
        WHERE c.preDocumento = b.preDocumento;
      END IF;
      DELETE MOPREDOCUMXPREDOCUM c
      WHERE c.id = b.id;
    END LOOP;
    DELETE MOPREDOCUMXPREDOCUM
    WHERE idItemPreDocReferenciado = p_item_idItemPreDocumento;
    FOR b IN (
      SELECT
        id,
        idItemDocFiscalReferenciado,
        quantidade
      FROM MOPREDOCUMXDOCFISCAL
      WHERE idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      IF v_cab_devolucaoAnulacaoRetorno = 1 THEN
        FOR c IN (
          SELECT
            c.entrega,
            c.idItemOrcamento,
            c.quantidade,
            c.situacaoEntrega
          FROM MOENTREGAS c
          WHERE c.idItemDocFiscalRemessa = b.idItemDocFiscalReferenciado
          AND c.situacaoEntrega IN (6,7))
        LOOP
          ADD_ENTREGA_SITUACAO_TROCA (
            p_usuarioLogado,
            p_estabelecimentoAtivo,
            c.idItemOrcamento,
            c.entrega,
            c.quantidade,
            c.situacaoEntrega - 1,
            'ADD_PRE_DOC_ITEM_EXCLUI');
        END LOOP;
      END IF;
      IF b.quantidade <> 0 THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_devolucaoAnulacaoRetorno,
          'P',
          p_item_idItemPreDocumento,
          - b.quantidade,
          - a.quantidadeConvertida,
          'D',
          b.idItemDocFiscalReferenciado);
      END IF;
      DELETE MOPREDOCUMXDOCFISCAL c
      WHERE c.id = b.id;
    END LOOP;
    DELETE MODOCFISCALXPREDOCUM
    WHERE idItemPreDocReferenciado = p_item_idItemPreDocumento;
    DELETE MODOCTRANSFXPREDOCUM
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    IF p_cancelando_Excluindo = 'C' THEN
      UPDATE MOPREDOCUMXITENS
      SET cancelado = 1
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    ELSE
      DELETE MOPREDOCUMXCOMPOSICOESPR
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXNUMEROSSERIE
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXNUMEROSSERIE b
      WHERE b.idEnderecoEstoquePreDocumento > 0
      AND EXISTS (
        SELECT 1
        FROM MOPREDOCUMXENDERECOESTOQ c
        WHERE c.idEnderecoEstoquePreDocumento = b.idEnderecoEstoquePreDocumento
        AND c.idItemPreDocumento = p_item_idItemPreDocumento);
      DELETE MOPREDOCUMXENDERECOESTOQ
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXEMBALAGENSTIN
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXCENTROSCUSTOS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXPROJETOS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MODOCTROCAXITENS
      WHERE idItemPreDocumentoSaida = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXITENS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      IF p_cancelandoExcluindoDocumento = 0 THEN
        v_auxNumber := 0;
        FOR b IN (
          SELECT idItemPreDocumento
          FROM MOPREDOCUMXITENS b
          WHERE b.preDocumento = a.preDocumento
          AND b.idItemPreDocumento <> p_item_idItemPreDocumento
          ORDER BY b.sequencia)
        LOOP
          v_auxNumber := v_auxNumber + 1;
          UPDATE MOPREDOCUMXITENS c
          SET c.sequencia = v_auxNumber
          WHERE c.idItemPreDocumento = b.idItemPreDocumento;
        END LOOP;
      END IF;
    END IF;
  END LOOP;
END ADD_PRE_DOC_ITEM_EXCLUI;

/

create or replace PROCEDURE ADD_PRE_DOC_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_227_manterPessoaOrcam IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     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, -- D = Documento Fiscal, O = Orçamento, P, Pré-Documento, T = Transferência
  p_idItemReferenciado           IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_tempComp_nomeTempComposicao  IN VARCHAR2,
  p_tempComp_sequencia           IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemPreDocumento      IN NUMBER,
  p_item_preDocumento            IN NUMBER,
  p_item_pedidoCompraFornecedor  IN VARCHAR2,
  p_item_sequenciaPedidoCompraFo IN NUMBER,
  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_quantidadeExtemporanea  IN NUMBER,
  p_item_acrescimoUnitarioExtemp IN NUMBER,
  p_item_valorAcrescimoExtempIte IN NUMBER,
  p_item_valorDescontoCustoOpIte IN NUMBER,
  p_item_valorAcrescimoCustoOpIt 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_valorAcrescimoExtempGer IN NUMBER,
  p_item_valorDescontoCustoOpGer IN NUMBER,
  p_item_valorAcrescimoCustoOpGe IN NUMBER,
  p_item_valorDescontoPagamento  IN NUMBER,
  p_item_valorOutrasDespPagament IN NUMBER,
  p_item_valorJurosPagamento     IN NUMBER,
  p_item_percentualDevolucao     IN NUMBER,
  p_item_valorIPIDevolucao       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_idItemPreDocumento    IN VARCHAR2,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER,
  r_item_idItemPreDocumento      OUT NUMBER,
  r_buffer_idItemPreDocumento    OUT VARCHAR2,
  r_valorInserido                OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_finalidadeNota           CHAR (1);
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_documentoFiscal          NUMBER;
  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_statusPreDocumento       CHAR (1);
  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_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota 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_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_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_item_sequencia               NUMBER;
  v_item_cancelado               NUMBER;
  v_item_quantidadeDevolvidaRet  NUMBER;
  v_item_precoUnitario           NUMBER;
  v_item_precoUnitarioConvertido NUMBER;
  v_item_valorProdutoServicoBrut NUMBER;
  v_item_valorProdutoServico     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_item_valorDescontoCustoOpTot NUMBER;
  v_item_valorAcrescimoCustoOpTo NUMBER;
  v_item_precoCustoOperacao      NUMBER;
  v_item_valorCustoOperacao      NUMBER;
  v_item_precoCMV                NUMBER;
  v_item_valorCMV                NUMBER;
  v_item_valorAcrescimoExtempSub NUMBER;
  v_item_valorAcrescimoExtempTot 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_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_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  r_item_idItemPreDocumento := p_item_idItemPreDocumento;
  r_buffer_idItemPreDocumento := p_buffer_idItemPreDocumento;
  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.devolucaoAnulacaoRetorno,
    cab.finalidadeNota,
    cab.atualizaCustoMedio,
    cab.documentoFiscal,
    cab.estabelecimento,
    cab.dataEmissao,
    cab.pessoa,
    cab.enderecoEntregaPessoa,
    cab.municipioFatoGerador,
    cab.localDestinoOperacao,
    cab.indicadorConsumidorFinal,
    cab.modalidadeFrete,
    cab.tipoPagamentoFrete,
    cab.statusPreDocumento,
    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,
    cab.valorDescontoCustoOpItem,
    cab.valorDescontoCustoOpGeral,
    cab.valorDescontoCustoOpTotal,
    cab.valorAcrescimoCustoOpItem,
    cab.valorAcrescimoCustoOpGeral,
    cab.valorAcrescimoCustoOpTotal,
    cab.valorCustoOperacao,
    cab.valorCMV,
    cab.quantidadeExtemporanea,
    cab.valorAcrescimoExtempSubtotal,
    cab.valorAcrescimoExtempItem,
    cab.valorAcrescimoExtempGeral,
    cab.valorAcrescimoExtempTotal,
    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
  INTO
    v_cab_origemDocumento,
    v_cab_tipoDocumento,
    v_cab_entradaSaida,
    v_cab_devolucaoAnulacaoRetorno,
    v_cab_finalidadeNota,
    v_cab_atualizaCustoMedio,
    v_cab_documentoFiscal,
    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_statusPreDocumento,
    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_cab_valorDescontoCustoOpItem,
    v_cab_valorDescontoCustoOpGera,
    v_cab_valorDescontoCustoOpTota,
    v_cab_valorAcrescimoCustoOpIte,
    v_cab_valorAcrescimoCustoOpGer,
    v_cab_valorAcrescimoCustoOpTot,
    v_cab_valorCustoOperacao,
    v_cab_valorCMV,
    v_cab_quantidadeExtemporanea,
    v_cab_valorAcrescimoExtempSubt,
    v_cab_valorAcrescimoExtempItem,
    v_cab_valorAcrescimoExtempGera,
    v_cab_valorAcrescimoExtempTota,
    v_est_grupoFiscal,
    v_pessEst_regimeTributario,
    v_munEndEst_uf,
    v_pess_indicadorInscricaoEstad,
    v_endPess_enderecoPessoa,
    v_munEndPess_uf,
    v_munEndEntr_uf
  FROM MOPREDOCUMENTOS 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
  WHERE cab.preDocumento = p_item_preDocumento;
  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_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_item_quantidadeDevolvidaRet  := 0;
  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_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;
  IF p_manterFinanceiro_Retotalizar = 0 THEN
    SELECT COALESCE (MAX(1), 0)
    INTO v_cab_promocaoExiste
    FROM MOPREDOCUMXPROMOCOES
    WHERE preDocumento = p_item_preDocumento;
  END IF;
  IF p_item_idItemPreDocumento > 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.quantidadeDevolvidaRetornada,
        a.pesoLiquido,
        a.pesoBruto,
        a.valorProdutoServicoBruto,
        a.valorProdutoServico,
        a.valorDescontoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.quantidadeExtemporanea,
        a.valorAcrescimoExtempSubtotal,
        a.valorAcrescimoExtempItem,
        a.valorDescontoCustoOpItem,
        a.valorAcrescimoCustoOpItem,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorAcrescimoExtempGeral,
        a.valorDescontoCustoOpGeral,
        a.valorAcrescimoCustoOpGeral,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.valorFreteTotal,
        a.valorSeguroTotal,
        a.valorDescontoTotal,
        a.valorOutrasDespesasTotal,
        a.valorAdicFreteMarinhaMerTotal,
        a.valorDespesasAduaneirasTotal,
        a.valorAcrescimoExtempTotal,
        a.valorDescontoCustoOpTotal,
        a.valorAcrescimoCustoOpTotal,
        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,
        a.valorCustoOperacao,
        a.valorCMV,
        prod.tipoProduto
      FROM MOPREDOCUMXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      WHERE a.idItemPreDocumento = p_item_idItemPreDocumento)
    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_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_item_quantidadeDevolvidaRet := a.quantidadeDevolvidaRetornada;
      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 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 <> p_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;
        v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
        v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
        v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
        v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
        v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
        v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
        v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
        v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
        v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
        v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
        v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
        v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
        v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      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,
    p_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);
  v_item_valorAcrescimoExtempSub := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
    p_item_quantidade,
    v_item_precoUnitario,
    p_item_quantidadeExtemporanea,
    p_item_acrescimoUnitarioExtemp);
  v_item_valorAcrescimoExtempTot := FUNC_ADD_CALC_EXTEMP_TOTAL(
    v_item_valorAcrescimoExtempSub,
    p_item_valorAcrescimoExtempIte,
    p_item_valorAcrescimoExtempGer);
  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 = CASE WHEN v_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
      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,
        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_PRE_DOC_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_227_manterPessoaOrcam,
        p_config_362_calcCustoPorGrade,
        p_config_378_calcularVolumes,
        p_config_413_obs_add_marca,
        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, -- D = Documento Fiscal, G = Grade DF-e, O = Orçamento, 'P', Pré-Documento, T = Transferência
        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_calcularImpostos,
        0, -- p_item_idItemPreDocumento
        p_item_preDocumento,
        p_item_pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo,
        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
        CASE
          WHEN p_item_quantidade = 0
          THEN 0
          ELSE ROUND(p_item_quantidadeExtemporanea * a.quantidade / p_item_quantidade, 2)
        END, -- p_item_quantidadeExtemporanea
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_acrescimoUnitarioExtemp
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_acrescimoUnitarioExtemp
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoExtempIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpIt
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpIt
        p_item_observacoesDigitadas,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorFreteGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_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_valorAcrescimoExtempGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpGe
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpGe
        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
        p_item_percentualDevolucao,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorIPIDevolucao
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorIPIDevolucao,
        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_idItemPreDocumento,
        /* Retornos */
        r_calcularImpostos,
        v_auxNumber, -- idItemPreDocumento
        r_buffer_idItemPreDocumento,
        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_PRE_DOC_ITEM_COMBO_RESIDUO (
        p_item_preDocumento,
        v_item_valorProdutoServico,
        p_item_valorDescontoItem,
        p_item_valorAcrescimoItem,
        v_modDoc_diminuiDescontoPrUnit,
        v_modDoc_somaAcrescimosPrUnit,
        r_buffer_idItemPreDocumento,
        r_valorInserido);
      r_calcularImpostos := 1;
    END IF;
  ELSE
    IF r_item_idItemPreDocumento <= 0 THEN
      r_item_idItemPreDocumento := FUNC_ADD_BUSCA_PROXIMO_ID ('MOPREDOCUMXITENS', 'idItemPreDocumento', 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
          OR p_item_valorAcrescimoExtempGer <> 0
          OR p_item_valorDescontoCustoOpGer <> 0
          OR p_item_valorAcrescimoCustoOpGe <> 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_PRE_DOC_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          p_item_preDocumento,
          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 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,
        p_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,
        v_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,
        v_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
        p_item_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,
      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
      v_item_valorAcrescimoExtempTot,
      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,
      p_item_valorIPIDevolucao,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      v_item_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0 -- p_item_somarICMSST
      );
    ADD_CALCULA_CUSTO_CMV (
      v_cab_atualizaCustoMedio,
      v_cab_estabelecimento,
      0, -- p_cab_nfFornecedor
      p_item_modeloDocumento,
      p_item_quantidade,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      p_item_valorIPIDevolucao,
      v_item_valorPIS,
      v_item_valorPISST,
      v_item_valorCOFINS,
      v_item_valorCOFINSST,
      v_item_valorCreditoSimplesNac,
      v_item_valorICMS,
      v_item_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      v_item_valorLiquidoItem,
      p_item_valorDescontoCustoOpIte,
      p_item_valorDescontoCustoOpGer,
      p_item_valorAcrescimoCustoOpIt,
      p_item_valorAcrescimoCustoOpGe,
      v_item_valorAcrescimoExtempTot,
      v_item_valorDescontoCustoOpTot,
      v_item_valorAcrescimoCustoOpTo,
      v_item_precoCustoOperacao,
      v_item_valorCustoOperacao,
      v_item_precoCMV,
      v_item_valorCMV);
    IF v_inserindoItem = 1 THEN
      SELECT COALESCE (MAX (sequencia),0) + 1
      INTO v_item_sequencia
      FROM MOPREDOCUMXITENS
      WHERE preDocumento = p_item_preDocumento;
      v_cab_ultimoVendedorItem := p_item_vendedor;
    END IF;
    IF v_item_cancelado = 0 THEN
      IF p_manterFinanceiro_Retotalizar <> 2 THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume + TRUNC(CASE WHEN p_item_controleQuantidade = 1 AND p_item_loteMultiplo <> 0 THEN p_item_quantidade / p_item_loteMultiplo ELSE p_item_quantidadeConvertida END,0);
        END IF;
        v_cab_pesoLiquido := v_cab_pesoLiquido + p_item_pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto + p_item_pesoBruto;
      END IF;
      v_cab_quantidade := v_cab_quantidade + p_item_quantidadeConvertida;
      IF v_prod_tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorServicos := v_cab_valorServicos + v_item_valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos + p_item_valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorProdutos := v_cab_valorProdutos + v_item_valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos + p_item_valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem + p_item_valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem + p_item_valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem + p_item_valorAdicFreteMarItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem + p_item_valorDespesasAduanItem;
      v_cab_valorFreteGeral := v_cab_valorFreteGeral + p_item_valorFreteGeral;
      v_cab_valorSeguroGeral := v_cab_valorSeguroGeral + p_item_valorSeguroGeral;
      v_cab_valorDescontoGeral := v_cab_valorDescontoGeral + v_item_valorDescontoGeral;
      v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral + p_item_valorOutrasDespesasGer;
      v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral + p_item_valorAdicFreteMarGeral;
      v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral + p_item_valorDespesasAduanGeral;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento + v_item_valorBasePagamento;
      IF p_item_usarPrecoAVista = 1
        AND v_item_geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo + v_item_valorProdutoServico - v_item_valorDescontoTotal + v_item_valorOutrasDespesasTot;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento + v_item_valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento + v_item_valorOutrasDespPagament;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento + v_item_valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal + v_item_valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal + v_item_valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal + v_item_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_item_valorOutrasDespesasTot;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal + v_item_valorAdicFreteMarTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal + v_item_valorDespesasAduanTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem + v_item_valorLiquidoItem;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem + p_item_valorDescontoCustoOpIte;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera + p_item_valorDescontoCustoOpGer;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota + v_item_valorDescontoCustoOpTot;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte + p_item_valorAcrescimoCustoOpIt;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer + p_item_valorAcrescimoCustoOpGe;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot + v_item_valorAcrescimoCustoOpTo;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao + v_item_valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV + v_item_valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea + p_item_quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt + v_item_valorAcrescimoExtempSub;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem + p_item_valorAcrescimoExtempIte;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera + p_item_valorAcrescimoExtempGer;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota + v_item_valorAcrescimoExtempTot;
    END IF;
    UPDATE MOPREDOCUMENTOS SET
      modalidadeFrete               = v_cab_modalidadeFrete,
      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,
      valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
      valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
      valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
      valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
      valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
      valorCustoOperacao            = v_cab_valorCustoOperacao,
      valorCMV                      = v_cab_valorCMV,
      quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
      valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
      valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
      valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
    WHERE preDocumento = p_item_preDocumento;
    IF p_item_idItemPreDocumento > 0 THEN
      DELETE MOPREDOCUMXCOMPOSICOESPR compDoc
      WHERE compDoc.idItemPreDocumento = p_item_idItemPreDocumento
      AND EXISTS(
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.produto = comp.produto
        WHERE comp.composicaoPreco = compDoc.composicaoPreco
        AND gradProd.gradeProduto <> p_item_gradeProduto);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      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_413_obs_add_marca,
      ' ',
      0,
      'P',
      p_item_idItemPreDocumento,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    MERGE INTO MOPREDOCUMXITENS a USING (
      SELECT
        r_item_idItemPreDocumento      idItemPreDocumento,
        p_item_preDocumento            preDocumento,
        v_item_sequencia               sequencia,
        v_item_cancelado               cancelado,
        p_item_pedidoCompraFornecedor  pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo sequenciaPedidoCompraFornec,
        p_item_modeloDocumento         modeloDocumento,
        p_item_estabelecimentoOriginal estabelecimentoOriginal,
        p_item_vendedor                vendedor,
        p_item_gradeProduto            gradeProduto,
        p_item_idFormulaTinta          idFormulaTinta,
        p_item_personalizacao          personalizacao,
        p_item_idLoteEstoque           idLoteEstoque,
        p_item_operacaoFiscal          operacaoFiscal,
        v_item_movimentaEstoque        movimentaEstoque,
        v_item_geraFinanceiro          geraFinanceiro,
        p_item_localEstoque            localEstoque,
        p_item_pessoaParticipante      pessoaParticipante,
        p_item_controleQuantidade      controleQuantidade,
        p_item_unidadeMedidaConversao  unidadeMedidaConversao,
        p_item_conversorQuantidade     conversorQuantidade,
        p_item_loteMinimo              loteMinimo,
        p_item_loteMultiplo            loteMultiplo,
        p_item_altura                  altura,
        p_item_largura                 largura,
        p_item_comprimento             comprimento,
        p_item_pecas                   pecas,
        p_item_quantidade              quantidade,
        p_item_quantidadeConvertida    quantidadeConvertida,
        v_item_quantidadeDevolvidaRet  quantidadeDevolvidaRetornada,
        p_item_percentualDevolucao     percentualDevolucao,
        p_item_pesoLiquido             pesoLiquido,
        p_item_pesoBruto               pesoBruto,
        p_item_tipoPreco               tipoPreco,
        p_item_tabelaPreco             tabelaPreco,
        p_item_precoSugestaoAPrazo     precoSugestaoAPrazo,
        p_item_precoSugestaoAVista     precoSugestaoAVista,
        p_item_precoDesconto           precoDesconto,
        p_item_precoMinimo             precoMinimo,
        p_item_usarPrecoAVista         usarPrecoAVista,
        p_item_precoUnitarioBruto      precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos acrescimoUnitarioComposicao,
        v_item_precoUnitario           precoUnitario,
        v_item_precoUnitarioConvertido precoUnitarioConvertido,
        v_item_valorProdutoServicoBrut valorProdutoServicoBruto,
        v_item_valorProdutoServico     valorProdutoServico,
        p_item_percDescontoItem        percDescontoItem,
        p_item_valorDescontoItem       valorDescontoItem,
        p_item_percAcrescimoItem       percAcrescimoItem,
        p_item_valorAcrescimoItem      valorAcrescimoItem,
        p_item_valorFreteItem          valorFreteItem,
        p_item_valorSeguroItem         valorSeguroItem,
        p_item_valorAdicFreteMarItem   valorAdicFreteMarinhaMerItem,
        p_item_valorDespesasAduanItem  valorDespesasAduaneirasItem,
        p_item_valorFreteGeral         valorFreteGeral,
        p_item_valorSeguroGeral        valorSeguroGeral,
        v_item_valorDescontoGeral      valorDescontoGeral,
        p_item_valorOutrasDespesasGer  valorOutrasDespesasGeral,
        p_item_valorAdicFreteMarGeral  valorAdicFreteMarinhaMerGeral,
        p_item_valorDespesasAduanGeral valorDespesasAduaneirasGeral,
        v_item_valorBasePagamento      valorBasePagamento,
        v_item_valorDescontoPagamento  valorDescontoPagamento,
        v_item_valorOutrasDespPagament valorOutrasDespesasPagamento,
        v_item_valorJurosPagamento     valorJurosPagamento,
        v_item_valorFreteTotal         valorFreteTotal,
        v_item_valorSeguroTotal        valorSeguroTotal,
        v_item_valorDescontoTotal      valorDescontoTotal,
        v_item_valorOutrasDespesasTot  valorOutrasDespesasTotal,
        v_item_valorAdicFreteMarTotal  valorAdicFreteMarinhaMerTotal,
        v_item_valorDespesasAduanTotal valorDespesasAduaneirasTotal,
        v_item_cfop                    cfop,
        v_item_indicadorISSQN          indicadorISSQN,
        v_item_aliquotaISSQN           aliquotaISSQN,
        v_item_retidoISSQN             retidoISSQN,
        v_item_tributadoForaMunicipio  tributadoForaMunicipio,
        v_item_incentivoFiscal         incentivoFiscal,
        v_item_listaServicos           listaServicos,
        v_item_cnae                    cnae,
        v_item_idServicoMunicipio      idServicoMunicipio,
        v_item_numeroProcessoAdministr numeroProcessoAdministrativo,
        v_item_baseISSQN               baseISSQN,
        v_item_valorISSQN              valorISSQN,
        v_item_retencaoIRRF            retencaoIRRF,
        v_item_baseRetIRRF             baseRetIRRF,
        v_item_valorRetIRRF            valorRetIRRF,
        v_item_retencaoINSS            retencaoINSS,
        v_item_baseRetINSS             baseRetINSS,
        v_item_valorRetINSS            valorRetINSS,
        v_item_retencaoPIS             retencaoPIS,
        v_item_baseRetPIS              baseRetPIS,
        v_item_valorRetPIS             valorRetPIS,
        v_item_retencaoCOFINS          retencaoCOFINS,
        v_item_baseRetCOFINS           baseRetCOFINS,
        v_item_valorRetCOFINS          valorRetCOFINS,
        v_item_retencaoCSLL            retencaoCSLL,
        v_item_baseRetCSLL             baseRetCSLL,
        v_item_valorRetCSLL            valorRetCSLL,
        v_item_retencaoOutros          retencaoOutros,
        v_item_baseRetOutros           baseRetOutros,
        v_item_valorRetOutros          valorRetOutros,
        v_item_aliquotaII              aliquotaII,
        v_item_baseII                  baseII,
        v_item_valorII                 valorII,
        v_item_aliquotaIOF             aliquotaIOF,
        v_item_baseIOF                 baseIOF,
        v_item_valorIOF                valorIOF,
        v_item_codigoEnquadramentoIPI  codigoEnquadramentoIPI,
        v_item_stIPI                   stIPI,
        v_item_aliquotaIPI             aliquotaIPI,
        v_item_valorAliquotaIPI        valorAliquotaIPI,
        v_item_baseIPI                 baseIPI,
        v_item_valorIPI                valorIPI,
        p_item_valorIPIDevolucao       valorIPIDevolucao,
        v_item_stPIS                   stPIS,
        v_item_aliquotaPIS             aliquotaPIS,
        v_item_valorAliquotaPIS        valorAliquotaPIS,
        v_item_basePIS                 basePIS,
        v_item_valorPIS                valorPIS,
        v_item_aliquotaPISST           aliquotaPISST,
        v_item_valorAliquotaPISST      valorAliquotaPISST,
        v_item_basePISST               basePISST,
        v_item_valorPISST              valorPISST,
        v_item_stCOFINS                stCOFINS,
        v_item_aliquotaCOFINS          aliquotaCOFINS,
        v_item_valorAliquotaCOFINS     valorAliquotaCOFINS,
        v_item_baseCOFINS              baseCOFINS,
        v_item_valorCOFINS             valorCOFINS,
        v_item_aliquotaCOFINSST        aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST   valorAliquotaCOFINSST,
        v_item_baseCOFINSST            baseCOFINSST,
        v_item_valorCOFINSST           valorCOFINSST,
        v_item_stSimplesNacional       stSimplesNacional,
        v_item_creditoSimplesNacional  creditoSimplesNacional,
        v_item_baseCreditoSimplesNac   baseCreditoSimplesNacional,
        v_item_valorCreditoSimplesNac  valorCreditoSimplesNacional,
        v_item_stICMS                  stICMS,
        v_item_modalBaseCalcICMS       modalidadeBaseCalcICMS,
        v_item_reducaoBaseICMS         reducaoBaseICMS,
        v_item_aliquotaICMS            aliquotaICMS,
        v_item_diferimentoICMS         diferimentoICMS,
        v_item_motivoDesoneracaoICMS   motivoDesoneracaoICMS,
        v_item_idBeneficio             idBeneficio,
        v_item_baseICMS                baseICMS,
        v_item_valorICMSOperacao       valorICMSOperacao,
        v_item_valorICMSDiferido       valorICMSDiferido,
        v_item_valorICMS               valorICMS,
        v_item_valorICMSDesoneracao    valorICMSDesoneracao,
        v_item_modalBaseCalcICMSST     modalidadeBaseCalcICMSST,
        v_item_margemValorAdicionadoST margemValorAdicionadoST,
        v_item_reducaoBaseST           reducaoBaseST,
        v_item_aliquotaICMSST          aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin aliquotaSTSuportConsFinal,
        v_item_baseICMSST              baseICMSST,
        v_item_valorICMSST             valorICMSST,
        v_item_baseICMSSTAnteriormente baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment valorICMSSTAnteriormente,
        v_item_valorICMSProprioSubstit valorICMSProprioSubstituto,
        v_item_reducaoBaseICMSEfetivo  reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo     aliquotaICMSEfetivo,
        v_item_baseICMSEfetivo         baseICMSEfetivo,
        v_item_valorICMSEfetivo        valorICMSEfetivo,
        v_item_aliquotaICMSUFDestinat  aliquotaICMSUFDestinatario,
        v_item_aliquotaICMSInterestad  aliquotaICMSInterestadual,
        v_item_partilhaICMSInterestad  partilhaICMSInterestadual,
        v_item_baseICMSUFDestinatario  baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente     baseICMSUFRemetente,
        v_item_valorICMSUFRemetente    valorICMSUFRemetente,
        v_item_aliquotaFCP             aliquotaFCP,
        v_item_baseFCP                 baseFCP,
        v_item_valorFCP                valorFCP,
        v_item_aliquotaFCPST           aliquotaFCPST,
        v_item_baseFCPST               baseFCPST,
        v_item_valorFCPST              valorFCPST,
        v_item_aliquotaFCPSTAnteriorm  aliquotaFCPSTAnteriormente,
        v_item_baseFCPSTAnteriormente  baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente valorFCPSTAnteriormente,
        v_item_aliquotaFCPUFDestinat   aliquotaFCPUFDestinatario,
        v_item_baseFCPUFDestinatario   baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario  valorFCPUFDestinatario,
        v_item_aliquotaEstImpFederais  aliquotaEstimadaImpFederais,
        v_item_aliquotaEstImpEstaduais aliquotaEstimadaImpEstaduais,
        v_item_aliquotaEstImpMunicipai aliquotaEstimadaImpMunicipais,
        v_item_baseEstimadaImpostos    baseEstimadaImpostos,
        v_item_valorEstImpFederais     valorEstimadoImpFederais,
        v_item_valorEstImpEstaduais    valorEstimadoImpEstaduais,
        v_item_valorEstImpMunicipais   valorEstimadoImpMunicipais,
        v_item_valorLiquidoItem        valorLiquidoItem,
        p_item_valorDescontoCustoOpIte valorDescontoCustoOpItem,
        p_item_valorDescontoCustoOpGer valorDescontoCustoOpGeral,
        v_item_valorDescontoCustoOpTot valorDescontoCustoOpTotal,
        p_item_valorAcrescimoCustoOpIt valorAcrescimoCustoOpItem,
        p_item_valorAcrescimoCustoOpGe valorAcrescimoCustoOpGeral,
        v_item_valorAcrescimoCustoOpTo valorAcrescimoCustoOpTotal,
        v_item_precoCustoOperacao      precoCustoOperacao,
        v_item_valorCustoOperacao      valorCustoOperacao,
        v_item_precoCMV                precoCMV,
        v_item_valorCMV                valorCMV,
        p_item_quantidadeExtemporanea  quantidadeExtemporanea,
        p_item_acrescimoUnitarioExtemp acrescimoUnitarioExtemporaneo,
        v_item_valorAcrescimoExtempSub valorAcrescimoExtempSubtotal,
        p_item_valorAcrescimoExtempIte valorAcrescimoExtempItem,
        p_item_valorAcrescimoExtempGer valorAcrescimoExtempGeral,
        v_item_valorAcrescimoExtempTot valorAcrescimoExtempTotal,
        p_item_observacoesDigitadas    observacoesDigitadas,
        v_observacoes                  observacoes
      FROM DUAL) b
    ON (a.idItemPreDocumento = b.idItemPreDocumento)
    WHEN MATCHED THEN UPDATE SET
      a.preDocumento                  = b.preDocumento,
      a.sequencia                     = b.sequencia,
      a.cancelado                     = b.cancelado,
      a.pedidoCompraFornecedor        = b.pedidoCompraFornecedor,
      a.sequenciaPedidoCompraFornec   = b.sequenciaPedidoCompraFornec,
      a.vendedor                      = b.vendedor,
      a.modeloDocumento               = b.modeloDocumento,
      a.estabelecimentoOriginal       = b.estabelecimentoOriginal,
      a.gradeProduto                  = b.gradeProduto,
      a.idFormulaTinta                = b.idFormulaTinta,
      a.personalizacao                = b.personalizacao,
      a.idLoteEstoque                 = b.idLoteEstoque,
      a.operacaoFiscal                = b.operacaoFiscal,
      a.movimentaEstoque              = b.movimentaEstoque,
      a.geraFinanceiro                = b.geraFinanceiro,
      a.localEstoque                  = b.localEstoque,
      a.pessoaParticipante            = b.pessoaParticipante,
      a.controleQuantidade            = b.controleQuantidade,
      a.unidadeMedidaConversao        = b.unidadeMedidaConversao,
      a.conversorQuantidade           = b.conversorQuantidade,
      a.loteMinimo                    = b.loteMinimo,
      a.loteMultiplo                  = b.loteMultiplo,
      a.altura                        = b.altura,
      a.largura                       = b.largura,
      a.comprimento                   = b.comprimento,
      a.pecas                         = b.pecas,
      a.quantidade                    = b.quantidade,
      a.quantidadeConvertida          = b.quantidadeConvertida,
      a.quantidadeDevolvidaRetornada  = b.quantidadeDevolvidaRetornada,
      a.percentualDevolucao           = b.percentualDevolucao,
      a.pesoLiquido                   = b.pesoLiquido,
      a.pesoBruto                     = b.pesoBruto,
      a.tipoPreco                     = b.tipoPreco,
      a.tabelaPreco                   = b.tabelaPreco,
      a.precoSugestaoAPrazo           = b.precoSugestaoAPrazo,
      a.precoSugestaoAVista           = b.precoSugestaoAVista,
      a.precoDesconto                 = b.precoDesconto,
      a.precoMinimo                   = b.precoMinimo,
      a.usarPrecoAVista               = b.usarPrecoAVista,
      a.precoUnitarioBruto            = b.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao   = b.acrescimoUnitarioComposicao,
      a.precoUnitario                 = b.precoUnitario,
      a.precoUnitarioConvertido       = b.precounitarioConvertido,
      a.valorProdutoServicoBruto      = b.valorProdutoServicoBruto,
      a.valorProdutoServico           = b.valorProdutoServico,
      a.percDescontoItem              = b.percDescontoItem,
      a.valorDescontoItem             = b.valorDescontoItem,
      a.percAcrescimoItem             = b.percAcrescimoItem,
      a.valorAcrescimoItem            = b.valorAcrescimoItem,
      a.valorFreteItem                = b.valorFreteItem,
      a.valorSeguroItem               = b.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem  = b.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem   = b.valorDespesasAduaneirasItem,
      a.valorFreteGeral               = b.valorFreteGeral,
      a.valorSeguroGeral              = b.valorSeguroGeral,
      a.valorDescontoGeral            = b.valorDescontoGeral,
      a.valorOutrasDespesasGeral      = b.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral = b.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral  = b.valorDespesasAduaneirasGeral,
      a.valorBasePagamento            = b.valorBasePagamento,
      a.valorDescontoPagamento        = b.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento  = b.valorOutrasDespesasPagamento,
      a.valorJurosPagamento           = b.valorJurosPagamento,
      a.valorFreteTotal               = b.valorFreteTotal,
      a.valorSeguroTotal              = b.valorSeguroTotal,
      a.valorDescontoTotal            = b.valorDescontoTotal,
      a.valorOutrasDespesasTotal      = b.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal = b.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal  = b.valorDespesasAduaneirasTotal,
      a.cfop                          = b.cfop,
      a.indicadorISSQN                = b.indicadorISSQN,
      a.aliquotaISSQN                 = b.aliquotaISSQN,
      a.retidoISSQN                   = b.retidoISSQN,
      a.tributadoForaMunicipio        = b.tributadoForaMunicipio,
      a.incentivoFiscal               = b.incentivoFiscal,
      a.listaServicos                 = b.listaServicos,
      a.cnae                          = b.cnae,
      a.idServicoMunicipio            = b.idServicoMunicipio,
      a.numeroProcessoAdministrativo  = b.numeroProcessoAdministrativo,
      a.baseISSQN                     = b.baseISSQN,
      a.valorISSQN                    = b.valorISSQN,
      a.retencaoIRRF                  = b.retencaoIRRF,
      a.baseRetIRRF                   = b.baseRetIRRF,
      a.valorRetIRRF                  = b.valorRetIRRF,
      a.retencaoINSS                  = b.retencaoINSS,
      a.baseRetINSS                   = b.baseRetINSS,
      a.valorRetINSS                  = b.valorRetINSS,
      a.retencaoPIS                   = b.retencaoPIS,
      a.baseRetPIS                    = b.baseRetPIS,
      a.valorRetPIS                   = b.valorRetPIS,
      a.retencaoCOFINS                = b.retencaoCOFINS,
      a.baseRetCOFINS                 = b.baseRetCOFINS,
      a.valorRetCOFINS                = b.valorRetCOFINS,
      a.retencaoCSLL                  = b.retencaoCSLL,
      a.baseRetCSLL                   = b.baseRetCSLL,
      a.valorRetCSLL                  = b.valorRetCSLL,
      a.retencaoOutros                = b.retencaoOutros,
      a.baseRetOutros                 = b.baseRetOutros,
      a.valorRetOutros                = b.valorRetOutros,
      a.aliquotaII                    = b.aliquotaII,
      a.baseII                        = b.baseII,
      a.valorII                       = b.valorII,
      a.aliquotaIOF                   = b.aliquotaIOF,
      a.baseIOF                       = b.baseIOF,
      a.valorIOF                      = b.valorIOF,
      a.codigoEnquadramentoIPI        = b.codigoEnquadramentoIPI,
      a.stIPI                         = b.stIPI,
      a.aliquotaIPI                   = b.aliquotaIPI,
      a.valorAliquotaIPI              = b.valorAliquotaIPI,
      a.baseIPI                       = b.baseIPI,
      a.valorIPI                      = b.valorIPI,
      a.valorIPIDevolucao             = b.valorIPIDevolucao,
      a.stPIS                         = b.stPIS,
      a.aliquotaPIS                   = b.aliquotaPIS,
      a.valorAliquotaPIS              = b.valorAliquotaPIS,
      a.basePIS                       = b.basePIS,
      a.valorPIS                      = b.valorPIS,
      a.aliquotaPISST                 = b.aliquotaPISST,
      a.valorAliquotaPISST            = b.valorAliquotaPISST,
      a.basePISST                     = b.basePISST,
      a.valorPISST                    = b.valorPISST,
      a.stCOFINS                      = b.stCOFINS,
      a.aliquotaCOFINS                = b.aliquotaCOFINS,
      a.valorAliquotaCOFINS           = b.valorAliquotaCOFINS,
      a.baseCOFINS                    = b.baseCOFINS,
      a.valorCOFINS                   = b.valorCOFINS,
      a.aliquotaCOFINSST              = b.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST         = b.valorAliquotaCOFINSST,
      a.baseCOFINSST                  = b.baseCOFINSST,
      a.valorCOFINSST                 = b.valorCOFINSST,
      a.stSimplesNacional             = b.stSimplesNacional,
      a.creditoSimplesNacional        = b.creditoSimplesNacional,
      a.baseCreditoSimplesNacional    = b.baseCreditoSimplesNacional,
      a.valorCreditoSimplesNacional   = b.valorCreditoSimplesNacional,
      a.stICMS                        = b.stICMS,
      a.modalidadeBaseCalcICMS        = b.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS               = b.reducaoBaseICMS,
      a.aliquotaICMS                  = b.aliquotaICMS,
      a.diferimentoICMS               = b.diferimentoICMS,
      a.motivoDesoneracaoICMS         = b.motivoDesoneracaoICMS,
      a.idBeneficio                   = b.idBeneficio,
      a.baseICMS                      = b.baseICMS,
      a.valorICMSoperacao             = b.valorICMSoperacao,
      a.valorICMSdiferido             = b.valorICMSdiferido,
      a.valorICMS                     = b.valorICMS,
      a.valorICMSdesoneracao          = b.valorICMSdesoneracao,
      a.modalidadeBaseCalcICMSST      = b.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST       = b.margemValorAdicionadoST,
      a.reducaoBaseST                 = b.reducaoBaseST,
      a.aliquotaICMSST                = b.aliquotaICMSST,
      a.aliquotaSTSuportConsFinal     = b.aliquotaSTSuportConsFinal,
      a.baseICMSST                    = b.baseICMSST,
      a.valorICMSST                   = b.valorICMSST,
      a.baseICMSSTAnteriormente       = b.baseICMSSTAnteriormente,
      a.valorICMSSTAnteriormente      = b.valorICMSSTAnteriormente,
      a.valorICMSProprioSubstituto    = b.valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo        = b.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo           = b.aliquotaICMSEfetivo,
      a.baseICMSEfetivo               = b.baseICMSEfetivo,
      a.valorICMSEfetivo              = b.valorICMSEfetivo,
      a.aliquotaICMSUFDestinatario    = b.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual     = b.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual     = b.partilhaICMSInterestadual,
      a.baseICMSUFDestinatario        = b.baseICMSUFDestinatario,
      a.valorICMSUFDestinatario       = b.valorICMSUFDestinatario,
      a.baseICMSUFRemetente           = b.baseICMSUFRemetente,
      a.valorICMSUFRemetente          = b.valorICMSUFRemetente,
      a.aliquotaFCP                   = b.aliquotaFCP,
      a.baseFCP                       = b.baseFCP,
      a.valorFCP                      = b.valorFCP,
      a.aliquotaFCPST                 = b.aliquotaFCPST,
      a.baseFCPST                     = b.baseFCPST,
      a.valorFCPST                    = b.valorFCPST,
      a.aliquotaFCPSTAnteriormente    = b.aliquotaFCPSTAnteriormente,
      a.baseFCPSTAnteriormente        = b.baseFCPSTAnteriormente,
      a.valorFCPSTAnteriormente       = b.valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario     = b.aliquotaFCPUFDestinatario,
      a.baseFCPUFDestinatario         = b.baseFCPUFDestinatario,
      a.valorFCPUFDestinatario        = b.valorFCPUFDestinatario,
      a.aliquotaestimadaimpfederais   = b.aliquotaestimadaimpfederais,
      a.aliquotaestimadaimpestaduais  = b.aliquotaestimadaimpestaduais,
      a.aliquotaestimadaimpmunicipais = b.aliquotaestimadaimpmunicipais,
      a.baseestimadaimpostos          = b.baseestimadaimpostos,
      a.valorestimadoimpfederais      = b.valorestimadoimpfederais,
      a.valorEstimadoImpEstaduais     = b.valorEstimadoImpEstaduais,
      a.valorEstimadoImpMunicipais    = b.valorEstimadoImpMunicipais,
      a.valorLiquidoItem              = b.valorLiquidoItem,
      a.valorDescontoCustoOpItem      = b.valorDescontoCustoOpItem,
      a.valorDescontoCustoOpGeral     = b.valorDescontoCustoOpGeral,
      a.valorDescontoCustoOpTotal     = b.valorDescontoCustoOpTotal,
      a.valorAcrescimoCustoOpItem     = b.valorAcrescimoCustoOpItem,
      a.valorAcrescimoCustoOpGeral    = b.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoCustoOpTotal    = b.valorAcrescimoCustoOpTotal,
      a.precoCustoOperacao            = b.precoCustoOperacao,
      a.valorCustoOperacao            = b.valorCustoOperacao,
      a.precoCMV                      = b.precoCMV,
      a.valorCMV                      = b.valorCMV,
      a.quantidadeExtemporanea        = b.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo = b.acrescimoUnitarioExtemporaneo,
      a.valorAcrescimoExtempSubtotal  = b.valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem      = b.valorAcrescimoExtempItem,
      a.valorAcrescimoExtempGeral     = b.valorAcrescimoExtempGeral,
      a.valorAcrescimoExtempTotal     = b.valorAcrescimoExtempTotal,
      a.observacoesDigitadas          = b.observacoesDigitadas,
      a.observacoes                   = b.observacoes
    WHEN NOT MATCHED THEN INSERT (
      idItemPreDocumento,
      preDocumento,
      sequencia,
      cancelado,
      pedidoCompraFornecedor,
      sequenciaPedidoCompraFornec,
      modeloDocumento,
      estabelecimentoOriginal,
      vendedor,
      gradeProduto,
      idFormulaTinta,
      personalizacao,
      idLoteEstoque,
      operacaoFiscal,
      movimentaEstoque,
      geraFinanceiro,
      localEstoque,
      pessoaParticipante,
      controleQuantidade,
      unidadeMedidaConversao,
      conversorQuantidade,
      loteMinimo,
      loteMultiplo,
      altura,
      largura,
      comprimento,
      pecas,
      quantidade,
      quantidadeConvertida,
      quantidadeDevolvidaRetornada,
      percentualDevolucao,
      pesoLiquido,
      pesoBruto,
      tipoPreco,
      tabelaPreco,
      precoSugestaoAPrazo,
      precoSugestaoAVista,
      precoDesconto,
      precoMinimo,
      usarPrecoAVista,
      precoUnitarioBruto,
      acrescimoUnitarioComposicao,
      precoUnitario,
      precoUnitarioConvertido,
      valorProdutoServicoBruto,
      valorProdutoServico,
      percDescontoItem,
      valorDescontoItem,
      percAcrescimoItem,
      valorAcrescimoItem,
      valorFreteItem,
      valorSeguroItem,
      valorAdicFreteMarinhaMerItem,
      valorDespesasAduaneirasItem,
      valorFreteGeral,
      valorSeguroGeral,
      valorDescontoGeral,
      valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral,
      valorDespesasAduaneirasGeral,
      valorBasePagamento,
      valorDescontoPagamento,
      valorOutrasDespesasPagamento,
      valorJurosPagamento,
      valorFreteTotal,
      valorSeguroTotal,
      valorDescontoTotal,
      valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal,
      valorDespesasAduaneirasTotal,
      cfop,
      indicadorISSQN,
      aliquotaISSQN,
      retidoISSQN,
      tributadoForaMunicipio,
      incentivoFiscal,
      listaServicos,
      cnae,
      idServicoMunicipio,
      numeroProcessoAdministrativo,
      baseISSQN,
      valorISSQN,
      retencaoIRRF,
      baseRetIRRF,
      valorRetIRRF,
      retencaoINSS,
      baseRetINSS,
      valorRetINSS,
      retencaoPIS,
      baseRetPIS,
      valorRetPIS,
      retencaoCOFINS,
      baseRetCOFINS,
      valorRetCOFINS,
      retencaoCSLL,
      baseRetCSLL,
      valorRetCSLL,
      retencaoOutros,
      baseRetOutros,
      valorRetOutros,
      aliquotaII,
      baseII,
      valorII,
      aliquotaIOF,
      baseIOF,
      valorIOF,
      codigoEnquadramentoIPI,
      stIPI,
      aliquotaIPI,
      valorAliquotaIPI,
      baseIPI,
      valorIPI,
      valorIPIDevolucao,
      stPIS,
      aliquotaPIS,
      valorAliquotaPIS,
      basePIS,
      valorPIS,
      aliquotaPISST,
      valorAliquotaPISST,
      basePISST,
      valorPISST,
      stCOFINS,
      aliquotaCOFINS,
      valorAliquotaCOFINS,
      baseCOFINS,
      valorCOFINS,
      aliquotaCOFINSST,
      valorAliquotaCOFINSST,
      baseCOFINSST,
      valorCOFINSST,
      stSimplesNacional,
      creditoSimplesNacional,
      baseCreditoSimplesNacional,
      valorCreditoSimplesNacional,
      stICMS,
      modalidadeBaseCalcICMS,
      reducaoBaseICMS,
      aliquotaICMS,
      diferimentoICMS,
      motivoDesoneracaoICMS,
      idBeneficio,
      baseICMS,
      valorICMSOperacao,
      valorICMSDiferido,
      valorICMS,
      valorICMSDesoneracao,
      modalidadeBaseCalcICMSST,
      margemValorAdicionadoST,
      reducaoBaseST,
      aliquotaICMSST,
      aliquotaSTSuportConsFinal,
      baseICMSST,
      valorICMSST,
      baseICMSSTAnteriormente,
      valorICMSSTAnteriormente,
      valorICMSProprioSubstituto,
      reducaoBaseICMSEfetivo,
      aliquotaICMSEfetivo,
      baseICMSEfetivo,
      valorICMSEfetivo,
      aliquotaICMSUFDestinatario,
      aliquotaICMSInterestadual,
      partilhaICMSInterestadual,
      baseICMSUFDestinatario,
      valorICMSUFDestinatario,
      baseICMSUFRemetente,
      valorICMSUFRemetente,
      aliquotaFCP,
      baseFCP,
      valorFCP,
      aliquotaFCPST,
      baseFCPST,
      valorFCPST,
      aliquotaFCPSTAnteriormente,
      baseFCPSTAnteriormente,
      valorFCPSTAnteriormente,
      aliquotaFCPUFDestinatario,
      baseFCPUFDestinatario,
      valorFCPUFDestinatario,
      aliquotaEstimadaImpFederais,
      aliquotaEstimadaImpEstaduais,
      aliquotaEstimadaImpMunicipais,
      baseEstimadaImpostos,
      valorEstimadoImpFederais,
      valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais,
      valorLiquidoItem,
      valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral,
      valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpItem,
      valorAcrescimoCustoOpGeral,
      valorAcrescimoCustoOpTotal,
      precoCustoOperacao,
      valorCustoOperacao,
      precoCMV,
      valorCMV,
      quantidadeExtemporanea,
      acrescimoUnitarioExtemporaneo,
      valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral,
      valorAcrescimoExtempTotal,
      observacoesDigitadas,
      observacoes)
    VALUES (
      b.idItemPreDocumento,
      b.preDocumento,
      b.sequencia,
      b.cancelado,
      b.pedidoCompraFornecedor,
      b.sequenciaPedidoCompraFornec,
      b.modeloDocumento,
      b.estabelecimentoOriginal,
      b.vendedor,
      b.gradeProduto,
      b.idFormulaTinta,
      b.personalizacao,
      b.idLoteEstoque,
      b.operacaoFiscal,
      b.movimentaEstoque,
      b.geraFinanceiro,
      b.localEstoque,
      b.pessoaParticipante,
      b.controleQuantidade,
      b.unidadeMedidaConversao,
      b.conversorQuantidade,
      b.loteMinimo,
      b.loteMultiplo,
      b.altura,
      b.largura,
      b.comprimento,
      b.pecas,
      b.quantidade,
      b.quantidadeConvertida,
      b.quantidadeDevolvidaRetornada,
      b.percentualDevolucao,
      b.pesoLiquido,
      b.pesoBruto,
      b.tipoPreco,
      b.tabelaPreco,
      b.precoSugestaoAPrazo,
      b.precoSugestaoAVista,
      b.precoDesconto,
      b.precoMinimo,
      b.usarPrecoAVista,
      b.precoUnitarioBruto,
      b.acrescimoUnitarioComposicao,
      b.precoUnitario,
      b.precoUnitarioConvertido,
      b.valorProdutoServicoBruto,
      b.valorProdutoServico,
      b.percDescontoItem,
      b.valorDescontoItem,
      b.percAcrescimoItem,
      b.valorAcrescimoItem,
      b.valorFreteItem,
      b.valorSeguroItem,
      b.valorAdicFreteMarinhaMerItem,
      b.valorDespesasAduaneirasItem,
      b.valorFreteGeral,
      b.valorSeguroGeral,
      b.valorDescontoGeral,
      b.valorOutrasDespesasGeral,
      b.valorAdicFreteMarinhaMerGeral,
      b.valorDespesasAduaneirasGeral,
      b.valorBasePagamento,
      b.valorDescontoPagamento,
      b.valorOutrasDespesasPagamento,
      b.valorJurosPagamento,
      b.valorFreteTotal,
      b.valorSeguroTotal,
      b.valorDescontoTotal,
      b.valorOutrasDespesasTotal,
      b.valorAdicFreteMarinhaMerTotal,
      b.valorDespesasAduaneirasTotal,
      b.cfop,
      b.indicadorISSQN,
      b.aliquotaISSQN,
      b.retidoISSQN,
      b.tributadoForaMunicipio,
      b.incentivoFiscal,
      b.listaServicos,
      b.cnae,
      b.idServicoMunicipio,
      b.numeroProcessoAdministrativo,
      b.baseISSQN,
      b.valorISSQN,
      b.retencaoIRRF,
      b.baseRetIRRF,
      b.valorRetIRRF,
      b.retencaoINSS,
      b.baseRetINSS,
      b.valorRetINSS,
      b.retencaoPIS,
      b.baseRetPIS,
      b.valorRetPIS,
      b.retencaoCOFINS,
      b.baseRetCOFINS,
      b.valorRetCOFINS,
      b.retencaoCSLL,
      b.baseRetCSLL,
      b.valorRetCSLL,
      b.retencaoOutros,
      b.baseRetOutros,
      b.valorRetOutros,
      b.aliquotaII,
      b.baseII,
      b.valorII,
      b.aliquotaIOF,
      b.baseIOF,
      b.valorIOF,
      b.codigoEnquadramentoIPI,
      b.stIPI,
      b.aliquotaIPI,
      b.valorAliquotaIPI,
      b.baseIPI,
      b.valorIPI,
      b.valorIPIDevolucao,
      b.stPIS,
      b.aliquotaPIS,
      b.valorAliquotaPIS,
      b.basePIS,
      b.valorPIS,
      b.aliquotaPISST,
      b.valorAliquotaPISST,
      b.basePISST,
      b.valorPISST,
      b.stCOFINS,
      b.aliquotaCOFINS,
      b.valorAliquotaCOFINS,
      b.baseCOFINS,
      b.valorCOFINS,
      b.aliquotaCOFINSST,
      b.valorAliquotaCOFINSST,
      b.baseCOFINSST,
      b.valorCOFINSST,
      b.stSimplesNacional,
      b.creditoSimplesNacional,
      b.baseCreditoSimplesNacional,
      b.valorCreditoSimplesNacional,
      b.stICMS,
      b.modalidadeBaseCalcICMS,
      b.reducaoBaseICMS,
      b.aliquotaICMS,
      b.diferimentoICMS,
      b.motivoDesoneracaoICMS,
      b.idBeneficio,
      b.baseICMS,
      b.valorICMSOperacao,
      b.valorICMSDiferido,
      b.valorICMS,
      b.valorICMSDesoneracao,
      b.modalidadeBaseCalcICMSST,
      b.margemValorAdicionadoST,
      b.reducaoBaseST,
      b.aliquotaICMSST,
      b.aliquotaSTSuportConsFinal,
      b.baseICMSST,
      b.valorICMSST,
      b.baseICMSSTAnteriormente,
      b.valorICMSSTAnteriormente,
      b.valorICMSProprioSubstituto,
      b.reducaoBaseICMSEfetivo,
      b.aliquotaICMSEfetivo,
      b.baseICMSEfetivo,
      b.valorICMSEfetivo,
      b.aliquotaICMSUFDestinatario,
      b.aliquotaICMSInterestadual,
      b.partilhaICMSInterestadual,
      b.baseICMSUFDestinatario,
      b.valorICMSUFDestinatario,
      b.baseICMSUFRemetente,
      b.valorICMSUFRemetente,
      b.aliquotaFCP,
      b.baseFCP,
      b.valorFCP,
      b.aliquotaFCPST,
      b.baseFCPST,
      b.valorFCPST,
      b.aliquotaFCPSTAnteriormente,
      b.baseFCPSTAnteriormente,
      b.valorFCPSTAnteriormente,
      b.aliquotaFCPUFDestinatario,
      b.baseFCPUFDestinatario,
      b.valorFCPUFDestinatario,
      b.aliquotaEstimadaImpFederais,
      b.aliquotaEstimadaImpEstaduais,
      b.aliquotaEstimadaImpMunicipais,
      b.baseEstimadaImpostos,
      b.valorEstimadoImpFederais,
      b.valorEstimadoImpEstaduais,
      b.valorEstimadoImpMunicipais,
      b.valorLiquidoItem,
      b.valorDescontoCustoOpItem,
      b.valorDescontoCustoOpGeral,
      b.valorDescontoCustoOpTotal,
      b.valorAcrescimoCustoOpItem,
      b.valorAcrescimoCustoOpGeral,
      b.valorAcrescimoCustoOpTotal,
      b.precoCustoOperacao,
      b.valorCustoOperacao,
      b.precoCMV,
      b.valorCMV,
      b.quantidadeExtemporanea,
      b.acrescimoUnitarioExtemporaneo,
      b.valorAcrescimoExtempSubtotal,
      b.valorAcrescimoExtempItem,
      b.valorAcrescimoExtempGeral,
      b.valorAcrescimoExtempTotal,
      b.observacoesDigitadas,
      b.observacoes);
    v_atualizarObservacoes := 0;
    IF p_idItemReferenciado > 0 THEN
      IF p_tipoDocumentoReferenciado IN ('D','P') THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV(
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_devolucaoAnulacaoRetorno,
          'P',
          r_item_idItemPreDocumento,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          p_tipoDocumentoReferenciado,
          p_idItemReferenciado);
      END IF;
      IF p_tipoDocumentoReferenciado = 'D' THEN
        ADD_PRE_DOC_ITEM_REF_DOC_FIS (
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_preDocumento,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemPreDocumento,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'O' THEN
        ADD_PRE_DOC_ITEM_REF_ORCAMEN (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_preDocumento,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemPreDocumento,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'P' THEN
        ADD_PRE_DOC_ITEM_REF_PRE_DOC (
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_preDocumento,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemPreDocumento,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'T' THEN
        ADD_PRE_DOC_ITEM_TRANS_GRAVA (
          p_estabelecimentoAtivo,
          v_cab_entradaSaida,
          p_idItemReferenciado,
          r_item_idItemPreDocumento,
          p_quantidadeReferenciada);
      END IF;
    END IF;
    IF p_tempComp_nomeTempComposicao <> ' '
      AND (NOT (p_tipoDocumentoReferenciado IN ('D','O','P'))
        OR p_idItemReferenciado <= 0)
    THEN
      ADD_PRE_DOC_ITEM_COMP_TEMP (
        p_sessaoClient,
        p_estabelecimentoAtivo,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        r_item_idItemPreDocumento,
        v_atualizarObservacoes,
        v_atualizarObservacoes);
    END IF;
    v_idEnderecoEstoque := 0;
    IF p_item_idEnderecoEstoque > 0 THEN
      ADD_PRE_DOC_ITEM_ENDER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemPreDocumento,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_quantidade,
        ' ',
        v_idEnderecoEstoque);
    END IF;
    IF p_item_idNumeroSerie > 0 THEN
      ADD_PRE_DOC_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemPreDocumento,
        v_idEnderecoEstoque,
        p_item_gradeProduto,
        p_item_idNumeroSerie,
        0,
        v_auxNumber);
      v_atualizarObservacoes := 1;
    END IF;
    IF v_atualizarObservacoes = 1 THEN
      v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
        p_sessaoClient,
        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_413_obs_add_marca,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        'P',
        r_item_idItemPreDocumento,
        p_item_gradeProduto,
        p_item_idFormulaTinta,
        p_item_personalizacao,
        p_item_idLoteEstoque,
        p_item_controleQuantidade,
        p_item_loteMultiplo,
        p_item_altura,
        p_item_largura,
        p_item_comprimento,
        p_item_quantidade,
        p_item_observacoesDigitadas);
      UPDATE MOPREDOCUMXITENS
      SET observacoes = v_observacoes
      WHERE idItemPreDocumento = r_item_idItemPreDocumento;
    END IF;
    IF v_cab_statusPreDocumento = 'A' THEN
      ADD_PRE_DOC_ITEM_EST_ATUALIZA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_item_idItemPreDocumento,
        p_estabelecimentoAtivo);
      ADD_PRE_DOC_ITEM_FIL_ATUALIZA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_item_idItemPreDocumento,
        p_estabelecimentoAtivo);
    END IF;
    r_buffer_idItemPreDocumento := CASE WHEN (r_buffer_idItemPreDocumento IS NULL OR r_buffer_idItemPreDocumento = '' OR r_buffer_idItemPreDocumento = ' ') THEN '' ELSE RTRIM (r_buffer_idItemPreDocumento) || ';' END || TO_CHAR (LPAD(r_item_idItemPreDocumento,14,'0'));
    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;
  END IF;
END ADD_PRE_DOC_ITEM_GRAVA;

/

create or replace PROCEDURE ADD_DOCTROCA_CAB_EXCLUI (
  p_documentoTroca IN NUMBER)
IS
  v_idFinanceiroAdiantamento NUMBER;
BEGIN
  SELECT idFinanceiroAdiantamento
  INTO v_idFinanceiroAdiantamento
  FROM MODOCUMENTOSTROCA
  WHERE documentoTroca = p_documentoTroca;
  FOR a IN (
    SELECT idItemDocTroca
    FROM MODOCTROCAXITENS
    WHERE documentoTroca = p_documentoTroca)
  LOOP
    ADD_DOCTROCA_ITEM_EXCLUI (a.idItemDocTroca);
  END LOOP;
  DELETE MODOCUMENTOSTROCA
  WHERE documentoTroca = p_documentoTroca;
  IF v_idFinanceiroAdiantamento > 0 THEN
    ADD_FINANC_EXCLUI (v_idFinanceiroAdiantamento);
  END IF;
END ADD_DOCTROCA_CAB_EXCLUI;

/

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

/

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

/

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

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_REF_DFE_GRAD (
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_config_230_etapaPedComprParc IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_cab_idDocumentoFiscal        IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_documentoFiscal          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_sequencia               IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  p_gradeDistribuicaoDFe         IN NUMBER,
  p_atualizarObservacoes         IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes         OUT NUMBER)
IS
  v_novaEtapaOrcamento NUMBER;
  v_quantidadeSaldo    NUMBER;
  v_auxNumber          NUMBER;
  v_auxChar            CHAR (1);
  v_auxVarchar         VARCHAR2 (32000);
BEGIN
  FOR a IN (
    SELECT
      a.idItemOrcamento,
      a.quantidadeSaldo,
      a.quantidadeBaixar,
      a.zerarSaldo,
      b.orcamento
    FROM MODISTRIBUICAODFEXORCAM a
    JOIN MOORCAMENTOXITENS b
    ON b.idItemOrcamento = a.idItemOrcamento
    WHERE a.gradeDistribuicaoDFe = p_gradeDistribuicaoDFe
    AND a.quantidadeBaixar > 0
    ORDER BY a.sequencia)
  LOOP
    UPDATE MODISTRIBUICAODFEXGRADE
    SET idItemDocFiscal = p_item_idItemDocFiscal
    WHERE gradeDistribuicaoDFe = p_gradeDistribuicaoDFe;
    ADD_DOC_FISC_ITEM_REF_ORCAMEN (
      p_usuarioLogado,
      p_estabelecimentoAtivo,
      p_config_227_manterPessoaOrcam,
      p_cab_idDocumentoFiscal,
      p_cab_tipoDocumento,
      p_cab_documentoFiscal,
      p_cab_estabelecimento,
      p_cab_pessoa,
      p_item_idItemDocFiscal,
      p_item_sequencia,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_unidadeMedidaConversao,
      p_item_quantidadeConvertida,
      p_item_valorLiquidoItem,
      a.idItemOrcamento,
      CASE WHEN a.zerarSaldo = 1 THEN a.quantidadeSaldo ELSE a.quantidadeBaixar END,
      r_atualizarObservacoes,
      r_atualizarObservacoes);  
    SELECT COALESCE (SUM(b.quantidadeSaldo),0)
    INTO v_quantidadeSaldo
    FROM MOORCAMENTOXITENS b
    WHERE b.orcamento = a.orcamento
    AND b.cancelado = 0;
    IF v_quantidadeSaldo <= 0 THEN
      SELECT COALESCE(MAX(etapaOrcamento),0)
      INTO v_novaEtapaOrcamento
      FROM PAETAPASORCAMENTO
      WHERE etapaOrcamento > 0
      AND ativo = 1
      AND situacaoOrcamento = 80;      
      ADD_ORCAMENTO_CAB_ETAPA_TROCA (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        p_person_190_modeloFrete,
        p_config_378_calcularVolumes,
        a.orcamento,
        p_usuarioLogado,
        v_novaEtapaOrcamento,
        ' ',
        0,
        0,
        v_auxNumber,
        v_auxVarchar,
        v_auxNumber,
        v_auxChar,
        v_auxNumber);
    ELSE
      v_novaEtapaOrcamento := p_config_230_etapaPedComprParc;
    END IF;  
    IF v_novaEtapaOrcamento <> 0 THEN
      ADD_ORCAMENTO_CAB_ETAPA_TROCA (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        p_person_190_modeloFrete,
        p_config_378_calcularVolumes,
        a.orcamento,
        p_usuarioLogado,
        v_novaEtapaOrcamento,
        ' ',
        0,
        0,
        v_auxNumber,
        v_auxVarchar,
        v_auxNumber,
        v_auxChar,
        v_auxNumber);
    END IF;
  END LOOP;
END ADD_DOC_FISC_ITEM_REF_DFE_GRAD;

/

create or replace PROCEDURE ADD_DOC_FISC_PAG_EXCLUI_CORREL (
  p_idPagamentoDocFiscal IN NUMBER)
IS
  v_auxNumber NUMBER;
BEGIN
  ADD_MOTIVO_DOC_FISC_PAG_EXCLUI (
    p_idPagamentoDocFiscal,
    0,
    v_auxNumber);
  FOR a IN (
    SELECT idFinanceiro
    FROM MOFINANCEIROS
    WHERE idPagamentoDocFiscal = p_idPagamentoDocFiscal)
  LOOP
    ADD_FINANC_EXCLUI (a.idFinanceiro);
  END LOOP;
  DELETE MODOCFISCALXPROMOCOES
  WHERE idPagamentoDocFiscal = p_idPagamentoDocFiscal;
  UPDATE MOTRANSACOESTEF
  SET idPagamentoDocFiscal = 0
  WHERE idPagamentoDocFiscal = p_idPagamentoDocFiscal;
END ADD_DOC_FISC_PAG_EXCLUI_CORREL;

/

create or replace PROCEDURE ADD_DOC_FISC_PAG_EXCLUI_TROCA (
  p_calcularImpostos            IN NUMBER,
  p_cab_idDocumentoFiscal       IN NUMBER,
  p_cab_valorDescontoGeral      IN NUMBER,
  p_cab_valorOutrasDespesasGer  IN NUMBER,
  p_cab_valorDescontoPagamento  IN NUMBER,
  p_cab_valorOutrasDespPag      IN NUMBER,
  p_cab_valorJurosPagamento     IN NUMBER,
  p_cab_promocaoExiste          IN NUMBER,
  p_item_valorDescontoGeral     IN NUMBER,
  p_item_valorDescontoPagamento IN NUMBER,
  p_item_valorOutrasDespPag     IN NUMBER,
  p_item_valorJurosPagamento    IN NUMBER,
  /* Retornos */
  r_calcularImpostos            OUT NUMBER,
  r_cab_valorDescontoGeral      OUT NUMBER,
  r_cab_condicaoPagamento       OUT NUMBER,
  r_cab_numeroParcelas          OUT NUMBER,
  r_cab_somaPrazoParcelas       OUT NUMBER,
  r_cab_valorXPrazoParcelas     OUT NUMBER,
  r_cab_prazoMedio              OUT NUMBER,
  r_cab_prazoMedioPonderado     OUT NUMBER,
  r_cab_valorEntradaMinima      OUT NUMBER,
  r_cab_valorAVistaEntrada      OUT NUMBER,
  r_cab_valorPagamentoBruto     OUT NUMBER,
  r_cab_valorDescontoPagamento  OUT NUMBER,
  r_cab_valorOutrasDespPag      OUT NUMBER,
  r_cab_valorJurosPagamento     OUT NUMBER,
  r_cab_valorPagamentoLiquido   OUT NUMBER,
  r_cab_valorTroco              OUT NUMBER,
  r_item_valorDescontoGeral     OUT NUMBER,
  r_item_valorDescontoPagamento OUT NUMBER,
  r_item_valorOutrasDespPag     OUT NUMBER,
  r_item_valorJurosPagamento    OUT NUMBER)    
IS
BEGIN
  r_calcularImpostos            := p_calcularImpostos;
  r_cab_valorDescontoGeral      := p_cab_valorDescontoGeral;
  r_cab_valorDescontoPagamento  := p_cab_valorDescontoPagamento;
  r_cab_valorOutrasDespPag      := p_cab_valorOutrasDespPag;
  r_cab_valorJurosPagamento     := p_cab_valorJurosPagamento;
  r_item_valorDescontoGeral     := p_item_valorDescontoGeral;
  r_item_valorDescontoPagamento := p_item_valorDescontoPagamento;
  r_item_valorOutrasDespPag     := p_item_valorOutrasDespPag;
  r_item_valorJurosPagamento    := p_item_valorJurosPagamento;
  IF (p_cab_valorDescontoGeral <> 0
    OR p_cab_valorOutrasDespesasGer <> 0
    OR r_cab_valorDescontoPagamento <> 0
    OR r_cab_valorOutrasDespPag <> 0
    OR r_cab_valorJurosPagamento <> 0
    OR r_item_valorDescontoPagamento <> 0
    OR r_item_valorOutrasDespPag <> 0
    OR r_item_valorJurosPagamento <> 0
    OR p_cab_promocaoExiste = 1)
  THEN
    IF p_cab_promocaoExiste = 1 THEN
      r_item_valorDescontoGeral := 0;
    END IF;
    r_calcularImpostos := 1;
    r_item_valorDescontoPagamento := 0;
    r_item_valorOutrasDespPag := 0;
    r_item_valorJurosPagamento := 0;
    /* Remove dados Pagamentos Itens */
    UPDATE MODOCFISCALXITENS
    SET
      valorDescontoGeral = CASE WHEN p_cab_promocaoExiste = 1 THEN 0 ELSE valorDescontoGeral END,
      valorOutrasDespesasGeral = CASE WHEN p_cab_promocaoExiste = 1 THEN 0 ELSE valorOutrasDespesasGeral END,
      valorDescontoPagamento = 0,
      valorOutrasDespesasPagamento = 0,
      valorJurosPagamento = 0
    WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal;
  END IF;
  IF p_cab_promocaoExiste = 1 THEN
    r_cab_valorDescontoGeral := 0;
  END IF;
  r_cab_condicaoPagamento := 0;
  r_cab_numeroParcelas := 0;
  r_cab_somaPrazoParcelas := 0;
  r_cab_valorXPrazoParcelas := 0;
  r_cab_prazoMedio := 0;
  r_cab_prazoMedioPonderado := 0;
  r_cab_valorEntradaMinima := 0;
  r_cab_valorAVistaEntrada := 0;
  r_cab_valorPagamentoBruto := 0;
  r_cab_valorDescontoPagamento := 0;
  r_cab_valorOutrasDespPag := 0;
  r_cab_valorJurosPagamento := 0;
  r_cab_valorPagamentoLiquido := 0;
  r_cab_valorTroco := 0;
  FOR a IN (
    SELECT
      idPagamentoDocFiscal,
      pagamentoTroco,
      valorDescontoPagamento,
      valorOutrasDespesasPagamento,
      valorJurosPagamento
    FROM MODOCFISCALXPAGAMENTOS
    WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal)
  LOOP
    IF (a.pagamentoTroco = 'P' 
      AND (a.valorDescontoPagamento <> 0 
        OR a.valorOutrasDespesasPagamento <> 0 
        OR a.valorJurosPagamento <> 0)) THEN
      r_calcularImpostos := 1;
    END IF;
    ADD_DOC_FISC_PAG_EXCLUI_CORREL (a.idPagamentoDocFiscal);
    DELETE MODOCFISCALXPAGAMENTOS b
    WHERE b.idPagamentoDocFiscal = a.idPagamentoDocFiscal;
  END LOOP;
  DELETE MODOCFISCALXPROMOCOES
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal;  
END ADD_DOC_FISC_PAG_EXCLUI_TROCA;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_EXCLUI (
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_person_184_tipoEventoCancCon IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_95_etapaOrcamentoCanc IN NUMBER,
  p_config_96_etapaOrdemServCanc IN NUMBER,
  p_config_97_etapaPedCompraCanc IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_415_etapaFatContrCanc IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_cancelando_Excluindo         IN CHAR,
  p_cancelandoExcluindoDocumento IN NUMBER,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_atualizaUltimaCompra     NUMBER;
  v_cab_estabelecimento          NUMBER;
  v_cab_nfFornecedor             NUMBER;
  v_cab_documentoFiscal          NUMBER;
  v_cab_dataEntradaSaida         DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  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_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota NUMBER;
  v_cab_promocaoExiste           NUMBER;
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  FOR a IN (
    SELECT
      item.idDocumentoFiscal,
      item.gradeProduto,
      item.cancelado,
      item.usarPrecoAVista,
      item.geraFinanceiro,
      item.controleQuantidade,
      item.loteMultiplo,
      item.quantidade,
      item.quantidadeConvertida,
      item.pesoLiquido,
      item.pesoBruto,
      item.valorProdutoServicoBruto,
      item.valorProdutoServico,
      item.valorDescontoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      item.valorFreteGeral,
      item.valorSeguroGeral,
      item.valorDescontoGeral,
      item.valorOutrasDespesasGeral,
      item.valorAdicFreteMarinhaMerGeral,
      item.valorDespesasAduaneirasGeral,
      item.valorBasePagamento,
      item.valorDescontoPagamento,
      item.valorOutrasDespesasPagamento,
      item.valorJurosPagamento,
      item.valorFreteTotal,
      item.valorSeguroTotal,
      item.valorDescontoTotal,
      item.valorOutrasDespesasTotal,
      item.valorAdicFreteMarinhaMerTotal,
      item.valorDespesasAduaneirasTotal,
      item.valorLiquidoItem,
      item.valorDescontoCustoOpItem,
      item.valorDescontoCustoOpGeral,
      item.valorDescontoCustoOpTotal,
      item.valorAcrescimoCustoOpItem,
      item.valorAcrescimoCustoOpGeral,
      item.valorAcrescimoCustoOpTotal,
      item.valorCustoOperacao,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.valorAcrescimoExtempSubtotal,
      item.valorAcrescimoExtempItem,
      item.valorAcrescimoExtempGeral,
      item.valorAcrescimoExtempTotal,
      gradProd.produto,
      prod.tipoProduto
    FROM MODOCFISCALXITENS item
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE item.idItemDocFiscal = p_item_idItemDocFiscal)
  LOOP
    SELECT
      cab.origemDocumento,
      cab.tipoDocumento,
      cab.entradaSaida,
      cab.devolucaoAnulacaoRetorno,
      cab.atualizaCustoMedio,
      cab.atualizaUltimaCompra,
      cab.estabelecimento,
      cab.nfFornecedor,
      cab.documentoFiscal,
      cab.dataEntradaSaida,
      cab.pessoa,
      cab.modalidadeFrete,
      cab.tipoPagamentoFrete,
      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,
      cab.valorDescontoCustoOpItem,
      cab.valorDescontoCustoOpGeral,
      cab.valorDescontoCustoOpTotal,
      cab.valorAcrescimoCustoOpItem,
      cab.valorAcrescimoCustoOpGeral,
      cab.valorAcrescimoCustoOpTotal,
      cab.valorCustoOperacao,
      cab.valorCMV,
      cab.quantidadeExtemporanea,
      cab.valorAcrescimoExtempSubtotal,
      cab.valorAcrescimoExtempItem,
      cab.valorAcrescimoExtempGeral,
      cab.valorAcrescimoExtempTotal
    INTO
      v_cab_origemDocumento,
      v_cab_tipoDocumento,
      v_cab_entradaSaida,
      v_cab_devolucaoAnulacaoRetorno,
      v_cab_atualizaCustoMedio,
      v_cab_atualizaUltimaCompra,
      v_cab_estabelecimento,
      v_cab_nfFornecedor,
      v_cab_documentoFiscal,
      v_cab_dataEntradaSaida,
      v_cab_pessoa,
      v_cab_modalidadeFrete,
      v_cab_tipoPagamentoFrete,
      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_cab_valorDescontoCustoOpItem,
      v_cab_valorDescontoCustoOpGera,
      v_cab_valorDescontoCustoOpTota,
      v_cab_valorAcrescimoCustoOpIte,
      v_cab_valorAcrescimoCustoOpGer,
      v_cab_valorAcrescimoCustoOpTot,
      v_cab_valorCustoOperacao,
      v_cab_valorCMV,
      v_cab_quantidadeExtemporanea,
      v_cab_valorAcrescimoExtempSubt,
      v_cab_valorAcrescimoExtempItem,
      v_cab_valorAcrescimoExtempGera,
      v_cab_valorAcrescimoExtempTota
    FROM MODOCUMENTOSFISCAIS cab
    WHERE cab.idDocumentoFiscal = a.idDocumentoFiscal;
    IF p_cancelandoExcluindoDocumento = 0
      AND a.cancelado = 0
    THEN
      SELECT COALESCE (MAX(1), 0)
      INTO v_cab_promocaoExiste
      FROM MODOCFISCALXPROMOCOES
      WHERE idDocumentoFiscal = a.idDocumentoFiscal;
      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 NOT(p_person_190_modeloFrete IS NULL)
        AND p_person_190_modeloFrete <> ' '
        AND a.valorFreteTotal <> 0
        AND v_cab_valorFreteTotal - a.valorFreteTotal <= 0
      THEN
        v_cab_modalidadeFrete := '9';
      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;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      IF v_cab_valorDescontoGeral <> 0
        OR v_cab_valorOutrasDespesasGeral <> 0
        OR v_cab_valorPagamentoBruto <> 0
        OR v_cab_promocaoExiste = 1
      THEN
        ADD_DOC_FISC_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          a.idDocumentoFiscal,
          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;
      UPDATE MODOCUMENTOSFISCAIS SET
        modalidadeFrete               = v_cab_modalidadeFrete,
        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,
        valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
        valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
        valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
        valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
        valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
        valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
        valorCustoOperacao            = v_cab_valorCustoOperacao,
        valorCMV                      = v_cab_valorCMV,
        quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
        valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
        valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
        valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
        valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
      WHERE idDocumentoFiscal = a.idDocumentoFiscal;
    END IF;
    -- Cancela / Exclui Transferências vinculadas.
    FOR b IN (
      SELECT
        itemTransf.documentoTransferencia,
        docXTransf.entradaSaidaOriginal
      FROM MODOCTRANSFXDOCFISCAL docXTransf
      JOIN MODOCUMENTOTRANSFXITENS itemTransf
      ON itemTransf.idItemDocTransferencia = docXTransf.idItemDocTransferencia
      WHERE docXTransf.idItemDocFiscal = p_item_idItemDocFiscal
      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 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'
        AND docXTransf2.idItemDocFiscal <> docXTransf.idItemDocFiscal)
      GROUP BY
        itemTransf.documentoTransferencia,
        docXTransf.entradaSaidaOriginal)
    LOOP
      IF b.entradaSaidaOriginal = 'O' THEN
        ADD_DOCTRANSF_CAB_EXCLUI (b.documentoTransferencia);
      ELSIF p_cancelando_Excluindo = 'C' THEN
        ADD_DOCTRANSF_CAB_SIT_GRAVA (
          p_estabelecimentoAtivo,
          b.documentoTransferencia,
          'C',
          'Cancelamento Automático');
      END IF;
    END LOOP;
    IF v_cab_entradaSaida='E'
      AND v_cab_devolucaoAnulacaoRetorno = 0
      AND v_cab_atualizaUltimaCompra = 1
    THEN
      ADD_PRODUTO_CUSTO_DATA_EXCLUI (
        a.produto,
        v_cab_dataEntradaSaida);
    END IF;
    ADD_MOTIVO_DOC_FISC_ITE_EXCLUI (
      p_item_idItemDocFiscal,
      0,
      v_auxNumber);
    ADD_ESTOQUE_DOC_FISC_EXCLUI (
      p_item_idItemDocFiscal,
      '',
      v_auxVarchar);
    ADD_VALEDESCONTO_DOC_ITE_EXCL (
      p_item_idItemDocFiscal,
      '',
      v_auxVarchar);
    ADD_SEPARACAO_ITEM_DOC_EXCLUI (p_item_idItemDocFiscal);
    DELETE MODOCFISCALXPRODUTOFILHO
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    DELETE MODOCFISCALXPROMOCOES
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    DELETE MOINGRESSOS
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    DELETE CATABELAPRECOXFORMACOESPR
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    FOR b IN (
      SELECT
        entrega,
        idItemOrcamento,
        quantidade
      FROM MOENTREGAS
      WHERE idItemDocFiscalRemessa = p_item_idItemDocFiscal)
    LOOP
      ADD_ENTREGA_SITUACAO_TROCA (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        b.idItemOrcamento,
        b.entrega,
        b.quantidade,
        1, -- p_situacaoEntrega
        'ADD_DOC_FISC_ITEM_EXCLUI');
    END LOOP;
    FOR b IN (
      SELECT idConserto
      FROM MOCONSERTOS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      IF p_cancelando_Excluindo = 'C' THEN
        ADD_CONSERTO_CANCELA (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_person_184_tipoEventoCancCon,
          b.idConserto);
      ELSE
        ADD_CONSERTO_EXCLUI (b.idConserto);
      END IF;
    END LOOP;
    UPDATE MOCONSERTOS SET
      idItemDocFiscalDevolucao = 0,
      situacaoConserto = 'I'
    WHERE idItemDocFiscalDevolucao = p_item_idItemDocFiscal;
    FOR b IN (
      SELECT
        id,
        idItemOrcamento,
        quantidade
      FROM MODOCFISCALXORCAMENTOITEM
      WHERE idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      IF b.quantidade <> 0 THEN
        ADD_ORCAMENTO_ITEM_SALDO_VOLTA (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_person_184_tipoEventoCancCon,
          p_config_95_etapaOrcamentoCanc,
          p_config_96_etapaOrdemServCanc,
          p_config_97_etapaPedCompraCanc,
          p_config_415_etapaFatContrCanc,
          b.idItemOrcamento,
          b.quantidade);
      END IF;
      DELETE MODOCFISCALXORCAMENTOITEM c
      WHERE c.id = b.id;
    END LOOP;
    FOR b IN (
      SELECT
        docXDoc.id,
        docXDoc.idItemPreDocReferenciado,
        docXDoc.quantidade,
        itemPre.preDocumento,
        cabPre.statusPreDocumento
      FROM MODOCFISCALXPREDOCUM docXDoc
      JOIN MOPREDOCUMXITENS itemPre
      ON itemPre.idItemPreDocumento = docXDoc.idItemPreDocReferenciado
      JOIN MOPREDOCUMENTOS cabPre
      ON cabPre.predocumento = itemPre.preDocumento
      WHERE docXDoc.idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      IF v_cab_devolucaoAnulacaoRetorno = 1 THEN
        FOR c IN (
          SELECT
            c.entrega,
            c.idItemOrcamento,
            c.quantidade,
            c.situacaoEntrega
          FROM MOENTREGAS c
          WHERE c.idItemPreDocumentoRemessa = b.idItemPreDocReferenciado
          AND c.situacaoEntrega IN (6,7))
        LOOP
          ADD_ENTREGA_SITUACAO_TROCA (
            p_usuarioLogado,
            p_estabelecimentoAtivo,
            c.idItemOrcamento,
            c.entrega,
            c.quantidade,
            c.situacaoEntrega - 1,
            'ADD_DOC_FISC_ITEM_EXCLUI');
        END LOOP;
      END IF;
      IF b.quantidade <> 0 THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_devolucaoAnulacaoRetorno,
          'D',
          p_item_idItemDocFiscal,
          - b.quantidade,
          - a.quantidadeConvertida,
          'P',
          b.idItemPreDocReferenciado);
      END IF;
      IF v_cab_origemDocumento IN (10,13)
        AND b.statusPreDocumento = 'F'
      THEN
        UPDATE MOPREDOCUMENTOS c
        SET c.statusPreDocumento = 'A'
        WHERE c.preDocumento = b.preDocumento;
      END IF;
      DELETE MODOCFISCALXPREDOCUM c
      WHERE c.id = b.id;
    END LOOP;
    DELETE MOPREDOCUMXDOCFISCAL
    WHERE idItemDocFiscalReferenciado = p_item_idItemDocFiscal;
    FOR b IN (
      SELECT
        id,
        idItemDocFiscalReferenciado,
        quantidade
      FROM MODOCFISCALXDOCFISCAL a
      WHERE idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      IF v_cab_devolucaoAnulacaoRetorno = 1 THEN
        FOR c IN (
          SELECT
            c.entrega,
            c.idItemOrcamento,
            c.quantidade,
            c.situacaoEntrega
          FROM MOENTREGAS c
          WHERE c.idItemDocFiscalRemessa = b.idItemDocFiscalReferenciado
          AND c.situacaoEntrega IN (6,7))
        LOOP
          ADD_ENTREGA_SITUACAO_TROCA (
            p_usuarioLogado,
            p_estabelecimentoAtivo,
            c.idItemOrcamento,
            c.entrega,
            c.quantidade,
            c.situacaoEntrega - 1,
            'ADD_DOC_FISC_ITEM_EXCLUI');
        END LOOP;
      END IF;
      IF b.quantidade <> 0 THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_devolucaoAnulacaoRetorno,
          'D',
          p_item_idItemDocFiscal,
          - b.quantidade,
          - a.quantidadeConvertida,
          'D',
          b.idItemDocFiscalReferenciado);
      END IF;
      DELETE MODOCFISCALXDOCFISCAL c
      WHERE c.id = b.id;
    END LOOP;
    DELETE MODOCFISCALXDOCFISCAL
    WHERE idItemDocFiscalReferenciado = p_item_idItemDocFiscal;
    DELETE MODOCTRANSFXDOCFISCAL
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    DELETE MOBALANCOXDOCFISCAL
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    UPDATE MODISTRIBUICAODFEXGRADE
    SET idItemDocFiscal = 0
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    IF p_cancelando_Excluindo = 'C' THEN
      UPDATE MODOCFISCALXITENS
      SET cancelado = 1
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    ELSE
      DELETE MODOCFISCALXCOMPOSICOESPR
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXNUMEROSSERIE
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXNUMEROSSERIE b
      WHERE b.idEnderecoEstoqueDocFiscal > 0
      AND EXISTS (
        SELECT 1
        FROM MODOCFISCALXENDERECOESTOQ c
        WHERE c.idEnderecoEstoqueDocFiscal = b.idEnderecoEstoqueDocFiscal
        AND c.idItemDocFiscal = p_item_idItemDocFiscal);
      DELETE MODOCFISCALXENDERECOESTOQ
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXEMBALAGENSTIN
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXCENTROSCUSTOS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXPROJETOS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCTROCAXITENS
      WHERE idItemDocFiscalSaida = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXITENS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      IF p_cancelandoExcluindoDocumento = 0 THEN
        v_auxNumber := 0;
        FOR b IN (
          SELECT idItemDocFiscal
          FROM MODOCFISCALXITENS b
          WHERE b.idDocumentoFiscal = a.idDocumentoFiscal
          AND b.idItemDocFiscal <> p_item_idItemDocFiscal
          ORDER BY b.sequencia)
        LOOP
          v_auxNumber := v_auxNumber + 1;
          UPDATE MODOCFISCALXITENS c
          SET c.sequencia = v_auxNumber
          WHERE c.idItemDocFiscal = b.idItemDocFiscal;
        END LOOP;
      END IF;
    END IF;
  END LOOP;
END ADD_DOC_FISC_ITEM_EXCLUI;

/

create or replace PROCEDURE ADD_DOC_FISC_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_227_manterPessoaOrcam IN NUMBER,
  p_config_230_etapaPedComprParc IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     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, -- B = Balanço, D = Documento Fiscal, G = Grade DF-e, O = Orçamento, P, Pré-Documento, T = Transferência
  p_idItemReferenciado           IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_tempComp_nomeTempComposicao  IN VARCHAR2,
  p_tempComp_sequencia           IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_idDocumentoFiscal       IN NUMBER,
  p_item_pedidoCompraFornecedor  IN VARCHAR2,
  p_item_sequenciaPedidoCompraFo IN NUMBER,
  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_quantidadeExtemporanea  IN NUMBER,
  p_item_acrescimoUnitarioExtemp IN NUMBER,
  p_item_valorAcrescimoExtempIte IN NUMBER,
  p_item_valorDescontoCustoOpIte IN NUMBER,
  p_item_valorAcrescimoCustoOpIt 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_valorAcrescimoExtempGer IN NUMBER,
  p_item_valorDescontoCustoOpGer IN NUMBER,
  p_item_valorAcrescimoCustoOpGe IN NUMBER,
  p_item_valorDescontoPagamento  IN NUMBER,
  p_item_valorOutrasDespPagament IN NUMBER,
  p_item_valorJurosPagamento     IN NUMBER,
  p_item_percentualDevolucao     IN NUMBER,
  p_item_valorIPIDevolucao       IN NUMBER,
  p_item_operacaoFiscal          IN NUMBER,
  p_item_movimentaEstoque        IN NUMBER,
  p_item_movimentaEstoqueFiscal  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_stICMSEscrituracao      IN CHAR,
  p_item_reducaoBaseICMSEscritur IN NUMBER,
  p_item_aliquotaICMSEscrituraca IN NUMBER,
  p_item_diferimentoICMSEscritur IN NUMBER,
  p_item_margemValorAdicSTEscrit IN NUMBER,
  p_item_reducaoBaseSTEscriturac IN NUMBER,
  p_item_aliquotaICMSSTEscritura IN NUMBER,
  p_item_somarICMSST             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_baseICMSEscrituracao    IN NUMBER,
  p_item_valorICMSEscrituracao   IN NUMBER,
  p_item_valorICMSDesonEscritura IN NUMBER,
  p_item_baseICMSSTEscrituracao  IN NUMBER,
  p_item_valorICMSSTEscrituracao 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_idItemDocFiscal       IN VARCHAR2,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER,
  r_item_idItemDocFiscal         OUT NUMBER,
  r_buffer_idItemDocFiscal       OUT VARCHAR2,
  r_valorInserido                OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_finalidadeNota           CHAR (1);
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_nfFornecedor             NUMBER;
  v_cab_documentoFiscal          NUMBER;
  v_cab_estabelecimento          NUMBER;
  v_cab_dataEmissao              DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_vendaConsumidor          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_situacaoDocumentoFiscal  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_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota 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_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_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_item_sequencia               NUMBER;
  v_item_cancelado               NUMBER;
  v_item_quantidadeDevolvidaRet  NUMBER;
  v_item_precoUnitario           NUMBER;
  v_item_precoUnitarioConvertido NUMBER;
  v_item_valorProdutoServicoBrut NUMBER;
  v_item_valorProdutoServico     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_movimentaEstoqueFiscal  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_stICMSEscrituracao      CHAR (2);
  v_item_reducaoBaseICMSEscritur NUMBER;
  v_item_aliquotaICMSEscrituraca NUMBER;
  v_item_diferimentoICMSEscritur NUMBER;
  v_item_margemValorAdicSTEscrit NUMBER;
  v_item_reducaoBaseSTEscriturac NUMBER;
  v_item_aliquotaICMSSTEscritura NUMBER;
  v_item_somarICMSST             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_baseICMSEscrituracao    NUMBER;
  v_item_valorICMSEscrituracao   NUMBER;
  v_item_valorICMSDesonEscritura NUMBER;
  v_item_baseICMSSTEscrituracao  NUMBER;
  v_item_valorICMSSTEscrituracao 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_item_valorDescontoCustoOpTot NUMBER;
  v_item_valorAcrescimoCustoOpTo NUMBER;
  v_item_precoCustoOperacao      NUMBER;
  v_item_valorCustoOperacao      NUMBER;
  v_item_precoCMV                NUMBER;
  v_item_valorCMV                NUMBER;
  v_item_valorAcrescimoExtempSub NUMBER;
  v_item_valorAcrescimoExtempTot 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_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_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  r_item_idItemDocFiscal := p_item_idItemDocFiscal;
  r_buffer_idItemDocFiscal := p_buffer_idItemDocFiscal;
  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.devolucaoAnulacaoRetorno,
    cab.finalidadeNota,
    cab.atualizaCustoMedio,
    cab.nfFornecedor,
    cab.documentoFiscal,
    cab.estabelecimento,
    cab.dataEmissao,
    cab.pessoa,
    cab.vendaConsumidor,
    cab.enderecoEntregaPessoa,
    cab.municipioFatoGerador,
    cab.localDestinoOperacao,
    cab.indicadorConsumidorFinal,
    cab.modalidadeFrete,
    cab.tipoPagamentoFrete,
    cab.situacaoDocumentoFiscal,
    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,
    cab.valorDescontoCustoOpItem,
    cab.valorDescontoCustoOpGeral,
    cab.valorDescontoCustoOpTotal,
    cab.valorAcrescimoCustoOpItem,
    cab.valorAcrescimoCustoOpGeral,
    cab.valorAcrescimoCustoOpTotal,
    cab.valorCustoOperacao,
    cab.valorCMV,
    cab.quantidadeExtemporanea,
    cab.valorAcrescimoExtempSubtotal,
    cab.valorAcrescimoExtempItem,
    cab.valorAcrescimoExtempGeral,
    cab.valorAcrescimoExtempTotal,
    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
  INTO
    v_cab_origemDocumento,
    v_cab_tipoDocumento,
    v_cab_entradaSaida,
    v_cab_devolucaoAnulacaoRetorno,
    v_cab_finalidadeNota,
    v_cab_atualizaCustoMedio,
    v_cab_nfFornecedor,
    v_cab_documentoFiscal,
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_pessoa,
    v_cab_vendaConsumidor,
    v_cab_enderecoEntregaPessoa,
    v_cab_municipioFatoGerador,
    v_cab_localDestinoOperacao,
    v_cab_indicadorConsumidorFinal,
    v_cab_modalidadeFrete,
    v_cab_tipoPagamentoFrete,
    v_cab_situacaoDocumentoFiscal,
    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_cab_valorDescontoCustoOpItem,
    v_cab_valorDescontoCustoOpGera,
    v_cab_valorDescontoCustoOpTota,
    v_cab_valorAcrescimoCustoOpIte,
    v_cab_valorAcrescimoCustoOpGer,
    v_cab_valorAcrescimoCustoOpTot,
    v_cab_valorCustoOperacao,
    v_cab_valorCMV,
    v_cab_quantidadeExtemporanea,
    v_cab_valorAcrescimoExtempSubt,
    v_cab_valorAcrescimoExtempItem,
    v_cab_valorAcrescimoExtempGera,
    v_cab_valorAcrescimoExtempTota,
    v_est_grupoFiscal,
    v_pessEst_regimeTributario,
    v_munEndEst_uf,
    v_pess_indicadorInscricaoEstad,
    v_endPess_enderecoPessoa,
    v_munEndPess_uf,
    v_munEndEntr_uf
  FROM MODOCUMENTOSFISCAIS 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
  WHERE cab.idDocumentoFiscal = p_item_idDocumentoFiscal;
  v_ini_cab_valorFreteItem := v_cab_valorFreteItem;
  v_ini_cab_valorFreteGeral := v_cab_valorFreteGeral;
  SELECT
    diminuiDescontoPrUnit,
    somaAcrescimosPrUnit,
    somaFreteSeguroPrUnit
  INTO
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit
  FROM PAMODELOSDOCUMENTO
  WHERE modeloDocumento = p_item_modeloDocumento;
  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_valorFreteTotal          := 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_item_quantidadeDevolvidaRet  := 0;
  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_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_movimentaEstoqueFiscal  := p_item_movimentaEstoqueFiscal;
  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_stICMSEscrituracao      := p_item_stICMSEscrituracao;
  v_item_reducaoBaseICMSEscritur := p_item_reducaoBaseICMSEscritur;
  v_item_aliquotaICMSEscrituraca := p_item_aliquotaICMSEscrituraca;
  v_item_diferimentoICMSEscritur := p_item_diferimentoICMSEscritur;
  v_item_margemValorAdicSTEscrit := p_item_margemValorAdicSTEscrit;
  v_item_reducaoBaseSTEscriturac := p_item_reducaoBaseSTEscriturac;
  v_item_aliquotaICMSSTEscritura := p_item_aliquotaICMSSTEscritura;
  v_item_somarICMSST             := p_item_somarICMSST;
  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_baseICMSEscrituracao    := p_item_baseICMSEscrituracao;
  v_item_valorICMSEscrituracao   := p_item_valorICMSEscrituracao;
  v_item_valorICMSDesonEscritura := p_item_valorICMSDesonEscritura;
  v_item_baseICMSSTEscrituracao  := p_item_baseICMSSTEscrituracao;
  v_item_valorICMSSTEscrituracao := p_item_valorICMSSTEscrituracao;
  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;
  IF p_manterFinanceiro_Retotalizar = 0 THEN
    SELECT COALESCE (MAX(1), 0)
    INTO v_cab_promocaoExiste
    FROM MODOCFISCALXPROMOCOES
    WHERE idDocumentoFiscal = p_item_idDocumentoFiscal;
  END IF;
  IF p_item_idItemDocFiscal > 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.quantidadeDevolvidaRetornada,
        a.pesoLiquido,
        a.pesoBruto,
        a.valorProdutoServicoBruto,
        a.valorProdutoServico,
        a.valorDescontoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.quantidadeExtemporanea,
        a.valorAcrescimoExtempSubtotal,
        a.valorAcrescimoExtempItem,
        a.valorDescontoCustoOpItem,
        a.valorAcrescimoCustoOpItem,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorAcrescimoExtempGeral,
        a.valorDescontoCustoOpGeral,
        a.valorAcrescimoCustoOpGeral,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.valorFreteTotal,
        a.valorSeguroTotal,
        a.valorDescontoTotal,
        a.valorOutrasDespesasTotal,
        a.valorAdicFreteMarinhaMerTotal,
        a.valorDespesasAduaneirasTotal,
        a.valorAcrescimoExtempTotal,
        a.valorDescontoCustoOpTotal,
        a.valorAcrescimoCustoOpTotal,
        a.operacaoFiscal,
        a.movimentaEstoque,
        a.movimentaEstoqueFiscal,
        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.stICMSEscrituracao,
        a.reducaoBaseICMSEscrituracao,
        a.aliquotaICMSEscrituracao,
        a.diferimentoICMSEscrituracao,
        a.margemValorAdicSTEscrituracao,
        a.reducaoBaseSTEscrituracao,
        a.aliquotaICMSSTEscrituracao,
        a.somarICMSST,
        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.baseICMSEscrituracao,
        a.valorICMSEscrituracao,
        a.valorICMSDesonEscrituracao,
        a.baseICMSSTEscrituracao,
        a.valorICMSSTEscrituracao,
        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,
        a.valorCustoOperacao,
        a.valorCMV,
        prod.tipoProduto
      FROM MODOCFISCALXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      WHERE a.idItemDocFiscal = p_item_idItemDocFiscal)
    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_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_item_quantidadeDevolvidaRet := a.quantidadeDevolvidaRetornada;
      IF p_buscarAliquotas_CalcularImp ='T'
      THEN
        v_item_movimentaEstoque        := a.movimentaEstoque;
        v_item_movimentaEstoqueFiscal  := a.movimentaEstoqueFiscal;
        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_stICMSEscrituracao      := a.stICMSEscrituracao;
        v_item_reducaoBaseICMSEscritur := a.reducaoBaseICMSEscrituracao;
        v_item_aliquotaICMSEscrituraca := a.aliquotaICMSEscrituracao;
        v_item_diferimentoICMSEscritur := a.diferimentoICMSEscrituracao;
        v_item_margemValorAdicSTEscrit := a.margemValorAdicSTEscrituracao;
        v_item_reducaoBaseSTEscriturac := a.reducaoBaseSTEscrituracao;
        v_item_aliquotaICMSSTEscritura := a.aliquotaICMSSTEscrituracao;
        v_item_somarICMSST             := a.somarICMSST;
        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_baseICMSEscrituracao    := a.baseICMSEscrituracao;
        v_item_valorICMSEscrituracao   := a.valorICMSEscrituracao;
        v_item_valorICMSDesonEscritura := a.valorICMSDesonEscrituracao;
        v_item_baseICMSSTEscrituracao  := a.baseICMSSTEscrituracao;
        v_item_valorICMSSTEscrituracao := a.valorICMSSTEscrituracao;
        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 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 <> p_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;
        v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
        v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
        v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
        v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
        v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
        v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
        v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
        v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
        v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
        v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
        v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
        v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
        v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      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,
    p_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);
  v_item_valorAcrescimoExtempSub := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
    p_item_quantidade,
    v_item_precoUnitario,
    p_item_quantidadeExtemporanea,
    p_item_acrescimoUnitarioExtemp);
  v_item_valorAcrescimoExtempTot := FUNC_ADD_CALC_EXTEMP_TOTAL(
    v_item_valorAcrescimoExtempSub,
    p_item_valorAcrescimoExtempIte,
    p_item_valorAcrescimoExtempGer);
  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,
        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 = CASE WHEN v_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
      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,
        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_DOC_FISC_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_227_manterPessoaOrcam,
        p_config_230_etapaPedComprParc,
        p_config_362_calcCustoPorGrade,
        p_config_378_calcularVolumes,
        p_config_413_obs_add_marca,
        p_manterFinanceiro_Retotalizar,
        'S', -- p_buscarAliquotas_CalcularImp
        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_calcularImpostos,
        0, -- p_item_idItemDocFiscal
        p_item_idDocumentoFiscal,
        p_item_pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo,
        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
        CASE
          WHEN p_item_quantidade = 0
          THEN 0
          ELSE ROUND(p_item_quantidadeExtemporanea * a.quantidade / p_item_quantidade, 2)
        END, -- p_item_quantidadeExtemporanea
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_acrescimoUnitarioExtemp
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_acrescimoUnitarioExtemp
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoExtempIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpIt
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpIt
        p_item_observacoesDigitadas,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorFreteGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_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_valorAcrescimoExtempGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpGe
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpGe
        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
        p_item_percentualDevolucao,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorIPIDevolucao
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorIPIDevolucao,
        v_combo_operacaoFiscal,
        p_item_movimentaEstoque,
        p_item_movimentaEstoqueFiscal,
        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
        '  ', -- p_item_stICMSEscrituracao
        0, -- p_item_reducaoBaseICMSEscritur
        0, -- p_item_aliquotaICMSEscrituraca
        0, -- p_item_diferimentoICMSEscritur
        0, -- p_item_margemValorAdicSTEscrit
        0, -- p_item_reducaoBaseSTEscriturac
        0, -- p_item_aliquotaICMSSTEscritura
        0, -- p_item_somarICMSST
        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_baseICMSEscrituracao
        0, -- p_item_valorICMSEscrituracao
        0, -- p_item_valorICMSDesonEscritura
        0, -- p_item_baseICMSSTEscrituracao
        0, -- p_item_valorICMSSTEscrituracao
        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_idItemDocFiscal,
        /* Retornos */
        r_calcularImpostos,
        v_auxNumber, -- r_item_idItemDocFiscal
        r_buffer_idItemDocFiscal,
        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_DOC_FISC_ITEM_COMBO_RESID (
        p_item_idDocumentoFiscal,
        v_item_valorProdutoServico,
        p_item_valorDescontoItem,
        p_item_valorAcrescimoItem,
        v_modDoc_diminuiDescontoPrUnit,
        v_modDoc_somaAcrescimosPrUnit,
        r_buffer_idItemDocFiscal,
        r_valorInserido);
      r_calcularImpostos := 1;
    END IF;
  ELSE
    IF r_item_idItemDocFiscal <= 0 THEN
      r_item_idItemDocFiscal := FUNC_ADD_BUSCA_PROXIMO_ID ('MODOCFISCALXITENS', 'idItemDocFiscal', 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
          OR p_item_valorAcrescimoExtempGer <> 0
          OR p_item_valorDescontoCustoOpGer <> 0
          OR p_item_valorAcrescimoCustoOpGe <> 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_DOC_FISC_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          p_item_idDocumentoFiscal,
          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 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,
        p_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,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_finalidadeNota,
        v_cab_estabelecimento,
        v_cab_nfFornecedor,
        SYSDATE, -- p_cab_dataEmissao
        v_cab_pessoa,
        v_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,
        p_item_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
        1, -- 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_item_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_item_stICMSEscrituracao,
        v_item_reducaoBaseICMSEscritur,
        v_item_aliquotaICMSEscrituraca,
        v_item_diferimentoICMSEscritur,
        v_item_margemValorAdicSTEscrit,
        v_item_reducaoBaseSTEscriturac,
        v_item_aliquotaICMSSTEscritura,
        v_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,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_estabelecimento,
        v_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
        p_item_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
        1, -- p_calcularICMSEscrituracao
        v_item_stICMSEscrituracao,
        v_item_reducaoBaseICMSEscritur,
        v_item_aliquotaICMSEscrituraca,
        v_item_diferimentoICMSEscritur,
        0, -- p_baseICMSEscrituracao
        0, -- p_valorICMSEscrituracao
        0, -- p_valorICMSDesonEscrituracao
        1, -- p_calcularICMSSTEscrituracao
        v_item_margemValorAdicSTEscrit,
        v_item_reducaoBaseSTEscriturac,
        v_item_aliquotaICMSSTEscritura,
        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_item_baseICMSEscrituracao,
        v_item_valorICMSEscrituracao,
        v_item_valorICMSDesonEscritura,
        v_item_baseICMSSTEscrituracao,
        v_item_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,
      v_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,
      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,
      v_item_valorICMSSTEscrituracao,
      v_item_somarICMSST,
      v_item_valorAcrescimoExtempTot,
      v_modDoc_geraFinanceiro);
    v_item_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
      v_cab_nfFornecedor,
      v_cab_tipoPagamentoFrete,
      v_item_valorProdutoServico,
      v_item_valorFreteTotal,
      v_item_valorSeguroTotal,
      v_item_valorDescontoTotal,
      v_item_valorOutrasDespesasTot,
      p_item_valorIPIDevolucao,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      v_item_valorICMSST,
      v_item_valorICMSSTEscrituracao,
      v_item_somarICMSST
      );

    ADD_CALCULA_CUSTO_CMV (
      v_cab_atualizaCustoMedio,
      v_cab_estabelecimento,
      v_cab_nfFornecedor,
      p_item_modeloDocumento,
      p_item_quantidade,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      p_item_valorIPIDevolucao,
      v_item_valorPIS,
      v_item_valorPISST,
      v_item_valorCOFINS,
      v_item_valorCOFINSST,
      v_item_valorCreditoSimplesNac,
      v_item_valorICMS,
      v_item_valorICMSST,
      v_item_valorICMSSTEscrituracao,
      v_item_valorLiquidoItem,
      p_item_valorDescontoCustoOpIte,
      p_item_valorDescontoCustoOpGer,
      p_item_valorAcrescimoCustoOpIt,
      p_item_valorAcrescimoCustoOpGe,
      v_item_valorAcrescimoExtempTot,
      v_item_valorDescontoCustoOpTot,
      v_item_valorAcrescimoCustoOpTo,
      v_item_precoCustoOperacao,
      v_item_valorCustoOperacao,
      v_item_precoCMV,
      v_item_valorCMV);
    IF v_inserindoItem = 1 THEN
      SELECT COALESCE (MAX (sequencia),0) + 1
      INTO v_item_sequencia
      FROM MODOCFISCALXITENS
      WHERE idDocumentoFiscal = p_item_idDocumentoFiscal;
      v_cab_ultimoVendedorItem := p_item_vendedor;
    END IF;
    IF v_item_cancelado = 0 THEN
      IF p_manterFinanceiro_Retotalizar <> 2 THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume + TRUNC(CASE WHEN p_item_controleQuantidade = 1 AND p_item_loteMultiplo <> 0 THEN p_item_quantidade / p_item_loteMultiplo ELSE p_item_quantidadeConvertida END,0);
        END IF;
        v_cab_pesoLiquido := v_cab_pesoLiquido + p_item_pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto + p_item_pesoBruto;
      END IF;
      v_cab_quantidade := v_cab_quantidade + p_item_quantidadeConvertida;
      IF v_prod_tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorServicos := v_cab_valorServicos + v_item_valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos + p_item_valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorProdutos := v_cab_valorProdutos + v_item_valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos + p_item_valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem + p_item_valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem + p_item_valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem + p_item_valorAdicFreteMarItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem + p_item_valorDespesasAduanItem;
      v_cab_valorFreteGeral := v_cab_valorFreteGeral + p_item_valorFreteGeral;
      v_cab_valorSeguroGeral := v_cab_valorSeguroGeral + p_item_valorSeguroGeral;
      v_cab_valorDescontoGeral := v_cab_valorDescontoGeral + v_item_valorDescontoGeral;
      v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral + p_item_valorOutrasDespesasGer;
      v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral + p_item_valorAdicFreteMarGeral;
      v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral + p_item_valorDespesasAduanGeral;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento + v_item_valorBasePagamento;
      IF p_item_usarPrecoAVista = 1
        AND v_item_geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo + v_item_valorProdutoServico - v_item_valorDescontoTotal + v_item_valorOutrasDespesasTot;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento + v_item_valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento + v_item_valorOutrasDespPagament;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento + v_item_valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal + v_item_valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal + v_item_valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal + v_item_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_item_valorOutrasDespesasTot;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal + v_item_valorAdicFreteMarTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal + v_item_valorDespesasAduanTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem + v_item_valorLiquidoItem;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem + p_item_valorDescontoCustoOpIte;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera + p_item_valorDescontoCustoOpGer;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota + v_item_valorDescontoCustoOpTot;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte + p_item_valorAcrescimoCustoOpIt;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer + p_item_valorAcrescimoCustoOpGe;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot + v_item_valorAcrescimoCustoOpTo;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao + v_item_valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV + v_item_valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea + p_item_quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt + v_item_valorAcrescimoExtempSub;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem + p_item_valorAcrescimoExtempIte;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera + p_item_valorAcrescimoExtempGer;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota + v_item_valorAcrescimoExtempTot;
    END IF;
    UPDATE MODOCUMENTOSFISCAIS SET
      modalidadeFrete               = v_cab_modalidadeFrete,
      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,
      valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
      valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
      valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
      valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
      valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
      valorCustoOperacao            = v_cab_valorCustoOperacao,
      valorCMV                      = v_cab_valorCMV,
      quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
      valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
      valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
      valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
    WHERE idDocumentoFiscal = p_item_idDocumentoFiscal;
    IF p_item_idItemDocFiscal > 0 THEN
      DELETE MODOCFISCALXCOMPOSICOESPR compDoc
      WHERE compDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND EXISTS(
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.produto = comp.produto
        WHERE comp.composicaoPreco = compDoc.composicaoPreco
        AND gradProd.gradeProduto <> p_item_gradeProduto);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      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_413_obs_add_marca,
      ' ',
      0,
      'D',
      p_item_idItemDocFiscal,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    MERGE INTO MODOCFISCALXITENS a USING (
      SELECT
        r_item_idItemDocFiscal         idItemDocFiscal,
        p_item_idDocumentoFiscal       idDocumentoFiscal,
        v_item_sequencia               sequencia,
        v_item_cancelado               cancelado,
        p_item_pedidoCompraFornecedor  pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo sequenciaPedidoCompraFornec,
        p_item_modeloDocumento         modeloDocumento,
        p_item_estabelecimentoOriginal estabelecimentoOriginal,
        p_item_vendedor                vendedor,
        p_item_gradeProduto            gradeProduto,
        p_item_idFormulaTinta          idFormulaTinta,
        p_item_personalizacao          personalizacao,
        p_item_idLoteEstoque           idLoteEstoque,
        p_item_operacaoFiscal          operacaoFiscal,
        v_item_movimentaEstoque        movimentaEstoque,
        v_item_movimentaEstoqueFiscal  movimentaEstoqueFiscal,
        v_item_geraFinanceiro          geraFinanceiro,
        p_item_localEstoque            localEstoque,
        p_item_pessoaParticipante      pessoaParticipante,
        p_item_controleQuantidade      controleQuantidade,
        p_item_unidadeMedidaConversao  unidadeMedidaConversao,
        p_item_conversorQuantidade     conversorQuantidade,
        p_item_loteMinimo              loteMinimo,
        p_item_loteMultiplo            loteMultiplo,
        p_item_altura                  altura,
        p_item_largura                 largura,
        p_item_comprimento             comprimento,
        p_item_pecas                   pecas,
        p_item_quantidade              quantidade,
        p_item_quantidadeConvertida    quantidadeConvertida,
        v_item_quantidadeDevolvidaRet  quantidadeDevolvidaRetornada,
        p_item_percentualDevolucao     percentualDevolucao,
        p_item_pesoLiquido             pesoLiquido,
        p_item_pesoBruto               pesoBruto,
        p_item_tipoPreco               tipoPreco,
        p_item_tabelaPreco             tabelaPreco,
        p_item_precoSugestaoAPrazo     precoSugestaoAPrazo,
        p_item_precoSugestaoAVista     precoSugestaoAVista,
        p_item_precoDesconto           precoDesconto,
        p_item_precoMinimo             precoMinimo,
        p_item_usarPrecoAVista         usarPrecoAVista,
        p_item_precoUnitarioBruto      precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos acrescimoUnitarioComposicao,
        v_item_precoUnitario           precoUnitario,
        v_item_precoUnitarioConvertido precoUnitarioConvertido,
        v_item_valorProdutoServicoBrut valorProdutoServicoBruto,
        v_item_valorProdutoServico     valorProdutoServico,
        p_item_percDescontoItem        percDescontoItem,
        p_item_valorDescontoItem       valorDescontoItem,
        p_item_percAcrescimoItem       percAcrescimoItem,
        p_item_valorAcrescimoItem      valorAcrescimoItem,
        p_item_valorFreteItem          valorFreteItem,
        p_item_valorSeguroItem         valorSeguroItem,
        p_item_valorAdicFreteMarItem   valorAdicFreteMarinhaMerItem,
        p_item_valorDespesasAduanItem  valorDespesasAduaneirasItem,
        p_item_valorFreteGeral         valorFreteGeral,
        p_item_valorSeguroGeral        valorSeguroGeral,
        v_item_valorDescontoGeral      valorDescontoGeral,
        p_item_valorOutrasDespesasGer  valorOutrasDespesasGeral,
        p_item_valorAdicFreteMarGeral  valorAdicFreteMarinhaMerGeral,
        p_item_valorDespesasAduanGeral valorDespesasAduaneirasGeral,
        v_item_valorBasePagamento      valorBasePagamento,
        v_item_valorDescontoPagamento  valorDescontoPagamento,
        v_item_valorOutrasDespPagament valorOutrasDespesasPagamento,
        v_item_valorJurosPagamento     valorJurosPagamento,
        v_item_valorFreteTotal         valorFreteTotal,
        v_item_valorSeguroTotal        valorSeguroTotal,
        v_item_valorDescontoTotal      valorDescontoTotal,
        v_item_valorOutrasDespesasTot  valorOutrasDespesasTotal,
        v_item_valorAdicFreteMarTotal  valorAdicFreteMarinhaMerTotal,
        v_item_valorDespesasAduanTotal valorDespesasAduaneirasTotal,
        v_item_cfop                    cfop,
        v_item_indicadorISSQN          indicadorISSQN,
        v_item_aliquotaISSQN           aliquotaISSQN,
        v_item_retidoISSQN             retidoISSQN,
        v_item_tributadoForaMunicipio  tributadoForaMunicipio,
        v_item_incentivoFiscal         incentivoFiscal,
        v_item_listaServicos           listaServicos,
        v_item_cnae                    cnae,
        v_item_idServicoMunicipio      idServicoMunicipio,
        v_item_numeroProcessoAdministr numeroProcessoAdministrativo,
        v_item_baseISSQN               baseISSQN,
        v_item_valorISSQN              valorISSQN,
        v_item_retencaoIRRF            retencaoIRRF,
        v_item_baseRetIRRF             baseRetIRRF,
        v_item_valorRetIRRF            valorRetIRRF,
        v_item_retencaoINSS            retencaoINSS,
        v_item_baseRetINSS             baseRetINSS,
        v_item_valorRetINSS            valorRetINSS,
        v_item_retencaoPIS             retencaoPIS,
        v_item_baseRetPIS              baseRetPIS,
        v_item_valorRetPIS             valorRetPIS,
        v_item_retencaoCOFINS          retencaoCOFINS,
        v_item_baseRetCOFINS           baseRetCOFINS,
        v_item_valorRetCOFINS          valorRetCOFINS,
        v_item_retencaoCSLL            retencaoCSLL,
        v_item_baseRetCSLL             baseRetCSLL,
        v_item_valorRetCSLL            valorRetCSLL,
        v_item_retencaoOutros          retencaoOutros,
        v_item_baseRetOutros           baseRetOutros,
        v_item_valorRetOutros          valorRetOutros,
        v_item_aliquotaII              aliquotaII,
        v_item_baseII                  baseII,
        v_item_valorII                 valorII,
        v_item_aliquotaIOF             aliquotaIOF,
        v_item_baseIOF                 baseIOF,
        v_item_valorIOF                valorIOF,
        v_item_codigoEnquadramentoIPI  codigoEnquadramentoIPI,
        v_item_stIPI                   stIPI,
        v_item_aliquotaIPI             aliquotaIPI,
        v_item_valorAliquotaIPI        valorAliquotaIPI,
        v_item_baseIPI                 baseIPI,
        v_item_valorIPI                valorIPI,
        p_item_valorIPIDevolucao       valorIPIDevolucao,
        v_item_stPIS                   stPIS,
        v_item_aliquotaPIS             aliquotaPIS,
        v_item_valorAliquotaPIS        valorAliquotaPIS,
        v_item_basePIS                 basePIS,
        v_item_valorPIS                valorPIS,
        v_item_aliquotaPISST           aliquotaPISST,
        v_item_valorAliquotaPISST      valorAliquotaPISST,
        v_item_basePISST               basePISST,
        v_item_valorPISST              valorPISST,
        v_item_stCOFINS                stCOFINS,
        v_item_aliquotaCOFINS          aliquotaCOFINS,
        v_item_valorAliquotaCOFINS     valorAliquotaCOFINS,
        v_item_baseCOFINS              baseCOFINS,
        v_item_valorCOFINS             valorCOFINS,
        v_item_aliquotaCOFINSST        aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST   valorAliquotaCOFINSST,
        v_item_baseCOFINSST            baseCOFINSST,
        v_item_valorCOFINSST           valorCOFINSST,
        v_item_stSimplesNacional       stSimplesNacional,
        v_item_creditoSimplesNacional  creditoSimplesNacional,
        v_item_baseCreditoSimplesNac   baseCreditoSimplesNacional,
        v_item_valorCreditoSimplesNac  valorCreditoSimplesNacional,
        v_item_stICMS                  stICMS,
        v_item_modalBaseCalcICMS       modalidadeBaseCalcICMS,
        v_item_reducaoBaseICMS         reducaoBaseICMS,
        v_item_aliquotaICMS            aliquotaICMS,
        v_item_diferimentoICMS         diferimentoICMS,
        v_item_motivoDesoneracaoICMS   motivoDesoneracaoICMS,
        v_item_idBeneficio             idBeneficio,
        v_item_baseICMS                baseICMS,
        v_item_valorICMSOperacao       valorICMSOperacao,
        v_item_valorICMSDiferido       valorICMSDiferido,
        v_item_valorICMS               valorICMS,
        v_item_valorICMSDesoneracao    valorICMSDesoneracao,
        v_item_modalBaseCalcICMSST     modalidadeBaseCalcICMSST,
        v_item_margemValorAdicionadoST margemValorAdicionadoST,
        v_item_reducaoBaseST           reducaoBaseST,
        v_item_aliquotaICMSST          aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin aliquotaSTSuportConsFinal,
        v_item_baseICMSST              baseICMSST,
        v_item_valorICMSST             valorICMSST,
        v_item_baseICMSSTAnteriormente baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment valorICMSSTAnteriormente,
        v_item_valorICMSProprioSubstit valorICMSProprioSubstituto,
        v_item_reducaoBaseICMSEfetivo  reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo     aliquotaICMSEfetivo,
        v_item_baseICMSEfetivo         baseICMSEfetivo,
        v_item_valorICMSEfetivo        valorICMSEfetivo,
        v_item_stICMSEscrituracao      stICMSEscrituracao,
        v_item_reducaoBaseICMSEscritur reducaoBaseICMSEscrituracao,
        v_item_aliquotaICMSEscrituraca aliquotaICMSEscrituracao,
        v_item_diferimentoICMSEscritur diferimentoICMSEscrituracao,
        v_item_baseICMSEscrituracao    baseICMSEscrituracao,
        v_item_valorICMSEscrituracao   valorICMSEscrituracao,
        v_item_valorICMSDesonEscritura valorICMSDesonEscrituracao,
        v_item_margemValorAdicSTEscrit margemValorAdicSTEscrituracao,
        v_item_reducaoBaseSTEscriturac reducaoBaseSTEscrituracao,
        v_item_aliquotaICMSSTEscritura aliquotaICMSSTEscrituracao,
        v_item_baseICMSSTEscrituracao  baseICMSSTEscrituracao,
        v_item_valorICMSSTEscrituracao valorICMSSTEscrituracao,
        v_item_somarICMSST             somarICMSST,
        v_item_aliquotaICMSUFDestinat  aliquotaICMSUFDestinatario,
        v_item_aliquotaICMSInterestad  aliquotaICMSInterestadual,
        v_item_partilhaICMSInterestad  partilhaICMSInterestadual,
        v_item_baseICMSUFDestinatario  baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente     baseICMSUFRemetente,
        v_item_valorICMSUFRemetente    valorICMSUFRemetente,
        v_item_aliquotaFCP             aliquotaFCP,
        v_item_baseFCP                 baseFCP,
        v_item_valorFCP                valorFCP,
        v_item_aliquotaFCPST           aliquotaFCPST,
        v_item_baseFCPST               baseFCPST,
        v_item_valorFCPST              valorFCPST,
        v_item_aliquotaFCPSTAnteriorm  aliquotaFCPSTAnteriormente,
        v_item_baseFCPSTAnteriormente  baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente valorFCPSTAnteriormente,
        v_item_aliquotaFCPUFDestinat   aliquotaFCPUFDestinatario,
        v_item_baseFCPUFDestinatario   baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario  valorFCPUFDestinatario,
        v_item_aliquotaEstImpFederais  aliquotaEstimadaImpFederais,
        v_item_aliquotaEstImpEstaduais aliquotaEstimadaImpEstaduais,
        v_item_aliquotaEstImpMunicipai aliquotaEstimadaImpMunicipais,
        v_item_baseEstimadaImpostos    baseEstimadaImpostos,
        v_item_valorEstImpFederais     valorEstimadoImpFederais,
        v_item_valorEstImpEstaduais    valorEstimadoImpEstaduais,
        v_item_valorEstImpMunicipais   valorEstimadoImpMunicipais,
        v_item_valorLiquidoItem        valorLiquidoItem,
        p_item_valorDescontoCustoOpIte valorDescontoCustoOpItem,
        p_item_valorDescontoCustoOpGer valorDescontoCustoOpGeral,
        v_item_valorDescontoCustoOpTot valorDescontoCustoOpTotal,
        p_item_valorAcrescimoCustoOpIt valorAcrescimoCustoOpItem,
        p_item_valorAcrescimoCustoOpGe valorAcrescimoCustoOpGeral,
        v_item_valorAcrescimoCustoOpTo valorAcrescimoCustoOpTotal,
        v_item_precoCustoOperacao      precoCustoOperacao,
        v_item_valorCustoOperacao      valorCustoOperacao,
        v_item_precoCMV                precoCMV,
        v_item_valorCMV                valorCMV,
        p_item_quantidadeExtemporanea  quantidadeExtemporanea,
        p_item_acrescimoUnitarioExtemp acrescimoUnitarioExtemporaneo,
        v_item_valorAcrescimoExtempSub valorAcrescimoExtempSubtotal,
        p_item_valorAcrescimoExtempIte valorAcrescimoExtempItem,
        p_item_valorAcrescimoExtempGer valorAcrescimoExtempGeral,
        v_item_valorAcrescimoExtempTot valorAcrescimoExtempTotal,
        p_item_observacoesDigitadas    observacoesDigitadas,
        v_observacoes                  observacoes
      FROM DUAL) b
    ON (a.idItemDocFiscal = b.idItemDocFiscal)
    WHEN MATCHED THEN UPDATE SET
      a.idDocumentoFiscal             = b.idDocumentoFiscal,
      a.sequencia                     = b.sequencia,
      a.cancelado                     = b.cancelado,
      a.pedidoCompraFornecedor        = b.pedidoCompraFornecedor,
      a.sequenciaPedidoCompraFornec   = b.sequenciaPedidoCompraFornec,
      a.vendedor                      = b.vendedor,
      a.modeloDocumento               = b.modeloDocumento,
      a.estabelecimentoOriginal       = b.estabelecimentoOriginal,
      a.gradeProduto                  = b.gradeProduto,
      a.idFormulaTinta                = b.idFormulaTinta,
      a.personalizacao                = b.personalizacao,
      a.idLoteEstoque                 = b.idLoteEstoque,
      a.operacaoFiscal                = b.operacaoFiscal,
      a.movimentaEstoque              = b.movimentaEstoque,
      a.movimentaEstoqueFiscal        = b.movimentaEstoqueFiscal,
      a.geraFinanceiro                = b.geraFinanceiro,
      a.localEstoque                  = b.localEstoque,
      a.pessoaParticipante            = b.pessoaParticipante,
      a.controleQuantidade            = b.controleQuantidade,
      a.unidadeMedidaConversao        = b.unidadeMedidaConversao,
      a.conversorQuantidade           = b.conversorQuantidade,
      a.loteMinimo                    = b.loteMinimo,
      a.loteMultiplo                  = b.loteMultiplo,
      a.altura                        = b.altura,
      a.largura                       = b.largura,
      a.comprimento                   = b.comprimento,
      a.pecas                         = b.pecas,
      a.quantidade                    = b.quantidade,
      a.quantidadeConvertida          = b.quantidadeConvertida,
      a.quantidadeDevolvidaRetornada  = b.quantidadeDevolvidaRetornada,
      a.percentualDevolucao           = b.percentualDevolucao,
      a.pesoLiquido                   = b.pesoLiquido,
      a.pesoBruto                     = b.pesoBruto,
      a.tipoPreco                     = b.tipoPreco,
      a.tabelaPreco                   = b.tabelaPreco,
      a.precoSugestaoAPrazo           = b.precoSugestaoAPrazo,
      a.precoSugestaoAVista           = b.precoSugestaoAVista,
      a.precoDesconto                 = b.precoDesconto,
      a.precoMinimo                   = b.precoMinimo,
      a.usarPrecoAVista               = b.usarPrecoAVista,
      a.precoUnitarioBruto            = b.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao   = b.acrescimoUnitarioComposicao,
      a.precoUnitario                 = b.precoUnitario,
      a.precoUnitarioConvertido       = b.precounitarioConvertido,
      a.valorProdutoServicoBruto      = b.valorProdutoServicoBruto,
      a.valorProdutoServico           = b.valorProdutoServico,
      a.percDescontoItem              = b.percDescontoItem,
      a.valorDescontoItem             = b.valorDescontoItem,
      a.percAcrescimoItem             = b.percAcrescimoItem,
      a.valorAcrescimoItem            = b.valorAcrescimoItem,
      a.valorFreteItem                = b.valorFreteItem,
      a.valorSeguroItem               = b.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem  = b.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem   = b.valorDespesasAduaneirasItem,
      a.valorFreteGeral               = b.valorFreteGeral,
      a.valorSeguroGeral              = b.valorSeguroGeral,
      a.valorDescontoGeral            = b.valorDescontoGeral,
      a.valorOutrasDespesasGeral      = b.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral = b.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral  = b.valorDespesasAduaneirasGeral,
      a.valorBasePagamento            = b.valorBasePagamento,
      a.valorDescontoPagamento        = b.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento  = b.valorOutrasDespesasPagamento,
      a.valorJurosPagamento           = b.valorJurosPagamento,
      a.valorFreteTotal               = b.valorFreteTotal,
      a.valorSeguroTotal              = b.valorSeguroTotal,
      a.valorDescontoTotal            = b.valorDescontoTotal,
      a.valorOutrasDespesasTotal      = b.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal = b.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal  = b.valorDespesasAduaneirasTotal,
      a.cfop                          = b.cfop,
      a.indicadorISSQN                = b.indicadorISSQN,
      a.aliquotaISSQN                 = b.aliquotaISSQN,
      a.retidoISSQN                   = b.retidoISSQN,
      a.tributadoForaMunicipio        = b.tributadoForaMunicipio,
      a.incentivoFiscal               = b.incentivoFiscal,
      a.listaServicos                 = b.listaServicos,
      a.cnae                          = b.cnae,
      a.idServicoMunicipio            = b.idServicoMunicipio,
      a.numeroProcessoAdministrativo  = b.numeroProcessoAdministrativo,
      a.baseISSQN                     = b.baseISSQN,
      a.valorISSQN                    = b.valorISSQN,
      a.retencaoIRRF                  = b.retencaoIRRF,
      a.baseRetIRRF                   = b.baseRetIRRF,
      a.valorRetIRRF                  = b.valorRetIRRF,
      a.retencaoINSS                  = b.retencaoINSS,
      a.baseRetINSS                   = b.baseRetINSS,
      a.valorRetINSS                  = b.valorRetINSS,
      a.retencaoPIS                   = b.retencaoPIS,
      a.baseRetPIS                    = b.baseRetPIS,
      a.valorRetPIS                   = b.valorRetPIS,
      a.retencaoCOFINS                = b.retencaoCOFINS,
      a.baseRetCOFINS                 = b.baseRetCOFINS,
      a.valorRetCOFINS                = b.valorRetCOFINS,
      a.retencaoCSLL                  = b.retencaoCSLL,
      a.baseRetCSLL                   = b.baseRetCSLL,
      a.valorRetCSLL                  = b.valorRetCSLL,
      a.retencaoOutros                = b.retencaoOutros,
      a.baseRetOutros                 = b.baseRetOutros,
      a.valorRetOutros                = b.valorRetOutros,
      a.aliquotaII                    = b.aliquotaII,
      a.baseII                        = b.baseII,
      a.valorII                       = b.valorII,
      a.aliquotaIOF                   = b.aliquotaIOF,
      a.baseIOF                       = b.baseIOF,
      a.valorIOF                      = b.valorIOF,
      a.codigoEnquadramentoIPI        = b.codigoEnquadramentoIPI,
      a.stIPI                         = b.stIPI,
      a.aliquotaIPI                   = b.aliquotaIPI,
      a.valorAliquotaIPI              = b.valorAliquotaIPI,
      a.baseIPI                       = b.baseIPI,
      a.valorIPI                      = b.valorIPI,
      a.valorIPIDevolucao             = b.valorIPIDevolucao,
      a.stPIS                         = b.stPIS,
      a.aliquotaPIS                   = b.aliquotaPIS,
      a.valorAliquotaPIS              = b.valorAliquotaPIS,
      a.basePIS                       = b.basePIS,
      a.valorPIS                      = b.valorPIS,
      a.aliquotaPISST                 = b.aliquotaPISST,
      a.valorAliquotaPISST            = b.valorAliquotaPISST,
      a.basePISST                     = b.basePISST,
      a.valorPISST                    = b.valorPISST,
      a.stCOFINS                      = b.stCOFINS,
      a.aliquotaCOFINS                = b.aliquotaCOFINS,
      a.valorAliquotaCOFINS           = b.valorAliquotaCOFINS,
      a.baseCOFINS                    = b.baseCOFINS,
      a.valorCOFINS                   = b.valorCOFINS,
      a.aliquotaCOFINSST              = b.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST         = b.valorAliquotaCOFINSST,
      a.baseCOFINSST                  = b.baseCOFINSST,
      a.valorCOFINSST                 = b.valorCOFINSST,
      a.stSimplesNacional             = b.stSimplesNacional,
      a.creditoSimplesNacional        = b.creditoSimplesNacional,
      a.baseCreditoSimplesNacional    = b.baseCreditoSimplesNacional,
      a.valorCreditoSimplesNacional   = b.valorCreditoSimplesNacional,
      a.stICMS                        = b.stICMS,
      a.modalidadeBaseCalcICMS        = b.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS               = b.reducaoBaseICMS,
      a.aliquotaICMS                  = b.aliquotaICMS,
      a.diferimentoICMS               = b.diferimentoICMS,
      a.motivoDesoneracaoICMS         = b.motivoDesoneracaoICMS,
      a.idBeneficio                   = b.idBeneficio,
      a.baseICMS                      = b.baseICMS,
      a.valorICMSoperacao             = b.valorICMSoperacao,
      a.valorICMSdiferido             = b.valorICMSdiferido,
      a.valorICMS                     = b.valorICMS,
      a.valorICMSdesoneracao          = b.valorICMSdesoneracao,
      a.modalidadeBaseCalcICMSST      = b.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST       = b.margemValorAdicionadoST,
      a.reducaoBaseST                 = b.reducaoBaseST,
      a.aliquotaICMSST                = b.aliquotaICMSST,
      a.aliquotaSTSuportConsFinal     = b.aliquotaSTSuportConsFinal,
      a.baseICMSST                    = b.baseICMSST,
      a.valorICMSST                   = b.valorICMSST,
      a.baseICMSSTAnteriormente       = b.baseICMSSTAnteriormente,
      a.valorICMSSTAnteriormente      = b.valorICMSSTAnteriormente,
      a.valorICMSProprioSubstituto    = b.valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo        = b.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo           = b.aliquotaICMSEfetivo,
      a.baseICMSEfetivo               = b.baseICMSEfetivo,
      a.valorICMSEfetivo              = b.valorICMSEfetivo,
      a.stICMSEscrituracao            = b.stICMSEscrituracao,
      a.reducaoBaseICMSEscrituracao   = b.reducaoBaseICMSEscrituracao,
      a.aliquotaICMSEscrituracao      = b.aliquotaICMSEscrituracao,
      a.diferimentoICMSEscrituracao   = b.diferimentoICMSEscrituracao,
      a.baseICMSEscrituracao          = b.baseICMSEscrituracao,
      a.valorICMSEscrituracao         = b.valorICMSEscrituracao,
      a.valorICMSDesonEscrituracao    = b.valorICMSDesonEscrituracao,
      a.margemValorAdicSTEscrituracao = b.margemValorAdicSTEscrituracao,
      a.reducaoBaseSTEscrituracao     = b.reducaoBaseSTEscrituracao,
      a.aliquotaICMSSTEscrituracao    = b.aliquotaICMSSTEscrituracao,
      a.baseICMSSTEscrituracao        = b.baseICMSSTEscrituracao,
      a.valorICMSSTEscrituracao       = b.valorICMSSTEscrituracao,
      a.somarICMSST                   = b.somarICMSST,
      a.aliquotaICMSUFDestinatario    = b.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual     = b.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual     = b.partilhaICMSInterestadual,
      a.baseICMSUFDestinatario        = b.baseICMSUFDestinatario,
      a.valorICMSUFDestinatario       = b.valorICMSUFDestinatario,
      a.baseICMSUFRemetente           = b.baseICMSUFRemetente,
      a.valorICMSUFRemetente          = b.valorICMSUFRemetente,
      a.aliquotaFCP                   = b.aliquotaFCP,
      a.baseFCP                       = b.baseFCP,
      a.valorFCP                      = b.valorFCP,
      a.aliquotaFCPST                 = b.aliquotaFCPST,
      a.baseFCPST                     = b.baseFCPST,
      a.valorFCPST                    = b.valorFCPST,
      a.aliquotaFCPSTAnteriormente    = b.aliquotaFCPSTAnteriormente,
      a.baseFCPSTAnteriormente        = b.baseFCPSTAnteriormente,
      a.valorFCPSTAnteriormente       = b.valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario     = b.aliquotaFCPUFDestinatario,
      a.baseFCPUFDestinatario         = b.baseFCPUFDestinatario,
      a.valorFCPUFDestinatario        = b.valorFCPUFDestinatario,
      a.aliquotaestimadaimpfederais   = b.aliquotaestimadaimpfederais,
      a.aliquotaestimadaimpestaduais  = b.aliquotaestimadaimpestaduais,
      a.aliquotaestimadaimpmunicipais = b.aliquotaestimadaimpmunicipais,
      a.baseestimadaimpostos          = b.baseestimadaimpostos,
      a.valorestimadoimpfederais      = b.valorestimadoimpfederais,
      a.valorEstimadoImpEstaduais     = b.valorEstimadoImpEstaduais,
      a.valorEstimadoImpMunicipais    = b.valorEstimadoImpMunicipais,
      a.valorLiquidoItem              = b.valorLiquidoItem,
      a.valorDescontoCustoOpItem      = b.valorDescontoCustoOpItem,
      a.valorDescontoCustoOpGeral     = b.valorDescontoCustoOpGeral,
      a.valorDescontoCustoOpTotal     = b.valorDescontoCustoOpTotal,
      a.valorAcrescimoCustoOpItem     = b.valorAcrescimoCustoOpItem,
      a.valorAcrescimoCustoOpGeral    = b.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoCustoOpTotal    = b.valorAcrescimoCustoOpTotal,
      a.precoCustoOperacao            = b.precoCustoOperacao,
      a.valorCustoOperacao            = b.valorCustoOperacao,
      a.precoCMV                      = b.precoCMV,
      a.valorCMV                      = b.valorCMV,
      a.quantidadeExtemporanea        = b.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo = b.acrescimoUnitarioExtemporaneo,
      a.valorAcrescimoExtempSubtotal  = b.valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem      = b.valorAcrescimoExtempItem,
      a.valorAcrescimoExtempGeral     = b.valorAcrescimoExtempGeral,
      a.valorAcrescimoExtempTotal     = b.valorAcrescimoExtempTotal,
      a.observacoesDigitadas          = b.observacoesDigitadas,
      a.observacoes                   = b.observacoes
    WHEN NOT MATCHED THEN INSERT (
      idItemDocFiscal,
      idDocumentoFiscal,
      sequencia,
      cancelado,
      pedidoCompraFornecedor,
      sequenciaPedidoCompraFornec,
      modeloDocumento,
      estabelecimentoOriginal,
      vendedor,
      gradeProduto,
      idFormulaTinta,
      personalizacao,
      idLoteEstoque,
      operacaoFiscal,
      movimentaEstoque,
      movimentaEstoqueFiscal,
      geraFinanceiro,
      localEstoque,
      pessoaParticipante,
      controleQuantidade,
      unidadeMedidaConversao,
      conversorQuantidade,
      loteMinimo,
      loteMultiplo,
      altura,
      largura,
      comprimento,
      pecas,
      quantidade,
      quantidadeConvertida,
      quantidadeDevolvidaRetornada,
      percentualDevolucao,
      pesoLiquido,
      pesoBruto,
      tipoPreco,
      tabelaPreco,
      precoSugestaoAPrazo,
      precoSugestaoAVista,
      precoDesconto,
      precoMinimo,
      usarPrecoAVista,
      precoUnitarioBruto,
      acrescimoUnitarioComposicao,
      precoUnitario,
      precoUnitarioConvertido,
      valorProdutoServicoBruto,
      valorProdutoServico,
      percDescontoItem,
      valorDescontoItem,
      percAcrescimoItem,
      valorAcrescimoItem,
      valorFreteItem,
      valorSeguroItem,
      valorAdicFreteMarinhaMerItem,
      valorDespesasAduaneirasItem,
      valorFreteGeral,
      valorSeguroGeral,
      valorDescontoGeral,
      valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral,
      valorDespesasAduaneirasGeral,
      valorBasePagamento,
      valorDescontoPagamento,
      valorOutrasDespesasPagamento,
      valorJurosPagamento,
      valorFreteTotal,
      valorSeguroTotal,
      valorDescontoTotal,
      valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal,
      valorDespesasAduaneirasTotal,
      cfop,
      indicadorISSQN,
      aliquotaISSQN,
      retidoISSQN,
      tributadoForaMunicipio,
      incentivoFiscal,
      listaServicos,
      cnae,
      idServicoMunicipio,
      numeroProcessoAdministrativo,
      baseISSQN,
      valorISSQN,
      retencaoIRRF,
      baseRetIRRF,
      valorRetIRRF,
      retencaoINSS,
      baseRetINSS,
      valorRetINSS,
      retencaoPIS,
      baseRetPIS,
      valorRetPIS,
      retencaoCOFINS,
      baseRetCOFINS,
      valorRetCOFINS,
      retencaoCSLL,
      baseRetCSLL,
      valorRetCSLL,
      retencaoOutros,
      baseRetOutros,
      valorRetOutros,
      aliquotaII,
      baseII,
      valorII,
      aliquotaIOF,
      baseIOF,
      valorIOF,
      codigoEnquadramentoIPI,
      stIPI,
      aliquotaIPI,
      valorAliquotaIPI,
      baseIPI,
      valorIPI,
      valorIPIDevolucao,
      stPIS,
      aliquotaPIS,
      valorAliquotaPIS,
      basePIS,
      valorPIS,
      aliquotaPISST,
      valorAliquotaPISST,
      basePISST,
      valorPISST,
      stCOFINS,
      aliquotaCOFINS,
      valorAliquotaCOFINS,
      baseCOFINS,
      valorCOFINS,
      aliquotaCOFINSST,
      valorAliquotaCOFINSST,
      baseCOFINSST,
      valorCOFINSST,
      stSimplesNacional,
      creditoSimplesNacional,
      baseCreditoSimplesNacional,
      valorCreditoSimplesNacional,
      stICMS,
      modalidadeBaseCalcICMS,
      reducaoBaseICMS,
      aliquotaICMS,
      diferimentoICMS,
      motivoDesoneracaoICMS,
      idBeneficio,
      baseICMS,
      valorICMSOperacao,
      valorICMSDiferido,
      valorICMS,
      valorICMSDesoneracao,
      modalidadeBaseCalcICMSST,
      margemValorAdicionadoST,
      reducaoBaseST,
      aliquotaICMSST,
      aliquotaSTSuportConsFinal,
      baseICMSST,
      valorICMSST,
      baseICMSSTAnteriormente,
      valorICMSSTAnteriormente,
      valorICMSProprioSubstituto,
      reducaoBaseICMSEfetivo,
      aliquotaICMSEfetivo,
      baseICMSEfetivo,
      valorICMSEfetivo,
      stICMSEscrituracao,
      reducaoBaseICMSEscrituracao,
      aliquotaICMSEscrituracao,
      diferimentoICMSEscrituracao,
      baseICMSEscrituracao,
      valorICMSEscrituracao,
      valorICMSDesonEscrituracao,
      margemValorAdicSTEscrituracao,
      reducaoBaseSTEscrituracao,
      aliquotaICMSSTEscrituracao,
      baseICMSSTEscrituracao,
      valorICMSSTEscrituracao,
      somarICMSST,
      aliquotaICMSUFDestinatario,
      aliquotaICMSInterestadual,
      partilhaICMSInterestadual,
      baseICMSUFDestinatario,
      valorICMSUFDestinatario,
      baseICMSUFRemetente,
      valorICMSUFRemetente,
      aliquotaFCP,
      baseFCP,
      valorFCP,
      aliquotaFCPST,
      baseFCPST,
      valorFCPST,
      aliquotaFCPSTAnteriormente,
      baseFCPSTAnteriormente,
      valorFCPSTAnteriormente,
      aliquotaFCPUFDestinatario,
      baseFCPUFDestinatario,
      valorFCPUFDestinatario,
      aliquotaEstimadaImpFederais,
      aliquotaEstimadaImpEstaduais,
      aliquotaEstimadaImpMunicipais,
      baseEstimadaImpostos,
      valorEstimadoImpFederais,
      valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais,
      valorLiquidoItem,
      valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral,
      valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpItem,
      valorAcrescimoCustoOpGeral,
      valorAcrescimoCustoOpTotal,
      precoCustoOperacao,
      valorCustoOperacao,
      precoCMV,
      valorCMV,
      quantidadeExtemporanea,
      acrescimoUnitarioExtemporaneo,
      valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral,
      valorAcrescimoExtempTotal,
      observacoesDigitadas,
      observacoes)
    VALUES (
      b.idItemDocFiscal,
      b.idDocumentoFiscal,
      b.sequencia,
      b.cancelado,
      b.pedidoCompraFornecedor,
      b.sequenciaPedidoCompraFornec,
      b.modeloDocumento,
      b.estabelecimentoOriginal,
      b.vendedor,
      b.gradeProduto,
      b.idFormulaTinta,
      b.personalizacao,
      b.idLoteEstoque,
      b.operacaoFiscal,
      b.movimentaEstoque,
      b.movimentaEstoqueFiscal,
      b.geraFinanceiro,
      b.localEstoque,
      b.pessoaParticipante,
      b.controleQuantidade,
      b.unidadeMedidaConversao,
      b.conversorQuantidade,
      b.loteMinimo,
      b.loteMultiplo,
      b.altura,
      b.largura,
      b.comprimento,
      b.pecas,
      b.quantidade,
      b.quantidadeConvertida,
      b.quantidadeDevolvidaRetornada,
      b.percentualDevolucao,
      b.pesoLiquido,
      b.pesoBruto,
      b.tipoPreco,
      b.tabelaPreco,
      b.precoSugestaoAPrazo,
      b.precoSugestaoAVista,
      b.precoDesconto,
      b.precoMinimo,
      b.usarPrecoAVista,
      b.precoUnitarioBruto,
      b.acrescimoUnitarioComposicao,
      b.precoUnitario,
      b.precoUnitarioConvertido,
      b.valorProdutoServicoBruto,
      b.valorProdutoServico,
      b.percDescontoItem,
      b.valorDescontoItem,
      b.percAcrescimoItem,
      b.valorAcrescimoItem,
      b.valorFreteItem,
      b.valorSeguroItem,
      b.valorAdicFreteMarinhaMerItem,
      b.valorDespesasAduaneirasItem,
      b.valorFreteGeral,
      b.valorSeguroGeral,
      b.valorDescontoGeral,
      b.valorOutrasDespesasGeral,
      b.valorAdicFreteMarinhaMerGeral,
      b.valorDespesasAduaneirasGeral,
      b.valorBasePagamento,
      b.valorDescontoPagamento,
      b.valorOutrasDespesasPagamento,
      b.valorJurosPagamento,
      b.valorFreteTotal,
      b.valorSeguroTotal,
      b.valorDescontoTotal,
      b.valorOutrasDespesasTotal,
      b.valorAdicFreteMarinhaMerTotal,
      b.valorDespesasAduaneirasTotal,
      b.cfop,
      b.indicadorISSQN,
      b.aliquotaISSQN,
      b.retidoISSQN,
      b.tributadoForaMunicipio,
      b.incentivoFiscal,
      b.listaServicos,
      b.cnae,
      b.idServicoMunicipio,
      b.numeroProcessoAdministrativo,
      b.baseISSQN,
      b.valorISSQN,
      b.retencaoIRRF,
      b.baseRetIRRF,
      b.valorRetIRRF,
      b.retencaoINSS,
      b.baseRetINSS,
      b.valorRetINSS,
      b.retencaoPIS,
      b.baseRetPIS,
      b.valorRetPIS,
      b.retencaoCOFINS,
      b.baseRetCOFINS,
      b.valorRetCOFINS,
      b.retencaoCSLL,
      b.baseRetCSLL,
      b.valorRetCSLL,
      b.retencaoOutros,
      b.baseRetOutros,
      b.valorRetOutros,
      b.aliquotaII,
      b.baseII,
      b.valorII,
      b.aliquotaIOF,
      b.baseIOF,
      b.valorIOF,
      b.codigoEnquadramentoIPI,
      b.stIPI,
      b.aliquotaIPI,
      b.valorAliquotaIPI,
      b.baseIPI,
      b.valorIPI,
      b.valorIPIDevolucao,
      b.stPIS,
      b.aliquotaPIS,
      b.valorAliquotaPIS,
      b.basePIS,
      b.valorPIS,
      b.aliquotaPISST,
      b.valorAliquotaPISST,
      b.basePISST,
      b.valorPISST,
      b.stCOFINS,
      b.aliquotaCOFINS,
      b.valorAliquotaCOFINS,
      b.baseCOFINS,
      b.valorCOFINS,
      b.aliquotaCOFINSST,
      b.valorAliquotaCOFINSST,
      b.baseCOFINSST,
      b.valorCOFINSST,
      b.stSimplesNacional,
      b.creditoSimplesNacional,
      b.baseCreditoSimplesNacional,
      b.valorCreditoSimplesNacional,
      b.stICMS,
      b.modalidadeBaseCalcICMS,
      b.reducaoBaseICMS,
      b.aliquotaICMS,
      b.diferimentoICMS,
      b.motivoDesoneracaoICMS,
      b.idBeneficio,
      b.baseICMS,
      b.valorICMSOperacao,
      b.valorICMSDiferido,
      b.valorICMS,
      b.valorICMSDesoneracao,
      b.modalidadeBaseCalcICMSST,
      b.margemValorAdicionadoST,
      b.reducaoBaseST,
      b.aliquotaICMSST,
      b.aliquotaSTSuportConsFinal,
      b.baseICMSST,
      b.valorICMSST,
      b.baseICMSSTAnteriormente,
      b.valorICMSSTAnteriormente,
      b.valorICMSProprioSubstituto,
      b.reducaoBaseICMSEfetivo,
      b.aliquotaICMSEfetivo,
      b.baseICMSEfetivo,
      b.valorICMSEfetivo,
      b.stICMSEscrituracao,
      b.reducaoBaseICMSEscrituracao,
      b.aliquotaICMSEscrituracao,
      b.diferimentoICMSEscrituracao,
      b.baseICMSEscrituracao,
      b.valorICMSEscrituracao,
      b.valorICMSDesonEscrituracao,
      b.margemValorAdicSTEscrituracao,
      b.reducaoBaseSTEscrituracao,
      b.aliquotaICMSSTEscrituracao,
      b.baseICMSSTEscrituracao,
      b.valorICMSSTEscrituracao,
      b.somarICMSST,
      b.aliquotaICMSUFDestinatario,
      b.aliquotaICMSInterestadual,
      b.partilhaICMSInterestadual,
      b.baseICMSUFDestinatario,
      b.valorICMSUFDestinatario,
      b.baseICMSUFRemetente,
      b.valorICMSUFRemetente,
      b.aliquotaFCP,
      b.baseFCP,
      b.valorFCP,
      b.aliquotaFCPST,
      b.baseFCPST,
      b.valorFCPST,
      b.aliquotaFCPSTAnteriormente,
      b.baseFCPSTAnteriormente,
      b.valorFCPSTAnteriormente,
      b.aliquotaFCPUFDestinatario,
      b.baseFCPUFDestinatario,
      b.valorFCPUFDestinatario,
      b.aliquotaEstimadaImpFederais,
      b.aliquotaEstimadaImpEstaduais,
      b.aliquotaEstimadaImpMunicipais,
      b.baseEstimadaImpostos,
      b.valorEstimadoImpFederais,
      b.valorEstimadoImpEstaduais,
      b.valorEstimadoImpMunicipais,
      b.valorLiquidoItem,
      b.valorDescontoCustoOpItem,
      b.valorDescontoCustoOpGeral,
      b.valorDescontoCustoOpTotal,
      b.valorAcrescimoCustoOpItem,
      b.valorAcrescimoCustoOpGeral,
      b.valorAcrescimoCustoOpTotal,
      b.precoCustoOperacao,
      b.valorCustoOperacao,
      b.precoCMV,
      b.valorCMV,
      b.quantidadeExtemporanea,
      b.acrescimoUnitarioExtemporaneo,
      b.valorAcrescimoExtempSubtotal,
      b.valorAcrescimoExtempItem,
      b.valorAcrescimoExtempGeral,
      b.valorAcrescimoExtempTotal,
      b.observacoesDigitadas,
      b.observacoes);
    v_atualizarObservacoes := 0;
    IF p_idItemReferenciado > 0 THEN
      IF p_tipoDocumentoReferenciado IN ('D','P') THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV(
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_devolucaoAnulacaoRetorno,
          'D',
          r_item_idItemDocFiscal,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          p_tipoDocumentoReferenciado,
          p_idItemReferenciado);
      END IF;
      IF p_tipoDocumentoReferenciado = 'B' THEN
        ADD_DOC_FISC_ITEM_BALANC_GRAVA (
          p_estabelecimentoAtivo,
          p_idItemReferenciado,
          r_item_idItemDocFiscal);
      ELSIF p_tipoDocumentoReferenciado = 'D' THEN
        ADD_DOC_FISC_ITEM_REF_DOC_FIS (
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'G' THEN
        ADD_DOC_FISC_ITEM_REF_DFE_GRAD (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_person_190_modeloFrete,
          p_config_227_manterPessoaOrcam,
          p_config_230_etapaPedComprParc,
          p_config_378_calcularVolumes,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'O' THEN
        ADD_DOC_FISC_ITEM_REF_ORCAMEN (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'P' THEN
        ADD_DOC_FISC_ITEM_REF_PRE_DOC (
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'T' THEN
        ADD_DOC_FISC_ITEM_TRANS_GRAVA (
          p_estabelecimentoAtivo,
          v_cab_entradaSaida,
          p_idItemReferenciado,
          r_item_idItemDocFiscal,
          p_quantidadeReferenciada);
      END IF;
    END IF;
    IF p_tempComp_nomeTempComposicao <> ' '
      AND (NOT (p_tipoDocumentoReferenciado IN ('D','O','P'))
        OR p_idItemReferenciado <= 0)
    THEN
      ADD_DOC_FISC_ITEM_COMP_TEMP (
        p_sessaoClient,
        p_estabelecimentoAtivo,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        r_item_idItemDocFiscal,
        v_atualizarObservacoes,
        v_atualizarObservacoes);
    END IF;
    v_idEnderecoEstoque := 0;
    IF p_item_idEnderecoEstoque > 0 THEN
      ADD_DOC_FISC_ITEM_ENDER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemDocFiscal,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_quantidade,
        ' ',
        v_idEnderecoEstoque);
    END IF;
    IF p_item_idNumeroSerie > 0 THEN
      ADD_DOC_FISC_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemDocFiscal,
        v_idEnderecoEstoque,
        p_item_gradeProduto,
        p_item_idNumeroSerie,
        0,
        v_auxNumber);
      v_atualizarObservacoes := 1;
    END IF;
    IF v_atualizarObservacoes = 1 THEN
      v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
        p_sessaoClient,
        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_413_obs_add_marca,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        'D',
        r_item_idItemDocFiscal,
        p_item_gradeProduto,
        p_item_idFormulaTinta,
        p_item_personalizacao,
        p_item_idLoteEstoque,
        p_item_controleQuantidade,
        p_item_loteMultiplo,
        p_item_altura,
        p_item_largura,
        p_item_comprimento,
        p_item_quantidade,
        p_item_observacoesDigitadas);
      UPDATE MODOCFISCALXITENS
      SET observacoes = v_observacoes
      WHERE idItemDocFiscal = r_item_idItemDocFiscal;
    END IF;
    IF v_cab_situacaoDocumentoFiscal > 20 THEN
      ADD_DOC_FISC_ITEM_EST_ATUALIZA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_item_idItemDocFiscal,
        p_estabelecimentoAtivo);
      ADD_DOC_FISC_ITEM_FIL_ATUALIZA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_item_idItemDocFiscal,
        p_estabelecimentoAtivo);
    END IF;
    r_buffer_idItemDocFiscal := CASE WHEN (r_buffer_idItemDocFiscal IS NULL OR r_buffer_idItemDocFiscal = '' OR r_buffer_idItemDocFiscal = ' ') THEN '' ELSE RTRIM (r_buffer_idItemDocFiscal) || ';' END || TO_CHAR (LPAD(r_item_idItemDocFiscal,14,'0'));
    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;
  END IF;
END ADD_DOC_FISC_ITEM_GRAVA;

/

create or replace PROCEDURE ADD_DOC_FISC_ROT_EFET_PRE_DOC (
  p_exclusivo               IN VARCHAR2,
  p_1_NFCe_2_ConsFinal_3_NF IN VARCHAR2,
  p_preDocumento            IN NUMBER,
  p_estabelecimentoAtivo    IN NUMBER,
  p_nfFornecedor            IN NUMBER,
  p_idSerieFiscal           IN NUMBER,
  p_serieFiscal             IN VARCHAR2,
  p_subSerieFiscal          IN NUMBER,
  p_modeloDocumentoFiscal   IN VARCHAR2,
  p_documentoFiscal         IN NUMBER,
  p_data                    IN DATE,
  p_timezone                IN VARCHAR2,
  p_versaoAplicativo        IN VARCHAR2,
  r_idDocumentoFiscal       OUT NUMBER)
IS
  v_excluirPreDoc     NUMBER;
  v_tipoDocumento     NUMBER;
  v_fatocontabil      NUMBER;
  v_estabelecimento   NUMBER;
  v_pessoa            NUMBER;
  v_sequenciaItem     NUMBER;
  v_documentoFiscal   NUMBER;
  CURSOR c_itens IS
    SELECT
      item.idItemPreDocumento,
      CASE
        WHEN cancelado = 0
        THEN FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXITENS', 'idItemDocFiscal', 0, p_estabelecimentoAtivo, NULL)
        ELSE 0
      END idItemDocFiscal,
      item.sequencia,
      item.cancelado,
      item.pedidoCompraFornecedor,
      item.sequenciaPedidoCompraFornec,
      item.estabelecimentoOriginal,
      item.modeloDocumento,
      item.vendedor,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoque,
      item.pessoaParticipante,
      item.controleQuantidade,
      item.unidadeMedidaConversao,
      item.conversorQuantidade,
      item.loteMinimo,
      item.loteMultiplo,
      item.altura,
      item.largura,
      item.comprimento,
      item.pecas,
      item.quantidade,
      item.quantidadeConvertida,
      item.pesoLiquido,
      item.pesoBruto,
      item.tipoPreco,
      item.tabelaPreco,
      item.precoSugestaoAPrazo,
      item.precoSugestaoAVista,
      item.precoDesconto,
      item.precoMinimo,
      item.usarPrecoAVista,
      item.precoUnitarioBruto,
      item.acrescimoUnitarioComposicao,
      item.precoUnitario,
      item.precoUnitarioConvertido,
      item.valorProdutoServicoBruto,
      item.valorProdutoServico,
      item.percDescontoItem,
      item.valorDescontoItem,
      item.percAcrescimoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      item.quantidadeExtemporanea,
      item.acrescimoUnitarioExtemporaneo,
      item.valorAcrescimoExtempSubtotal,
      item.valorAcrescimoExtempItem,
      item.valorDescontoCustoOpItem,
      item.valorAcrescimoCustoOpItem, 
      item.observacoesDigitadas,
      item.observacoes,
      item.valorFreteGeral,
      item.valorSeguroGeral,
      item.valorDescontoGeral,
      item.valorOutrasDespesasGeral,
      item.valorAdicFreteMarinhaMerGeral,
      item.valorDespesasAduaneirasGeral,
      item.valorAcrescimoExtempGeral,
      item.valorDescontoCustoOpGeral,
      item.valorAcrescimoCustoOpGeral,
      item.valorDescontoPagamento,
      item.valorOutrasDespesasPagamento,
      item.valorJurosPagamento,
      item.valorFreteTotal,
      item.valorSeguroTotal,
      item.valorDescontoTotal,
      item.valorOutrasDespesasTotal,
      item.valorAdicFreteMarinhaMerTotal,
      item.valorDespesasAduaneirasTotal,
      item.valorAcrescimoExtempTotal,
      item.valorDescontoCustoOpTotal,
      item.valorAcrescimoCustoOpTotal,
      item.percentualDevolucao,
      item.valorIPIDevolucao, 
      item.operacaoFiscal,
      item.movimentaEstoque,
      item.geraFinanceiro,
      item.cfop,
      item.indicadorISSQN,
      item.aliquotaISSQN,
      item.retidoISSQN,
      item.tributadoForaMunicipio,
      item.incentivoFiscal,
      item.listaServicos,
      item.cnae,
      item.idServicoMunicipio,
      item.numeroProcessoAdministrativo,
      item.retencaoIRRF,
      item.retencaoINSS,
      item.retencaoPIS,
      item.retencaoCOFINS,
      item.retencaoCSLL,
      item.retencaoOutros,
      item.aliquotaII,
      item.aliquotaIOF,
      item.codigoEnquadramentoIPI,
      item.stIPI,
      item.aliquotaIPI,
      item.valorAliquotaIPI,
      item.stPIS,
      item.aliquotaPIS,
      item.valorAliquotaPIS,
      item.aliquotaPISST,
      item.valorAliquotaPISST,
      item.stCOFINS,
      item.aliquotaCOFINS,
      item.valorAliquotaCOFINS,
      item.aliquotaCOFINSST,
      item.valorAliquotaCOFINSST,
      item.stSimplesNacional,
      item.creditoSimplesNacional,
      item.stICMS,
      item.modalidadeBaseCalcICMS,
      item.reducaoBaseICMS,
      item.aliquotaICMS,
      item.diferimentoICMS,
      item.motivoDesoneracaoICMS,
      item.idBeneficio,
      item.modalidadeBaseCalcICMSST,
      item.margemValorAdicionadoST,
      item.reducaoBaseST,
      item.aliquotaICMSST,
      item.aliquotaSTSuportConsFinal,
      item.reducaoBaseICMSEfetivo,
      item.aliquotaICMSEfetivo,
      CASE
        WHEN p_nfFornecedor = 1 AND prod.tipoProduto IN('07','08')
        THEN '90'
        WHEN p_nfFornecedor = 1 AND item.stICMS IN('10','30','70')
          OR p_nfFornecedor = 1 AND item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203')
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500'
        THEN '60'
        WHEN item.stICMS <> ' '
        THEN item.stICMS
        WHEN item.stSimplesNacional IN ('101','102') AND item.reducaoBaseICMS = 0
        THEN '00'
        WHEN item.stSimplesNacional IN ('101','102')
        THEN '20'
        WHEN item.stSimplesNacional IN ('103','300')
        THEN '40'
        WHEN item.stSimplesNacional IN ('201','202','203') AND item.reducaoBaseICMS = 0
        THEN '10' WHEN item.stSimplesNacional IN ('201','202','203')
        THEN '70' WHEN item.stSimplesNacional = '400'
        THEN '41'
        ELSE '90'
      END stICMSEscrituracao,
      CASE
        WHEN p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','70')
          OR item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203'))
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500' THEN 0 WHEN item.stICMS <> ' '
        THEN item.reducaoBaseICMS
        ELSE 0
      END reducaoBaseICMSEscrituracao,
      CASE
        WHEN p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','70')
          OR item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203'))
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500' THEN 0 WHEN item.stICMS <> ' '
        THEN item.aliquotaICMS
        WHEN item.stSimplesNacional IN ('101','201')
        THEN item.creditoSimplesNacional
        ELSE 0
      END aliquotaICMSEscrituracao,
      CASE
        WHEN p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','70')
          OR item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203'))
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500' THEN 0 WHEN item.stICMS <> ' '
        THEN item.diferimentoICMS
        ELSE 0
      END diferimentoICMSEscrituracao,
      CASE
        WHEN item.stICMS = ' '
          OR p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','60','70'))
        THEN 0
        ELSE item.margemValorAdicionadoST
      END margemValorAdicSTEscrituracao,
      CASE
        WHEN item.stICMS = ' '
          OR p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','60','70'))
        THEN 0
        ELSE item.reducaoBaseST
      END reducaoBaseSTEscrituracao,
      CASE
        WHEN item.stICMS = ' '
          OR p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','60','70'))
        THEN 0
        ELSE item.aliquotaICMSST
      END aliquotaICMSSTEscrituracao,
      item.aliquotaICMSUFDestinatario,
      item.aliquotaICMSInterestadual,
      item.partilhaICMSInterestadual,
      item.aliquotaFCP,
      item.aliquotaFCPST,
      item.aliquotaFCPSTAnteriormente,
      item.aliquotaFCPUFDestinatario,
      item.aliquotaEstimadaImpFederais,
      item.aliquotaEstimadaImpEstaduais,
      item.aliquotaEstimadaImpMunicipais,
      item.baseISSQN,
      item.valorISSQN,
      item.baseRetIRRF,
      item.valorRetIRRF,
      item.baseRetINSS,
      item.valorRetINSS,
      item.baseRetPIS,
      item.valorRetPIS,
      item.baseRetCOFINS,
      item.valorRetCOFINS,
      item.baseRetCSLL,
      item.valorRetCSLL,
      item.baseRetOutros,
      item.valorRetOutros,
      item.baseII,
      item.valorII,
      item.baseIOF,
      item.valorIOF,
      item.baseIPI,
      item.valorIPI,
      item.basePIS,
      item.valorPIS,
      item.basePISST,
      item.valorPISST,
      item.baseCOFINS,
      item.valorCOFINS,
      item.baseCOFINSST,
      item.valorCOFINSST,
      item.baseCreditoSimplesNacional,
      item.valorCreditoSimplesNacional,
      item.baseICMS,
      item.valorICMSOperacao,
      item.valorICMSDiferido,
      item.valorICMS,
      item.valorICMSDesoneracao,
      item.baseICMSST,
      item.valorICMSST,
      item.baseICMSSTAnteriormente,
      item.valorICMSSTAnteriormente,
      item.valorICMSProprioSubstituto,
      item.baseICMSEfetivo,
      item.valorICMSEfetivo,
      CASE
        WHEN p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','70')
          OR item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203'))
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500'
        THEN 0
        WHEN item.stICMS <> ' ' AND p_nfFornecedor = 1
        THEN ROUND(item.baseICMS *(1-item.diferimentoICMS/100),2)
        WHEN item.stICMS <> ' '
        THEN item.baseICMS
        WHEN item.stSimplesNacional IN ('101','201') AND item.baseCreditoSimplesNacional = 0
        THEN item.valorProdutoServico
          - item.valorDescontoTotal
          + item.valorOutrasDespesasTotal
          + item.valorAdicFreteMarinhaMerTotal
          + item.valorDespesasAduaneirasTotal
          + item.valorII
          + item.valorIOF
        WHEN item.stSimplesNacional IN ('101','201')
        THEN item.baseCreditoSimplesNacional
        ELSE 0
      END baseICMSEscrituracao,
      CASE
        WHEN p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','70')
          OR item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203'))
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500'
        THEN 0
        WHEN item.stICMS <> ' '
        THEN item.valorICMS
        WHEN item.stSimplesNacional IN ('101','201')
        THEN item.valorCreditoSimplesNacional
        ELSE 0
      END valorICMSEscrituracao,
      CASE
        WHEN p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','70')
          OR item.stICMS = ' ' AND item.stSimplesNacional IN ('201','202','203'))
          OR item.stICMS = ' ' AND item.stSimplesNacional = '500'
        THEN 0
        WHEN item.stICMS <> ' '
        THEN item.valorICMSDesoneracao
        ELSE 0
      END valorICMSDesonEscrituracao,
      CASE
        WHEN item.stICMS = ' '
          OR p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','60','70'))
        THEN 0
        ELSE item.baseICMSST
      END baseICMSSTEscrituracao,
      CASE
        WHEN item.stICMS = ' '
          OR p_nfFornecedor = 1 AND (prod.tipoProduto IN('07','08')
          OR item.stICMS IN('10','30','60','70'))
        THEN 0
        ELSE item.valorICMSST
      END valorICMSSTEscrituracao,
      1 somarICMSST,
      item.baseICMSUFDestinatario,
      item.valorICMSUFDestinatario,
      item.baseICMSUFRemetente,
      item.valorICMSUFRemetente,
      item.baseFCP,
      item.valorFCP,
      item.baseFCPST,
      item.valorFCPST,
      item.baseFCPSTAnteriormente,
      item.valorFCPSTAnteriormente,
      item.baseFCPUFDestinatario,
      item.valorFCPUFDestinatario,
      item.baseEstimadaImpostos,
      item.valorEstimadoImpFederais,
      item.valorEstimadoImpEstaduais,
      item.valorEstimadoImpMunicipais,
      item.valorBasePagamento,
      item.valorLiquidoItem,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV
     FROM MOPREDOCUMXITENS item
     JOIN CAGRADESPRODUTO gradProd
     ON gradProd.gradeProduto = item.gradeProduto
     JOIN CAPRODUTOS prod
     ON prod.produto = gradProd.produto
     WHERE item.preDocumento = p_preDocumento
     ORDER BY item.sequencia;
  CURSOR c_endEst
  IS SELECT a.idEnderecoEstoquePreDocumento, a.idItemPreDocumento, FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXENDERECOESTOQ', 'idEnderecoEstoqueDocFiscal', 0, p_estabelecimentoAtivo, NULL) idEnderecoEstoqueDocFiscal, a.idEnderecoEstoque, a.posicaoCaixaEstoque, a.quantidade, a.quantidadeDevolvidaRetornada, a.quantidadeConferida, a.observacoes
     FROM MOPREDOCUMXENDERECOESTOQ a
     JOIN MOPREDOCUMXITENS b ON b.idItemPreDocumento = a.idItemPreDocumento
     WHERE b.preDocumento = p_preDocumento
     AND b.cancelado = 0;
  CURSOR c_pagtos
  IS SELECT idPagamentoPreDocumento, FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXPAGAMENTOS', 'idPagamentoDocFiscal', 0, p_estabelecimentoAtivo, NULL) idPagamentoDocFiscal, pagamentoTroco, sequencia, indicadorFormaPagamento, meioPagamento, condicaoPagamento, cobranca, numeroParcelas, somaPrazoParcelas, valorXPrazoParcelas, prazoMedio, prazoMedioPonderado, valorEntradaMinima, valorPagamentoBruto, percDescontoPagamento, valorDescontoPagamento, percOutrasDespesasPagamento, valorOutrasDespesasPagamento, fatorJurosPagamento, valorJurosPagamento, valorPagamentoImpostosSoma, valorPagamentoImpostosDiminui, valorPagamentoLiquido, valorFinanceiro, observacoes
     FROM MOPREDOCUMXPAGAMENTOS
     WHERE preDocumento = p_preDocumento
     ORDER BY pagamentoTroco, sequencia;
  CURSOR c_mot_cab IS
    SELECT idMotivoBloqueioDocumento, FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTIVOSBLOQUEIOS', 'idMotivoBloqueioDocumento', 0, p_estabelecimentoAtivo, NULL) idMotivoBloqueioNovo
    FROM MOMOTBLOQXPREDOCUMENTOS
    WHERE preDocumento = p_preDocumento;
  CURSOR c_mot_item IS
    SELECT a.idMotivoBloqueioDocumento, a.idItemPreDocumento, FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTIVOSBLOQUEIOS', 'idMotivoBloqueioDocumento', 0, p_estabelecimentoAtivo, NULL) idMotivoBloqueioNovo
    FROM MOMOTBLOQXPREDOCUMITENS a
    JOIN MOPREDOCUMXITENS b ON b.idItemPreDocumento = a.idItemPreDocumento
    WHERE b.preDocumento = p_preDocumento
    AND b.cancelado = 0;
  CURSOR c_mot_pag IS
    SELECT a.idMotivoBloqueioDocumento, a.idPagamentoPreDocumento, FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTIVOSBLOQUEIOS', 'idMotivoBloqueioDocumento', 0, p_estabelecimentoAtivo, NULL) idMotivoBloqueioNovo
    FROM MOMOTBLOQXPREDOCUMPAGAM a
    JOIN MOPREDOCUMXPAGAMENTOS b ON b.idPagamentoPreDocumento = a.idPagamentoPreDocumento
    WHERE b.preDocumento = p_preDocumento;
  CURSOR c_mot_pag2 IS
    SELECT
      FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTIVOSBLOQUEIOS', 'idMotivoBloqueioDocumento', 0, p_estabelecimentoAtivo, NULL) idMotivoBloqueioNovo,
      a.idMotivoBloqueioDocumento
      FROM MOMOTIVOSBLOQUEIOS a
      WHERE a.origem = 'P'
      AND a.idCabecalho = p_preDocumento
      AND a.cabecalhoItemPagamento = 'P'
      AND NOT (EXISTS(
        SELECT 1
        FROM MOMOTBLOQXPREDOCUMPAGAM b
        WHERE b.idMotivoBloqueioDocumento = a.idMotivoBloqueioDocumento));
BEGIN
  r_idDocumentoFiscal := FUNC_ADD_BUSCA_PROXIMO_ID('MODOCUMENTOSFISCAIS', 'idDocumentoFiscal', 0, p_estabelecimentoAtivo, NULL);
  SELECT 
    CASE
      WHEN COALESCE(TRUNC(preDoc.dataEmissao),TO_DATE('01/01/1900','DD/MM/YYYY'))
         = COALESCE(TRUNC(p_data),TO_DATE('01/01/1900','DD/MM/YYYY'))
      THEN 1
      ELSE 0
    END,
    CASE
      WHEN preDoc.entradaSaida='E'
        AND preDoc.devolucaoAnulacaoRetorno = 1
      THEN 602
      WHEN preDoc.entradaSaida='E'
      THEN 601
      WHEN preDoc.devolucaoAnulacaoRetorno = 1
      THEN 502
      WHEN p_1_NFCe_2_ConsFinal_3_NF = '1'
        OR p_1_NFCe_2_ConsFinal_3_NF = '2'
      THEN 503
      ELSE 501
    END,
    preDoc.fatocontabil,
    preDoc.estabelecimento,
    CASE
      WHEN p_1_NFCe_2_ConsFinal_3_NF = '2'
      THEN 0
      ELSE preDoc.pessoa
    END,
    CASE
      WHEN p_nfFornecedor = 1
      THEN p_documentoFiscal
      ELSE FUNC_ADD_BUSCA_PROXIMO_ID('MODOCUMENTOSFISCAIS|' || LPAD (preDoc.estabelecimento,4,'0') || '|' || LPAD (p_idSerieFiscal,14,'0'), ' ', 0, 0,TRUNC(p_data))
    END
  INTO
    v_excluirPreDoc,
    v_tipoDocumento,
    v_fatocontabil,
    v_estabelecimento,
    v_pessoa,
    v_documentoFiscal
  FROM MOPREDOCUMENTOS preDoc
  WHERE preDoc.preDocumento = p_preDocumento;
  IF v_excluirPreDoc = 1 THEN
    IF v_fatocontabil > 0 THEN
      UPDATE MOFATOSCONTABEIS a SET a.situacaoContabilizacao = 'A' WHERE a.fatocontabil = v_fatocontabil AND a.situacaoContabilizacao = 'N';
    END IF;
  ELSE
    v_fatoContabil := FUNC_ADD_BUSCA_PROXIMO_ID('MOFATOSCONTABEIS', 'fatoContabil', 0, p_estabelecimentoAtivo, NULL);
    INSERT INTO MOFATOSCONTABEIS (
      fatoContabil,
      estabelecimento,
      data,
      ordenacao,
      situacaoTransacao,
      situacaoContabilizacao,
      sessao,
      observacoes)
    VALUES (
      v_fatoContabil,
      v_estabelecimento,
      p_data,
      0,
      'A',
      'A',
      0,
      ' ');
  END IF;
  INSERT INTO MODOCUMENTOSFISCAIS (
    idDocumentoFiscal,
    origemDocumento,
    tipoDocumento,
    tipoVenda,
    modeloDocumento,
    entradaSaida,
    devolucaoAnulacaoRetorno,
    finalidadeNota,
    atualizaCustoMedio,
    atualizaUltimaCompra,
    validoFaturamento,
    usarPrecoAVista,
    sessao,
    sessaoCaixa,
    fatoContabil,
    idTerminalSiTef,
    estabelecimentoOriginal,
    estabelecimento,
    enderecoRetiradaEstabeleciment,
    indicadorPresencaComprador,
    controlaSeparacaoConferencia,
    nfFornecedor,
    idSerieFiscal,
    serieFiscal,
    subserieFiscal,
    modeloDocumentoFiscal,
    documentoFiscal,
    dataEmissao,
    timezoneEmissao,
    dataEntradaSaida,
    pessoa,
    vendaConsumidor,
    indicadorPessoa,
    indicadorDocumentoPessoa,
    cnpjCpfIdEstrangeiro,
    nomeRazaoSocial,
    fone,
    indicadorFone,
    operadoraTelefonia,
    autorizadoPessoa,
    enderecoEntregaPessoa,
    municipioFatoGerador,
    localDestinoOperacao,
    indicadorConsumidorFinal,
    projeto,
    contratoCompra,
    comissionadoB,
    comissionadoC,
    modalidadeFrete,
    tipoPagamentoFrete,
    transportadora,
    enderecoTransportadora,
    motorista,
    placa,
    vagao,
    balsa,
    quantidadeVolume,
    especieVolume,
    descricaoMarca,
    numeracaoVolume,
    codigoIntegracao,
    atendimento,
    tipoCTe,
    idContingenciaNfe,
    codigoNumericoNfe,
    digitoVerificadorNfe,
    formaEmissaoNfe,
    indicadorAmbienteNfe,
    qrCode,
    chaveNfe,
    situacaoDocumentoFiscal,
    ultimoVendedorItem,
    quantidade,
    pesoLiquido,
    pesoBruto,
    valorProdutosBruto,
    valorProdutos,
    valorDescontoProdutos,
    valorAcrescimoProdutos,
    valorServicosBruto,
    valorServicos,
    valorDescontoServicos,
    valorAcrescimoServicos,
    valorFreteItem,
    valorSeguroItem,
    valorAdicFreteMarinhaMerItem,
    valorDespesasAduaneirasItem,
    valorFreteGeral,
    valorSeguroGeral,
    valorDescontoGeral,
    valorOutrasDespesasGeral,
    valorAdicFreteMarinhaMerGeral,
    valorDespesasAduaneirasGeral,
    condicaoPagamento,
    contaFinanceira,
    numeroParcelas,
    somaPrazoParcelas,
    valorXPrazoParcelas,
    prazoMedio,
    prazoMedioPonderado,
    valorBasePagamento,
    valorAVistaMinimo,
    valorEntradaMinima,
    valorAVistaEntrada,
    valorPagamentoBruto,
    valorDescontoPagamento,
    valorOutrasDespesasPagamento,
    valorJurosPagamento,
    valorPagamentoLiquido,
    valorTroco,
    valorFreteTotal,
    valorSeguroTotal,
    valorDescontoTotal,
    valorOutrasDespesasTotal,
    valorAdicFreteMarinhaMerTotal,
    valorDespesasAduaneirasTotal,
    impostosEditados,
    valorImpostosSomaPagamento,
    valorImpostosDiminuiPagamento,
    valorLiquidoItem,
    valorDescontoCustoOpItem,
    valorDescontoCustoOpGeral,
    valorDescontoCustoOpTotal,
    valorAcrescimoCustoOpItem,
    valorAcrescimoCustoOpGeral,
    valorAcrescimoCustoOpTotal,
    valorCustoOperacao,
    valorCMV,
    quantidadeExtemporanea,
    valorAcrescimoExtempSubtotal,
    valorAcrescimoExtempItem,
    valorAcrescimoExtempGeral,
    valorAcrescimoExtempTotal,
    versaoAplicativo)
  SELECT
    r_idDocumentoFiscal,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.origemDocumento ELSE 13 END,
    v_tipoDocumento,
    preDoc.tipoVenda,
    preDoc.modeloDocumento,
    preDoc.entradaSaida,
    preDoc.devolucaoAnulacaoRetorno,
    preDoc.finalidadeNota,
    preDoc.atualizaCustoMedio,
    preDoc.atualizaUltimaCompra,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.validoFaturamento ELSE 0 END,
    preDoc.usarPrecoAVista,
    preDoc.sessao,
    preDoc.sessaoCaixa,
    v_fatoContabil,
    preDoc.idTerminalSiTef,
    preDoc.estabelecimentoOriginal,
    v_estabelecimento,
    preDoc.enderecoRetiradaEstabeleciment,
    preDoc.indicadorPresencaComprador,
    preDoc.controlaSeparacaoConferencia,
    p_nfFornecedor,
    p_idSerieFiscal,
    p_serieFiscal,
    p_subserieFiscal,
    p_modeloDocumentoFiscal,
    v_documentoFiscal,
    p_data dataEmissao,
    p_timezone timezoneEmissao,
    p_data dataEntradaSaida,
    CASE WHEN p_1_NFCe_2_ConsFinal_3_NF = '2' THEN 0 ELSE preDoc.pessoa END pessoa,
    CASE WHEN p_1_NFCe_2_ConsFinal_3_NF = '2' THEN 1 ELSE 0 END vendaConsumidor,
    preDoc.indicadorPessoa,
    preDoc.indicadorDocumentoPessoa,
    preDoc.cnpjCpfIdEstrangeiro,
    preDoc.nomeRazaoSocial,
    preDoc.fone,
    preDoc.indicadorFone,
    preDoc.operadoraTelefonia,
    CASE WHEN p_1_NFCe_2_ConsFinal_3_NF = '2' THEN 0 ELSE preDoc.autorizadoPessoa END autorizadoPessoa,
    CASE WHEN p_1_NFCe_2_ConsFinal_3_NF = '2' THEN 0 ELSE preDoc.enderecoEntregaPessoa END enderecoEntregaPessoa,
    CASE
      WHEN p_1_NFCe_2_ConsFinal_3_NF = '2'
      THEN COALESCE ((SELECT MAX(endEst.municipio) FROM CAENDERECOSPESSOA endEst WHERE endEst.pessoa = est.pessoaEstabelecimento AND endEst.ativo = 1 AND endEst.principal = 1),0)
      ELSE preDoc.municipioFatoGerador
    END municipioFatoGerador,
    CASE WHEN p_1_NFCe_2_ConsFinal_3_NF = '2' THEN '1' ELSE preDoc.localDestinoOperacao END localDestinoOperacao,
    CASE WHEN p_1_NFCe_2_ConsFinal_3_NF = '2' THEN '1' ELSE preDoc.indicadorConsumidorFinal END indicadorConsumidorFinal,
    preDoc.projeto,
    preDoc.contratoCompra,
    preDoc.comissionadoB,
    preDoc.comissionadoC,
    CASE WHEN preDoc.modalidadeFrete = ' ' THEN '9' ELSE preDoc.modalidadeFrete END,
    CASE WHEN preDoc.tipoPagamentoFrete = ' ' THEN 'N' ELSE preDoc.tipoPagamentoFrete END,
    preDoc.transportadora,
    preDoc.enderecoTransportadora,
    preDoc.motorista,
    preDoc.placa,
    preDoc.vagao,
    preDoc.balsa,
    preDoc.quantidadeVolume,
    preDoc.especieVolume,
    preDoc.descricaoMarca,
    preDoc.numeracaoVolume,
    preDoc.codigoIntegracao,
    preDoc.atendimento,
    '0' tipoCTe,
    0 idContingenciaNfe,
    0 codigoNumericoNfe,
    0 digitoVerificadorNfe,
    ' ' formaEmissaoNfe,
    est.indicadorAmbienteNfe,
    ' ' qrCode,
    ' ' chaveNfe,
    11 situacaoDocumentoFiscal,
    preDoc.ultimoVendedorItem,
    preDoc.quantidade,
    preDoc.pesoLiquido,
    preDoc.pesoBruto,
    preDoc.valorProdutosBruto,
    preDoc.valorProdutos,
    preDoc.valorDescontoProdutos,
    preDoc.valorAcrescimoProdutos,
    preDoc.valorServicosBruto,
    preDoc.valorServicos,
    preDoc.valorDescontoServicos,
    preDoc.valorAcrescimoServicos,
    preDoc.valorFreteItem,
    preDoc.valorSeguroItem,
    preDoc.valorAdicFreteMarinhaMerItem,
    preDoc.valorDespesasAduaneirasItem,
    preDoc.valorFreteGeral,
    preDoc.valorSeguroGeral,
    preDoc.valorDescontoGeral + CASE WHEN v_excluirPreDoc = 1 THEN 0 ELSE preDoc.valorDescontoPagamento END,
    preDoc.valorOutrasDespesasGeral + CASE WHEN v_excluirPreDoc = 1 THEN 0 ELSE preDoc.valorOutrasDespesasPagamento + preDoc.valorJurosPagamento END,
    preDoc.valorAdicFreteMarinhaMerGeral,
    preDoc.valorDespesasAduaneirasGeral,
    preDoc.condicaoPagamento,
    preDoc.contaFinanceira,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.numeroParcelas ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.somaPrazoParcelas ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorXPrazoParcelas ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.prazoMedio ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.prazoMedioPonderado ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorBasePagamento ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorAVistaMinimo ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorEntradaMinima ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorAVistaEntrada ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorPagamentoBruto ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorDescontoPagamento ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorOutrasDespesasPagamento ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorJurosPagamento ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorPagamentoLiquido ELSE 0 END,
    CASE WHEN v_excluirPreDoc = 1 THEN preDoc.valorTroco ELSE 0 END,
    preDoc.valorFreteTotal,
    preDoc.valorSeguroTotal,
    preDoc.valorDescontoTotal,
    preDoc.valorOutrasDespesasTotal,
    preDoc.valorAdicFreteMarinhaMerTotal,
    preDoc.valorDespesasAduaneirasTotal,
    preDoc.impostosEditados,
    preDoc.valorImpostosSomaPagamento,
    preDoc.valorImpostosDiminuiPagamento,
    preDoc.valorLiquidoItem,
    preDoc.valorDescontoCustoOpItem,
    preDoc.valorDescontoCustoOpGeral,
    preDoc.valorDescontoCustoOpTotal,
    preDoc.valorAcrescimoCustoOpItem,
    preDoc.valorAcrescimoCustoOpGeral,
    preDoc.valorAcrescimoCustoOpTotal,
    preDoc.valorCustoOperacao,
    preDoc.valorCMV,
    preDoc.quantidadeExtemporanea,
    preDoc.valorAcrescimoExtempSubtotal,
    preDoc.valorAcrescimoExtempItem,
    preDoc.valorAcrescimoExtempGeral,
    preDoc.valorAcrescimoExtempTotal,
    p_versaoAplicativo
  FROM MOPREDOCUMENTOS preDoc
  JOIN PAESTABELECIMENTOS est ON est.estabelecimento = preDoc.estabelecimento
  WHERE preDoc.preDocumento = p_preDocumento;
  INSERT INTO MODOCFISCALXPERSPROJETO (
    idPersonProjetoDocFiscal,
    idDocumentoFiscal,
    personalizacaoProjeto,
    conteudo)
  SELECT
    FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXPERSPROJETO', 'idPersonProjetoDocFiscal', 0, p_estabelecimentoAtivo, NULL),
    r_idDocumentoFiscal,
    personalizacaoProjeto,
    conteudo
  FROM MOPREDOCUMXPERSPROJETO
  WHERE preDocumento = p_preDocumento;
  INSERT INTO MODOCFISCALXINFOCOMPLEMEN (
    id,
    idDocumentoFiscal,
    sequencia,
    geradoPeloSistema,
    imprimir,
    destaque,
    informacaoComplementar,
    descInformacaoComplementar)
  SELECT
    FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXINFOCOMPLEMEN', 'id', 0, p_estabelecimentoAtivo, NULL),
    r_idDocumentoFiscal,
    sequencia,
    geradoPeloSistema,
    imprimir,
    destaque,
    informacaoComplementar,
    descInformacaoComplementar
  FROM MOPREDOCUMXINFOCOMPLENT
  WHERE preDocumento = p_preDocumento;
  INSERT INTO MODOCFISCALXPROMOCOES (
    id,
    idDocumentoFiscal,
    cabecalhoItemPagamento,
    sequencia,
    idItemDocFiscal,
    idPagamentoDocFiscal,
    regraPromocao,
    tipoBeneficio,
    multiplicador,
    precoUnitarioDe,
    precoUnitarioPor,
    precoDesconto,
    precoMinimo,
    percentualDesconto,
    valorDesconto,
    pontuacao,
    gerarPontuacao,
    observacoes)
  SELECT
    FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXPROMOCOES', 'id', 0, p_estabelecimentoAtivo, NULL),
    r_idDocumentoFiscal,
    cabecalhoItemPagamento,
    sequencia,
    0,
    0,
    regraPromocao,
    tipoBeneficio,
    multiplicador,
    precoUnitarioDe,
    precoUnitarioPor,
    precoDesconto,
    precoMinimo,
    percentualDesconto,
    valorDesconto,
    pontuacao,
    gerarPontuacao,
    observacoes
  FROM MOPREDOCUMXPROMOCOES
  WHERE preDocumento = p_preDocumento
  AND idItemPreDocumento = 0
  AND idPagamentoPreDocumento = 0;
  v_sequenciaItem := 0;
  FOR itens IN c_itens
  LOOP
    IF itens.cancelado = 0 THEN
      v_sequenciaItem := v_sequenciaItem + 1;
        INSERT INTO MODOCFISCALXITENS (
        idItemDocFiscal,
        idDocumentoFiscal,
        sequencia,
        cancelado,
        pedidoCompraFornecedor,
        sequenciaPedidoCompraFornec,
        modeloDocumento,
        estabelecimentoOriginal,
        vendedor,
        gradeProduto,
        idFormulaTinta,
        personalizacao,
        idLoteEstoque,
        localEstoque,
        pessoaParticipante,
        controleQuantidade,
        unidadeMedidaConversao,
        conversorQuantidade,
        loteMinimo,
        loteMultiplo,
        altura,
        largura,
        comprimento,
        pecas,
        quantidade,
        quantidadeConvertida,
        quantidadeDevolvidaRetornada,
        pesoLiquido,
        pesoBruto,
        tipoPreco,
        tabelaPreco,
        precoSugestaoAPrazo,
        precoSugestaoAVista,
        precoDesconto,
        precoMinimo,
        usarPrecoAVista,
        precoUnitarioBruto,
        acrescimoUnitarioComposicao,
        precoUnitario,
        precoUnitarioConvertido,
        valorProdutoServicoBruto,
        valorProdutoServico,
        percDescontoItem,
        valorDescontoItem,
        percAcrescimoItem,
        valorAcrescimoItem,
        valorFreteItem,
        valorSeguroItem,
        valorAdicFreteMarinhaMerItem,
        valorDespesasAduaneirasItem,
        quantidadeExtemporanea,
        acrescimoUnitarioExtemporaneo,
        valorAcrescimoExtempSubtotal,
        valorAcrescimoExtempItem,
        valorDescontoCustoOpItem,
        valorAcrescimoCustoOpItem,
        observacoesDigitadas,
        observacoes,
        valorFreteGeral,
        valorSeguroGeral,
        valorDescontoGeral,
        valorOutrasDespesasGeral,
        valorAdicFreteMarinhaMerGeral,
        valorDespesasAduaneirasGeral,
        valorAcrescimoExtempGeral,
        valorDescontoCustoOpGeral,
        valorAcrescimoCustoOpGeral,
        valorDescontoPagamento,
        valorOutrasDespesasPagamento,
        valorJurosPagamento,
        valorFreteTotal,
        valorSeguroTotal,
        valorDescontoTotal,
        valorOutrasDespesasTotal,
        valorAdicFreteMarinhaMerTotal,
        valorDespesasAduaneirasTotal,
        valorAcrescimoExtempTotal,
        valorDescontoCustoOpTotal,
        valorAcrescimoCustoOpTotal,
        percentualDevolucao,
        valorIPIDevolucao,
        operacaoFiscal,
        movimentaEstoque,
        movimentaEstoqueFiscal,
        geraFinanceiro,
        cfop,
        indicadorISSQN,
        aliquotaISSQN,
        retidoISSQN,
        tributadoForaMunicipio,
        incentivoFiscal,
        listaServicos,
        cnae,
        idServicoMunicipio,
        numeroProcessoAdministrativo,
        retencaoIRRF,
        retencaoINSS,
        retencaoPIS,
        retencaoCOFINS,
        retencaoCSLL,
        retencaoOutros,
        aliquotaII,
        aliquotaIOF,
        codigoEnquadramentoIPI,
        stIPI,
        aliquotaIPI,
        valorAliquotaIPI,
        stPIS,
        aliquotaPIS,
        valorAliquotaPIS,
        aliquotaPISST,
        valorAliquotaPISST,
        stCOFINS,
        aliquotaCOFINS,
        valorAliquotaCOFINS,
        aliquotaCOFINSST,
        valorAliquotaCOFINSST,
        stSimplesNacional,
        creditoSimplesNacional,
        stICMS,
        modalidadeBaseCalcICMS,
        reducaoBaseICMS,
        aliquotaICMS,
        diferimentoICMS,
        motivoDesoneracaoICMS,
        idBeneficio,
        modalidadeBaseCalcICMSST,
        margemValorAdicionadoST,
        reducaoBaseST,
        aliquotaICMSST,
        aliquotaSTSuportConsFinal,
        reducaoBaseICMSEfetivo,
        aliquotaICMSEfetivo,
        stICMSEscrituracao,
        reducaoBaseICMSEscrituracao,
        aliquotaICMSEscrituracao,
        diferimentoICMSEscrituracao,
        margemValorAdicSTEscrituracao,
        reducaoBaseSTEscrituracao,
        aliquotaICMSSTEscrituracao,
        somarICMSST,
        aliquotaICMSUFDestinatario,
        aliquotaICMSInterestadual,
        partilhaICMSInterestadual,
        aliquotaFCP,
        aliquotaFCPST,
        aliquotaFCPSTAnteriormente,
        aliquotaFCPUFDestinatario,
        aliquotaEstimadaImpFederais,
        aliquotaEstimadaImpEstaduais,
        aliquotaEstimadaImpMunicipais,
        baseISSQN,
        valorISSQN,
        baseRetIRRF,
        valorRetIRRF,
        baseRetINSS,
        valorRetINSS,
        baseRetPIS,
        valorRetPIS,
        baseRetCOFINS,
        valorRetCOFINS,
        baseRetCSLL,
        valorRetCSLL,
        baseRetOutros,
        valorRetOutros,
        baseII,
        valorII,
        baseIOF,
        valorIOF,
        baseIPI,
        valorIPI,
        basePIS,
        valorPIS,
        basePISST,
        valorPISST,
        baseCOFINS,
        valorCOFINS,
        baseCOFINSST,
        valorCOFINSST,
        baseCreditoSimplesNacional,
        valorCreditoSimplesNacional,
        baseICMS,
        valorICMSOperacao,
        valorICMSDiferido,
        valorICMS,
        valorICMSDesoneracao,
        baseICMSST,
        valorICMSST,
        baseICMSSTAnteriormente,
        valorICMSSTAnteriormente,
        valorICMSProprioSubstituto,
        baseICMSEfetivo,
        valorICMSEfetivo,
        baseICMSEscrituracao,
        valorICMSEscrituracao,
        valorICMSDesonEscrituracao,
        baseICMSSTEscrituracao,
        valorICMSSTEscrituracao,
        baseICMSUFDestinatario,
        valorICMSUFDestinatario,
        baseICMSUFRemetente,
        valorICMSUFRemetente,
        baseFCP,
        valorFCP,
        baseFCPST,
        valorFCPST,
        baseFCPSTAnteriormente,
        valorFCPSTAnteriormente,
        baseFCPUFDestinatario,
        valorFCPUFDestinatario,
        baseEstimadaImpostos,
        valorEstimadoImpFederais,
        valorEstimadoImpEstaduais,
        valorEstimadoImpMunicipais,
        valorBasePagamento,
        valorLiquidoItem,
        precoCustoOperacao,
        valorCustoOperacao,
        precoCMV,
        valorCMV)
      VALUES (
        itens.idItemDocFiscal,
        r_idDocumentoFiscal,
        itens.sequencia,
        itens.cancelado,
        itens.pedidoCompraFornecedor,
        itens.sequenciaPedidoCompraFornec,
        itens.modeloDocumento,
        itens.estabelecimentoOriginal,
        itens.vendedor,
        itens.gradeProduto,
        itens.idFormulaTinta,
        itens.personalizacao,
        itens.idLoteEstoque,
        itens.localEstoque,
        itens.pessoaParticipante,
        itens.controleQuantidade,
        itens.unidadeMedidaConversao,
        itens.conversorQuantidade,
        itens.loteMinimo,
        itens.loteMultiplo,
        itens.altura,
        itens.largura,
        itens.comprimento,
        itens.pecas,
        itens.quantidade,
        itens.quantidadeConvertida,
        0,
        itens.pesoLiquido,
        itens.pesoBruto,
        itens.tipoPreco,
        itens.tabelaPreco,
        itens.precoSugestaoAPrazo,
        itens.precoSugestaoAVista,
        itens.precoDesconto,
        itens.precoMinimo,
        itens.usarPrecoAVista,
        itens.precoUnitarioBruto,
        itens.acrescimoUnitarioComposicao,
        itens.precoUnitario,
        itens.precoUnitarioConvertido,
        itens.valorProdutoServicoBruto,
        itens.valorProdutoServico,
        itens.percDescontoItem,
        itens.valorDescontoItem,
        itens.percAcrescimoItem,
        itens.valorAcrescimoItem,
        itens.valorFreteItem,
        itens.valorSeguroItem,
        itens.valorAdicFreteMarinhaMerItem,
        itens.valorDespesasAduaneirasItem,
        itens.quantidadeExtemporanea,
        itens.acrescimoUnitarioExtemporaneo,
        itens.valorAcrescimoExtempSubtotal,
        itens.valorAcrescimoExtempItem,
        itens.valorDescontoCustoOpItem,
        itens.valorAcrescimoCustoOpItem,
        itens.observacoesDigitadas,
        itens.observacoes,
        itens.valorFreteGeral,
        itens.valorSeguroGeral,
        itens.valorDescontoGeral +
        CASE
          WHEN v_excluirPreDoc = 1
          THEN 0
          ELSE itens.valorDescontoPagamento
        END,
        itens.valorOutrasDespesasGeral +
        CASE
          WHEN v_excluirPreDoc = 1
          THEN 0
          ELSE itens.valorOutrasDespesasPagamento + itens.valorJurosPagamento
        END,
        itens.valorAdicFreteMarinhaMerGeral,
        itens.valorDespesasAduaneirasGeral,
        itens.valorAcrescimoExtempGeral,
        itens.valorDescontoCustoOpGeral,
        itens.valorAcrescimoCustoOpGeral,
        CASE
          WHEN v_excluirPreDoc = 1
          THEN itens.valorDescontoPagamento
          ELSE 0
        END,
        CASE
          WHEN v_excluirPreDoc = 1
          THEN itens.valorOutrasDespesasPagamento
          ELSE 0
        END,
        CASE
          WHEN v_excluirPreDoc = 1
          THEN itens.valorJurosPagamento
          ELSE 0
        END,
        itens.valorFreteTotal,
        itens.valorSeguroTotal,
        itens.valorDescontoTotal,
        itens.valorOutrasDespesasTotal,
        itens.valorAdicFreteMarinhaMerTotal,
        itens.valorDespesasAduaneirasTotal,
        itens.valorAcrescimoExtempTotal,
        itens.valorDescontoCustoOpTotal,
        itens.valorAcrescimoCustoOpTotal,
        itens.percentualDevolucao,
        itens.valorIPIDevolucao,
        itens.operacaoFiscal,
        CASE
          WHEN v_excluirPreDoc = 1
          THEN itens.movimentaEstoque
          ELSE 0
        END,
        itens.movimentaEstoque,
        CASE
          WHEN v_excluirPreDoc = 1
          THEN itens.geraFinanceiro
          ELSE 0
        END,
        itens.cfop,
        itens.indicadorISSQN,
        itens.aliquotaISSQN,
        itens.retidoISSQN,
        itens.tributadoForaMunicipio,
        itens.incentivoFiscal,
        itens.listaServicos,
        itens.cnae,
        itens.idServicoMunicipio,
        itens.numeroProcessoAdministrativo,
        itens.retencaoIRRF,
        itens.retencaoINSS,
        itens.retencaoPIS,
        itens.retencaoCOFINS,
        itens.retencaoCSLL,
        itens.retencaoOutros,
        itens.aliquotaII,
        itens.aliquotaIOF,
        itens.codigoEnquadramentoIPI,
        itens.stIPI,
        itens.aliquotaIPI,
        itens.valorAliquotaIPI,
        itens.stPIS,
        itens.aliquotaPIS,
        itens.valorAliquotaPIS,
        itens.aliquotaPISST,
        itens.valorAliquotaPISST,
        itens.stCOFINS,
        itens.aliquotaCOFINS,
        itens.valorAliquotaCOFINS,
        itens.aliquotaCOFINSST,
        itens.valorAliquotaCOFINSST,
        itens.stSimplesNacional,
        itens.creditoSimplesNacional,
        itens.stICMS,
        itens.modalidadeBaseCalcICMS,
        itens.reducaoBaseICMS,
        itens.aliquotaICMS,
        itens.diferimentoICMS,
        itens.motivoDesoneracaoICMS,
        itens.idBeneficio,
        itens.modalidadeBaseCalcICMSST,
        itens.margemValorAdicionadoST,
        itens.reducaoBaseST,
        itens.aliquotaICMSST,
        itens.aliquotaSTSuportConsFinal,
        itens.reducaoBaseICMSEfetivo,
        itens.aliquotaICMSEfetivo,
        itens.stICMSEscrituracao,
        itens.reducaoBaseICMSEscrituracao,
        itens.aliquotaICMSEscrituracao,
        itens.diferimentoICMSEscrituracao,
        itens.margemValorAdicSTEscrituracao,
        itens.reducaoBaseSTEscrituracao,
        itens.aliquotaICMSSTEscrituracao,
        itens.somarICMSST,
        itens.aliquotaICMSUFDestinatario,
        itens.aliquotaICMSInterestadual,
        itens.partilhaICMSInterestadual,
        itens.aliquotaFCP,
        itens.aliquotaFCPST,
        itens.aliquotaFCPSTAnteriormente,
        itens.aliquotaFCPUFDestinatario,
        itens.aliquotaEstimadaImpFederais,
        itens.aliquotaEstimadaImpEstaduais,
        itens.aliquotaEstimadaImpMunicipais,
        itens.baseISSQN,
        itens.valorISSQN,
        itens.baseRetIRRF,
        itens.valorRetIRRF,
        itens.baseRetINSS,
        itens.valorRetINSS,
        itens.baseRetPIS,
        itens.valorRetPIS,
        itens.baseRetCOFINS,
        itens.valorRetCOFINS,
        itens.baseRetCSLL,
        itens.valorRetCSLL,
        itens.baseRetOutros,
        itens.valorRetOutros,
        itens.baseII,
        itens.valorII,
        itens.baseIOF,
        itens.valorIOF,
        itens.baseIPI,
        itens.valorIPI,
        itens.basePIS,
        itens.valorPIS,
        itens.basePISST,
        itens.valorPISST,
        itens.baseCOFINS,
        itens.valorCOFINS,
        itens.baseCOFINSST,
        itens.valorCOFINSST,
        itens.baseCreditoSimplesNacional,
        itens.valorCreditoSimplesNacional,
        itens.baseICMS,
        itens.valorICMSOperacao,
        itens.valorICMSDiferido,
        itens.valorICMS,
        itens.valorICMSDesoneracao,
        itens.baseICMSST,
        itens.valorICMSST,
        itens.baseICMSSTAnteriormente,
        itens.valorICMSSTAnteriormente,
        itens.valorICMSProprioSubstituto,
        itens.baseICMSEfetivo,
        itens.valorICMSEfetivo,
        itens.baseICMSEscrituracao,
        itens.valorICMSEscrituracao,
        itens.valorICMSDesonEscrituracao,
        itens.baseICMSSTEscrituracao,
        itens.valorICMSSTEscrituracao,
        itens.baseICMSUFDestinatario,
        itens.valorICMSUFDestinatario,
        itens.baseICMSUFRemetente,
        itens.valorICMSUFRemetente,
        itens.baseFCP,
        itens.valorFCP,
        itens.baseFCPST,
        itens.valorFCPST,
        itens.baseFCPSTAnteriormente,
        itens.valorFCPSTAnteriormente,
        itens.baseFCPUFDestinatario,
        itens.valorFCPUFDestinatario,
        itens.baseEstimadaImpostos,
        itens.valorEstimadoImpFederais,
        itens.valorEstimadoImpEstaduais,
        itens.valorEstimadoImpMunicipais,
        CASE
          WHEN v_excluirPreDoc = 1
          THEN itens.valorBasePagamento
          ELSE 0
        END,
        itens.valorLiquidoItem,
        itens.precoCustoOperacao,
        itens.valorCustoOperacao,
        itens.precoCMV,
        itens.valorCMV);
      INSERT INTO MODOCFISCALXCOMPOSICOESPR (
        id,
        idItemDocFiscal,
        composicaoPreco,
        selecionado,
        quantidade,
        observacoes)
      SELECT
        FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXCOMPOSICOESPR', 'id', 0, p_estabelecimentoAtivo, NULL),
        itens.idItemDocFiscal,
        x.composicaoPreco,
        x.selecionado,
        x.quantidade,
        x.observacoes
      FROM MOPREDOCUMXCOMPOSICOESPR x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      INSERT INTO MODOCFISCALXEMBALAGENSTIN (
        idEmbalagemTintaDocFiscal,
        idItemDocFiscal,
        embalagemTinta,
        quantidade,
        quantidadeSaldo,
        quantidadeConferida,
        observacoes)
      SELECT
        FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXEMBALAGENSTIN', 'idEmbalagemTintaDocFiscal', 0, p_estabelecimentoAtivo, NULL),
        itens.idItemDocFiscal,
        x.embalagemTinta,
        x.quantidade,
        x.quantidadeSaldo,
        x.quantidadeConferida,
        x.observacoes
      FROM MOPREDOCUMXEMBALAGENSTIN x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      INSERT INTO MODOCFISCALXNUMEROSSERIE (
        idNumeroSerieDocFiscal,
        idItemDocFiscal,
        idEnderecoEstoqueDocFiscal,
        gradeProduto,
        idNumeroSerie,
        devolvidoRetornado)
      SELECT
        FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXNUMEROSSERIE', 'idNumeroSerieDocFiscal', 0, p_estabelecimentoAtivo, NULL),
        itens.idItemDocFiscal,
        0,
        x.gradeProduto,
        x.idNumeroSerie,
        x.devolvidoRetornado
      FROM MOPREDOCUMXNUMEROSSERIE x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento
      AND x.idEnderecoEstoquePreDocumento = 0;
      INSERT INTO MODOCFISCALXCENTROSCUSTOS (
        idCentroCustoDocFiscal,
        idItemDocFiscal,
        idCentroCusto,
        percentualRateio)
      SELECT
        FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXCENTROSCUSTOS', 'idCentroCustoDocFiscal', 0, p_estabelecimentoAtivo, NULL),
        itens.idItemDocFiscal,
        x.idCentroCusto,
        x.percentualRateio
      FROM MOPREDOCUMXCENTROSCUSTOS x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      INSERT INTO MODOCFISCALXPROJETOS (id,
        idItemDocFiscal,
        projeto)
      SELECT
        FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXPROJETOS', 'id', 0, p_estabelecimentoAtivo, NULL),
        itens.idItemDocFiscal,
        x.projeto
      FROM MOPREDOCUMXPROJETOS x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      INSERT INTO MODOCFISCALXPROMOCOES (
        id,
        idDocumentoFiscal,
        cabecalhoItemPagamento,
        sequencia,
        idItemDocFiscal,
        idPagamentoDocFiscal,
        regraPromocao,
        tipoBeneficio,
        multiplicador,
        precoUnitarioDe,
        precoUnitarioPor,
        precoDesconto,
        precoMinimo,
        percentualDesconto,
        valorDesconto,
        pontuacao,
        gerarPontuacao,
        observacoes)
      SELECT
        FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXPROMOCOES', 'id', 0, p_estabelecimentoAtivo, NULL),
        r_idDocumentoFiscal,
        x.cabecalhoItemPagamento,
        itens.sequencia,
        itens.idItemDocFiscal,
        0,
        x.regraPromocao,
        x.tipoBeneficio,
        x.multiplicador,
        x.precoUnitarioDe,
        x.precoUnitarioPor,
        x.precoDesconto,
        x.precoMinimo,
        x.percentualDesconto,
        x.valorDesconto,
        x.pontuacao,
        x.gerarPontuacao,
        x.observacoes
      FROM MOPREDOCUMXPROMOCOES x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      FOR endEst IN c_endEst
      LOOP
        IF endEst.idItemPreDocumento = itens.idItemPreDocumento THEN
          INSERT INTO MODOCFISCALXENDERECOESTOQ (
            idEnderecoEstoqueDocFiscal,
            idItemDocFiscal,
            idEnderecoEstoque,
            posicaoCaixaEstoque,
            quantidade,
            quantidadeDevolvidaRetornada,
            quantidadeConferida,
            observacoes)
          VALUES (
            endEst.idEnderecoEstoqueDocFiscal,
            itens.idItemDocFiscal,
            endEst.idEnderecoEstoque,
            endEst.posicaoCaixaEstoque,
            endEst.quantidade,
            endEst.quantidadeDevolvidaRetornada,
            endEst.quantidadeConferida,
            endEst.observacoes);
          INSERT INTO MODOCFISCALXNUMEROSSERIE (
            idNumeroSerieDocFiscal,
            idItemDocFiscal,
            idEnderecoEstoqueDocFiscal,
            gradeProduto,
            idNumeroSerie,
            devolvidoRetornado)
          SELECT
            FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXNUMEROSSERIE', 'idNumeroSerieDocFiscal', 0, p_estabelecimentoAtivo, NULL),
            itens.idItemDocFiscal,
            endEst.idEnderecoEstoqueDocFiscal,
            x.gradeProduto,
            x.idNumeroSerie,
            x.devolvidoRetornado
          FROM MOPREDOCUMXNUMEROSSERIE x
          WHERE x.idItemPreDocumento = itens.idItemPreDocumento
          AND x.idEnderecoEstoquePreDocumento = endEst.idEnderecoEstoquePreDocumento;
        END IF;
      END LOOP;
    END IF;
    FOR mot IN c_mot_item
    LOOP
      IF mot.idItemPreDocumento = itens.idItemPreDocumento THEN
        INSERT INTO MOMOTIVOSBLOQUEIOS (
          idMotivoBloqueioDocumento,
          origem,
          idCabecalho,
          tipoDocumento,
          idDocumento,
          estabelecimento,
          pessoa,
          cabecalhoItemPagamento,
          sequencia,
          condicaoPagamento,
          vendedor,
          gradeProduto,
          unidadeMedidaConversao,
          quantidadeConvertida,
          valorLiquido,
          motivoBloqueioDocumento,
          dataBloqueio,
          baseBloqueado,
          valorBloqueado,
          percentualBloqueado,
          situacaoLiberacao,
          observacoes)
        SELECT
          mot.idMotivoBloqueioNovo,
          'D',
          r_idDocumentoFiscal,
          v_tipoDocumento,
          v_documentoFiscal,
          v_estabelecimento,
          v_pessoa,
          a.cabecalhoItemPagamento,
          itens.sequencia,
          a.condicaoPagamento,
          a.vendedor,
          a.gradeProduto,
          a.unidadeMedidaConversao,
          a.quantidadeConvertida,
          a.valorLiquido,
          a.motivoBloqueioDocumento,
          a.dataBloqueio,
          a.baseBloqueado,
          a.valorBloqueado,
          a.percentualBloqueado,
          a.situacaoLiberacao, a.observacoes
        FROM MOMOTIVOSBLOQUEIOS a
        WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
        INSERT INTO MOMOTBLOQXDOCFISCALITENS (
          id,
          idMotivoBloqueioDocumento,
          idItemDocFiscal)
        VALUES (
          FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXDOCFISCALITENS', 'id', 0, p_estabelecimentoAtivo, NULL),
          mot.idMotivoBloqueioNovo,
          itens.idItemDocFiscal);
        INSERT INTO MOMOTBLOQXLIBERACOES (
          id,
          idMotivoBloqueioDocumento,
          usuario,
          dataLiberacao,
          valorLiberado,
          percentualLiberado,
          percentualAlcada,
          situacaoLiberacao,
          observacoes)
        SELECT
          FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXLIBERACOES', 'id', 0, p_estabelecimentoAtivo, NULL),
          mot.idMotivoBloqueioNovo,
          a.usuario,
          a.dataLiberacao,
          a.valorLiberado,
          a.percentualLiberado,
          a.percentualAlcada,
          a.situacaoLiberacao, a.observacoes
        FROM MOMOTBLOQXLIBERACOES a
        WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
        IF v_excluirPreDoc = 1 THEN
          DELETE MOMOTBLOQXLIBERACOES a
          WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
          DELETE MOMOTBLOQXPREDOCUMITENS a
          WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
          DELETE MOMOTIVOSBLOQUEIOS a
          WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
        END IF;
      END IF;
    END LOOP;
    IF v_excluirPreDoc = 1 THEN
      IF itens.cancelado = 0 THEN
        INSERT INTO MODOCFISCALXORCAMENTOITEM (
          id,
          idItemDocFiscal,
          idItemOrcamento,
          quantidade,
          efetivacao)
        SELECT
          FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXORCAMENTOITEM', 'id', 0, p_estabelecimentoAtivo, NULL),
          itens.idItemDocFiscal,
          x.idItemOrcamento,
          x.quantidade,
          x.efetivacao
        FROM MOPREDOCUMXORCAMENTOITEM x
        WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
        INSERT INTO MOPREDOCUMXDOCFISCAL (
          id,
          idItemPreDocumento,
          idItemDocFiscalReferenciado,
          quantidade)
        SELECT
          FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXDOCFISCAL', 'id', 0, p_estabelecimentoAtivo, NULL),
          x.idItemPreDocumento,
          itens.idItemDocFiscal,
          x.quantidade
        FROM MOPREDOCUMXPREDOCUM x
        WHERE x.idItemPreDocReferenciado = itens.idItemPreDocumento;
        INSERT INTO MODOCFISCALXPREDOCUM (
          id,
          idItemDocFiscal,
          idItemPreDocReferenciado,
          quantidade)
        SELECT
          FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXPREDOCUM', 'id', 0, p_estabelecimentoAtivo, NULL),
          itens.idItemDocFiscal,
          x.idItemPreDocReferenciado,
          x.quantidade
        FROM MOPREDOCUMXPREDOCUM x
        WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
        INSERT INTO MODOCFISCALXDOCFISCAL (
          id,
          idItemDocFiscal,
          idItemDocFiscalReferenciado,
          quantidade)
        SELECT
          FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXDOCFISCAL', 'id', 0, p_estabelecimentoAtivo, NULL),
          x.idItemDocFiscal,
          itens.idItemDocFiscal,
          x.quantidade
        FROM MODOCFISCALXPREDOCUM x
        WHERE x.idItemPreDocReferenciado = itens.idItemPreDocumento;
        INSERT INTO MODOCFISCALXDOCFISCAL (
          id,
          idItemDocFiscal,
          idItemDocFiscalReferenciado,
          quantidade)
        SELECT
          FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXDOCFISCAL', 'id', 0, p_estabelecimentoAtivo, NULL),
          itens.idItemDocFiscal,
          x.idItemDocFiscalReferenciado,
          x.quantidade
        FROM MOPREDOCUMXDOCFISCAL x
        WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
        INSERT INTO MODOCTRANSFXDOCFISCAL (
          id,
          entradaSaidaOriginal,
          idItemDocTransferencia,
          idItemDocFiscal,
          quantidade)
        SELECT
          FUNC_ADD_BUSCA_PROXIMO_ID('MODOCTRANSFXDOCFISCAL', 'id', 0, p_estabelecimentoAtivo, NULL),
          x.entradaSaidaOriginal,
          x.idItemDocTransferencia,
          itens.idItemDocFiscal,
          x.quantidade
        FROM MODOCTRANSFXPREDOCUM x
        WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
        INSERT INTO MODOCFISCALXESTOQUE (
          id,
          idItemDocFiscal,
          idEstoque)
        SELECT
          FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXESTOQUE', 'id', 0, p_estabelecimentoAtivo, NULL),
          itens.idItemDocFiscal,
          x.idEstoque
        FROM MOPREDOCUMXESTOQUE x
        WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
        INSERT INTO MOVALEDESCXITEMDOCFISCAL (
          id,
          idValeDesconto,
          idItemDocFiscal)
        SELECT
          FUNC_ADD_BUSCA_PROXIMO_ID('MOVALEDESCXITEMDOCFISCAL', 'id', 0, p_estabelecimentoAtivo, NULL),
          x.idValeDesconto,
          itens.idItemDocFiscal
        FROM MOVALEDESCXITEMPREDOCUM x
        WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      END IF;
      UPDATE MOSEPARACAOXITENS x SET
        x.idItemPreDocumento = 0,
        x.idItemDocFiscal = itens.idItemDocFiscal
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      UPDATE MODOCTROCAXITENS x SET
        x.idItemPreDocumentoSaida = 0,
        x.idItemDocFiscalSaida = itens.idItemDocFiscal
      WHERE x.idItemPreDocumentoSaida = itens.idItemPreDocumento;
      UPDATE MOENTREGAS x SET
        x.idItemPreDocumentoRemessa = 0,
        x.idItemDocFiscalRemessa = itens.idItemDocFiscal
      WHERE x.idItemPreDocumentoRemessa = itens.idItemPreDocumento;
      UPDATE MOINGRESSOS x SET
        x.idItemPreDocumento = 0,
        x.idItemDocFiscal = itens.idItemDocFiscal
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXESTOQUE x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXPRODUTOFILHO x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXPROJETOS x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXPROMOCOES x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MODOCFISCALXPREDOCUM x
      WHERE x.idItemPreDocReferenciado = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXDOCFISCAL x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXPREDOCUM x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXPREDOCUM x
      WHERE x.idItemPreDocReferenciado = itens.idItemPreDocumento;
      DELETE MODOCTRANSFXPREDOCUM x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXORCAMENTOITEM x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXCENTROSCUSTOS x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXNUMEROSSERIE x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXENDERECOESTOQ x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXEMBALAGENSTIN x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOPREDOCUMXCOMPOSICOESPR x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      DELETE MOVALEDESCXITEMPREDOCUM x
      WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
    ELSIF itens.cancelado = 0 THEN
      INSERT INTO MODOCFISCALXPREDOCUM (
        id,
        idItemDocFiscal,
        idItemPreDocReferenciado,
        quantidade)
      VALUES (
        FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXPREDOCUM', 'id', 0, p_estabelecimentoAtivo, NULL),
        itens.idItemDocFiscal,
        itens.idItemPreDocumento,
        itens.quantidade);
    END IF;
  END LOOP;
  FOR mot IN c_mot_cab
  LOOP
    INSERT INTO MOMOTIVOSBLOQUEIOS (
      idMotivoBloqueioDocumento,
      origem,
      idCabecalho,
      tipoDocumento,
      idDocumento,
      estabelecimento,
      pessoa,
      cabecalhoItemPagamento,
      sequencia,
      condicaoPagamento,
      vendedor,
      gradeProduto,
      unidadeMedidaConversao,
      quantidadeConvertida,
      valorLiquido,
      motivoBloqueioDocumento,
      dataBloqueio,
      baseBloqueado,
      valorBloqueado,
      percentualBloqueado,
      situacaoLiberacao,
      observacoes)
    SELECT
      mot.idMotivoBloqueioNovo,
      'D',
      r_idDocumentoFiscal,
      v_tipoDocumento,
      v_documentoFiscal,
      v_estabelecimento,
      v_pessoa,
      a.cabecalhoItemPagamento,
      0,
      a.condicaoPagamento,
      a.vendedor,
      a.gradeProduto,
      a.unidadeMedidaConversao,
      a.quantidadeConvertida,
      a.valorLiquido,
      a.motivoBloqueioDocumento,
      a.dataBloqueio,
      a.baseBloqueado,
      a.valorBloqueado,
      a.percentualBloqueado,
      a.situacaoLiberacao,
      a.observacoes
    FROM MOMOTIVOSBLOQUEIOS a
    WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
    INSERT INTO MOMOTBLOQXDOCUMENTOSFISC (
      id,
      idMotivoBloqueioDocumento,
      idDocumentoFiscal)
    VALUES (
      FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXDOCUMENTOSFISC', 'id', 0, p_estabelecimentoAtivo, NULL),
      mot.idMotivoBloqueioNovo,
      r_idDocumentoFiscal);
    INSERT INTO MOMOTBLOQXLIBERACOES (
      id,
      idMotivoBloqueioDocumento,
      usuario,
      dataLiberacao,
      valorLiberado,
      percentualLiberado,
      percentualAlcada,
      situacaoLiberacao,
      observacoes)
    SELECT
      FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXLIBERACOES', 'id', 0, p_estabelecimentoAtivo, NULL),
      mot.idMotivoBloqueioNovo,
      a.usuario,
      a.dataLiberacao,
      a.valorLiberado,
      a.percentualLiberado,
      a.percentualAlcada,
      a.situacaoLiberacao,
      a.observacoes
    FROM MOMOTBLOQXLIBERACOES a
    WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
    IF v_excluirPreDoc = 1 THEN
      DELETE MOMOTBLOQXLIBERACOES a
      WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
      DELETE MOMOTBLOQXPREDOCUMENTOS a
      WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
      DELETE MOMOTIVOSBLOQUEIOS a
      WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
    END IF;
  END LOOP;
  FOR mot IN c_mot_pag2
  LOOP
    INSERT INTO MOMOTIVOSBLOQUEIOS (
      idMotivoBloqueioDocumento,
      origem,
      idCabecalho,
      tipoDocumento,
      idDocumento,
      estabelecimento,
      pessoa,
      cabecalhoItemPagamento,
      sequencia,
      condicaoPagamento,
      vendedor,
      gradeProduto,
      unidadeMedidaConversao,
      quantidadeConvertida,
      valorLiquido,
      motivoBloqueioDocumento,
      dataBloqueio,
      baseBloqueado,
      valorBloqueado,
      percentualBloqueado,
      situacaoLiberacao,
      observacoes)
    SELECT
      mot.idMotivoBloqueioNovo,
      'D',
      r_idDocumentoFiscal,
      v_tipoDocumento,
      v_documentoFiscal,
      v_estabelecimento,
      v_pessoa,
      a.cabecalhoItemPagamento,
      a.sequencia,
      a.condicaoPagamento,
      a.vendedor,
      a.gradeProduto,
      a.unidadeMedidaConversao,
      a.quantidadeConvertida,
      a.valorLiquido,
      a.motivoBloqueioDocumento,
      a.dataBloqueio,
      a.baseBloqueado,
      a.valorBloqueado,
      a.percentualBloqueado,
      a.situacaoLiberacao,
      a.observacoes
    FROM MOMOTIVOSBLOQUEIOS a
    WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
    INSERT INTO MOMOTBLOQXLIBERACOES (
      id,
      idMotivoBloqueioDocumento,
      usuario,
      dataLiberacao,
      valorLiberado,
      percentualLiberado,
      percentualAlcada,
      situacaoLiberacao,
      observacoes)
    SELECT
      FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXLIBERACOES', 'id', 0, p_estabelecimentoAtivo, NULL),
      mot.idMotivoBloqueioNovo,
      a.usuario,
      a.dataLiberacao,
      a.valorLiberado,
      a.percentualLiberado,
      a.percentualAlcada,
      a.situacaoLiberacao,
      a.observacoes
    FROM MOMOTBLOQXLIBERACOES a
    WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
    IF v_excluirPreDoc = 1 THEN
      DELETE MOMOTBLOQXLIBERACOES a
      WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
      DELETE MOMOTIVOSBLOQUEIOS a
      WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
    END IF;
  END LOOP;
  IF v_excluirPreDoc = 1 THEN
    FOR pagtos IN c_pagtos
    LOOP
      INSERT INTO MODOCFISCALXPAGAMENTOS (
        idPagamentoDocFiscal,
        idDocumentoFiscal,
        pagamentoTroco,
        sequencia,
        indicadorFormaPagamento,
        meioPagamento,
        condicaoPagamento,
        cobranca,
        numeroParcelas,
        somaPrazoParcelas,
        valorXPrazoParcelas,
        prazoMedio,
        prazoMedioPonderado,
        valorEntradaMinima,
        valorPagamentoBruto,
        percDescontoPagamento,
        valorDescontoPagamento,
        percOutrasDespesasPagamento,
        valorOutrasDespesasPagamento,
        fatorJurosPagamento,
        valorJurosPagamento,
        valorPagamentoImpostosSoma,
        valorPagamentoImpostosDiminui,
        valorPagamentoLiquido,
        valorFinanceiro,
        observacoes)
      VALUES (
        pagtos.idPagamentoDocFiscal,
        r_idDocumentoFiscal,
        pagtos.pagamentoTroco,
        pagtos.sequencia,
        pagtos.indicadorFormaPagamento,
        pagtos.meioPagamento,
        pagtos.condicaoPagamento,
        pagtos.cobranca,
        pagtos.numeroParcelas,
        pagtos.somaPrazoParcelas,
        pagtos.valorXPrazoParcelas,
        pagtos.prazoMedio,
        pagtos.prazoMedioPonderado,
        pagtos.valorEntradaMinima,
        pagtos.valorPagamentoBruto,
        pagtos.percDescontoPagamento,
        pagtos.valorDescontoPagamento,
        pagtos.percOutrasDespesasPagamento,
        pagtos.valorOutrasDespesasPagamento,
        pagtos.fatorJurosPagamento,
        pagtos.valorJurosPagamento,
        pagtos.valorPagamentoImpostosSoma,
        pagtos.valorPagamentoImpostosDiminui,
        pagtos.valorPagamentoLiquido,
        pagtos.valorFinanceiro,
        pagtos.observacoes);
      UPDATE MOPREVFINANCXFINANCEIRO x SET
      x.preDocumento = 0,
      x.idDocumentoFiscal = r_idDocumentoFiscal
      WHERE EXISTS (
        SELECT 1
        FROM MOFINANCEIROS y
        WHERE y.idFinanceiro = x.idFinanceiro
        AND y.idPagamentoPreDocumento = pagtos.idPagamentoPreDocumento);
      UPDATE MOFINANCEIROS x SET
        x.documento = TO_CHAR(v_documentoFiscal),
        x.fatura = TO_CHAR(v_documentoFiscal),
        x.idPagamentoPreDocumento = 0,
        x.idPagamentoDocFiscal = pagtos.idPagamentoDocFiscal
      WHERE x.idPagamentoPreDocumento = pagtos.idPagamentoPreDocumento;
      UPDATE MOTRANSACOESTEF x SET
        x.idPagamentoPreDocumento = 0,
        x.idPagamentoDocFiscal = pagtos.idPagamentoDocFiscal
      WHERE x.idPagamentoPreDocumento = pagtos.idPagamentoPreDocumento;
      INSERT INTO MODOCFISCALXPROMOCOES (
        id,
        idDocumentoFiscal,
        cabecalhoItemPagamento,
        sequencia,
        idItemDocFiscal,
        idPagamentoDocFiscal,
        regraPromocao,
        tipoBeneficio,
        multiplicador,
        precoUnitarioDe,
        precoUnitarioPor,
        precoDesconto,
        precoMinimo,
        percentualDesconto,
        valorDesconto,
        pontuacao,
        gerarPontuacao,
        observacoes)
      SELECT
        FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXPROMOCOES', 'id', 0, p_estabelecimentoAtivo, NULL),
        r_idDocumentoFiscal,
        x.cabecalhoItemPagamento,
        x.sequencia,
        0,
        pagtos.idPagamentoDocFiscal,
        x.regraPromocao,
        x.tipoBeneficio,
        x.multiplicador,
        x.precoUnitarioDe,
        x.precoUnitarioPor,
        x.precoDesconto,
        x.precoMinimo,
        x.percentualDesconto,
        x.valorDesconto,
        x.pontuacao,
        x.gerarPontuacao,
        x.observacoes
      FROM MOPREDOCUMXPROMOCOES x
      WHERE x.preDocumento = p_preDocumento
      AND x.idPagamentoPreDocumento = pagtos.idPagamentoPreDocumento;
      DELETE MOPREDOCUMXPROMOCOES x
      WHERE x.preDocumento = p_preDocumento
      AND x.idPagamentoPreDocumento = pagtos.idPagamentoPreDocumento;
      FOR mot IN c_mot_pag
      LOOP
        IF mot.idPagamentoPreDocumento = pagtos.idPagamentoPreDocumento THEN
          INSERT INTO MOMOTIVOSBLOQUEIOS (
            idMotivoBloqueioDocumento,
            origem,
            idCabecalho,
            tipoDocumento,
            idDocumento,
            estabelecimento,
            pessoa,
            cabecalhoItemPagamento,
            sequencia,
            condicaoPagamento,
            vendedor,
            gradeProduto,
            unidadeMedidaConversao,
            quantidadeConvertida,
            valorLiquido,
            motivoBloqueioDocumento,
            dataBloqueio,
            baseBloqueado,
            valorBloqueado,
            percentualBloqueado,
            situacaoLiberacao,
            observacoes)
          SELECT
            mot.idMotivoBloqueioNovo,
            'D',
            r_idDocumentoFiscal,
            v_tipoDocumento,
            v_documentoFiscal,
            v_estabelecimento,
            v_pessoa,
            a.cabecalhoItemPagamento,
            pagtos.sequencia,
            a.condicaoPagamento,
            a.vendedor,
            a.gradeProduto,
            a.unidadeMedidaConversao,
            a.quantidadeConvertida,
            a.valorLiquido,
            a.motivoBloqueioDocumento,
            a.dataBloqueio,
            a.baseBloqueado,
            a.valorBloqueado,
            a.percentualBloqueado,
            a.situacaoLiberacao,
            a.observacoes
          FROM MOMOTIVOSBLOQUEIOS a
          WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
          INSERT INTO MOMOTBLOQXDOCFISCALPAGAM (
            id,
            idMotivoBloqueioDocumento,
            idPagamentoDocFiscal)
          VALUES (
            FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXDOCFISCALPAGAM', 'id', 0, p_estabelecimentoAtivo, NULL),
            mot.idMotivoBloqueioNovo,
            pagtos.idPagamentoDocFiscal);
          INSERT INTO MOMOTBLOQXLIBERACOES (
            id,
            idMotivoBloqueioDocumento,
            usuario,
            dataLiberacao,
            valorLiberado,
            percentualLiberado,
            percentualAlcada,
            situacaoLiberacao,
            observacoes)
          SELECT
            FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXLIBERACOES', 'id', 0, p_estabelecimentoAtivo, NULL),
            mot.idMotivoBloqueioNovo,
            a.usuario,
            a.dataLiberacao,
            a.valorLiberado,
            a.percentualLiberado,
            a.percentualAlcada,
            a.situacaoLiberacao,
            a.observacoes
          FROM MOMOTBLOQXLIBERACOES a
          WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
          DELETE MOMOTBLOQXLIBERACOES a
          WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
          DELETE MOMOTBLOQXPREDOCUMPAGAM a
          WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
          DELETE MOMOTIVOSBLOQUEIOS a WHERE
          a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
        END IF;
      END LOOP;
    END LOOP;
    INSERT INTO MOBAIXAFINANCXDOCFISCAL (
      id,
      idBaixaFinanceiro,
      idDocumentoFiscal)
    SELECT
      FUNC_ADD_BUSCA_PROXIMO_ID('MOBAIXAFINANCXDOCFISCAL', 'id', 0, p_estabelecimentoAtivo, NULL),
      x.idBaixaFinanceiro,
      r_idDocumentoFiscal
    FROM MOBAIXAFINANCXPREDOCUM x
    WHERE x.preDocumento = p_preDocumento;
    INSERT INTO MOVALEDESCXDOCFISCAL (
      id,
      idValeDesconto,
      idDocumentoFiscal,
      valor)
    SELECT
      FUNC_ADD_BUSCA_PROXIMO_ID('MOVALEDESCXDOCFISCAL', 'id', 0, p_estabelecimentoAtivo, NULL),
      x.idValeDesconto,
      r_idDocumentoFiscal,
      x.valor
    FROM MOVALEDESCXPREDOCUM x
    WHERE x.preDocumento = p_preDocumento;
    INSERT INTO MODOCFISCALXBLOQUEIOSEST (
      id,
      idDocumentoFiscal,
      sequencia,
      dataBloqueio,
      estabelecimento,
      localEstoque,
      pessoaParticipante,
      idEnderecoEstoque,
      gradeProduto,
      personalizacao,
      idLoteEstoque,
      idNumeroSerie,
      quantidade,
      quantidadeEstoque,
      quantidadeReservas,
      situacaoLiberacao,
      usuarioLiberacao,
      dataLiberacao,
      observacoes)
    SELECT
      FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXBLOQUEIOSEST', 'id', 0, p_estabelecimentoAtivo, NULL),
      r_idDocumentoFiscal,
      x.sequencia,
      x.dataBloqueio,
      x.estabelecimento,
      x.localEstoque,
      x.pessoaParticipante,
      x.idEnderecoEstoque,
      x.gradeProduto,
      x.personalizacao,
      x.idLoteEstoque,
      x.idNumeroSerie,
      x.quantidade,
      x.quantidadeEstoque,
      x.quantidadeReservas,
      x.situacaoLiberacao,
      x.usuarioLiberacao,
      x.dataLiberacao,
      x.observacoes
    FROM MOPREDOCUMXBLOQUEIOSEST x
    WHERE x.preDocumento = p_preDocumento;
    DELETE MOBAIXAFINANCXPREDOCUM
    WHERE preDocumento = p_preDocumento;
    DELETE MOPREDOCUMXPERSPROJETO
    WHERE preDocumento = p_preDocumento;
    DELETE MOPREDOCUMXINFOCOMPLENT
    WHERE preDocumento = p_preDocumento;
    DELETE MOPREDOCUMXPROMOCOES
    WHERE preDocumento = p_preDocumento
    AND idItemPreDocumento = 0
    AND idPagamentoPreDocumento = 0;
    DELETE MOVALEDESCXPREDOCUM
    WHERE preDocumento = p_preDocumento;
    DELETE MOPREDOCUMXBLOQUEIOSEST
    WHERE preDocumento = p_preDocumento;
    UPDATE MOPREVFINANCXFINANCEIRO SET
      preDocumento = 0,
      idDocumentoFiscal = r_idDocumentoFiscal
    WHERE preDocumento = p_preDocumento;
    UPDATE MOFINANCEIROXCOMISSOES SET
      preDocumento = 0,
      idDocumentoFiscal = r_idDocumentoFiscal
    WHERE preDocumento = p_preDocumento;
    UPDATE MOFINANCEIROXDOCUMENTOS SET
      preDocumento = 0,
      idDocumentoFiscal = r_idDocumentoFiscal
    WHERE preDocumento = p_preDocumento;
    UPDATE MOEVENTOS SET
      preDocumento = 0,
      idDocumentoFiscal = r_idDocumentoFiscal
    WHERE preDocumento = p_preDocumento;
    DELETE MOPREDOCUMXPAGAMENTOS
    WHERE preDocumento = p_preDocumento;
    DELETE MOPREDOCUMXITENS
    WHERE preDocumento = p_preDocumento;
    DELETE MOPREDOCUMXSTATUS
    WHERE preDocumento = p_preDocumento;
    DELETE MOPREDOCUMENTOS
    WHERE preDocumento = p_preDocumento;
  ELSE
    UPDATE MOPREDOCUMENTOS
    SET statusPreDocumento = 'F'
    WHERE preDocumento = p_preDocumento;
  END IF;
END ADD_DOC_FISC_ROT_EFET_PRE_DOC;

/

INSERT INTO SISITUACOESCONTRATO (situacaoContrato, ordenacao, descricao, ativo, observacoes) values ('A', 1, 'Ativo', 1, ' ');

COMMIT;

UPDATE MOCONTRATOS SET situacaoContrato = 'A' WHERE situacaoContrato = 'P';

COMMIT;

DELETE SISITUACOESCONTRATO WHERE situacaoContrato = 'P';

COMMIT;

INSERT INTO SITIPOSDOCUMENTOIMPRESSO (tipoDocumentoImpresso, descricao, ativo, ordenacao, habilitaFinalizacao, habilitaAbrirGaveta, permiteGrafico, permiteCaractere, permiteMerge, arquivoModeloMerge, permiteReport, observacoesReport, permiteFiscal, observacoes) VALUES (55, 'Contrato', 1, 160, 1, 0, 0, 0, 1, '%SYS_DIR_ARQ_MODELOS%Contrato.rtf', 1, ' ', 0, ' ');
INSERT INTO SITIPOSDOCUMENTOIMPRESSO (tipoDocumentoImpresso, descricao, ativo, ordenacao, habilitaFinalizacao, habilitaAbrirGaveta, permiteGrafico, permiteCaractere, permiteMerge, arquivoModeloMerge, permiteReport, observacoesReport, permiteFiscal, observacoes) VALUES (56, 'Fatura Contrato', 1, 161, 1, 0, 0, 0, 1, '%SYS_DIR_ARQ_MODELOS%FaturaContrato.rtf', 1, ' ', 0, ' ');

COMMIT;

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_REF_CONTR (
  p_estabelecimentoAtivo IN NUMBER,
  p_idItemContrato       IN NUMBER,
  p_idItemOrcamento      IN NUMBER,
  p_quantidade           IN NUMBER)
IS
  v_faturamentoItemContrato CHAR (1);
  v_id                      NUMBER;
BEGIN
  SELECT faturamentoItemContrato
  INTO v_faturamentoItemContrato
  FROM MOCONTRATOXITENS
  WHERE idItemContrato = p_idItemContrato;
  SELECT COALESCE (MAX (id),0)
  INTO v_id
  FROM MOCONTRATOXORCAMENTO
  WHERE idItemContrato = p_idItemContrato
  AND idItemOrcamento = p_idItemOrcamento;
  IF v_id > 0 THEN
    IF v_faturamentoItemContrato = 'Q' THEN
      UPDATE MOCONTRATOXORCAMENTO
      SET quantidade = quantidade + p_quantidade
      WHERE id = v_id;
    END IF;
  ELSE
    INSERT INTO MOCONTRATOXORCAMENTO (
      id,
      idItemOrcamento,
      idItemContrato,
      quantidade)
    VALUES (
      FUNC_ADD_BUSCA_PROXIMO_ID ('MOCONTRATOXORCAMENTO', 'id', 14, p_estabelecimentoAtivo, NULL),
      p_idItemOrcamento,
      p_idItemContrato,
      CASE WHEN v_faturamentoItemContrato = 'Q' THEN p_quantidade ELSE 0 END);
  END IF;
  IF v_faturamentoItemContrato = 'Q' THEN
    UPDATE MOCONTRATOXITENS
    SET quantidadeSaldo = quantidadeSaldo - p_quantidade
    WHERE idItemContrato = p_idItemContrato;
  END IF;
END ADD_ORCAMENTO_ITEM_REF_CONTR;

/

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_config_413_obs_add_marca     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_config_413_obs_add_marca,
        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
      SELECT COALESCE (MAX (sequencia),0) + 1
      INTO v_item_sequencia
      FROM MOORCAMENTOXITENS
      WHERE orcamento = p_item_orcamento;
      v_cab_ultimoVendedorItem := p_item_vendedor;
    END IF;
    IF v_item_cancelado = 0 THEN
      IF p_manterFinanceiro_Retotalizar <> 2 THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume + TRUNC(CASE WHEN p_item_controleQuantidade = 1 AND p_item_loteMultiplo <> 0 THEN p_item_quantidade / p_item_loteMultiplo ELSE p_item_quantidadeConvertida END,0);
        END IF;
        v_cab_pesoLiquido := v_cab_pesoLiquido + p_item_pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto + p_item_pesoBruto;
      END IF;
      v_cab_quantidade := v_cab_quantidade + p_item_quantidadeConvertida;
      IF v_prod_tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorServicos := v_cab_valorServicos + v_item_valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos + p_item_valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorProdutos := v_cab_valorProdutos + v_item_valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos + p_item_valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem + p_item_valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem + p_item_valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem + p_item_valorAdicFreteMarItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem + p_item_valorDespesasAduanItem;
      v_cab_valorFreteGeral := v_cab_valorFreteGeral + v_item_valorFreteGeral;
      v_cab_valorSeguroGeral := v_cab_valorSeguroGeral + p_item_valorSeguroGeral;
      v_cab_valorDescontoGeral := v_cab_valorDescontoGeral + v_item_valorDescontoGeral;
      v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral + p_item_valorOutrasDespesasGer;
      v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral + p_item_valorAdicFreteMarGeral;
      v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral + p_item_valorDespesasAduanGeral;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento + v_item_valorBasePagamento;
      IF p_item_usarPrecoAVista = 1
        AND v_item_geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo + v_item_valorProdutoServico - v_item_valorDescontoTotal + v_item_valorOutrasDespesasTot;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento + v_item_valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento + v_item_valorOutrasDespPagament;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento + v_item_valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal + v_item_valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal + v_item_valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal + v_item_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_item_valorOutrasDespesasTot;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal + v_item_valorAdicFreteMarTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal + v_item_valorDespesasAduanTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem + v_item_valorLiquidoItem;
    ELSE
      v_item_quantidadeSaldo := 0;
    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 = p_item_orcamento;
    IF p_item_idItemOrcamento > 0 THEN
      DELETE MOORCAMENTOXCOMPOSICOESPR compDoc
      WHERE compDoc.idItemOrcamento = p_item_idItemOrcamento
      AND EXISTS(
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.produto = comp.produto
        WHERE comp.composicaoPreco = compDoc.composicaoPreco
        AND gradProd.gradeProduto <> p_item_gradeProduto);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      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_413_obs_add_marca,
      ' ',
      0,
      'O',
      p_item_idItemOrcamento,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    MERGE INTO MOORCAMENTOXITENS a USING (
      SELECT
        r_item_idItemOrcamento         idItemOrcamento,
        p_item_orcamento               orcamento,
        v_item_sequencia               sequencia,
        v_item_cancelado               cancelado,
        p_item_pedidoCompraFornecedor  pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo sequenciaPedidoCompraFornec,
        p_item_ambiente                ambiente,
        p_item_ambienteObservacoes     ambienteObservacoes,
        p_item_modeloDocumento         modeloDocumento,
        p_item_estabelecimentoOriginal estabelecimentoOriginal,
        p_item_vendedor                vendedor,
        p_item_gradeProduto            gradeProduto,
        p_item_atividadeServico        atividadeServico,
        p_item_statusAtividadeServico  statusAtividadeServico,
        p_item_idFormulaTinta          idFormulaTinta,
        p_item_personalizacao          personalizacao,
        p_item_idLoteEstoque           idLoteEstoque,
        p_item_vinculoItemDocumento    vinculoItemDocumento,
        p_item_operacaoFiscal          operacaoFiscal,
        v_item_movimentaEstoque        movimentaEstoque,
        v_item_geraFinanceiro          geraFinanceiro,
        p_item_localEstoque            localEstoque,
        p_item_pessoaParticipante      pessoaParticipante,
        p_item_dataEntrega             dataEntrega,
        p_item_controleQuantidade      controleQuantidade,
        p_item_unidadeMedidaConversao  unidadeMedidaConversao,
        p_item_conversorQuantidade     conversorQuantidade,
        p_item_loteMinimo              loteMinimo,
        p_item_loteMultiplo            loteMultiplo,
        p_item_altura                  altura,
        p_item_largura                 largura,
        p_item_comprimento             comprimento,
        p_item_pecas                   pecas,
        p_item_quantidade              quantidade,
        p_item_quantidadeConvertida    quantidadeConvertida,
        v_item_quantidadeSaldo         quantidadeSaldo,
        p_item_controleEntrega         controleEntrega,
        p_item_pesoLiquido             pesoLiquido,
        p_item_pesoBruto               pesoBruto,
        p_item_tipoPreco               tipoPreco,
        p_item_tabelaPreco             tabelaPreco,
        p_item_precoSugestaoAPrazo     precoSugestaoAPrazo,
        p_item_precoSugestaoAVista     precoSugestaoAVista,
        p_item_precoDesconto           precoDesconto,
        p_item_precoMinimo             precoMinimo,
        p_item_usarPrecoAVista         usarPrecoAVista,
        p_item_precoUnitarioBruto      precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos acrescimoUnitarioComposicao,
        v_item_precoUnitario           precoUnitario,
        v_item_precoUnitarioConvertido precoUnitarioConvertido,
        v_item_valorProdutoServicoBrut valorProdutoServicoBruto,
        v_item_valorProdutoServico     valorProdutoServico,
        p_item_percDescontoItem        percDescontoItem,
        p_item_valorDescontoItem       valorDescontoItem,
        p_item_percAcrescimoItem       percAcrescimoItem,
        p_item_valorAcrescimoItem      valorAcrescimoItem,
        p_item_valorFreteItem          valorFreteItem,
        p_item_valorSeguroItem         valorSeguroItem,
        p_item_valorAdicFreteMarItem   valorAdicFreteMarinhaMerItem,
        p_item_valorDespesasAduanItem  valorDespesasAduaneirasItem,
        v_item_valorFreteGeral         valorFreteGeral,
        p_item_valorSeguroGeral        valorSeguroGeral,
        v_item_valorDescontoGeral      valorDescontoGeral,
        p_item_valorOutrasDespesasGer  valorOutrasDespesasGeral,
        p_item_valorAdicFreteMarGeral  valorAdicFreteMarinhaMerGeral,
        p_item_valorDespesasAduanGeral valorDespesasAduaneirasGeral,
        v_item_valorBasePagamento      valorBasePagamento,
        v_item_valorDescontoPagamento  valorDescontoPagamento,
        v_item_valorOutrasDespPagament valorOutrasDespesasPagamento,
        v_item_valorJurosPagamento     valorJurosPagamento,
        v_item_valorFreteTotal         valorFreteTotal,
        v_item_valorSeguroTotal        valorSeguroTotal,
        v_item_valorDescontoTotal      valorDescontoTotal,
        v_item_valorOutrasDespesasTot  valorOutrasDespesasTotal,
        v_item_valorAdicFreteMarTotal  valorAdicFreteMarinhaMerTotal,
        v_item_valorDespesasAduanTotal valorDespesasAduaneirasTotal,
        v_item_cfop                    cfop,
        v_item_indicadorISSQN          indicadorISSQN,
        v_item_aliquotaISSQN           aliquotaISSQN,
        v_item_retidoISSQN             retidoISSQN,
        v_item_tributadoForaMunicipio  tributadoForaMunicipio,
        v_item_incentivoFiscal         incentivoFiscal,
        v_item_listaServicos           listaServicos,
        v_item_cnae                    cnae,
        v_item_idServicoMunicipio      idServicoMunicipio,
        v_item_numeroProcessoAdministr numeroProcessoAdministrativo,
        v_item_baseISSQN               baseISSQN,
        v_item_valorISSQN              valorISSQN,
        v_item_retencaoIRRF            retencaoIRRF,
        v_item_baseRetIRRF             baseRetIRRF,
        v_item_valorRetIRRF            valorRetIRRF,
        v_item_retencaoINSS            retencaoINSS,
        v_item_baseRetINSS             baseRetINSS,
        v_item_valorRetINSS            valorRetINSS,
        v_item_retencaoPIS             retencaoPIS,
        v_item_baseRetPIS              baseRetPIS,
        v_item_valorRetPIS             valorRetPIS,
        v_item_retencaoCOFINS          retencaoCOFINS,
        v_item_baseRetCOFINS           baseRetCOFINS,
        v_item_valorRetCOFINS          valorRetCOFINS,
        v_item_retencaoCSLL            retencaoCSLL,
        v_item_baseRetCSLL             baseRetCSLL,
        v_item_valorRetCSLL            valorRetCSLL,
        v_item_retencaoOutros          retencaoOutros,
        v_item_baseRetOutros           baseRetOutros,
        v_item_valorRetOutros          valorRetOutros,
        v_item_aliquotaII              aliquotaII,
        v_item_baseII                  baseII,
        v_item_valorII                 valorII,
        v_item_aliquotaIOF             aliquotaIOF,
        v_item_baseIOF                 baseIOF,
        v_item_valorIOF                valorIOF,
        v_item_codigoEnquadramentoIPI  codigoEnquadramentoIPI,
        v_item_stIPI                   stIPI,
        v_item_aliquotaIPI             aliquotaIPI,
        v_item_valorAliquotaIPI        valorAliquotaIPI,
        v_item_baseIPI                 baseIPI,
        v_item_valorIPI                valorIPI,
        v_item_stPIS                   stPIS,
        v_item_aliquotaPIS             aliquotaPIS,
        v_item_valorAliquotaPIS        valorAliquotaPIS,
        v_item_basePIS                 basePIS,
        v_item_valorPIS                valorPIS,
        v_item_aliquotaPISST           aliquotaPISST,
        v_item_valorAliquotaPISST      valorAliquotaPISST,
        v_item_basePISST               basePISST,
        v_item_valorPISST              valorPISST,
        v_item_stCOFINS                stCOFINS,
        v_item_aliquotaCOFINS          aliquotaCOFINS,
        v_item_valorAliquotaCOFINS     valorAliquotaCOFINS,
        v_item_baseCOFINS              baseCOFINS,
        v_item_valorCOFINS             valorCOFINS,
        v_item_aliquotaCOFINSST        aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST   valorAliquotaCOFINSST,
        v_item_baseCOFINSST            baseCOFINSST,
        v_item_valorCOFINSST           valorCOFINSST,
        v_item_stSimplesNacional       stSimplesNacional,
        v_item_creditoSimplesNacional  creditoSimplesNacional,
        v_item_baseCreditoSimplesNac   baseCreditoSimplesNacional,
        v_item_valorCreditoSimplesNac  valorCreditoSimplesNacional,
        v_item_stICMS                  stICMS,
        v_item_modalBaseCalcICMS       modalidadeBaseCalcICMS,
        v_item_reducaoBaseICMS         reducaoBaseICMS,
        v_item_aliquotaICMS            aliquotaICMS,
        v_item_diferimentoICMS         diferimentoICMS,
        v_item_motivoDesoneracaoICMS   motivoDesoneracaoICMS,
        v_item_idBeneficio             idBeneficio,
        v_item_baseICMS                baseICMS,
        v_item_valorICMSOperacao       valorICMSOperacao,
        v_item_valorICMSDiferido       valorICMSDiferido,
        v_item_valorICMS               valorICMS,
        v_item_valorICMSDesoneracao    valorICMSDesoneracao,
        v_item_modalBaseCalcICMSST     modalidadeBaseCalcICMSST,
        v_item_margemValorAdicionadoST margemValorAdicionadoST,
        v_item_reducaoBaseST           reducaoBaseST,
        v_item_aliquotaICMSST          aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin aliquotaSTSuportConsFinal,
        v_item_baseICMSST              baseICMSST,
        v_item_valorICMSST             valorICMSST,
        v_item_baseICMSSTAnteriormente baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment valorICMSSTAnteriormente,
        v_item_valorICMSProprioSubstit valorICMSProprioSubstituto,
        v_item_reducaoBaseICMSEfetivo  reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo     aliquotaICMSEfetivo,
        v_item_baseICMSEfetivo         baseICMSEfetivo,
        v_item_valorICMSEfetivo        valorICMSEfetivo,
        v_item_aliquotaICMSUFDestinat  aliquotaICMSUFDestinatario,
        v_item_aliquotaICMSInterestad  aliquotaICMSInterestadual,
        v_item_partilhaICMSInterestad  partilhaICMSInterestadual,
        v_item_baseICMSUFDestinatario  baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente     baseICMSUFRemetente,
        v_item_valorICMSUFRemetente    valorICMSUFRemetente,
        v_item_aliquotaFCP             aliquotaFCP,
        v_item_baseFCP                 baseFCP,
        v_item_valorFCP                valorFCP,
        v_item_aliquotaFCPST           aliquotaFCPST,
        v_item_baseFCPST               baseFCPST,
        v_item_valorFCPST              valorFCPST,
        v_item_aliquotaFCPSTAnteriorm  aliquotaFCPSTAnteriormente,
        v_item_baseFCPSTAnteriormente  baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente valorFCPSTAnteriormente,
        v_item_aliquotaFCPUFDestinat   aliquotaFCPUFDestinatario,
        v_item_baseFCPUFDestinatario   baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario  valorFCPUFDestinatario,
        v_item_aliquotaEstImpFederais  aliquotaEstimadaImpFederais,
        v_item_aliquotaEstImpEstaduais aliquotaEstimadaImpEstaduais,
        v_item_aliquotaEstImpMunicipai aliquotaEstimadaImpMunicipais,
        v_item_baseEstimadaImpostos    baseEstimadaImpostos,
        v_item_valorEstImpFederais     valorEstimadoImpFederais,
        v_item_valorEstImpEstaduais    valorEstimadoImpEstaduais,
        v_item_valorEstImpMunicipais   valorEstimadoImpMunicipais,
        v_item_valorLiquidoItem        valorLiquidoItem,
        p_item_observacoesDigitadas    observacoesDigitadas,
        v_observacoes                  observacoes
      FROM DUAL) b
    ON (a.idItemOrcamento = b.idItemOrcamento)
    WHEN MATCHED THEN UPDATE SET
      a.orcamento                     = b.orcamento,
      a.sequencia                     = b.sequencia,
      a.cancelado                     = b.cancelado,
      a.pedidoCompraFornecedor        = b.pedidoCompraFornecedor,
      a.sequenciaPedidoCompraFornec   = b.sequenciaPedidoCompraFornec,
      a.ambiente                      = b.ambiente,
      a.ambienteObservacoes           = b.ambienteObservacoes,
      a.vendedor                      = b.vendedor,
      a.modeloDocumento               = b.modeloDocumento,
      a.estabelecimentoOriginal       = b.estabelecimentoOriginal,
      a.gradeProduto                  = b.gradeProduto,
      a.atividadeServico              = b.atividadeServico,
      a.statusAtividadeServico        = b.statusAtividadeServico,
      a.idFormulaTinta                = b.idFormulaTinta,
      a.personalizacao                = b.personalizacao,
      a.idLoteEstoque                 = b.idLoteEstoque,
      a.vinculoItemDocumento          = b.vinculoItemDocumento,
      a.operacaoFiscal                = b.operacaoFiscal,
      a.movimentaEstoque              = b.movimentaEstoque,
      a.geraFinanceiro                = b.geraFinanceiro,
      a.localEstoque                  = b.localEstoque,
      a.pessoaParticipante            = b.pessoaParticipante,
      a.dataEntrega                   = b.dataEntrega,
      a.controleQuantidade            = b.controleQuantidade,
      a.unidadeMedidaConversao        = b.unidadeMedidaConversao,
      a.conversorQuantidade           = b.conversorQuantidade,
      a.loteMinimo                    = b.loteMinimo,
      a.loteMultiplo                  = b.loteMultiplo,
      a.altura                        = b.altura,
      a.largura                       = b.largura,
      a.comprimento                   = b.comprimento,
      a.pecas                         = b.pecas,
      a.quantidade                    = b.quantidade,
      a.quantidadeConvertida          = b.quantidadeConvertida,
      a.quantidadeSaldo               = b.quantidadeSaldo,
      a.controleEntrega               = b.controleEntrega,
      a.pesoLiquido                   = b.pesoLiquido,
      a.pesoBruto                     = b.pesoBruto,
      a.tipoPreco                     = b.tipoPreco,
      a.tabelaPreco                   = b.tabelaPreco,
      a.precoSugestaoAPrazo           = b.precoSugestaoAPrazo,
      a.precoSugestaoAVista           = b.precoSugestaoAVista,
      a.precoDesconto                 = b.precoDesconto,
      a.precoMinimo                   = b.precoMinimo,
      a.usarPrecoAVista               = b.usarPrecoAVista,
      a.precoUnitarioBruto            = b.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao   = b.acrescimoUnitarioComposicao,
      a.precoUnitario                 = b.precoUnitario,
      a.precoUnitarioConvertido       = b.precounitarioConvertido,
      a.valorProdutoServicoBruto      = b.valorProdutoServicoBruto,
      a.valorProdutoServico           = b.valorProdutoServico,
      a.percDescontoItem              = b.percDescontoItem,
      a.valorDescontoItem             = b.valorDescontoItem,
      a.percAcrescimoItem             = b.percAcrescimoItem,
      a.valorAcrescimoItem            = b.valorAcrescimoItem,
      a.valorFreteItem                = b.valorFreteItem,
      a.valorSeguroItem               = b.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem  = b.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem   = b.valorDespesasAduaneirasItem,
      a.valorFreteGeral               = b.valorFreteGeral,
      a.valorSeguroGeral              = b.valorSeguroGeral,
      a.valorDescontoGeral            = b.valorDescontoGeral,
      a.valorOutrasDespesasGeral      = b.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral = b.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral  = b.valorDespesasAduaneirasGeral,
      a.valorBasePagamento            = b.valorBasePagamento,
      a.valorDescontoPagamento        = b.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento  = b.valorOutrasDespesasPagamento,
      a.valorJurosPagamento           = b.valorJurosPagamento,
      a.valorFreteTotal               = b.valorFreteTotal,
      a.valorSeguroTotal              = b.valorSeguroTotal,
      a.valorDescontoTotal            = b.valorDescontoTotal,
      a.valorOutrasDespesasTotal      = b.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal = b.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal  = b.valorDespesasAduaneirasTotal,
      a.cfop                          = b.cfop,
      a.indicadorISSQN                = b.indicadorISSQN,
      a.aliquotaISSQN                 = b.aliquotaISSQN,
      a.baseISSQN                     = b.baseISSQN,
      a.valorISSQN                    = b.valorISSQN,
      a.retidoISSQN                   = b.retidoISSQN,
      a.tributadoForaMunicipio        = b.tributadoForaMunicipio,
      a.incentivoFiscal               = b.incentivoFiscal,
      a.listaServicos                 = b.listaServicos,
      a.cnae                          = b.cnae,
      a.idServicoMunicipio            = b.idServicoMunicipio,
      a.numeroProcessoAdministrativo  = b.numeroProcessoAdministrativo,
      a.retencaoIRRF                  = b.retencaoIRRF,
      a.baseRetIRRF                   = b.baseRetIRRF,
      a.valorRetIRRF                  = b.valorRetIRRF,
      a.retencaoINSS                  = b.retencaoINSS,
      a.baseRetINSS                   = b.baseRetINSS,
      a.valorRetINSS                  = b.valorRetINSS,
      a.retencaoPIS                   = b.retencaoPIS,
      a.baseRetPIS                    = b.baseRetPIS,
      a.valorRetPIS                   = b.valorRetPIS,
      a.retencaoCOFINS                = b.retencaoCOFINS,
      a.baseRetCOFINS                 = b.baseRetCOFINS,
      a.valorRetCOFINS                = b.valorRetCOFINS,
      a.retencaoCSLL                  = b.retencaoCSLL,
      a.baseRetCSLL                   = b.baseRetCSLL,
      a.valorRetCSLL                  = b.valorRetCSLL,
      a.retencaoOutros                = b.retencaoOutros,
      a.baseRetOutros                 = b.baseRetOutros,
      a.valorRetOutros                = b.valorRetOutros,
      a.aliquotaII                    = b.aliquotaII,
      a.baseII                        = b.baseII,
      a.valorII                       = b.valorII,
      a.aliquotaIOF                   = b.aliquotaIOF,
      a.baseIOF                       = b.baseIOF,
      a.valorIOF                      = b.valorIOF,
      a.codigoEnquadramentoIPI        = b.codigoEnquadramentoIPI,
      a.stIPI                         = b.stIPI,
      a.aliquotaIPI                   = b.aliquotaIPI,
      a.valorAliquotaIPI              = b.valorAliquotaIPI,
      a.baseIPI                       = b.baseIPI,
      a.valorIPI                      = b.valorIPI,
      a.stPIS                         = b.stPIS,
      a.aliquotaPIS                   = b.aliquotaPIS,
      a.valorAliquotaPIS              = b.valorAliquotaPIS,
      a.basePIS                       = b.basePIS,
      a.valorPIS                      = b.valorPIS,
      a.aliquotaPISST                 = b.aliquotaPISST,
      a.valorAliquotaPISST            = b.valorAliquotaPISST,
      a.basePISST                     = b.basePISST,
      a.valorPISST                    = b.valorPISST,
      a.stCOFINS                      = b.stCOFINS,
      a.aliquotaCOFINS                = b.aliquotaCOFINS,
      a.valorAliquotaCOFINS           = b.valorAliquotaCOFINS,
      a.baseCOFINS                    = b.baseCOFINS,
      a.valorCOFINS                   = b.valorCOFINS,
      a.aliquotaCOFINSST              = b.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST         = b.valorAliquotaCOFINSST,
      a.baseCOFINSST                  = b.baseCOFINSST,
      a.valorCOFINSST                 = b.valorCOFINSST,
      a.stSimplesNacional             = b.stSimplesNacional,
      a.creditoSimplesNacional        = b.creditoSimplesNacional,
      a.baseCreditoSimplesNacional    = b.baseCreditoSimplesNacional,
      a.valorCreditoSimplesNacional   = b.valorCreditoSimplesNacional,
      a.stICMS                        = b.stICMS,
      a.modalidadeBaseCalcICMS        = b.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS               = b.reducaoBaseICMS,
      a.aliquotaICMS                  = b.aliquotaICMS,
      a.diferimentoICMS               = b.diferimentoICMS,
      a.motivoDesoneracaoICMS         = b.motivoDesoneracaoICMS,
      a.idBeneficio                   = b.idBeneficio,
      a.baseICMS                      = b.baseICMS,
      a.valorICMSoperacao             = b.valorICMSoperacao,
      a.valorICMSdiferido             = b.valorICMSdiferido,
      a.valorICMS                     = b.valorICMS,
      a.valorICMSdesoneracao          = b.valorICMSdesoneracao,
      a.modalidadeBaseCalcICMSST      = b.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST       = b.margemValorAdicionadoST,
      a.reducaoBaseST                 = b.reducaoBaseST,
      a.aliquotaICMSST                = b.aliquotaICMSST,
      a.aliquotaSTSuportConsFinal     = b.aliquotaSTSuportConsFinal,
      a.baseICMSST                    = b.baseICMSST,
      a.valorICMSST                   = b.valorICMSST,
      a.baseICMSSTAnteriormente       = b.baseICMSSTAnteriormente,
      a.valorICMSSTAnteriormente      = b.valorICMSSTAnteriormente,
      a.valorICMSProprioSubstituto    = b.valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo        = b.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo           = b.aliquotaICMSEfetivo,
      a.baseICMSEfetivo               = b.baseICMSEfetivo,
      a.valorICMSEfetivo              = b.valorICMSEfetivo,
      a.aliquotaICMSUFDestinatario    = b.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual     = b.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual     = b.partilhaICMSInterestadual,
      a.baseICMSUFDestinatario        = b.baseICMSUFDestinatario,
      a.valorICMSUFDestinatario       = b.valorICMSUFDestinatario,
      a.baseICMSUFRemetente           = b.baseICMSUFRemetente,
      a.valorICMSUFRemetente          = b.valorICMSUFRemetente,
      a.aliquotaFCP                   = b.aliquotaFCP,
      a.baseFCP                       = b.baseFCP,
      a.valorFCP                      = b.valorFCP,
      a.aliquotaFCPST                 = b.aliquotaFCPST,
      a.baseFCPST                     = b.baseFCPST,
      a.valorFCPST                    = b.valorFCPST,
      a.aliquotaFCPSTAnteriormente    = b.aliquotaFCPSTAnteriormente,
      a.baseFCPSTAnteriormente        = b.baseFCPSTAnteriormente,
      a.valorFCPSTAnteriormente       = b.valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario     = b.aliquotaFCPUFDestinatario,
      a.baseFCPUFDestinatario         = b.baseFCPUFDestinatario,
      a.valorFCPUFDestinatario        = b.valorFCPUFDestinatario,
      a.aliquotaestimadaimpfederais   = b.aliquotaestimadaimpfederais,
      a.aliquotaestimadaimpestaduais  = b.aliquotaestimadaimpestaduais,
      a.aliquotaestimadaimpmunicipais = b.aliquotaestimadaimpmunicipais,
      a.baseestimadaimpostos          = b.baseestimadaimpostos,
      a.valorestimadoimpfederais      = b.valorestimadoimpfederais,
      a.valorEstimadoImpEstaduais     = b.valorEstimadoImpEstaduais,
      a.valorEstimadoImpMunicipais    = b.valorEstimadoImpMunicipais,
      a.valorLiquidoItem              = b.valorLiquidoItem,
      a.observacoesDigitadas          = b.observacoesDigitadas,
      a.observacoes                   = b.observacoes
    WHEN NOT MATCHED THEN INSERT (
      idItemOrcamento,
      orcamento,
      sequencia,
      cancelado,
      pedidoCompraFornecedor,
      sequenciaPedidoCompraFornec,
      ambiente,
      ambienteObservacoes,
      modeloDocumento,
      estabelecimentoOriginal,
      vendedor,
      gradeProduto,
      atividadeServico,
      statusAtividadeServico,
      idFormulaTinta,
      personalizacao,
      idLoteEstoque,
      vinculoItemDocumento,
      operacaoFiscal,
      movimentaEstoque,
      geraFinanceiro,
      localEstoque,
      pessoaParticipante,
      dataEntrega,
      controleQuantidade,
      unidadeMedidaConversao,
      conversorQuantidade,
      loteMinimo,
      loteMultiplo,
      altura,
      largura,
      comprimento,
      pecas,
      quantidade,
      quantidadeConvertida,
      quantidadeSaldo,
      controleEntrega,
      pesoLiquido,
      pesoBruto,
      tipoPreco,
      tabelaPreco,
      precoSugestaoAPrazo,
      precoSugestaoAVista,
      precoDesconto,
      precoMinimo,
      usarPrecoAVista,
      precoUnitarioBruto,
      acrescimoUnitarioComposicao,
      precoUnitario,
      precoUnitarioConvertido,
      valorProdutoServicoBruto,
      valorProdutoServico,
      percDescontoItem,
      valorDescontoItem,
      percAcrescimoItem,
      valorAcrescimoItem,
      valorFreteItem,
      valorSeguroItem,
      valorAdicFreteMarinhaMerItem,
      valorDespesasAduaneirasItem,
      valorFreteGeral,
      valorSeguroGeral,
      valorDescontoGeral,
      valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral,
      valorDespesasAduaneirasGeral,
      valorBasePagamento,
      valorDescontoPagamento,
      valorOutrasDespesasPagamento,
      valorJurosPagamento,
      valorFreteTotal,
      valorSeguroTotal,
      valorDescontoTotal,
      valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal,
      valorDespesasAduaneirasTotal,
      cfop,
      indicadorISSQN,
      aliquotaISSQN,
      retidoISSQN,
      tributadoForaMunicipio,
      incentivoFiscal,
      listaServicos,
      cnae,
      idServicoMunicipio,
      numeroProcessoAdministrativo,
      baseISSQN,
      valorISSQN,
      retencaoIRRF,
      baseRetIRRF,
      valorRetIRRF,
      retencaoINSS,
      baseRetINSS,
      valorRetINSS,
      retencaoPIS,
      baseRetPIS,
      valorRetPIS,
      retencaoCOFINS,
      baseRetCOFINS,
      valorRetCOFINS,
      retencaoCSLL,
      baseRetCSLL,
      valorRetCSLL,
      retencaoOutros,
      baseRetOutros,
      valorRetOutros,
      aliquotaII,
      baseII,
      valorII,
      aliquotaIOF,
      baseIOF,
      valorIOF,
      codigoEnquadramentoIPI,
      stIPI,
      aliquotaIPI,
      valorAliquotaIPI,
      baseIPI,
      valorIPI,
      stPIS,
      aliquotaPIS,
      valorAliquotaPIS,
      basePIS,
      valorPIS,
      aliquotaPISST,
      valorAliquotaPISST,
      basePISST,
      valorPISST,
      stCOFINS,
      aliquotaCOFINS,
      valorAliquotaCOFINS,
      baseCOFINS,
      valorCOFINS,
      aliquotaCOFINSST,
      valorAliquotaCOFINSST,
      baseCOFINSST,
      valorCOFINSST,
      stSimplesNacional,
      creditoSimplesNacional,
      baseCreditoSimplesNacional,
      valorCreditoSimplesNacional,
      stICMS,
      modalidadeBaseCalcICMS,
      reducaoBaseICMS,
      aliquotaICMS,
      diferimentoICMS,
      motivoDesoneracaoICMS,
      idBeneficio,
      baseICMS,
      valorICMSOperacao,
      valorICMSDiferido,
      valorICMS,
      valorICMSDesoneracao,
      modalidadeBaseCalcICMSST,
      margemValorAdicionadoST,
      reducaoBaseST,
      aliquotaICMSST,
      aliquotaSTSuportConsFinal,
      baseICMSST,
      valorICMSST,
      baseICMSSTAnteriormente,
      valorICMSSTAnteriormente,
      valorICMSProprioSubstituto,
      reducaoBaseICMSEfetivo,
      aliquotaICMSEfetivo,
      baseICMSEfetivo,
      valorICMSEfetivo,
      aliquotaICMSUFDestinatario,
      aliquotaICMSInterestadual,
      partilhaICMSInterestadual,
      baseICMSUFDestinatario,
      valorICMSUFDestinatario,
      baseICMSUFRemetente,
      valorICMSUFRemetente,
      aliquotaFCP,
      baseFCP,
      valorFCP,
      aliquotaFCPST,
      baseFCPST,
      valorFCPST,
      aliquotaFCPSTAnteriormente,
      baseFCPSTAnteriormente,
      valorFCPSTAnteriormente,
      aliquotaFCPUFDestinatario,
      baseFCPUFDestinatario,
      valorFCPUFDestinatario,
      aliquotaEstimadaImpFederais,
      aliquotaEstimadaImpEstaduais,
      aliquotaEstimadaImpMunicipais,
      baseEstimadaImpostos,
      valorEstimadoImpFederais,
      valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais,
      valorLiquidoItem,
      observacoesDigitadas,
      observacoes)
    VALUES (
      b.idItemOrcamento,
      b.orcamento,
      b.sequencia,
      b.cancelado,
      b.pedidoCompraFornecedor,
      b.sequenciaPedidoCompraFornec,
      b.ambiente,
      b.ambienteObservacoes,
      b.modeloDocumento,
      b.estabelecimentoOriginal,
      b.vendedor,
      b.gradeProduto,
      b.atividadeServico,
      b.statusAtividadeServico,
      b.idFormulaTinta,
      b.personalizacao,
      b.idLoteEstoque,
      b.vinculoItemDocumento,
      b.operacaoFiscal,
      b.movimentaEstoque,
      b.geraFinanceiro,
      b.localEstoque,
      b.pessoaParticipante,
      b.dataEntrega,
      b.controleQuantidade,
      b.unidadeMedidaConversao,
      b.conversorQuantidade,
      b.loteMinimo,
      b.loteMultiplo,
      b.altura,
      b.largura,
      b.comprimento,
      b.pecas,
      b.quantidade,
      b.quantidadeConvertida,
      b.quantidadeSaldo,
      b.controleEntrega,
      b.pesoLiquido,
      b.pesoBruto,
      b.tipoPreco,
      b.tabelaPreco,
      b.precoSugestaoAPrazo,
      b.precoSugestaoAVista,
      b.precoDesconto,
      b.precoMinimo,
      b.usarPrecoAVista,
      b.precoUnitarioBruto,
      b.acrescimoUnitarioComposicao,
      b.precoUnitario,
      b.precoUnitarioConvertido,
      b.valorProdutoServicoBruto,
      b.valorProdutoServico,
      b.percDescontoItem,
      b.valorDescontoItem,
      b.percAcrescimoItem,
      b.valorAcrescimoItem,
      b.valorFreteItem,
      b.valorSeguroItem,
      b.valorAdicFreteMarinhaMerItem,
      b.valorDespesasAduaneirasItem,
      b.valorFreteGeral,
      b.valorSeguroGeral,
      b.valorDescontoGeral,
      b.valorOutrasDespesasGeral,
      b.valorAdicFreteMarinhaMerGeral,
      b.valorDespesasAduaneirasGeral,
      b.valorBasePagamento,
      b.valorDescontoPagamento,
      b.valorOutrasDespesasPagamento,
      b.valorJurosPagamento,
      b.valorFreteTotal,
      b.valorSeguroTotal,
      b.valorDescontoTotal,
      b.valorOutrasDespesasTotal,
      b.valorAdicFreteMarinhaMerTotal,
      b.valorDespesasAduaneirasTotal,
      b.cfop,
      b.indicadorISSQN,
      b.aliquotaISSQN,
      b.retidoISSQN,
      b.tributadoForaMunicipio,
      b.incentivoFiscal,
      b.listaServicos,
      b.cnae,
      b.idServicoMunicipio,
      b.numeroProcessoAdministrativo,
      b.baseISSQN,
      b.valorISSQN,
      b.retencaoIRRF,
      b.baseRetIRRF,
      b.valorRetIRRF,
      b.retencaoINSS,
      b.baseRetINSS,
      b.valorRetINSS,
      b.retencaoPIS,
      b.baseRetPIS,
      b.valorRetPIS,
      b.retencaoCOFINS,
      b.baseRetCOFINS,
      b.valorRetCOFINS,
      b.retencaoCSLL,
      b.baseRetCSLL,
      b.valorRetCSLL,
      b.retencaoOutros,
      b.baseRetOutros,
      b.valorRetOutros,
      b.aliquotaII,
      b.baseII,
      b.valorII,
      b.aliquotaIOF,
      b.baseIOF,
      b.valorIOF,
      b.codigoEnquadramentoIPI,
      b.stIPI,
      b.aliquotaIPI,
      b.valorAliquotaIPI,
      b.baseIPI,
      b.valorIPI,
      b.stPIS,
      b.aliquotaPIS,
      b.valorAliquotaPIS,
      b.basePIS,
      b.valorPIS,
      b.aliquotaPISST,
      b.valorAliquotaPISST,
      b.basePISST,
      b.valorPISST,
      b.stCOFINS,
      b.aliquotaCOFINS,
      b.valorAliquotaCOFINS,
      b.baseCOFINS,
      b.valorCOFINS,
      b.aliquotaCOFINSST,
      b.valorAliquotaCOFINSST,
      b.baseCOFINSST,
      b.valorCOFINSST,
      b.stSimplesNacional,
      b.creditoSimplesNacional,
      b.baseCreditoSimplesNacional,
      b.valorCreditoSimplesNacional,
      b.stICMS,
      b.modalidadeBaseCalcICMS,
      b.reducaoBaseICMS,
      b.aliquotaICMS,
      b.diferimentoICMS,
      b.motivoDesoneracaoICMS,
      b.idBeneficio,
      b.baseICMS,
      b.valorICMSOperacao,
      b.valorICMSDiferido,
      b.valorICMS,
      b.valorICMSDesoneracao,
      b.modalidadeBaseCalcICMSST,
      b.margemValorAdicionadoST,
      b.reducaoBaseST,
      b.aliquotaICMSST,
      b.aliquotaSTSuportConsFinal,
      b.baseICMSST,
      b.valorICMSST,
      b.baseICMSSTAnteriormente,
      b.valorICMSSTAnteriormente,
      b.valorICMSProprioSubstituto,
      b.reducaoBaseICMSEfetivo,
      b.aliquotaICMSEfetivo,
      b.baseICMSEfetivo,
      b.valorICMSEfetivo,
      b.aliquotaICMSUFDestinatario,
      b.aliquotaICMSInterestadual,
      b.partilhaICMSInterestadual,
      b.baseICMSUFDestinatario,
      b.valorICMSUFDestinatario,
      b.baseICMSUFRemetente,
      b.valorICMSUFRemetente,
      b.aliquotaFCP,
      b.baseFCP,
      b.valorFCP,
      b.aliquotaFCPST,
      b.baseFCPST,
      b.valorFCPST,
      b.aliquotaFCPSTAnteriormente,
      b.baseFCPSTAnteriormente,
      b.valorFCPSTAnteriormente,
      b.aliquotaFCPUFDestinatario,
      b.baseFCPUFDestinatario,
      b.valorFCPUFDestinatario,
      b.aliquotaEstimadaImpFederais,
      b.aliquotaEstimadaImpEstaduais,
      b.aliquotaEstimadaImpMunicipais,
      b.baseEstimadaImpostos,
      b.valorEstimadoImpFederais,
      b.valorEstimadoImpEstaduais,
      b.valorEstimadoImpMunicipais,
      b.valorLiquidoItem,
      b.observacoesDigitadas,
      b.observacoes);
    IF p_item_idItemOrcamento <= 0
      AND v_item_cancelado = 0
      AND p_item_atividadeServico > 0
    THEN
      SELECT
        validoPrevisto,
        habilitaAtividadePrevista
      INTO
        v_ativServ_validoPrevisto,
        v_ativServ_habilitaAtivPrev
      FROM PAATIVIDADESSERVICO
      WHERE atividadeServico = p_item_atividadeServico;
      IF v_ativServ_habilitaAtivPrev = 1 THEN
        ADD_ORCAMENTO_ITEM_PREV_INSERE (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          r_item_idItemOrcamento,
          p_item_atividadeServico,
          v_ativServ_validoPrevisto);
      END IF;
    END IF;
    v_atualizarObservacoes := 0;
    IF p_idItemReferenciado > 0 THEN
      IF p_tipoDocumentoReferenciado = 'C' THEN
        UPDATE MOPAINELCOMPRAXGRADE
        SET idItemOrcamento = r_item_idItemOrcamento
        WHERE idGradePainelCompra = p_idItemReferenciado;
      ELSIF p_tipoDocumentoReferenciado = 'F' THEN
        ADD_ORCAMENTO_ITEM_REF_CONTR (
          p_estabelecimentoAtivo,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      ELSIF p_tipoDocumentoReferenciado = 'L' THEN
        ADD_ORCAMENTO_ITEM_LISTA_GRAVA (
          p_estabelecimentoAtivo,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      ELSIF p_tipoDocumentoReferenciado = 'O' THEN
        ADD_ORCAMENTO_ITEM_REF_ORCAMEN (
          p_estabelecimentoAtivo,
          r_item_idItemOrcamento,
          p_item_quantidade,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'T' THEN
        ADD_ORCAMENTO_ITEM_TRANS_GRAVA (
          p_estabelecimentoAtivo,
          v_cab_entradaSaida,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      END IF;
    END IF;
    IF p_tempComp_nomeTempComposicao <> ' '
      AND (p_tipoDocumentoReferenciado <> 'O'
        OR p_idItemReferenciado <= 0)
    THEN
      ADD_ORCAMENTO_ITEM_COMP_TEMP (
        p_sessaoClient,
        p_estabelecimentoAtivo,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        r_item_idItemOrcamento,
        v_atualizarObservacoes,
        v_atualizarObservacoes);
    END IF;
    v_idEnderecoEstoque := 0;
    IF p_item_idEnderecoEstoque > 0 THEN
      ADD_ORCAMENTO_ITEM_ENDER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemOrcamento,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_quantidade,
        ' ',
        v_idEnderecoEstoque);
    END IF;
    IF p_item_idNumeroSerie > 0 THEN
      ADD_ORCAMENTO_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemOrcamento,
        v_idEnderecoEstoque,
        p_item_gradeProduto,
        p_item_idNumeroSerie,
        0,
        v_auxNumber);
      v_atualizarObservacoes := 1;
    END IF;
    IF v_atualizarObservacoes = 1 THEN
      v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
        p_sessaoClient,
        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_413_obs_add_marca,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        'O',
        r_item_idItemOrcamento,
        p_item_gradeProduto,
        p_item_idFormulaTinta,
        p_item_personalizacao,
        p_item_idLoteEstoque,
        p_item_controleQuantidade,
        p_item_loteMultiplo,
        p_item_altura,
        p_item_largura,
        p_item_comprimento,
        p_item_quantidade,
        p_item_observacoesDigitadas);
      UPDATE MOORCAMENTOXITENS
      SET observacoes = v_observacoes
      WHERE idItemOrcamento = r_item_idItemOrcamento;
    END IF;
    IF v_etOrc_situacaoOrcamento > 40 THEN
      ADD_ORCAMENTO_ITEM_RES_ITEM (
        r_item_idItemOrcamento,
        p_estabelecimentoAtivo,
        ' ',
        v_auxVarchar);
    END IF;
    r_buffer_idItemOrcamento := CASE WHEN (r_buffer_idItemOrcamento IS NULL OR r_buffer_idItemOrcamento = '' OR r_buffer_idItemOrcamento = ' ') THEN '' ELSE RTRIM (r_buffer_idItemOrcamento) || ';' END || TO_CHAR (LPAD(r_item_idItemOrcamento,14,'0'));
    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;
  END IF;
END ADD_ORCAMENTO_ITEM_GRAVA;

/

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.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;
    FOR b IN (
      SELECT
        id,
        idItemContrato,
        quantidade
      FROM MOCONTRATOXORCAMENTO
      WHERE idItemOrcamento = p_item_idItemOrcamento)
    LOOP
      UPDATE MOCONTRATOXITENS c
      SET c.quantidadeSaldo = c.quantidadeSaldo + b.quantidade
      WHERE c.idItemContrato = b.idItemContrato;
      DELETE MOCONTRATOXORCAMENTO c
      WHERE c.id = b.id;
    END LOOP;
    -- 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;

/

-- FIM BETA 2 - 17/4/24

CREATE TABLE PACHECKLISTXTAREFAS_2401 AS SELECT * FROM PACHECKLISTXTAREFAS;

ALTER TABLE PACHECKLISTXTAREFAXOPCOES DROP CONSTRAINT PACHECKLISTXTAREFAXOPCOES_FK1;
ALTER TABLE MOORCAMENTOXTAREFAS DROP CONSTRAINT MOORCAMENTOXTAREFAS_FK2;

DROP TABLE PACHECKLISTXTAREFAS;

CREATE TABLE PACHECKLISTS_2401 AS SELECT * FROM PACHECKLISTS;

DROP TABLE PACHECKLISTS;

-- PACHECKLISTS
CREATE TABLE PACHECKLISTS
  (
    checklist     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    descricao     VARCHAR (120) DEFAULT ' ' NOT NULL,
    ativo         NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes   VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PACHECKLISTS ADD CONSTRAINT PACHECKLISTS_PK1 PRIMARY KEY (checklist);
CREATE INDEX PACHECKLISTS_K2 ON PACHECKLISTS (descricao);

INSERT INTO PACHECKLISTS (checklist, descricao, ativo, observacoes) VALUES (0, 'SELECIONE', 1, ' ');
INSERT INTO PACHECKLISTS (checklist, descricao, ativo, observacoes) SELECT checklist, descricao, ativo, observacoes FROM PACHECKLISTS_2401 WHERE checklist > 0;

COMMIT;

-- PACHECKLISTXTAREFAS
CREATE TABLE PACHECKLISTXTAREFAS
  (
    idCheckListXTarefas   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    checklist             NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sequencia             NUMERIC (3,0) DEFAULT 0 NOT NULL,
    descricao             VARCHAR (256) DEFAULT ' ' NOT NULL,
    ativo                 NUMERIC (1,0) DEFAULT 0 NOT NULL,
    tipoCampo             CHAR (1) DEFAULT ' ' NOT NULL,
    mascara               VARCHAR (30) DEFAULT ' ' NOT NULL,
    exibirCampo           CHAR (1) DEFAULT ' ' NOT NULL,
    tipoArquivo           NUMERIC (3,0) DEFAULT 0 NOT NULL,
    obrigatorio           NUMERIC (1,0) DEFAULT 0 NOT NULL,
    conteudoSugestao      VARCHAR (256) DEFAULT ' ' NOT NULL,
    tabelaSistema         VARCHAR (30) DEFAULT ' ' NOT NULL,
    observacoes           VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PACHECKLISTXTAREFAS ADD CONSTRAINT PACHECKLISTXTAREFAS_PK1 PRIMARY KEY (idCheckListXTarefas);
CREATE UNIQUE INDEX PACHECKLISTXTAREFAS_K2 ON PACHECKLISTXTAREFAS (checklist, sequencia);
CREATE INDEX PACHECKLISTXTAREFAS_K3 ON PACHECKLISTXTAREFAS (descricao);
ALTER TABLE PACHECKLISTXTAREFAS ADD CONSTRAINT PACHECKLISTXTAREFAS_FK1 FOREIGN KEY (checklist) REFERENCES PACHECKLISTS (checklist);
ALTER TABLE PACHECKLISTXTAREFAS ADD CONSTRAINT PACHECKLISTXTAREFAS_FK2 FOREIGN KEY (tipoCampo) REFERENCES SITIPOSCAMPO (tipoCampo);
ALTER TABLE PACHECKLISTXTAREFAS ADD CONSTRAINT PACHECKLISTXTAREFAS_FK3 FOREIGN KEY (exibirCampo) REFERENCES SIEXIBIRCAMPO (exibirCampo);
ALTER TABLE PACHECKLISTXTAREFAS ADD CONSTRAINT PACHECKLISTXTAREFAS_FK4 FOREIGN KEY (tipoArquivo) REFERENCES SITIPOSARQUIVO (tipoArquivo);
ALTER TABLE PACHECKLISTXTAREFAS ADD CONSTRAINT PACHECKLISTXTAREFAS_FK5 FOREIGN KEY (tabelaSistema) REFERENCES SITABELASSISTEMA (tabelaSistema);

INSERT INTO PACHECKLISTXTAREFAS (idCheckListXTarefas, checklist, sequencia, descricao, ativo, tipoCampo, mascara, exibirCampo, tipoArquivo, obrigatorio, conteudoSugestao, tabelaSistema, observacoes) VALUES (0, 0, 0, ' ', 1, ' ', ' ', ' ', 0, 0, ' ', ' ', ' ');
INSERT INTO PACHECKLISTXTAREFAS (idCheckListXTarefas, checklist, sequencia, descricao, ativo, tipoCampo, mascara, exibirCampo, tipoArquivo, obrigatorio, conteudoSugestao, tabelaSistema, observacoes) SELECT idCheckListXTarefas, checklist, sequencia, descricao, ativo, tipoCampo, mascara, exibirCampo, tipoArquivo, obrigatorio, conteudoSugestao, tabelaSistema, observacoes FROM PACHECKLISTXTAREFAS_2401 WHERE idCheckListXTarefas > 0;

COMMIT;

ALTER TABLE PACHECKLISTXTAREFAXOPCOES ADD CONSTRAINT PACHECKLISTXTAREFAXOPCOES_FK1 FOREIGN KEY (idCheckListXTarefas) REFERENCES PACHECKLISTXTAREFAS (idCheckListXTarefas);
ALTER TABLE MOORCAMENTOXTAREFAS ADD CONSTRAINT MOORCAMENTOXTAREFAS_FK2 FOREIGN KEY (idCheckListXTarefas) REFERENCES PACHECKLISTXTAREFAS (idCheckListXTarefas);

UPDATE SITABELASSISTEMA SET numeroDigitosCodigo = 14 WHERE tabelaSistema = 'PACHECKLISTS';

COMMIT;

-- PAATIVIDADESERVXCHECKLIST;
CREATE TABLE PAATIVIDADESERVXCHECKLIST
  (
    id               NUMERIC (14,0) DEFAULT 0 NOT NULL,
    atividadeServico NUMERIC (4,0) DEFAULT 0 NOT NULL,
    ordenacao        NUMERIC (11,0) DEFAULT 0 NOT NULL,
    checklist        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    ativo            NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes      VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PAATIVIDADESERVXCHECKLIST ADD CONSTRAINT PAATIVIDADESERVXCHECKLIST_PK1 PRIMARY KEY (id);
CREATE UNIQUE INDEX PAATIVIDADESERVXCHECKLIST_K2 ON PAATIVIDADESERVXCHECKLIST (atividadeServico, ordenacao, id);
ALTER TABLE PAATIVIDADESERVXCHECKLIST ADD CONSTRAINT PAATIVIDADESERVXCHECKLIST_FK1 FOREIGN KEY (atividadeServico) REFERENCES PAATIVIDADESSERVICO (atividadeServico);
ALTER TABLE PAATIVIDADESERVXCHECKLIST ADD CONSTRAINT PAATIVIDADESERVXCHECKLIST_FK2 FOREIGN KEY (checklist) REFERENCES PACHECKLISTS (checklist);

INSERT INTO PAATIVIDADESERVXCHECKLIST (id, atividadeServico, ordenacao, checklist, ativo, observacoes) VALUES (0, 0, 0, 0, 1, ' ');

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('PAATIVIDADESERVXCHECKLIST', 'Atividade Serviço x Checklists', 1, 30820, 'PA', 'id', 'N', 14, ' ', 1, ' ', 0, 200005, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqAtividadeServicoXChecklist', 1, 1, ' '); 

COMMIT;

INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (952, 'Atividade Serviço x Checklists', 1, 2070006382, 20, 'OCU', 0, 401, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqAtividadeServicoXChecklist', ' ', 0, 0, NULL, ' ');

COMMIT;

-- PAPROJETOXATIVIDXPRODUTOS
CREATE TABLE PAPROJETOXATIVIDXPRODUTOS
  (
    idProdutoXAtividadeProjeto NUMERIC (14,0) DEFAULT 0 NOT NULL,
    atividadeProjeto           NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sequencia                  NUMERIC (3,0) DEFAULT 0 NOT NULL,
    cancelado                  NUMERIC (1,0) DEFAULT 0 NOT NULL,
    gradeProduto               NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quantidade                 NUMERIC (15,6) DEFAULT 0 NOT NULL,
    observacoes                VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PAPROJETOXATIVIDXPRODUTOS ADD CONSTRAINT PAPROJETOXATIVIDXPRODUTOS_PK1 PRIMARY KEY (idProdutoXAtividadeProjeto);
CREATE INDEX PAPROJETOXATIVIDXPRODUTOS_K2 ON PAPROJETOXATIVIDXPRODUTOS (atividadeProjeto, sequencia);
ALTER TABLE PAPROJETOXATIVIDXPRODUTOS ADD CONSTRAINT PAPROJETOXATIVIDXPRODUTOS_FK1 FOREIGN KEY (atividadeProjeto) REFERENCES PAPROJETOXATIVIDADES (atividadeProjeto);
ALTER TABLE PAPROJETOXATIVIDXPRODUTOS ADD CONSTRAINT PAPROJETOXATIVIDXPRODUTOS_FK2 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);

INSERT INTO PAPROJETOXATIVIDXPRODUTOS (idProdutoXAtividadeProjeto, atividadeProjeto, sequencia, cancelado, gradeProduto, quantidade, observacoes) VALUES (0, 0, 0, 0, 0, 0, ' ');

COMMIT;

INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (953, 'Projeto X Atividades X Produtos', 1, 2060009530, 20, 'OCU', 0, 398, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqProjetoXProdutos', ' ', 0, 0, NULL, ' ');

COMMIT;

DROP INDEX TEMPSELECIONADOS_PK1;
DROP INDEX TEMPSELECIONADOS_K2;
DROP INDEX TEMPSELECIONADOS_K3;
CREATE UNIQUE INDEX TEMPSELECIONADOS_PK1 ON TEMPSELECIONADOS (sessaoClient, contadorSessao, ordenacao, id, codigo, id2, codigo2);
CREATE INDEX TEMPSELECIONADOS_K2 ON TEMPSELECIONADOS (sessaoClient, contadorSessao, id, codigo, id2, codigo2);
CREATE INDEX TEMPSELECIONADOS_K3 ON TEMPSELECIONADOS (sessaoClient, contadorSessao, quebra, id, codigo, id2, codigo2);

CREATE TABLE MOCONTRATOS_2401 AS SELECT * FROM MOCONTRATOS;

ALTER TABLE MOCONTRATOXITENS DROP CONSTRAINT MOCONTRATOXITENS_FK1;
ALTER TABLE MOEVENTOS DROP CONSTRAINT MOEVENTOS_FK13;

DROP TABLE MOCONTRATOS;

-- MOCONTRATOS
CREATE TABLE MOCONTRATOS
  (
    idContrato                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    modeloContrato             NUMERIC (4,0) DEFAULT 0 NOT NULL,
    estabelecimento            NUMERIC (4,0) DEFAULT 0 NOT NULL,
    dataEmissao                DATE,
    dataVigenciaInicio         DATE,
    dataVigenciaTermino        DATE,
    dataProximoReajuste        DATE,
    diaFaturamento             NUMERIC (2,0) DEFAULT 0 NOT NULL,
    diaVencimento              NUMERIC (2,0) DEFAULT 0 NOT NULL,
    pessoa                     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    cobranca                   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    faturarClienteOrdemServico NUMERIC (1,0) DEFAULT 0 NOT NULL,
    tabelaPreco                VARCHAR (10) DEFAULT ' ' NOT NULL,
    colaboradorResponsavel     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    vendedor                   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    comissionadoB              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    comissionadoC              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    contratoTerceiro           VARCHAR (15) DEFAULT ' ' NOT NULL,
    situacaoContrato           CHAR (1) DEFAULT ' ' NOT NULL,
    observacoes                VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_PK1 PRIMARY KEY (idContrato);
CREATE INDEX MOCONTRATOS_K2 ON MOCONTRATOS (pessoa);
CREATE INDEX MOCONTRATOS_K3 ON MOCONTRATOS (dataEmissao);
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_FK1 FOREIGN KEY (modeloContrato) REFERENCES PAMODELOSCONTRATO (modeloContrato);
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_FK2 FOREIGN KEY (estabelecimento) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_FK3 FOREIGN KEY (diaFaturamento) REFERENCES SIDIAS (dia);
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_FK4 FOREIGN KEY (diaVencimento) REFERENCES SIDIAS (dia);
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_FK5 FOREIGN KEY (pessoa) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_FK6 FOREIGN KEY (cobranca) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_FK7 FOREIGN KEY (tabelaPreco) REFERENCES PATABELASPRECO (tabelaPreco);
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_FK8 FOREIGN KEY (colaboradorResponsavel) REFERENCES CACOLABORADORES (colaborador);
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_FK9 FOREIGN KEY (vendedor) REFERENCES CAVENDEDORES (vendedor);
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_FK10 FOREIGN KEY (comissionadoB) REFERENCES CACOMISSIONADOSB (comissionadoB);
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_FK11 FOREIGN KEY (comissionadoC) REFERENCES CACOMISSIONADOSC (comissionadoC);
ALTER TABLE MOCONTRATOS ADD CONSTRAINT MOCONTRATOS_FK12 FOREIGN KEY (situacaoContrato) REFERENCES SISITUACOESCONTRATO (situacaoContrato);

INSERT INTO MOCONTRATOS (idContrato, modeloContrato, estabelecimento, dataEmissao, dataVigenciaInicio, dataVigenciaTermino, dataProximoReajuste, diaFaturamento, diaVencimento, pessoa, cobranca, faturarClienteOrdemServico, tabelaPreco, colaboradorResponsavel, vendedor, comissionadoB, comissionadoC, contratoTerceiro, situacaoContrato, observacoes) VALUES (0, 0, 0, NULL, NULL, NULL, NULL, 0, 0, 0, 0, 0, ' ', 0, 0, 0, 0, ' ', ' ', ' ');
INSERT INTO MOCONTRATOS (idContrato, modeloContrato, estabelecimento, dataEmissao, dataVigenciaInicio, dataVigenciaTermino, dataProximoReajuste, diaFaturamento, diaVencimento, pessoa, cobranca, faturarClienteOrdemServico, tabelaPreco, colaboradorResponsavel, vendedor, comissionadoB, comissionadoC, contratoTerceiro, situacaoContrato, observacoes) SELECT idContrato, modeloContrato, estabelecimento, dataEmissao, dataVigenciaInicio, dataVigenciaTermino, dataProximoReajuste, diaFaturamento, diaVencimento, pessoa, cobranca, faturarClienteOrdemServico, ' ', colaboradorResponsavel, vendedor, comissionadoB, comissionadoC, contratoTerceiro, situacaoContrato, observacoes FROM MOCONTRATOS_2401 WHERE idContrato > 0;

COMMIT;

ALTER TABLE MOCONTRATOXITENS ADD CONSTRAINT MOCONTRATOXITENS_FK1 FOREIGN KEY (idContrato) REFERENCES MOCONTRATOS (idContrato);
ALTER TABLE MOEVENTOS ADD CONSTRAINT MOEVENTOS_FK13 FOREIGN KEY (idContrato) REFERENCES MOCONTRATOS (idContrato);

-- MOCONTRATOXPROJETOS
CREATE TABLE MOCONTRATOXPROJETOS
  (
    id          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idContrato  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    projeto     VARCHAR (60) DEFAULT ' ' NOT NULL,
    ativo       NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MOCONTRATOXPROJETOS ADD CONSTRAINT MOCONTRATOXPROJETOS_PK1 PRIMARY KEY (id);
CREATE UNIQUE INDEX MOCONTRATOXPROJETOS_K2 ON MOCONTRATOXPROJETOS (idContrato, projeto);
CREATE INDEX MOCONTRATOXPROJETOS_K3 ON MOCONTRATOXPROJETOS (idContrato);
CREATE INDEX MOCONTRATOXPROJETOS_K4 ON MOCONTRATOXPROJETOS (projeto);
ALTER TABLE MOCONTRATOXPROJETOS ADD CONSTRAINT MOCONTRATOXPROJETOS_FK1 FOREIGN KEY (idContrato) REFERENCES MOCONTRATOS (idContrato);
ALTER TABLE MOCONTRATOXPROJETOS ADD CONSTRAINT MOCONTRATOXPROJETOS_FK2 FOREIGN KEY (projeto) REFERENCES PAPROJETOS (projeto);

INSERT INTO MOCONTRATOXPROJETOS (id, idContrato, projeto, ativo, observacoes) VALUES (0, 0, ' ', 1, ' ');

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MOCONTRATOXPROJETOS', 'Contrato X Projetos', 1, 50225, 'MO', 'id', 'N', 14, ' ', 1, ' ', 0, 100002, ' ', ' ', 1, 1, ' '); 

COMMIT;

INSERT INTO SITIPOSPRECO (tipoPreco, descricao, ativo, validoCusto, observacoes) values ('R', 'Último Preço de Reposição', 1, 1, ' ');

COMMIT;

INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (165, '54', '54 - TODA LINDA STORE', 204, 1, 54, ' ');

COMMIT;

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

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_ULT_COMPR (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataPrecoInicial         IN DATE,
  p_cab_dataPrecoFinal           IN DATE,
  p_item_personalizacao          IN NUMBER,
  p_gradProd_produto             IN NUMBER,
  p_gradProd_cor                 IN NUMBER,
  p_gradProd_tamanho             IN VARCHAR,
  p_precoRetornar                IN NUMBER, -- 0 Preco Menos Desconto, 1 Preco Bruto, 2 Preço Reposicao
  p_gerandoInventario            IN NUMBER)
  RETURN NUMBER
IS 
  v_contaGradesProduto NUMBER;
  v_gradeProduto       NUMBER;
  v_data               DATE;
  v_preco              NUMBER;
BEGIN
  v_preco := 0;
  SELECT
    COALESCE (MAX(gradeProduto), 0),
    COALESCE (COUNT (1), 0)
  INTO
    v_gradeProduto,
    v_contaGradesProduto
  FROM CAGRADESPRODUTO
  WHERE produto = p_gradProd_produto
  AND (p_config_362_calcCustoPorGrade = 0
    OR p_gradProd_cor = 0
    OR cor = p_gradProd_cor)
  AND (p_config_362_calcCustoPorGrade = 0
    OR p_gradProd_tamanho = ''
    OR p_gradProd_tamanho = ' '
    OR tamanho = p_gradProd_tamanho);
  IF v_contaGradesProduto = 1 THEN
    WITH ESTABELECIMENTOS AS (
      SELECT DISTINCT a.estabelecimento
      FROM (
        SELECT est.estabelecimento
        FROM PAESTABELECIMENTOS est
        WHERE est.estabelecimento = p_cab_estabelecimento
        UNION ALL
        SELECT est2.estabelecimento
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND est2.ativo = 1
        UNION ALL
        SELECT est2.estabelecimento
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE p_config_209_filtrarGrupoEcon = 1
        AND est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.ativo = 1) a)
    SELECT
      MAX(a.data),
      COALESCE(MAX(a.preco),0)
    INTO
      v_data,
      v_preco
    FROM (
      SELECT 
        ROW_NUMBER() OVER (
          ORDER BY
            TRUNC(a.dataEntradaSaida) Desc,
            a.preco Desc) ordenacao,
        TRUNC(a.dataEntradaSaida) data,
        a.preco
      FROM (
        SELECT
          doc.dataEntradaSaida,
          CASE
            WHEN COUNT (1) = 1
              OR SUM(item.quantidade) = 0
            THEN MAX(item.precoUnitario)
            ELSE ROUND((SUM(item.valorProdutoServico) / SUM(item.quantidade)),7)
          END
          + CASE
              WHEN p_precoRetornar = 1
                OR SUM (item.quantidade) = 0
              THEN 0
              WHEN p_precoRetornar = 2
              THEN ROUND (SUM (
                item.valorFreteTotal
                + item.valorSeguroTotal
                - item.valorDescontoTotal
                + item.valorOutrasDespesasTotal
                + item.valorII
                + item.valorIOF
                + item.valorIPI
                + item.valorIPIDevolucao
                + CASE
                    WHEN doc.nfFornecedor = 1
                      AND item.somarICMSST IN (0,1)
                    THEN
                      CASE
                        WHEN item.valorICMSSTEscrituracao = 0
                        THEN item.valorICMSST
                        ELSE item.valorICMSSTEscrituracao
                      END
                    WHEN doc.nfFornecedor = 1
                    THEN 0
                    ELSE item.valorICMSST
                  END) / SUM (item.quantidade), 7)
              ELSE ROUND (SUM (- item.valorDescontoTotal) / SUM(item.quantidade), 7)
            END preco       
        FROM MODOCFISCALXITENS item
        JOIN MODOCUMENTOSFISCAIS doc
        ON doc.idDocumentoFiscal = item.idDocumentoFiscal
        JOIN ESTABELECIMENTOS est
        ON est.estabelecimento = doc.estabelecimento
        WHERE item.gradeProduto = v_gradeProduto
        AND item.cancelado = 0
        AND (item.quantidade = 0
          AND item.precoUnitario > 0
          OR item.quantidade > 0
          AND item.valorProdutoServico >
            CASE
              WHEN p_precoRetornar = 1
              THEN 0
              WHEN p_precoRetornar = 2
              THEN - item.valorFreteTotal
                - item.valorSeguroTotal
                + item.valorDescontoTotal
                - item.valorOutrasDespesasTotal
                - item.valorII
                - item.valorIOF
                - item.valorIPI
                - item.valorIPIDevolucao
                - CASE
                    WHEN doc.nfFornecedor = 1
                      AND item.somarICMSST IN (0,1)
                    THEN
                      CASE
                        WHEN item.valorICMSSTEscrituracao = 0
                        THEN item.valorICMSST
                        ELSE item.valorICMSSTEscrituracao
                      END
                    WHEN doc.nfFornecedor = 1
                    THEN 0
                    ELSE item.valorICMSST
                  END
              ELSE item.valorDescontoTotal
            END)
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_item_personalizacao = 0
          OR item.personalizacao = p_item_personalizacao)
        AND doc.entradaSaida = 'E'
        AND doc.devolucaoAnulacaoRetorno = 0
        AND doc.situacaoDocumentoFiscal IN (21,22,23)
        AND doc.atualizaUltimaCompra = 1
        AND doc.dataEntradaSaida >= COALESCE(TRUNC(p_cab_dataPrecoInicial),TO_DATE ('01/01/1900','DD/MM/YYYY'))
        AND doc.dataEntradaSaida < TRUNC(p_cab_dataPrecoFinal) + 1
        GROUP BY
          doc.dataEntradaSaida,
          item.idDocumentoFiscal
        UNION ALL
        SELECT
          doc.dataEntradaSaida,
          CASE
            WHEN COUNT (1) = 1
              OR SUM(item.quantidade) = 0
            THEN MAX(item.precoUnitario)
            ELSE ROUND((SUM(item.valorProdutoServico) / SUM(item.quantidade)),7)
          END
          + CASE
              WHEN p_precoRetornar = 1
                OR SUM (item.quantidade) = 0
              THEN 0
              WHEN p_precoRetornar = 2
              THEN ROUND (SUM (
                item.valorFreteTotal
                + item.valorSeguroTotal
                - item.valorDescontoTotal
                + item.valorOutrasDespesasTotal
                + item.valorII
                + item.valorIOF
                + item.valorIPI
                + item.valorICMSST) / SUM (item.quantidade), 7)
              ELSE ROUND (SUM (- item.valorDescontoTotal) / SUM(item.quantidade), 7)
            END preco       
        FROM MOPREDOCUMXITENS item
        JOIN MOPREDOCUMENTOS doc
        ON doc.preDocumento = item.preDocumento
        JOIN ESTABELECIMENTOS est
        ON est.estabelecimento = doc.estabelecimento
        WHERE item.gradeProduto = v_gradeProduto
        AND item.cancelado = 0
        AND (item.quantidade = 0
          AND item.precoUnitario > 0
          OR item.quantidade > 0
          AND item.valorProdutoServico >
            CASE
              WHEN p_precoRetornar = 1
              THEN 0
              WHEN p_precoRetornar = 2
              THEN - item.valorFreteTotal
                - item.valorSeguroTotal
                + item.valorDescontoTotal
                - item.valorOutrasDespesasTotal
                - item.valorII
                - item.valorIOF
                - item.valorIPI
                - item.valorICMSST
              ELSE item.valorDescontoTotal
            END)
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_item_personalizacao = 0
          OR item.personalizacao = p_item_personalizacao)
        AND doc.entradaSaida = 'E'
        AND doc.devolucaoAnulacaoRetorno = 0
        AND doc.statusPreDocumento IN ('A','F')
        AND doc.atualizaUltimaCompra = 1
        AND doc.dataEntradaSaida >= COALESCE(TRUNC(p_cab_dataPrecoInicial),TO_DATE ('01/01/1900','DD/MM/YYYY'))
        AND doc.dataEntradaSaida < TRUNC(p_cab_dataPrecoFinal) + 1
        GROUP BY
          doc.dataEntradaSaida,
          item.preDocumento) a) a
    WHERE a.ordenacao = 1;
  ELSIF v_contaGradesProduto > 1 THEN
    WITH ESTABELECIMENTOS AS (
      SELECT DISTINCT a.estabelecimento
      FROM (
        SELECT est.estabelecimento
        FROM PAESTABELECIMENTOS est
        WHERE est.estabelecimento = p_cab_estabelecimento
        UNION ALL
        SELECT est2.estabelecimento
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND est2.ativo = 1
        UNION ALL
        SELECT est2.estabelecimento
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE p_config_209_filtrarGrupoEcon = 1
        AND est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.ativo = 1) a)
    SELECT
      MAX(a.data),
      COALESCE(MAX(a.preco),0)
    INTO
      v_data,
      v_preco
    FROM (
      SELECT 
        ROW_NUMBER() OVER (
          ORDER BY
            TRUNC(a.dataEntradaSaida) Desc,
            a.preco Desc) ordenacao,
        TRUNC(a.dataEntradaSaida) data,
        a.preco
      FROM (
        SELECT
          doc.dataEntradaSaida,
          CASE
            WHEN COUNT (1) = 1
              OR SUM(item.quantidade) = 0
            THEN MAX(item.precoUnitario)
            ELSE ROUND((SUM(item.valorProdutoServico) / SUM(item.quantidade)),7)
          END
          + CASE
              WHEN p_precoRetornar = 1
                OR SUM (item.quantidade) = 0
              THEN 0
              WHEN p_precoRetornar = 2
              THEN ROUND (SUM (
                item.valorFreteTotal
                + item.valorSeguroTotal
                - item.valorDescontoTotal
                + item.valorOutrasDespesasTotal
                + item.valorII
                + item.valorIOF
                + item.valorIPI
                + item.valorIPIDevolucao
                + CASE
                    WHEN doc.nfFornecedor = 1
                      AND item.somarICMSST IN (0,1)
                    THEN
                      CASE
                        WHEN item.valorICMSSTEscrituracao = 0
                        THEN item.valorICMSST
                        ELSE item.valorICMSSTEscrituracao
                      END
                    WHEN doc.nfFornecedor = 1
                    THEN 0
                    ELSE item.valorICMSST
                  END) / SUM (item.quantidade), 7)
              ELSE ROUND (SUM (- item.valorDescontoTotal) / SUM(item.quantidade), 7)
            END preco       
        FROM MODOCFISCALXITENS item
        JOIN CAGRADESPRODUTO grad
        ON grad.gradeProduto = item.gradeProduto
        JOIN MODOCUMENTOSFISCAIS doc
        ON doc.idDocumentoFiscal = item.idDocumentoFiscal
        JOIN ESTABELECIMENTOS est
        ON est.estabelecimento = doc.estabelecimento
        WHERE item.cancelado = 0
        AND (item.quantidade = 0
          AND item.precoUnitario > 0
          OR item.quantidade > 0
          AND item.valorProdutoServico >
            CASE
              WHEN p_precoRetornar = 1
              THEN 0
              WHEN p_precoRetornar = 2
              THEN - item.valorFreteTotal
                - item.valorSeguroTotal
                + item.valorDescontoTotal
                - item.valorOutrasDespesasTotal
                - item.valorII
                - item.valorIOF
                - item.valorIPI
                - item.valorIPIDevolucao
                - CASE
                    WHEN doc.nfFornecedor = 1
                      AND item.somarICMSST IN (0,1)
                    THEN
                      CASE
                        WHEN item.valorICMSSTEscrituracao = 0
                        THEN item.valorICMSST
                        ELSE item.valorICMSSTEscrituracao
                      END
                    WHEN doc.nfFornecedor = 1
                    THEN 0
                    ELSE item.valorICMSST
                  END
              ELSE item.valorDescontoTotal
            END)
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_item_personalizacao = 0
          OR item.personalizacao = p_item_personalizacao)
        AND doc.entradaSaida = 'E'
        AND doc.devolucaoAnulacaoRetorno = 0
        AND doc.situacaoDocumentoFiscal IN (21,22,23)
        AND doc.atualizaUltimaCompra = 1
        AND doc.dataEntradaSaida >= COALESCE(TRUNC(p_cab_dataPrecoInicial),TO_DATE ('01/01/1900','DD/MM/YYYY'))
        AND doc.dataEntradaSaida < TRUNC(p_cab_dataPrecoFinal) + 1
        AND grad.produto = p_gradProd_produto
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gradProd_cor = 0
          OR grad.cor = p_gradProd_cor)
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gradProd_tamanho = ''
          OR p_gradProd_tamanho = ' '
          OR grad.tamanho = p_gradProd_tamanho)
        GROUP BY
          doc.dataEntradaSaida,
          item.idDocumentoFiscal
        UNION ALL
        SELECT
          doc.dataEntradaSaida,
          CASE
            WHEN COUNT (1) = 1
              OR SUM(item.quantidade) = 0
            THEN MAX(item.precoUnitario)
            ELSE ROUND((SUM(item.valorProdutoServico) / SUM(item.quantidade)),7)
          END
          + CASE
              WHEN p_precoRetornar = 1
                OR SUM (item.quantidade) = 0
              THEN 0
              WHEN p_precoRetornar = 2
              THEN ROUND (SUM (
                item.valorFreteTotal
                + item.valorSeguroTotal
                - item.valorDescontoTotal
                + item.valorOutrasDespesasTotal
                + item.valorII
                + item.valorIOF
                + item.valorIPI
                + item.valorICMSST) / SUM (item.quantidade), 7)
              ELSE ROUND (SUM (- item.valorDescontoTotal) / SUM(item.quantidade), 7)
            END preco       
        FROM MOPREDOCUMXITENS item
        JOIN CAGRADESPRODUTO grad
        ON grad.gradeProduto = item.gradeProduto
        JOIN MOPREDOCUMENTOS doc
        ON doc.preDocumento = item.preDocumento
        JOIN ESTABELECIMENTOS est
        ON est.estabelecimento = doc.estabelecimento
        WHERE item.cancelado = 0
        AND (item.quantidade = 0
          AND item.precoUnitario > 0
          OR item.quantidade > 0
          AND item.valorProdutoServico >
            CASE
              WHEN p_precoRetornar = 1
              THEN 0
              WHEN p_precoRetornar = 2
              THEN - item.valorFreteTotal
                - item.valorSeguroTotal
                + item.valorDescontoTotal
                - item.valorOutrasDespesasTotal
                - item.valorII
                - item.valorIOF
                - item.valorIPI
                - item.valorICMSST
              ELSE item.valorDescontoTotal
            END)
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_item_personalizacao = 0
          OR item.personalizacao = p_item_personalizacao)
        AND doc.entradaSaida = 'E'
        AND doc.devolucaoAnulacaoRetorno = 0
        AND doc.statusPreDocumento IN ('A','F')
        AND doc.atualizaUltimaCompra = 1
        AND doc.dataEntradaSaida >= COALESCE (TRUNC (p_cab_dataPrecoInicial), TO_DATE ('01/01/1900', 'DD/MM/YYYY'))
        AND doc.dataEntradaSaida < TRUNC(p_cab_dataPrecoFinal) + 1
        AND grad.produto = p_gradProd_produto
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gradProd_cor = 0
          OR grad.cor = p_gradProd_cor)
        AND (p_config_362_calcCustoPorGrade = 0
          OR p_gradProd_tamanho = ''
          OR p_gradProd_tamanho = ' '
          OR grad.tamanho = p_gradProd_tamanho)
        GROUP BY
          doc.dataEntradaSaida,
          item.preDocumento) a) a
    WHERE a.ordenacao = 1;
  END IF;
  v_preco := FUNC_ADD_BUSCA_PRECO_INVENT(
    p_config_209_filtrarGrupoEcon,
    p_config_362_calcCustoPorGrade,
    p_cab_estabelecimento,
    COALESCE (v_data, COALESCE (TRUNC (p_cab_dataPrecoInicial), TO_DATE ('01/01/1900', 'DD/MM/YYYY'))),
    TRUNC(p_cab_dataPrecoFinal),
    p_item_personalizacao,
    p_gradProd_produto,
    p_gradProd_cor,
    p_gradProd_tamanho,
    v_preco,
    p_gerandoInventario,
    'U');
  IF v_preco = 0
    AND (p_cab_dataPrecoInicial IS NULL
      OR p_cab_dataPrecoInicial = TO_DATE ('01/01/1900','DD/MM/YYYY'))
  THEN
    v_preco := FUNC_ADD_BUSCA_PRECO_PRODXEST(
      p_config_209_filtrarGrupoEcon,
      p_cab_estabelecimento,
      p_gradProd_produto,
      'U');
  END IF;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_FORMACAO (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataPrecoInicial         IN DATE,
  p_cab_dataPrecoFinal           IN DATE,
  p_item_personalizacao          IN NUMBER,
  p_gradProd_produto             IN NUMBER,
  p_gradProd_cor                 IN NUMBER,
  p_gradProd_tamanho             IN VARCHAR,
  p_gerandoInventario            IN NUMBER)
  RETURN NUMBER
IS
  v_data  DATE;
  v_preco NUMBER;
BEGIN
  SELECT
    MAX(a.data),
    COALESCE(MAX(a.novoPrecoCusto),0)
  INTO
    v_data,
    v_preco
  FROM (
    SELECT 
      ROW_NUMBER() OVER (
        ORDER BY
          data Desc,
          novoPrecoCusto Desc) ordenacao,
      data,
      novoPrecoCusto
    FROM CAPRODUTOXCUSTOS
    WHERE produto = p_gradProd_produto
    AND ativo = 1
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_cor = 0
      OR cor = p_gradProd_cor)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_tamanho = ''
      OR p_gradProd_tamanho = ' '
      OR tamanho = p_gradProd_tamanho)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_item_personalizacao = 0
      OR personalizacao = p_item_personalizacao)
    AND data >= COALESCE(TRUNC(p_cab_dataPrecoInicial),TO_DATE ('01/01/1900','DD/MM/YYYY'))
    AND data < TRUNC(p_cab_dataPrecoFinal) + 1) a
  WHERE a.ordenacao = 1;
  v_preco := FUNC_ADD_BUSCA_PRECO_INVENT (
    p_config_209_filtrarGrupoEcon,
    p_config_362_calcCustoPorGrade,
    p_cab_estabelecimento,
    COALESCE(v_data,COALESCE(TRUNC(p_cab_dataPrecoInicial),TO_DATE ('01/01/1900','DD/MM/YYYY'))),
    TRUNC(p_cab_dataPrecoFinal),
    p_item_personalizacao,
    p_gradProd_produto,
    p_gradProd_cor,
    p_gradProd_tamanho,
    v_preco,
    p_gerandoInventario,
    'F');
  IF v_preco = 0
    AND (p_cab_dataPrecoInicial IS NULL
      OR p_cab_dataPrecoInicial = TO_DATE ('01/01/1900','DD/MM/YYYY'))
  THEN
    v_preco := FUNC_ADD_BUSCA_PRECO_PRODXEST (
      p_config_209_filtrarGrupoEcon,
      p_cab_estabelecimento,
      p_gradProd_produto,
      'P');
  END IF;
  IF v_preco = 0 THEN
    v_preco := FUNC_ADD_BUSCA_PRECO_ULT_COMPR (
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_cab_estabelecimento,
      p_cab_dataPrecoInicial,
      p_cab_dataPrecoFinal,
      p_item_personalizacao,
      p_gradProd_produto,
      p_gradProd_cor,
      p_gradProd_tamanho,
      0, -- p_precoRetornar
      p_gerandoInventario);
  END IF;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_TABELA (
  p_perfilUsuarioLogado          IN NUMBER,
  p_usuarioLogado                IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_devolucaoAnulacaoRetorno IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataPrecoFinal           IN DATE,
  p_cab_pessoa                   IN NUMBER,
  p_cab_projeto                  IN VARCHAR,
  p_modDoc_capituloNaturezaFisc  IN NUMBER,
  p_endPessEst_uf                IN CHAR,
  p_endPess_uf                   IN CHAR,
  p_item_vendedor                IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_gradProd_produto             IN NUMBER,
  p_gradProd_cor                 IN NUMBER,
  p_gradProd_tamanho             IN VARCHAR,
  p_manterPreco                  IN NUMBER,
  p_tabelaPreco                  IN VARCHAR)
  RETURN NUMBER
IS 
  v_preco NUMBER;
BEGIN
  SELECT COALESCE (MAX (
    CASE
      WHEN a.promocao = 1
      THEN a.precoPromocaoAPrazo
      ELSE a.precoAPrazo
    END *
    CASE
      WHEN a.indexador = ' '
        OR a.cotacao = 0
      THEN 1
      ELSE a.cotacao
    END), 0) preco
  INTO v_preco
  FROM (
    SELECT
      a.precoAPrazo,
      a.promocao,
      a.precoPromocaoAPrazo,
      a.indexador,
      COALESCE ((
        SELECT
          CASE
            WHEN p_cab_entradaSaida =
              CASE
                WHEN p_cab_devolucaoAnulacaoRetorno = 1
                THEN 'S'
                ELSE 'E'
              END
            THEN indDia.cotacaoCompra
            ELSE indDia.cotacaoVenda
          END
        FROM PAINDEXADORXDIAS indDia
        WHERE indDia.indexador = a.indexador
        AND indDia.aPartirDe = (
          SELECT MAX(indDia2.aPartirDe)
          FROM PAINDEXADORXDIAS indDia2
          WHERE indDia2.indexador = indDia.indexador
          AND indDia2.aPartirDe <= SYSDATE)), 0) cotacao
    FROM (
      SELECT 
        a.precoAPrazo,
        a.promocao,
        a.precoPromocaoAPrazo,
        tabela.indexador,
        ROW_NUMBER() OVER (
          ORDER BY
            CASE
              WHEN p_cab_projeto = ' '
              THEN 0
              WHEN EXISTS (
                SELECT 1
                FROM MOCONTRATOXPROJETOS contrXProj
                JOIN MOCONTRATOS contr
                ON contr.idContrato = contrXProj.idContrato
                JOIN MOCONTRATOXITENS contrXitem
                ON contrXitem.idContrato = contr.idContrato
                JOIN CAGRADESPRODUTO gradProd
                ON gradProd.gradeProduto = contrXitem.gradeProduto
                WHERE contrXProj.projeto = p_cab_projeto
                AND contrXProj.ativo = 1
                AND contr.situacaoContrato = 'A'
                AND contrXitem.tabelaPreco = a.tabelaPreco
                AND contrXitem.cancelado = 0
                AND gradProd.produto = p_gradProd_produto)
              THEN 1
              WHEN EXISTS (
                SELECT 1
                FROM MOCONTRATOXPROJETOS contrXProj
                JOIN MOCONTRATOS contr
                ON contr.idContrato = contrXProj.idContrato
                WHERE contrXProj.projeto = p_cab_projeto
                AND contrXProj.ativo = 1
                AND contr.situacaoContrato = 'A'
                AND contr.tabelaPreco = a.tabelaPreco)
              THEN 2
              ELSE 3
            END,
            tabela.ordenacao,
            a.tabelaPreco,
            (a.filtrarCores
              + a.filtrarTamanhos
              + a.filtrarPersonalizacoes) desc,
            a.ordenacao,
            a.idPrecoTabela) ordenacao
      FROM CATABELAPRECOXPRECOS a
      JOIN PATABELASPRECO tabela
      ON tabela.tabelaPreco = a.tabelaPreco
      JOIN PAFILTROSCABECALHO filtroCab
      ON filtroCab.filtroCabecalho = tabela.filtroCabecalho
      JOIN CAPESSOAS pess
      ON pess.pessoa = p_cab_pessoa
      WHERE a.produto = p_gradProd_produto
      AND a.tabelaPreco <> ' '
      AND (p_tabelaPreco = ' '
        OR a.tabelaPreco = p_tabelaPreco)
      AND a.ativo = 1
      AND a.quantidadeMinima <= p_item_quantidade
      AND a.quantidadeMaxima >= p_item_quantidade
      AND a.dataValidadeInicial <= p_cab_dataPrecoFinal
      AND a.dataValidadeFinal >= p_cab_dataPrecoFinal
      AND (p_gradProd_cor = 0
        AND a.filtrarCores = 0
        OR p_gradProd_cor > 0
        AND (a.filtrarCores = 0
          OR EXISTS (
            SELECT 1
            FROM CATABELAPRECOXCORES tabcor
            WHERE tabcor.idPrecoTabela = a.idPrecoTabela
            AND tabcor.cor = p_gradProd_cor
            AND tabcor.ativo = 1)))
      AND (p_gradProd_tamanho = ' '
        AND a.filtrarTamanhos = 0
        OR p_gradProd_tamanho <> ' '
        AND (a.filtrarTamanhos = 0
          OR EXISTS (
            SELECT 1
            FROM CATABELAPRECOXTAMANHOS tabtam
            WHERE tabtam.idPrecoTabela = a.idPrecoTabela
            AND tabtam.tamanho = p_gradProd_tamanho
            AND tabtam.ativo = 1)))
      AND (p_item_personalizacao = 0
        AND a.filtrarPersonalizacoes = 0
        OR p_item_personalizacao > 0
        AND (a.filtrarPersonalizacoes = 0
          OR EXISTS (
            SELECT 1
            FROM CATABELAPRECOXPERSONALIZ tabPers
            WHERE tabPers.idPrecoTabela = a.idPrecoTabela
            AND tabPers.personalizacao = p_item_personalizacao
            AND tabPers.ativo = 1)))
      AND (p_manterPreco = 1
        OR tabela.ativo = 1 
        AND CASE 
          WHEN p_tabelaPreco <> ' '
            OR p_cab_entradaSaida = ' '
            OR p_modDoc_capituloNaturezaFisc = 9
          THEN 1
          WHEN p_cab_entradaSaida =
            CASE
              WHEN p_cab_devolucaoAnulacaoRetorno = 1
              THEN 'S'
              ELSE 'E'
            END
          THEN tabela.validoParaCompra
          ELSE tabela.validoParaVenda
        END = 1
        AND (tabela.filtrarVendedores = 0
          OR EXISTS (
            SELECT 1
            FROM PATABELAPRECOXVENDEDORES tabVend
            WHERE tabVend.tabelaPreco = tabela.tabelaPreco
            AND tabVend.vendedor = p_item_vendedor
            AND tabVend.ativo = 1))
        AND (tabela.filtrarLocaisEstoque = 0
          OR EXISTS (
            SELECT 1
            FROM PATABELAPRECOXLOCAISESTOQ tabLocEst
            WHERE tabLocEst.tabelaPreco = tabela.tabelaPreco
            AND tabLocEst.localEstoque = p_item_localEstoque
            AND tabLocEst.ativo = 1))
        AND (tabela.filtroCabecalho = 0
          OR (filtroCab.filtrarEstabelecimentos = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROCABECXESTABELEC filCabEst
              WHERE filCabEst.filtroCabecalho = tabela.filtroCabecalho
              AND filCabEst.estabelecimento = p_cab_estabelecimento
              AND filCabEst.ativo = 1))
          AND (filtroCab.filtrarUfs = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROCABECXUFS filCabUf
              WHERE filCabUf.filtroCabecalho = tabela.filtroCabecalho
              AND filCabUf.uf =
                CASE
                  WHEN p_cab_pessoa = 0
                  THEN p_endPessEst_uf
                  ELSE p_endPess_uf
                END
              AND filCabUf.ativo = 1))
          AND (filtroCab.filtrarPessoas = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROCABECXPESSOAS filCabPess
              WHERE filCabPess.filtroCabecalho = tabela.filtroCabecalho
              AND filCabPess.pessoa = p_cab_pessoa
              AND filCabPess.ativo = 1))
          AND (filtroCab.filtrarPerfisUsuario = 0
            AND filtroCab.filtrarUsuarios = 0
            OR filtroCab.filtrarPerfisUsuario = 1
            AND EXISTS (
              SELECT 1
              FROM PAFILTROCABECXPERFISUSUAR filCabPerfUs
              WHERE filCabPerfUs.filtroCabecalho = tabela.filtroCabecalho
              AND filCabPerfUs.perfilUsuario = p_perfilUsuarioLogado
              AND filCabPerfUs.ativo = 1)
            OR filtroCab.filtrarUsuarios = 1
            AND EXISTS (
              SELECT 1
              FROM PAFILTROCABECXUSUARIOS filCabUs
              WHERE filCabUs.filtroCabecalho = tabela.filtroCabecalho
              AND filCabUs.usuario =
              p_usuarioLogado
              AND filCabUs.ativo = 1))
          AND (filtroCab.indicadorPessoa = ' '
            OR filtroCab.indicadorPessoa = pess.indicadorPessoa)
          AND (filtroCab.colaborador = ' '
            OR filtroCab.colaborador = 'N'
            AND (p_cab_pessoa = 0
              OR NOT(EXISTS(
                SELECT 1
                FROM CACOLABORADORES colab
                WHERE colab.colaborador = p_cab_pessoa
                AND colab.ativo = 1)))
            OR filtroCab.colaborador = 'S'
            AND p_cab_pessoa <> 0
            AND EXISTS(
              SELECT 1
              FROM CACOLABORADORES colab
              WHERE colab.colaborador = p_cab_pessoa
              AND colab.ativo = 1))))) a
    WHERE a.ordenacao = 1) a;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_ANTERIOR (
  p_perfilUsuarioLogado          IN NUMBER,
  p_usuarioLogado                IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_devolucaoAnulacaoRetorno IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataPrecoFinal           IN DATE,
  p_cab_pessoa                   IN NUMBER,
  p_cab_projeto                  IN VARCHAR,
  p_modDoc_capituloNaturezaFisc  IN NUMBER,
  p_endPessEst_uf                IN CHAR,
  p_endPess_uf                   IN CHAR,
  p_item_vendedor                IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_gradProd_produto             IN NUMBER,
  p_gradProd_cor                 IN NUMBER,
  p_gradProd_tamanho             IN VARCHAR,
  p_manterPreco                  IN NUMBER,
  p_tabelaPreco                  IN VARCHAR)
  RETURN NUMBER
IS 
  v_preco NUMBER;
BEGIN
  SELECT COALESCE (MAX (
    CASE
      WHEN a.promocao = 1
      THEN a.precoPromocaoAPrazo
      ELSE a.precoAPrazo
    END *
    CASE
      WHEN a.indexador = ' '
        OR a.cotacao = 0
      THEN 1
      ELSE a.cotacao
    END),0) preco
  INTO v_preco
  FROM (
    SELECT
      a.precoAPrazo,
      a.promocao,
      a.precoPromocaoAPrazo,
      a.indexador,
      COALESCE ((
        SELECT
          CASE
            WHEN p_cab_entradaSaida =
              CASE
                WHEN p_cab_devolucaoAnulacaoRetorno = 1
                THEN 'S'
                ELSE 'E'
              END
            THEN indDia.cotacaoCompra
            ELSE indDia.cotacaoVenda
          END
        FROM PAINDEXADORXDIAS indDia
        WHERE indDia.indexador = a.indexador
        AND indDia.aPartirDe = (
          SELECT MAX(indDia2.aPartirDe)
          FROM PAINDEXADORXDIAS indDia2
          WHERE indDia2.indexador = indDia.indexador
          AND indDia2.aPartirDe <= SYSDATE)),0) cotacao
    FROM (
      SELECT 
        CASE
          WHEN precoAnt.id IS NULL
          THEN a.precoAPrazo
          ELSE precoAnt.precoAPrazoAnterior
        END precoAPrazo,
        CASE
          WHEN precoAnt.id IS NULL
          THEN a.promocao
          ELSE precoAnt.promocaoAnterior
        END promocao,
        CASE
          WHEN precoAnt.id IS NULL
          THEN a.precoPromocaoAPrazo
          ELSE precoAnt.precoPromocaoAPrazoAnterior
        END precoPromocaoAPrazo,
        tabela.indexador,
        ROW_NUMBER() OVER (
          ORDER BY
            CASE
              WHEN p_cab_projeto = ' '
              THEN 0
              WHEN EXISTS (
                SELECT 1
                FROM MOCONTRATOXPROJETOS contrXProj
                JOIN MOCONTRATOS contr
                ON contr.idContrato = contrXProj.idContrato
                JOIN MOCONTRATOXITENS contrXitem
                ON contrXitem.idContrato = contr.idContrato
                JOIN CAGRADESPRODUTO gradProd
                ON gradProd.gradeProduto = contrXitem.gradeProduto
                WHERE contrXProj.projeto = p_cab_projeto
                AND contrXProj.ativo = 1
                AND contr.situacaoContrato = 'A'
                AND contrXitem.tabelaPreco = a.tabelaPreco
                AND contrXitem.cancelado = 0
                AND gradProd.produto = p_gradProd_produto)
              THEN 1
              WHEN EXISTS (
                SELECT 1
                FROM MOCONTRATOXPROJETOS contrXProj
                JOIN MOCONTRATOS contr
                ON contr.idContrato = contrXProj.idContrato
                WHERE contrXProj.projeto = p_cab_projeto
                AND contrXProj.ativo = 1
                AND contr.situacaoContrato = 'A'
                AND contr.tabelaPreco = a.tabelaPreco)
              THEN 2
              ELSE 3
            END,
            tabela.ordenacao,
            a.tabelaPreco,
            (a.filtrarCores
              + a.filtrarTamanhos
              + a.filtrarPersonalizacoes) desc,
            a.ordenacao,
            a.idPrecoTabela,
            precoAnt.data DESC) ordenacao
      FROM CATABELAPRECOXPRECOS a
      JOIN PATABELASPRECO tabela
      ON tabela.tabelaPreco = a.tabelaPreco
      JOIN PAFILTROSCABECALHO filtroCab
      ON filtroCab.filtroCabecalho = tabela.filtroCabecalho
      JOIN CAPESSOAS pess
      ON pess.pessoa = p_cab_pessoa
      LEFT JOIN CATABELAPRECOXALTERACOES precoAnt
      ON precoAnt.idPrecoTabela = a.idPrecoTabela
      AND precoAnt.data >= p_cab_dataPrecoFinal
      WHERE a.produto = p_gradProd_produto
      AND a.tabelaPreco <> ' '
      AND (p_tabelaPreco = ' '
        OR a.tabelaPreco = p_tabelaPreco)
      AND a.ativo = 1
      AND a.quantidadeMinima <= p_item_quantidade
      AND a.quantidadeMaxima >= p_item_quantidade
      AND a.dataValidadeInicial <= p_cab_dataPrecoFinal
      AND a.dataValidadeFinal >= p_cab_dataPrecoFinal
      AND (p_gradProd_cor = 0
        AND a.filtrarCores = 0
        OR p_gradProd_cor > 0
        AND (a.filtrarCores = 0
          OR EXISTS (
            SELECT 1
            FROM CATABELAPRECOXCORES tabcor
            WHERE tabcor.idPrecoTabela = a.idPrecoTabela
            AND tabcor.cor = p_gradProd_cor
            AND tabcor.ativo = 1)))
      AND (p_gradProd_tamanho = ' '
        AND a.filtrarTamanhos = 0
        OR p_gradProd_tamanho <> ' '
        AND (a.filtrarTamanhos = 0
          OR EXISTS (
            SELECT 1
            FROM CATABELAPRECOXTAMANHOS tabtam
            WHERE tabtam.idPrecoTabela = a.idPrecoTabela
            AND tabtam.tamanho = p_gradProd_tamanho
            AND tabtam.ativo = 1)))
      AND (p_item_personalizacao = 0
        AND a.filtrarPersonalizacoes = 0
        OR p_item_personalizacao > 0
        AND (a.filtrarPersonalizacoes = 0
          OR EXISTS (
            SELECT 1
            FROM CATABELAPRECOXPERSONALIZ tabPers
            WHERE tabPers.idPrecoTabela = a.idPrecoTabela
            AND tabPers.personalizacao = p_item_personalizacao
            AND tabPers.ativo = 1)))
      AND (p_manterPreco = 1
        OR tabela.ativo = 1 
        AND CASE 
          WHEN p_tabelaPreco <> ' '
            OR p_cab_entradaSaida = ' '
            OR p_modDoc_capituloNaturezaFisc = 9
          THEN 1
          WHEN p_cab_entradaSaida =
            CASE
              WHEN p_cab_devolucaoAnulacaoRetorno = 1
              THEN 'S'
              ELSE 'E'
            END
          THEN tabela.validoParaCompra
          ELSE tabela.validoParaVenda
        END = 1
        AND (tabela.filtrarVendedores = 0
          OR EXISTS (
            SELECT 1
            FROM PATABELAPRECOXVENDEDORES tabVend
            WHERE tabVend.tabelaPreco = tabela.tabelaPreco
            AND tabVend.vendedor = p_item_vendedor
            AND tabVend.ativo = 1))
        AND (tabela.filtrarLocaisEstoque = 0
          OR EXISTS (
            SELECT 1
            FROM PATABELAPRECOXLOCAISESTOQ tabLocEst
            WHERE tabLocEst.tabelaPreco = tabela.tabelaPreco
            AND tabLocEst.localEstoque = p_item_localEstoque
            AND tabLocEst.ativo = 1))
        AND (tabela.filtroCabecalho = 0
          OR (filtroCab.filtrarEstabelecimentos = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROCABECXESTABELEC filCabEst
              WHERE filCabEst.filtroCabecalho = tabela.filtroCabecalho
              AND filCabEst.estabelecimento = p_cab_estabelecimento
              AND filCabEst.ativo = 1))
          AND (filtroCab.filtrarUfs = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROCABECXUFS filCabUf
              WHERE filCabUf.filtroCabecalho = tabela.filtroCabecalho
              AND filCabUf.uf =
                CASE
                  WHEN p_cab_pessoa = 0
                  THEN p_endPessEst_uf
                  ELSE p_endPess_uf
                END
              AND filCabUf.ativo = 1))
          AND (filtroCab.filtrarPessoas = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROCABECXPESSOAS filCabPess
              WHERE filCabPess.filtroCabecalho = tabela.filtroCabecalho
              AND filCabPess.pessoa = p_cab_pessoa
              AND filCabPess.ativo = 1))
          AND (filtroCab.filtrarPerfisUsuario = 0
            AND filtroCab.filtrarUsuarios = 0
            OR filtroCab.filtrarPerfisUsuario = 1
            AND EXISTS (
              SELECT 1
              FROM PAFILTROCABECXPERFISUSUAR filCabPerfUs
              WHERE filCabPerfUs.filtroCabecalho = tabela.filtroCabecalho
              AND filCabPerfUs.perfilUsuario = p_perfilUsuarioLogado
              AND filCabPerfUs.ativo = 1)
            OR filtroCab.filtrarUsuarios = 1
            AND EXISTS (
              SELECT 1
              FROM PAFILTROCABECXUSUARIOS filCabUs
              WHERE filCabUs.filtroCabecalho = tabela.filtroCabecalho
              AND filCabUs.usuario =
              p_usuarioLogado
              AND filCabUs.ativo = 1))
          AND (filtroCab.indicadorPessoa = ' '
            OR filtroCab.indicadorPessoa = pess.indicadorPessoa)
          AND (filtroCab.colaborador = ' '
            OR filtroCab.colaborador = 'N'
            AND (p_cab_pessoa = 0
              OR NOT(EXISTS(
                SELECT 1
                FROM CACOLABORADORES colab
                WHERE colab.colaborador = p_cab_pessoa
                AND colab.ativo = 1)))
            OR filtroCab.colaborador = 'S'
            AND p_cab_pessoa <> 0
            AND EXISTS(
              SELECT 1
              FROM CACOLABORADORES colab
              WHERE colab.colaborador = p_cab_pessoa
              AND colab.ativo = 1))))) a
    WHERE a.ordenacao = 1) a;
  RETURN v_preco;
END;

/

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

/

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

/

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

/

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

/

create or replace PROCEDURE ADD_BUSCA_PRECO_INTERNO_TABELA (
  p_perfilUsuarioLogado          IN NUMBER,
  p_usuarioLogado                IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_devolucaoAnulacaoRetorno IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataPrecoFinal           IN DATE,
  p_cab_pessoa                   IN NUMBER,
  p_cab_projeto                  IN VARCHAR,
  p_modDoc_capituloNaturezaFisc  IN NUMBER,
  p_endPessEst_uf                IN CHAR,
  p_endPess_uf                   IN CHAR,
  p_item_vendedor                IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_gradProd_produto             IN NUMBER,
  p_gradProd_cor                 IN NUMBER,
  p_gradProd_tamanho             IN VARCHAR,
  p_manterPreco                  IN NUMBER,
  p_precoSugestaoAPrazoOriginal  IN NUMBER,
  p_precoSugestaoAVistaOriginal  IN NUMBER,
  p_tabelaPreco                  IN VARCHAR,
  r_tabelaPreco                  OUT VARCHAR,
  r_precoSugestaoAPrazo          OUT NUMBER,
  r_precoSugestaoAVista          OUT NUMBER,
  r_precoDesconto                OUT NUMBER,
  r_precoMinimo                  OUT NUMBER,
  r_informarPrecoManualmente     OUT NUMBER,
  r_precoAPrazo                  OUT NUMBER,
  r_precoAVista                  OUT NUMBER,
  r_promocao                     OUT NUMBER,
  r_precoPromocaoAPrazo          OUT NUMBER,
  r_precoPromocaoAVista          OUT NUMBER,
  r_precoIndexadoAPrazo          OUT NUMBER,
  r_precoIndexadoAVista          OUT NUMBER)
IS
BEGIN
  SELECT
    COALESCE (MAX (a.tabelaPreco), ' ') tabelaPreco,
    COALESCE (MAX (CASE WHEN a.promocao = 1 THEN a.precoPromocaoAPrazo ELSE a.precoAPrazo END * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoSugestaoAPrazo,
    COALESCE (MAX (CASE WHEN a.promocao = 1 THEN a.precoPromocaoAVista ELSE a.precoAVista END * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoSugestaoAVista,
    COALESCE (MAX (a.precoDesconto * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoDesconto,
    COALESCE (MAX (a.precoMinimo * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoMinimo,
    COALESCE (MAX (a.precoAPrazo * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoAPrazo,
    COALESCE (MAX (a.precoAVista * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoAVista,
    COALESCE (MAX (a.promocao), 0) promocao,
    COALESCE (MAX (a.precoPromocaoAPrazo * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoPromocaoAPrazo,
    COALESCE (MAX (a.precoPromocaoAVista * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoPromocaoAVista,
    COALESCE (MAX (CASE WHEN a.promocao = 1 THEN a.precoPromocaoAPrazo ELSE a.precoAPrazo END), 0) precoIndexadoAPrazo,
    COALESCE (MAX (CASE WHEN a.promocao = 1 THEN a.precoPromocaoAVista ELSE a.precoAVista END), 0) precoIndexadoAVista
  INTO
    r_tabelaPreco,
    r_precoSugestaoAPrazo,
    r_precoSugestaoAVista,
    r_precoDesconto,
    r_precoMinimo,
    r_precoAPrazo,
    r_precoAVista,
    r_promocao,
    r_precoPromocaoAPrazo,
    r_precoPromocaoAVista,
    r_precoIndexadoAPrazo,
    r_precoIndexadoAVista
  FROM(
    SELECT 
      a.tabelaPreco,
      a.precoAPrazo,
      a.precoAVista,
      a.promocao,
      a.precoPromocaoAVista,
      a.precoPromocaoAPrazo,
      a.precoDesconto,
      a.precoMinimo,
      a.indexador,
      COALESCE ((
        SELECT
          CASE
            WHEN p_cab_entradaSaida =
              CASE
                WHEN p_cab_devolucaoAnulacaoRetorno = 1
                THEN 'S'
                ELSE 'E'
              END
            THEN indDia.cotacaoCompra
            ELSE indDia.cotacaoVenda
          END
        FROM PAINDEXADORXDIAS indDia
        WHERE indDia.indexador = a.indexador
        AND indDia.aPartirDe = (
          SELECT MAX(indDia2.aPartirDe)
          FROM PAINDEXADORXDIAS indDia2
          WHERE indDia2.indexador = indDia.indexador
          AND indDia2.aPartirDe <= sysdate)),0) cotacao
    FROM (
      SELECT 
        a.tabelaPreco,
        a.precoAPrazo,
        a.precoAVista,
        a.promocao,
        a.precoPromocaoAVista,
        a.precoPromocaoAPrazo,
        a.precoDesconto,
        a.precoMinimo,
        tabela.indexador,
        ROW_NUMBER() OVER (
          ORDER BY
            CASE
              WHEN p_cab_projeto = ' '
              THEN 0
              WHEN EXISTS (
                SELECT 1
                FROM MOCONTRATOXPROJETOS contrXProj
                JOIN MOCONTRATOS contr
                ON contr.idContrato = contrXProj.idContrato
                JOIN MOCONTRATOXITENS contrXitem
                ON contrXitem.idContrato = contr.idContrato
                JOIN CAGRADESPRODUTO gradProd
                ON gradProd.gradeProduto = contrXitem.gradeProduto
                WHERE contrXProj.projeto = p_cab_projeto
                AND contrXProj.ativo = 1
                AND contr.situacaoContrato = 'A'
                AND contrXitem.tabelaPreco = a.tabelaPreco
                AND contrXitem.cancelado = 0
                AND gradProd.produto = p_gradProd_produto)
              THEN 1
              WHEN EXISTS (
                SELECT 1
                FROM MOCONTRATOXPROJETOS contrXProj
                JOIN MOCONTRATOS contr
                ON contr.idContrato = contrXProj.idContrato
                WHERE contrXProj.projeto = p_cab_projeto
                AND contrXProj.ativo = 1
                AND contr.situacaoContrato = 'A'
                AND contr.tabelaPreco = a.tabelaPreco)
              THEN 2
              ELSE 3
            END,
            tabela.ordenacao,
            a.tabelaPreco,
            (a.filtrarCores + a.filtrarTamanhos + a.filtrarPersonalizacoes) desc,
            a.ordenacao,
            a.idPrecoTabela) ordenacao
      FROM CATABELAPRECOXPRECOS a
      JOIN PATABELASPRECO tabela
      ON tabela.tabelaPreco = a.tabelaPreco
      JOIN PAFILTROSCABECALHO filtroCab
      ON filtroCab.filtroCabecalho = tabela.filtroCabecalho
      JOIN CAPESSOAS pess
      ON pess.pessoa = p_cab_pessoa
      WHERE a.produto = p_gradProd_produto
      AND a.tabelaPreco <> ' '
      AND (p_tabelaPreco = ' '
        OR a.tabelaPreco = p_tabelaPreco)
      AND a.ativo = 1
      AND a.quantidadeMinima <= p_item_quantidade
      AND a.quantidadeMaxima >= p_item_quantidade
      AND a.dataValidadeInicial <= p_cab_dataPrecoFinal
      AND a.dataValidadeFinal >= p_cab_dataPrecoFinal
      AND (p_gradProd_cor = 0
        AND a.filtrarCores = 0
        OR p_gradProd_cor > 0
        AND (a.filtrarCores = 0
          OR EXISTS (
            SELECT 1
            FROM CATABELAPRECOXCORES tabcor
            WHERE tabcor.idPrecoTabela = a.idPrecoTabela
            AND tabcor.cor = p_gradProd_cor
            AND tabcor.ativo = 1)))
      AND (p_gradProd_tamanho = ' '
        AND a.filtrarTamanhos = 0
        OR p_gradProd_tamanho <> ' '
        AND (a.filtrarTamanhos = 0
          OR EXISTS (
            SELECT 1
            FROM CATABELAPRECOXTAMANHOS tabtam
            WHERE tabtam.idPrecoTabela = a.idPrecoTabela
            AND tabtam.tamanho = p_gradProd_tamanho
            AND tabtam.ativo = 1)))
      AND (p_item_personalizacao = 0
        AND a.filtrarPersonalizacoes = 0
        OR p_item_personalizacao > 0
        AND (a.filtrarPersonalizacoes = 0
          OR EXISTS (
            SELECT 1
            FROM CATABELAPRECOXPERSONALIZ tabPers
            WHERE tabPers.idPrecoTabela = a.idPrecoTabela
            AND tabPers.personalizacao = p_item_personalizacao
            AND tabPers.ativo = 1)))
      AND (p_manterPreco = 1
        OR tabela.ativo = 1 
        AND
          CASE
            WHEN p_tabelaPreco <> ' '
              OR p_cab_entradaSaida = ' '
              OR p_modDoc_capituloNaturezaFisc = 9
            THEN 1
            WHEN p_cab_entradaSaida =
              CASE
                WHEN p_cab_devolucaoAnulacaoRetorno = 1
                THEN 'S'
                ELSE 'E'
              END
            THEN tabela.validoParaCompra
            ELSE tabela.validoParaVenda
          END = 1
        AND (tabela.filtrarVendedores = 0
          OR EXISTS (
            SELECT 1
            FROM PATABELAPRECOXVENDEDORES tabVend
            WHERE tabVend.tabelaPreco = tabela.tabelaPreco
            AND tabVend.vendedor = p_item_vendedor
            AND tabVend.ativo = 1))
        AND (tabela.filtrarLocaisEstoque = 0
          OR EXISTS (
            SELECT 1
            FROM PATABELAPRECOXLOCAISESTOQ tabLocEst
            WHERE tabLocEst.tabelaPreco = tabela.tabelaPreco
            AND tabLocEst.localEstoque = p_item_localEstoque
            AND tabLocEst.ativo = 1))
        AND (tabela.filtroCabecalho = 0
          OR (filtroCab.filtrarEstabelecimentos = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROCABECXESTABELEC filCabEst
              WHERE filCabEst.filtroCabecalho = tabela.filtroCabecalho
              AND filCabEst.estabelecimento = p_cab_estabelecimento
              AND filCabEst.ativo = 1))
          AND (filtroCab.filtrarUfs = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROCABECXUFS filCabUf
              WHERE filCabUf.filtroCabecalho = tabela.filtroCabecalho
              AND filCabUf.uf =
                CASE
                  WHEN p_cab_pessoa = 0
                  THEN p_endPessEst_uf
                  ELSE p_endPess_uf
                END
              AND filCabUf.ativo = 1))
          AND (filtroCab.filtrarPessoas = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROCABECXPESSOAS filCabPess
              WHERE filCabPess.filtroCabecalho = tabela.filtroCabecalho
              AND filCabPess.pessoa = p_cab_pessoa
              AND filCabPess.ativo = 1))
          AND (filtroCab.filtrarPerfisUsuario = 0
            AND filtroCab.filtrarUsuarios = 0
            OR filtroCab.filtrarPerfisUsuario = 1
            AND EXISTS (
              SELECT 1
              FROM PAFILTROCABECXPERFISUSUAR filCabPerfUs
              WHERE filCabPerfUs.filtroCabecalho = tabela.filtroCabecalho
              AND filCabPerfUs.perfilUsuario = p_perfilUsuarioLogado
              AND filCabPerfUs.ativo = 1)
            OR filtroCab.filtrarUsuarios = 1
            AND EXISTS (
              SELECT 1
              FROM PAFILTROCABECXUSUARIOS filCabUs
              WHERE filCabUs.filtroCabecalho = tabela.filtroCabecalho
              AND filCabUs.usuario = p_usuarioLogado
              AND filCabUs.ativo = 1))
          AND (filtroCab.indicadorPessoa = ' '
            OR filtroCab.indicadorPessoa = pess.indicadorPessoa)
          AND (filtroCab.colaborador = ' '
            OR filtroCab.colaborador = 'N'
            AND (p_cab_pessoa = 0
              OR NOT(EXISTS(
                SELECT 1
                FROM CACOLABORADORES colab
                WHERE colab.colaborador = p_cab_pessoa
                AND colab.ativo = 1)))
            OR filtroCab.colaborador = 'S'
            AND p_cab_pessoa <> 0
            AND EXISTS(
              SELECT 1
              FROM CACOLABORADORES colab
              WHERE colab.colaborador = p_cab_pessoa
              AND colab.ativo = 1))))) a
    WHERE a.ordenacao = 1) a;
  r_informarPrecoManualmente :=
    CASE
      WHEN r_tabelaPreco <> ' '
        AND r_precoSugestaoAPrazo = 0
      THEN 1
      ELSE 0
    END;
  IF r_tabelaPreco <> ' '
    AND r_precoSugestaoAPrazo = 0
    AND r_precoSugestaoAVista = 0
    AND p_manterPreco = 1
  THEN
    r_precoSugestaoAPrazo := p_precoSugestaoAPrazoOriginal;
    r_precoSugestaoAVista := p_precoSugestaoAVistaOriginal;
  END IF;
END ADD_BUSCA_PRECO_INTERNO_TABELA;

/

create or replace PROCEDURE ADD_BUSCA_PRECO_INTERNO_ANTER (
  p_perfilUsuarioLogado          IN NUMBER,
  p_usuarioLogado                IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_devolucaoAnulacaoRetorno IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataPrecoFinal           IN DATE,
  p_cab_pessoa                   IN NUMBER,
  p_cab_projeto                  IN VARCHAR,
  p_modDoc_capituloNaturezaFisc  IN NUMBER,
  p_endPessEst_uf                IN CHAR,
  p_endPess_uf                   IN CHAR,
  p_item_vendedor                IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_gradProd_produto             IN NUMBER,
  p_gradProd_cor                 IN NUMBER,
  p_gradProd_tamanho             IN VARCHAR,
  p_manterPreco                  IN NUMBER,
  p_precoSugestaoAPrazoOriginal  IN NUMBER,
  p_precoSugestaoAVistaOriginal  IN NUMBER,
  p_tabelaPreco                  IN VARCHAR,
  r_tabelaPreco                  OUT VARCHAR,
  r_precoSugestaoAPrazo          OUT NUMBER,
  r_precoSugestaoAVista          OUT NUMBER,
  r_precoDesconto                OUT NUMBER,
  r_precoMinimo                  OUT NUMBER,
  r_informarPrecoManualmente     OUT NUMBER,
  r_precoAPrazo                  OUT NUMBER,
  r_precoAVista                  OUT NUMBER,
  r_promocao                     OUT NUMBER,
  r_precoPromocaoAPrazo          OUT NUMBER,
  r_precoPromocaoAVista          OUT NUMBER,
  r_precoIndexadoAPrazo          OUT NUMBER,
  r_precoIndexadoAVista          OUT NUMBER)
IS
BEGIN
  SELECT
    COALESCE (MAX (a.tabelaPreco), ' ') tabelaPreco,
    COALESCE (MAX (CASE WHEN a.promocao = 1 THEN a.precoPromocaoAPrazo ELSE a.precoAPrazo END * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoSugestaoAPrazo,
    COALESCE (MAX (CASE WHEN a.promocao = 1 THEN a.precoPromocaoAVista ELSE a.precoAVista END * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoSugestaoAVista,
    COALESCE (MAX (a.precoDesconto * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoDesconto,
    COALESCE (MAX (a.precoMinimo * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoMinimo,
    COALESCE (MAX (a.precoAPrazo * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoAPrazo,
    COALESCE (MAX (a.precoAVista * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoAVista,
    COALESCE (MAX (a.promocao), 0) promocao,
    COALESCE (MAX (a.precoPromocaoAPrazo * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoPromocaoAPrazo,
    COALESCE (MAX (a.precoPromocaoAVista * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoPromocaoAVista,
    COALESCE (MAX (CASE WHEN a.promocao = 1 THEN a.precoPromocaoAPrazo ELSE a.precoAPrazo END), 0) precoIndexadoAPrazo,
    COALESCE (MAX (CASE WHEN a.promocao = 1 THEN a.precoPromocaoAVista ELSE a.precoAVista END), 0) precoIndexadoAVista
  INTO
    r_tabelaPreco,
    r_precoSugestaoAPrazo,
    r_precoSugestaoAVista,
    r_precoDesconto,
    r_precoMinimo,
    r_precoAPrazo,
    r_precoAVista,
    r_promocao,
    r_precoPromocaoAPrazo,
    r_precoPromocaoAVista,
    r_precoIndexadoAPrazo,
    r_precoIndexadoAVista
  FROM(
    SELECT 
      a.tabelaPreco,
      a.precoAPrazo,
      a.precoAVista,
      a.promocao,
      a.precoPromocaoAVista,
      a.precoPromocaoAPrazo,
      a.precoDesconto,
      a.precoMinimo,
      a.indexador,
      COALESCE ((
        SELECT
          CASE
            WHEN p_cab_entradaSaida =
              CASE
                WHEN p_cab_devolucaoAnulacaoRetorno = 1
                THEN 'S'
                ELSE 'E'
              END
            THEN indDia.cotacaoCompra
            ELSE indDia.cotacaoVenda
          END
        FROM PAINDEXADORXDIAS indDia
        WHERE indDia.indexador = a.indexador
        AND indDia.aPartirDe = (
          SELECT MAX(indDia2.aPartirDe)
          FROM PAINDEXADORXDIAS indDia2
          WHERE indDia2.indexador = indDia.indexador
          AND indDia2.aPartirDe <= sysdate)),0) cotacao
    FROM (
      SELECT 
        a.tabelaPreco,
        CASE
          WHEN precoAnt.id IS NULL
          THEN a.precoAPrazo
          ELSE precoAnt.precoAPrazoAnterior
        END precoAPrazo,
        CASE
          WHEN precoAnt.id IS NULL
          THEN a.precoAVista
          ELSE precoAnt.precoAVistaAnterior
        END precoAVista,
        CASE
          WHEN precoAnt.id IS NULL
          THEN a.promocao
          ELSE precoAnt.promocaoAnterior
        END promocao,
        CASE
          WHEN precoAnt.id IS NULL
          THEN a.precoPromocaoAPrazo
          ELSE precoAnt.precoPromocaoAPrazoAnterior
        END precoPromocaoAPrazo,
        CASE
          WHEN precoAnt.id IS NULL
          THEN a.precoPromocaoAVista
          ELSE precoAnt.precoPromocaoAVistaAnterior
        END precoPromocaoAVista,
        CASE
          WHEN precoAnt.id IS NULL
          THEN a.precoDesconto
          ELSE precoAnt.precoDescontoAnterior
        END precoDesconto,
        CASE
          WHEN precoAnt.id IS NULL
          THEN a.precoMinimo
          ELSE precoAnt.precoMinimoAnterior
        END precoMinimo,
        tabela.indexador,
        ROW_NUMBER() OVER (
          ORDER BY
            CASE
              WHEN p_cab_projeto = ' '
              THEN 0
              WHEN EXISTS (
                SELECT 1
                FROM MOCONTRATOXPROJETOS contrXProj
                JOIN MOCONTRATOS contr
                ON contr.idContrato = contrXProj.idContrato
                JOIN MOCONTRATOXITENS contrXitem
                ON contrXitem.idContrato = contr.idContrato
                JOIN CAGRADESPRODUTO gradProd
                ON gradProd.gradeProduto = contrXitem.gradeProduto
                WHERE contrXProj.projeto = p_cab_projeto
                AND contrXProj.ativo = 1
                AND contr.situacaoContrato = 'A'
                AND contrXitem.tabelaPreco = a.tabelaPreco
                AND contrXitem.cancelado = 0
                AND gradProd.produto = p_gradProd_produto)
              THEN 1
              WHEN EXISTS (
                SELECT 1
                FROM MOCONTRATOXPROJETOS contrXProj
                JOIN MOCONTRATOS contr
                ON contr.idContrato = contrXProj.idContrato
                WHERE contrXProj.projeto = p_cab_projeto
                AND contrXProj.ativo = 1
                AND contr.situacaoContrato = 'A'
                AND contr.tabelaPreco = a.tabelaPreco)
              THEN 2
              ELSE 3
            END,
            tabela.ordenacao,
            a.tabelaPreco,
            (a.filtrarCores + a.filtrarTamanhos + a.filtrarPersonalizacoes) desc,
            a.ordenacao,
            a.idPrecoTabela) ordenacao
      FROM CATABELAPRECOXPRECOS a
      JOIN PATABELASPRECO tabela
      ON tabela.tabelaPreco = a.tabelaPreco
      JOIN PAFILTROSCABECALHO filtroCab
      ON filtroCab.filtroCabecalho = tabela.filtroCabecalho
      JOIN CAPESSOAS pess
      ON pess.pessoa = p_cab_pessoa
      LEFT JOIN CATABELAPRECOXALTERACOES precoAnt
      ON precoAnt.idPrecoTabela = a.idPrecoTabela
      AND precoAnt.data >= p_cab_dataPrecoFinal
      WHERE a.produto = p_gradProd_produto
      AND a.tabelaPreco <> ' '
      AND (p_tabelaPreco = ' '
        OR a.tabelaPreco = p_tabelaPreco)
      AND a.ativo = 1
      AND a.quantidadeMinima <= p_item_quantidade
      AND a.quantidadeMaxima >= p_item_quantidade
      AND a.dataValidadeInicial <= p_cab_dataPrecoFinal
      AND a.dataValidadeFinal >= p_cab_dataPrecoFinal
      AND (p_gradProd_cor = 0
        AND a.filtrarCores = 0
        OR p_gradProd_cor > 0
        AND (a.filtrarCores = 0
          OR EXISTS (
            SELECT 1
            FROM CATABELAPRECOXCORES tabcor
            WHERE tabcor.idPrecoTabela = a.idPrecoTabela
            AND tabcor.cor = p_gradProd_cor
            AND tabcor.ativo = 1)))
      AND (p_gradProd_tamanho = ' '
        AND a.filtrarTamanhos = 0
        OR p_gradProd_tamanho <> ' '
        AND (a.filtrarTamanhos = 0
          OR EXISTS (
            SELECT 1
            FROM CATABELAPRECOXTAMANHOS tabtam
            WHERE tabtam.idPrecoTabela = a.idPrecoTabela
            AND tabtam.tamanho = p_gradProd_tamanho
            AND tabtam.ativo = 1)))
      AND (p_item_personalizacao = 0
        AND a.filtrarPersonalizacoes = 0
        OR p_item_personalizacao > 0
        AND (a.filtrarPersonalizacoes = 0
          OR EXISTS (
            SELECT 1
            FROM CATABELAPRECOXPERSONALIZ tabPers
            WHERE tabPers.idPrecoTabela = a.idPrecoTabela
            AND tabPers.personalizacao = p_item_personalizacao
            AND tabPers.ativo = 1)))
      AND (p_manterPreco = 1
        OR tabela.ativo = 1 
        AND
          CASE 
            WHEN p_tabelaPreco <> ' '
              OR p_cab_entradaSaida = ' '
              OR p_modDoc_capituloNaturezaFisc = 9
            THEN 1
            WHEN p_cab_entradaSaida =
              CASE
                WHEN p_cab_devolucaoAnulacaoRetorno = 1
                THEN 'S'
                ELSE 'E'
              END
            THEN tabela.validoParaCompra
            ELSE tabela.validoParaVenda
          END = 1
        AND (tabela.filtrarVendedores = 0
          OR EXISTS (
            SELECT 1
            FROM PATABELAPRECOXVENDEDORES tabVend
            WHERE tabVend.tabelaPreco = tabela.tabelaPreco
            AND tabVend.vendedor = p_item_vendedor
            AND tabVend.ativo = 1))
        AND (tabela.filtrarLocaisEstoque = 0
          OR EXISTS (
            SELECT 1
            FROM PATABELAPRECOXLOCAISESTOQ tabLocEst
            WHERE tabLocEst.tabelaPreco = tabela.tabelaPreco
            AND tabLocEst.localEstoque = p_item_localEstoque
            AND tabLocEst.ativo = 1))
        AND (tabela.filtroCabecalho = 0
          OR (filtroCab.filtrarEstabelecimentos = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROCABECXESTABELEC filCabEst
              WHERE filCabEst.filtroCabecalho = tabela.filtroCabecalho
              AND filCabEst.estabelecimento = p_cab_estabelecimento
              AND filCabEst.ativo = 1))
          AND (filtroCab.filtrarUfs = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROCABECXUFS filCabUf
              WHERE filCabUf.filtroCabecalho = tabela.filtroCabecalho
              AND filCabUf.uf =
                CASE
                  WHEN p_cab_pessoa = 0
                  THEN p_endPessEst_uf
                  ELSE p_endPess_uf
                END
              AND filCabUf.ativo = 1))
          AND (filtroCab.filtrarPessoas = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROCABECXPESSOAS filCabPess
              WHERE filCabPess.filtroCabecalho = tabela.filtroCabecalho
              AND filCabPess.pessoa = p_cab_pessoa
              AND filCabPess.ativo = 1))
          AND (filtroCab.filtrarPerfisUsuario = 0
            AND filtroCab.filtrarUsuarios = 0
            OR filtroCab.filtrarPerfisUsuario = 1
            AND EXISTS (
              SELECT 1
              FROM PAFILTROCABECXPERFISUSUAR filCabPerfUs
              WHERE filCabPerfUs.filtroCabecalho = tabela.filtroCabecalho
              AND filCabPerfUs.perfilUsuario = p_perfilUsuarioLogado
              AND filCabPerfUs.ativo = 1)
            OR filtroCab.filtrarUsuarios = 1
            AND EXISTS (
              SELECT 1
              FROM PAFILTROCABECXUSUARIOS filCabUs
              WHERE filCabUs.filtroCabecalho = tabela.filtroCabecalho
              AND filCabUs.usuario = p_usuarioLogado
              AND filCabUs.ativo = 1))
          AND (filtroCab.indicadorPessoa = ' '
            OR filtroCab.indicadorPessoa = pess.indicadorPessoa)
          AND (filtroCab.colaborador = ' '
            OR filtroCab.colaborador = 'N'
            AND (p_cab_pessoa = 0
              OR NOT(EXISTS(
                SELECT 1
                FROM CACOLABORADORES colab
                WHERE colab.colaborador = p_cab_pessoa
                AND colab.ativo = 1)))
            OR filtroCab.colaborador = 'S'
            AND p_cab_pessoa <> 0
            AND EXISTS(
              SELECT 1
              FROM CACOLABORADORES colab
              WHERE colab.colaborador = p_cab_pessoa
              AND colab.ativo = 1))))) a
    WHERE a.ordenacao = 1) a;
  r_informarPrecoManualmente :=
    CASE
      WHEN r_tabelaPreco <> ' '
        AND r_precoSugestaoAPrazo = 0
      THEN 1
      ELSE 0
    END;
  IF r_tabelaPreco <> ' '
    AND r_precoSugestaoAPrazo = 0
    AND r_precoSugestaoAVista = 0
    AND p_manterPreco = 1
  THEN
    r_precoSugestaoAPrazo := p_precoSugestaoAPrazoOriginal;
    r_precoSugestaoAVista := p_precoSugestaoAVistaOriginal;
  END IF;
END ADD_BUSCA_PRECO_INTERNO_ANTER;

/

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

/

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

/

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

/

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

/

create or replace PROCEDURE ADD_BUSCA_PRECO_GRADE_PRODUTO (
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_usuarioLogado                IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_devolucaoAnulacaoRetorno IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_cab_projeto                  IN VARCHAR,
  p_orc_pessoa                   IN NUMBER,
  p_item_modeloDocumento         IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_manterPreco                  IN NUMBER,
  p_precoSugestaoAPrazoOriginal  IN NUMBER,
  p_precoSugestaoAVistaOriginal  IN NUMBER,
  p_tipoPreco                    IN CHAR,
  p_tabelaPreco                  IN VARCHAR,
  r_tipoPreco                    OUT CHAR,
  r_tabelaPreco                  OUT VARCHAR,
  r_precoSugestaoAPrazo          OUT NUMBER,
  r_precoSugestaoAVista          OUT NUMBER,
  r_precoDesconto                OUT NUMBER,
  r_precoMinimo                  OUT NUMBER,
  r_informarPrecoManualmente     OUT NUMBER)
IS
  v_precoAPrazo         NUMBER;
  v_precoAVista         NUMBER;
  v_promocao            NUMBER;
  v_precoPromocaoAPrazo NUMBER;
  v_precoPromocaoAVista NUMBER;
  v_precoIndexadoAPrazo NUMBER;
  v_precoIndexadoAVista NUMBER;
BEGIN
  r_tipoPreco                := ' ';
  r_tabelaPreco              := ' ';
  r_precoSugestaoAPrazo      := 0;
  r_precoSugestaoAVista      := 0;
  r_precoDesconto            := 0;
  r_precoMinimo              := 0;
  r_informarPrecoManualmente := 0;
  v_precoAPrazo              := 0;
  v_precoAVista              := 0;
  v_promocao                 := 0;
  v_precoPromocaoAPrazo      := 0;
  v_precoPromocaoAVista      := 0;
  v_precoIndexadoAPrazo      := 0;
  v_precoIndexadoAVista      := 0;
  IF p_item_gradeProduto > 0 THEN
    FOR a IN (
      SELECT
        modDoc.capituloNaturezaFiscal,
        modDoc.tipoPreco,
        modDoc.tabelaPreco,
        modDoc.fatorMultiplicadorPreco,
        modDoc.tipoPrecoB,
        modDoc.tabelaPrecoB,
        modDoc.fatorMultiplicadorPrecoB,
        gradProd.produto,
        gradProd.cor,
        gradProd.tamanho,
        prod.controleEstoque,
        locEst.indicadorPropriedadePosseItem,
        COALESCE((
          SELECT MAX(munEndEst.uf)
          FROM CAENDERECOSPESSOA endEst
          JOIN SIMUNICIPIOS munEndEst
          ON munEndEst.municipio = endEst.municipio
          WHERE endEst.pessoa = est.pessoaEstabelecimento
          AND endEst.ativo = 1
          AND endEst.principal = 1),'  ') ufEstabelecimento,
        COALESCE((
          SELECT MAX(munEndPess.uf)
          FROM CAENDERECOSPESSOA endPess
          JOIN SIMUNICIPIOS munEndPess
          ON munEndPess.municipio = endPess.municipio
          WHERE endPess.pessoa = CASE WHEN p_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN p_cab_pessoa ELSE p_orc_pessoa END
          AND endPess.ativo = 1
          AND endPess.principal = 1),'  ') ufPessoa
      FROM CAGRADESPRODUTO gradProd
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = p_cab_estabelecimento
      JOIN PAMODELOSDOCUMENTO modDoc
      ON modDoc.modeloDocumento = p_item_modeloDocumento
      JOIN PALOCAISESTOQUE locEst
      ON locEst.localEstoque = p_item_localEstoque
      WHERE gradProd.gradeProduto = p_item_gradeProduto)
    LOOP
      IF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'I' THEN
        r_tipoPreco := 'I';
      ELSE
        IF a.controleEstoque = 12 AND p_item_idFormulaTinta > 0 THEN
          ADD_BUSCA_PRECO_INTERNO_TINTA (
            p_config_209_filtrarGrupoEcon,
            p_config_362_calcCustoPorGrade,
            p_perfilUsuarioLogado,
            p_usuarioLogado,
            p_cab_entradaSaida,
            p_cab_devolucaoAnulacaoRetorno,
            p_cab_estabelecimento,
            NULL,
            TRUNC(SYSDATE),
            CASE WHEN p_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN p_cab_pessoa ELSE p_orc_pessoa END,
            p_cab_projeto,
            a.capituloNaturezaFiscal,
            a.ufEstabelecimento,
            a.ufPessoa,
            p_item_vendedor,
            p_item_idFormulaTinta,
            p_item_personalizacao,
            p_item_localEstoque,
            p_item_pessoaParticipante,
            p_item_quantidade,
            a.indicadorPropriedadePosseItem,
            p_manterPreco,
            CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END, --p_tipoPreco
            CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE a.tabelaPreco END, --p_tabelaPreco
            r_tabelaPreco,
            r_precoSugestaoAPrazo,
            r_precoSugestaoAVista,
            r_precoDesconto,
            r_precoMinimo,
            r_informarPrecoManualmente,
            v_precoAPrazo,
            v_precoAVista,
            v_promocao,
            v_precoPromocaoAPrazo,
            v_precoPromocaoAVista,
            v_precoIndexadoAPrazo,
            v_precoIndexadoAVista);
        ELSE
          -- A Tabela de Preço Anterior
          IF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'A' THEN
            ADD_BUSCA_PRECO_INTERNO_ANTER (
              p_perfilUsuarioLogado,
              p_usuarioLogado,
              p_cab_entradaSaida,
              p_cab_devolucaoAnulacaoRetorno,
              p_cab_estabelecimento,
              TRUNC(SYSDATE),
              CASE WHEN p_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN p_cab_pessoa ELSE p_orc_pessoa END,
              p_cab_projeto,
              a.capituloNaturezaFiscal,
              a.ufEstabelecimento,
              a.ufPessoa,
              p_item_vendedor,
              p_item_personalizacao,
              p_item_localEstoque,
              p_item_quantidade,
              a.produto,
              a.cor,
              a.tamanho,
              p_manterPreco,
              p_precoSugestaoAPrazoOriginal,
              p_precoSugestaoAVistaOriginal,
              CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE a.tabelaPreco END,
              r_tabelaPreco,
              r_precoSugestaoAPrazo,
              r_precoSugestaoAVista,
              r_precoDesconto,
              r_precoMinimo,
              r_informarPrecoManualmente,
              v_precoAPrazo,
              v_precoAVista,
              v_promocao,
              v_precoPromocaoAPrazo,
              v_precoPromocaoAVista,
              v_precoIndexadoAPrazo,
              v_precoIndexadoAVista);
          -- C Custo Médio da Venda (CMV)
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'C' AND NOT(a.controleEstoque IN (3,4)) THEN
            r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_MEDIO_FIS (
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_cab_estabelecimento,
              TRUNC(SYSDATE),
              p_item_pessoaParticipante,
              a.produto,
              a.cor,
              a.tamanho,
              a.indicadorPropriedadePosseItem,
              0); --p_gerandoInventario
          -- F Formação Preço (Custo)
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'F' THEN
            r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_FORMACAO(
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_cab_estabelecimento,
              NULL,
              TRUNC(SYSDATE),
              p_item_personalizacao,
              a.produto,
              a.cor,
              a.tamanho,
              0); --p_gerandoInventario
          -- G Custo Médio da Venda Gerencial (CMV)
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'G' AND NOT(a.controleEstoque IN (3,4)) THEN
            r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_MEDIO_GER(
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_cab_estabelecimento,
              TRUNC(SYSDATE),
              p_item_personalizacao,
              p_item_pessoaParticipante,
              a.produto,
              a.cor,
              a.tamanho,
              a.indicadorPropriedadePosseItem,
              0); --p_gerandoInventario
          -- P Preço de Custo (Último Custo)
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'P' THEN
            r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_CUSTO (
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_cab_estabelecimento,
              NULL,
              TRUNC(SYSDATE),
              p_item_personalizacao,
              p_item_pessoaParticipante,
              a.produto,
              a.cor,
              a.tamanho,
              a.indicadorPropriedadePosseItem,
              0); --p_gerandoInventario
          -- R Último Preço de Reposição
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'R' THEN
            r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_COMPR (
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_cab_estabelecimento,
              NULL,
              TRUNC(SYSDATE),
              p_item_personalizacao,
              a.produto,
              a.cor,
              a.tamanho,
              2, -- p_precoRetornar
              0); -- p_gerandoInventario
          -- T Tabela de Preço
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'T' THEN
            ADD_BUSCA_PRECO_INTERNO_TABELA (
              p_perfilUsuarioLogado,
              p_usuarioLogado,
              p_cab_entradaSaida,
              p_cab_devolucaoAnulacaoRetorno,
              p_cab_estabelecimento,
              TRUNC(SYSDATE),
              CASE WHEN p_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN p_cab_pessoa ELSE p_orc_pessoa END,
              p_cab_projeto,
              a.capituloNaturezaFiscal,
              a.ufEstabelecimento,
              a.ufPessoa,
              p_item_vendedor,
              p_item_personalizacao,
              p_item_localEstoque,
              p_item_quantidade,
              a.produto,
              a.cor,
              a.tamanho,
              p_manterPreco,
              p_precoSugestaoAPrazoOriginal,
              p_precoSugestaoAVistaOriginal,
              CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE a.tabelaPreco END,
              r_tabelaPreco,
              r_precoSugestaoAPrazo,
              r_precoSugestaoAVista,
              r_precoDesconto,
              r_precoMinimo,
              r_informarPrecoManualmente,
              v_precoAPrazo,
              v_precoAVista,
              v_promocao,
              v_precoPromocaoAPrazo,
              v_precoPromocaoAVista,
              v_precoIndexadoAPrazo,
              v_precoIndexadoAVista);
          -- U Última Compra
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'U' THEN
            r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_COMPR (
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_cab_estabelecimento,
              NULL,
              TRUNC(SYSDATE),
              p_item_personalizacao,
              a.produto,
              a.cor,
              a.tamanho,
              0, -- p_precoRetornar
              0); -- p_gerandoInventario
          -- 2 Última Compra Bruto
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = '2' THEN
            r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_COMPR (
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_cab_estabelecimento,
              NULL,
              TRUNC(SYSDATE),
              p_item_personalizacao,
              a.produto,
              a.cor,
              a.tamanho,
              1, -- p_precoRetornar
              0); -- p_gerandoInventario
          END IF;
          IF NOT(CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END IN ('A','T')) THEN
            r_tabelaPreco              := ' ';
            r_precoSugestaoAVista      := r_precoSugestaoAPrazo;
            r_precoDesconto            := 0;
            r_precoMinimo              := 0;
            r_informarPrecoManualmente := 0;
            v_precoAPrazo              := r_precoSugestaoAPrazo;
            v_precoAVista              := r_precoSugestaoAPrazo;
            v_promocao                 := 0;
            v_precoPromocaoAPrazo      := r_precoSugestaoAPrazo;
            v_precoPromocaoAVista      := r_precoSugestaoAPrazo;
            v_precoIndexadoAPrazo      := r_precoSugestaoAPrazo;
            v_precoIndexadoAVista      := r_precoSugestaoAPrazo;
          END IF;
          -- 3 = Combo / 4 = Kit
          IF r_tabelaPreco = ' ' AND r_precoSugestaoAPrazo = 0 AND a.controleEstoque IN (3,4) THEN
            ADD_BUSCA_PRECO_INTERNO_KIT (
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_perfilUsuarioLogado,
              p_usuarioLogado,
              p_cab_entradaSaida,
              p_cab_devolucaoAnulacaoRetorno,
              p_cab_estabelecimento,
              NULL,
              TRUNC(SYSDATE),
              CASE WHEN p_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN p_cab_pessoa ELSE p_orc_pessoa END,
              p_cab_projeto,
              a.capituloNaturezaFiscal,
              a.ufEstabelecimento,
              a.ufPessoa,
              p_item_vendedor,
              p_item_personalizacao,
              p_item_localEstoque,
              p_item_pessoaParticipante,
              p_item_quantidade,
              a.produto,
              a.indicadorPropriedadePosseItem,
              p_manterPreco,
              CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END,
              CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE a.tabelaPreco END,
              r_tabelaPreco,
              r_precoSugestaoAPrazo,
              r_precoSugestaoAVista,
              r_precoDesconto,
              r_precoMinimo,
              r_informarPrecoManualmente,
              v_precoAPrazo,
              v_precoAVista,
              v_promocao,
              v_precoPromocaoAPrazo,
              v_precoPromocaoAVista,
              v_precoIndexadoAPrazo,
              v_precoIndexadoAVista);
          END IF;
        END IF;
        -- Se encontrou preço
        IF r_tabelaPreco <> ' ' OR r_precoSugestaoAPrazo <> 0 OR r_precoSugestaoAVista <> 0 OR r_precoDesconto <> 0 OR r_precoMinimo <> 0 OR r_informarPrecoManualmente <> 0 OR v_precoAPrazo <> 0 OR v_precoAVista <> 0 OR v_precoPromocaoAPrazo <> 0 OR v_precoPromocaoAVista <> 0 OR v_precoIndexadoAPrazo <> 0 OR v_precoIndexadoAVista <> 0 OR CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'I' THEN
          r_tipoPreco := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END;
          IF NOT (a.fatorMultiplicadorPreco IN (0,1)) AND (p_manterPreco = 0 OR p_tipoPreco = a.tipoPreco AND p_tabelaPreco = a.tabelaPreco) THEN
            r_precoSugestaoAPrazo := r_precoSugestaoAPrazo * a.fatorMultiplicadorPreco;
            r_precoSugestaoAVista := r_precoSugestaoAVista * a.fatorMultiplicadorPreco;
            r_precoDesconto       := r_precoDesconto       * a.fatorMultiplicadorPreco;
            r_precoMinimo         := r_precoMinimo         * a.fatorMultiplicadorPreco;
            v_precoAPrazo         := v_precoAPrazo         * a.fatorMultiplicadorPreco;
            v_precoAVista         := v_precoAVista         * a.fatorMultiplicadorPreco;
            v_precoPromocaoAPrazo := v_precoPromocaoAPrazo * a.fatorMultiplicadorPreco;
            v_precoPromocaoAVista := v_precoPromocaoAVista * a.fatorMultiplicadorPreco;
            v_precoIndexadoAPrazo := v_precoIndexadoAPrazo * a.fatorMultiplicadorPreco;
            v_precoIndexadoAVista := v_precoIndexadoAVista * a.fatorMultiplicadorPreco;
          END IF;
        -- Se não encontrou preço, não mantém o atual e existe regra de preço B
        ELSIF p_manterPreco = 0 AND a.tipoPrecoB <> ' ' THEN
          ADD_BUSCA_PRECO (
            p_config_64_casasDecSaidas,
            p_config_65_casasDecEntrada,
            p_config_209_filtrarGrupoEcon,
            p_config_362_calcCustoPorGrade,
            p_perfilUsuarioLogado,
            p_usuarioLogado,
            p_cab_entradaSaida,
            p_cab_devolucaoAnulacaoRetorno,
            p_cab_estabelecimento,
            NULL,
            TRUNC(SYSDATE),
            CASE WHEN p_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN p_cab_pessoa ELSE p_orc_pessoa END,
            p_cab_projeto,
            a.capituloNaturezaFiscal,
            a.tipoPrecoB,
            a.tabelaPrecoB,
            a.fatorMultiplicadorPrecoB,
            ' ', --a.tipoPrecoB
            ' ', --a.tabelaPrecoB
            0, --a.fatorMultiplicadorPrecoB
            a.ufEstabelecimento,
            a.ufPessoa,
            p_item_vendedor,
            p_item_idFormulaTinta,
            p_item_personalizacao,
            p_item_localEstoque,
            p_item_pessoaParticipante,
            p_item_quantidade,
            a.produto,
            a.cor,
            a.tamanho,
            a.controleEstoque,
            a.indicadorPropriedadePosseItem,
            0, --p_manterPreco
            p_precoSugestaoAPrazoOriginal,
            p_precoSugestaoAVistaOriginal,
            a.tipoPrecoB,
            a.tabelaPrecoB,
            r_tipoPreco,
            r_tabelaPreco,
            r_precoSugestaoAPrazo,
            r_precoSugestaoAVista,
            r_precoDesconto,
            r_precoMinimo,
            r_informarPrecoManualmente,
            v_precoAPrazo,
            v_precoAVista,
            v_promocao,
            v_precoPromocaoAPrazo,
            v_precoPromocaoAVista,
            v_precoIndexadoAPrazo,
            v_precoIndexadoAVista);
          -- Se não encontrou preço B, devolve tipo preço e tabela atual
          IF r_precoSugestaoAPrazo = 0 AND r_precoSugestaoAVista = 0 AND r_precoDesconto = 0 AND r_precoMinimo = 0 AND r_informarPrecoManualmente = 0 AND v_precoAPrazo = 0 AND v_precoAVista = 0 AND v_precoPromocaoAPrazo = 0 AND v_precoPromocaoAVista = 0 AND v_precoIndexadoAPrazo = 0 AND v_precoIndexadoAVista = 0 AND a.tipoPrecoB <> 'I' THEN
            r_tipoPreco   := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco   ELSE a.tipoPreco   END;
            r_tabelaPreco := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE a.tabelaPreco END;
          END IF;
        -- Se não encontrou e não usa regra B, devolve tipo preço e tabela atual
        ELSE
          r_tipoPreco   := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco   ELSE a.tipoPreco   END;
          r_tabelaPreco := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE a.tabelaPreco END;
        END IF;
        -- Efetua arredondamento de preço
        r_precoSugestaoAPrazo := ROUND (r_precoSugestaoAPrazo, TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
        r_precoSugestaoAVista := ROUND (r_precoSugestaoAVista, TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
        r_precoDesconto       := ROUND (r_precoDesconto      , TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
        r_precoMinimo         := ROUND (r_precoMinimo        , TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
      END IF;
    END LOOP;
  END IF;
END ADD_BUSCA_PRECO_GRADE_PRODUTO;

/

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

/

create or replace PROCEDURE ADD_CALCULA_MARGEM_CONTRIB (
  p_usuarioLogado                IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_regMarg_tipoPreco            IN CHAR,
  p_regMarg_tabelaPreco          IN VARCHAR2,
  p_regMarg_fatorMultiplicador   IN NUMBER,
  p_regMarg_tipoPrecoB           IN CHAR,
  p_regMarg_tabelaPrecoB         IN VARCHAR2,
  p_regMarg_fatorMultiplicadorB  IN NUMBER,
  p_regMarg_reduzirImpostos      IN NUMBER,
  p_regMarg_reduzirTarifaCartao  IN NUMBER,
  p_regMarg_taxaCapitacaoCustoFi IN NUMBER,
  p_regMarg_exibImagemMargemItem IN NUMBER,
  p_regMarg_regraImagemItem      IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_prazoMedioPonderado      IN NUMBER,
  p_cab_valorLiquidoItem         IN NUMBER,
  p_cab_valorTarifaCartao        IN NUMBER,
  p_munEndEst_uf                 IN CHAR,
  p_munEndPess_uf                IN CHAR,
  p_item_modeloDocumento         IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_valorFreteItem          IN NUMBER,
  p_item_valorSeguroItem         IN NUMBER,
  p_item_valorFreteGeral         IN NUMBER,
  p_item_valorSeguroGeral        IN NUMBER,
  p_item_valorAdicFreteMarTotal  IN NUMBER,
  p_item_valorDespesasAduanTotal IN NUMBER,
  p_item_valorRetIRRF            IN NUMBER,
  p_item_valorRetCSLL            IN NUMBER,
  p_item_valorII                 IN NUMBER,
  p_item_valorIOF                IN NUMBER,
  p_item_valorIPI                IN NUMBER,
  p_item_valorIPIDevolucao       IN NUMBER,
  p_item_valorPIS                IN NUMBER,
  p_item_valorPISST              IN NUMBER,
  p_item_valorCOFINS             IN NUMBER,
  p_item_valorCOFINSST           IN NUMBER,
  p_item_valorCreditoSimplesNac  IN NUMBER,
  p_item_valorICMSOperacao       IN NUMBER,
  p_item_valorICMSDiferido       IN NUMBER,
  p_item_valorICMS               IN NUMBER,
  p_item_valorICMSDesoneracao    IN NUMBER,
  p_item_valorICMSST             IN NUMBER,
  p_item_valorICMSUFDestinatario IN NUMBER,
  p_item_valorICMSUFRemetente    IN NUMBER,
  p_item_valorFCP                IN NUMBER,
  p_item_valorFCPST              IN NUMBER,
  p_item_valorFCPSTAnteriormente IN NUMBER,
  p_item_valorFCPUFDestinatario  IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  /* Retornos */
  r_valorLiquidoSemFreteSeguro   OUT NUMBER,
  r_valorCaptacao                OUT NUMBER,
  r_valorTarifaCartao            OUT NUMBER,
  r_valorImpostos                OUT NUMBER,
  r_precoCusto                   OUT NUMBER,
  r_valorCusto                   OUT NUMBER,
  r_valorMargem                  OUT NUMBER,
  r_percentualMargem             OUT NUMBER)
IS
  v_gradProd_produto             NUMBER;
  v_gradProd_cor                 NUMBER;
  v_gradProd_tamanho             VARCHAR(10);
  v_prod_subcategoriaProduto     NUMBER;
  v_prod_marca                   NUMBER;
  v_prod_caracteristicaA         NUMBER;
  v_prod_caracteristicaB         NUMBER;
  v_prod_caracteristicaC         NUMBER;
  v_prod_caracteristicaD         NUMBER;
  v_prod_caracteristicaE         NUMBER;
  v_prod_idNcm                   NUMBER;
  v_prod_listaServicos           NUMBER;
  v_prod_controleEstoque         NUMBER;
  v_subCatProd_categoriaProduto  NUMBER;
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2(256);    
BEGIN
  SELECT
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho,
    prod.subcategoriaProduto,
    prod.marca,
    prod.caracteristicaA,
    prod.caracteristicaB,
    prod.caracteristicaC,
    prod.caracteristicaD,
    prod.caracteristicaE,
    prod.idNcm,
    prod.listaServicos,
    prod.controleEstoque,
    subCatProd.categoriaProduto
  INTO
    v_gradProd_produto,
    v_gradProd_cor,
    v_gradProd_tamanho,
    v_prod_subcategoriaProduto,
    v_prod_marca,
    v_prod_caracteristicaA,
    v_prod_caracteristicaB,
    v_prod_caracteristicaC,
    v_prod_caracteristicaD,
    v_prod_caracteristicaE,
    v_prod_idNcm,
    v_prod_listaServicos,
    v_prod_controleEstoque,
    v_subCatProd_categoriaProduto
  FROM CAGRADESPRODUTO gradProd
  JOIN CAPRODUTOS prod
  ON prod.produto = gradProd.produto
  JOIN PASUBCATEGORIASPRODUTO subCatProd
  ON subCatProd.subcategoriaProduto = prod.subcategoriaProduto
  WHERE gradProd.gradeProduto = p_item_gradeProduto;
  r_valorLiquidoSemFreteSeguro :=
    p_item_valorLiquidoItem
    - p_item_valorFreteItem
    - p_item_valorSeguroItem
    - p_item_valorFreteGeral
    - p_item_valorSeguroGeral
    - p_item_valorAdicFreteMarTotal
    - p_item_valorDespesasAduanTotal;
  r_valorCaptacao := FUNC_ADD_CALC_VALOR_CAPTACAO(
    p_cab_prazoMedioPonderado,
    p_regMarg_taxaCapitacaoCustoFi,
    r_valorLiquidoSemFreteSeguro);
  IF p_regMarg_reduzirTarifaCartao = 1
    AND p_cab_valorLiquidoItem <> 0
  THEN
    r_valorTarifaCartao :=
      CASE
        WHEN p_cab_valorLiquidoItem = 0
        THEN 0
        ELSE ROUND ((p_cab_valorTarifaCartao * p_item_valorLiquidoItem / p_cab_valorLiquidoItem), 2)
      END;
  ELSE
    r_valorTarifaCartao := 0;
  END IF;
  r_valorImpostos := 0;
  IF p_regMarg_reduzirImpostos = 1 THEN
    r_valorImpostos := FUNC_ADD_BUSCA_IMPOSTOS_MARGEM (
      p_usuarioLogado,
      p_perfilUsuarioLogado,
      FUNC_ADD_BUSCA_CENARIO_CALC_PR (
        'V', -- p_compraVenda
        p_cab_estabelecimento,
        p_munEndEst_uf,
        p_munEndPess_uf,
        p_item_modeloDocumento),
      p_cab_estabelecimento,
      p_munEndEst_uf,
      p_munEndPess_uf,
      p_item_quantidade,
      p_item_valorRetIRRF,
      p_item_valorRetCSLL,
      p_item_valorII,
      p_item_valorIOF,
      p_item_valorIPI,
      p_item_valorIPIDevolucao,
      p_item_valorPIS,
      p_item_valorPISST,
      p_item_valorCOFINS,
      p_item_valorCOFINSST,
      p_item_valorCreditoSimplesNac,
      p_item_valorICMSOperacao,
      p_item_valorICMSDiferido,
      p_item_valorICMS,
      p_item_valorICMSDesoneracao,
      p_item_valorICMSST,
      p_item_valorICMSUFDestinatario,
      p_item_valorICMSUFRemetente,
      p_item_valorFCP,
      p_item_valorFCPST,
      p_item_valorFCPSTAnteriormente,
      p_item_valorFCPUFDestinatario,
      r_valorLiquidoSemFreteSeguro,
      v_gradProd_produto,
      v_prod_subcategoriaProduto,
      v_prod_marca,
      v_prod_caracteristicaA,
      v_prod_caracteristicaB,
      v_prod_caracteristicaC,
      v_prod_caracteristicaD,
      v_prod_caracteristicaE,
      v_prod_idNcm,
      v_prod_listaServicos,
      v_subCatProd_categoriaProduto);
  END IF;
  ADD_BUSCA_PRECO (
    p_config_65_casasDecEntrada, -- p_config_64_casasDecSaidas
    p_config_65_casasDecEntrada,
    p_config_209_filtrarGrupoEcon,
    p_config_362_calcCustoPorGrade,
    0, -- p_perfilUsuarioLogado
    0, -- p_usuarioLogado
    'E', -- p_cab_entradaSaida
    0, -- p_cab_devolucaoAnulacaoRetorno
    p_cab_estabelecimento,
    TO_DATE('01/01/1900','DD/MM/YYYY'), -- p_cab_dataPrecoInicial
    TRUNC(SYSDATE), -- p_cab_dataPrecoFinal
    0, -- p_cab_pessoa
    ' ', -- p_cab_projeto
    0, -- p_modDoc_capituloNaturezaFisc
    p_regMarg_tipoPreco,
    p_regMarg_tabelaPreco,
    p_regMarg_fatorMultiplicador,
    p_regMarg_tipoPrecoB,
    p_regMarg_tabelaPrecoB,
    p_regMarg_fatorMultiplicadorB,
    p_munEndEst_uf, -- p_endPessEst_uf
    p_munEndEst_uf, -- p_endPess_uf
    0, -- p_item_vendedor
    0, -- p_item_idFormulaTinta,
    p_item_personalizacao,
    0, -- p_item_localEstoque,
    0, -- p_item_pessoaParticipante,
    p_item_quantidade,
    v_gradProd_produto,
    v_gradProd_cor,
    v_gradProd_tamanho,
    v_prod_controleEstoque,
    '0', -- v_locEst_indicadorPropPosseIt,
    0, -- p_manterPreco
    0, -- p_precoSugestaoAPrazoOriginal
    0, -- p_precoSugestaoAVistaOriginal
    ' ', -- p_tipoPreco
    ' ', -- p_tabelaPreco
    /* Retornos */
    v_auxVarchar, -- r_tipoPreco
    v_auxVarchar, -- r_tabelaPreco
    r_precoCusto,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber);
  r_valorCusto := ROUND ((p_item_quantidade * r_precoCusto),2);
  r_valorMargem :=
    r_valorLiquidoSemFreteSeguro
    - r_valorCaptacao
    - r_valorImpostos
    - r_valorTarifaCartao
    - r_valorCusto;
  r_percentualMargem :=
    CASE
      WHEN r_valorLiquidoSemFreteSeguro = 0
      THEN 0
      ELSE ROUND ((100 * r_valorMargem / r_valorLiquidoSemFreteSeguro), 8)
    END;
END ADD_CALCULA_MARGEM_CONTRIB;

/

create or replace PROCEDURE ADD_DOC_FISC_GERA_TEMP_MARGEM (
  p_sessaoClient                 IN VARCHAR2,
  p_usuarioLogado                IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_regMarg_tipoPreco            IN CHAR,
  p_regMarg_tabelaPreco          IN VARCHAR2,
  p_regMarg_fatorMultiplicador   IN NUMBER,
  p_regMarg_tipoPrecoB           IN CHAR,
  p_regMarg_tabelaPrecoB         IN VARCHAR2,
  p_regMarg_fatorMultiplicadorB  IN NUMBER,
  p_regMarg_reduzirImpostos      IN NUMBER,
  p_regMarg_reduzirTarifaCartao  IN NUMBER,
  p_regMarg_taxaCapitacaoCustoFi IN NUMBER,
  p_regMarg_exibImagemMargemCab  IN NUMBER,
  p_regMarg_regraImagemCab       IN NUMBER,
  p_regMarg_exibImagemMargemItem IN NUMBER,
  p_regMarg_regraImagemItem      IN NUMBER,
  p_idDocumentoFiscal            IN NUMBER,
  p_cabMargem_valorTarifaCartao  IN NUMBER,
  p_cabMargem_valorMargem        IN NUMBER,
  p_idItemDocFiscal              IN NUMBER,
  p_item_ini_cancelado           IN NUMBER,
  /* Retornos */
  r_cabMargem_valorTarifaCartao  OUT NUMBER,
  r_cabMargem_valorMargem        OUT NUMBER,
  r_cabMargem_percentualMargem   OUT NUMBER,
  r_cabMargem_imagemMargem       OUT VARCHAR2)
IS
  v_cab_estabelecimento          NUMBER;
  v_cab_tipoPagamentoFrete       CHAR(1);
  v_cab_prazoMedioPonderado      NUMBER;
  v_cab_valorFreteItem           NUMBER;
  v_cab_valorSeguroItem          NUMBER;
  v_cab_valorFreteGeral          NUMBER;
  v_cab_valorSeguroGeral         NUMBER;
  v_cab_valorAdicFreteMarinTotal NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_munEndEst_uf                 CHAR(2);
  v_munEndPess_uf                CHAR(2);
  v_item_valorLiquidoSemFreteSeg NUMBER;
  v_item_valorCaptacao           NUMBER;
  v_item_valorTarifaCartao       NUMBER;
  v_item_valorImpostos           NUMBER;
  v_item_precoCusto              NUMBER;
  v_item_valorCusto              NUMBER;
  v_item_valorMargem             NUMBER;
  v_item_percentualMargem        NUMBER;
  v_item_imagemMargem            VARCHAR2(256);
BEGIN
  IF p_idItemDocFiscal = 0 THEN
    r_cabMargem_valorTarifaCartao := FUNC_ADD_TARIFA_CART_DOC_FISC (p_idDocumentoFiscal);
    r_cabMargem_valorMargem := 0;
    DELETE TEMPMARGEMCONTRIBUICAO
    WHERE sessaoClient = p_sessaoClient
    AND orcamentoPredocumentoDocumento = 'D'
    AND idCabecalho = p_idDocumentoFiscal;
  ELSE
    r_cabMargem_valorTarifaCartao := p_cabMargem_valorTarifaCartao;
    r_cabMargem_valorMargem := p_cabMargem_valorMargem;
    IF p_item_ini_cancelado = 0 THEN
      SELECT COALESCE (MAX (temp.valorMargem), 0)
      INTO v_item_valorMargem
      FROM MODOCFISCALXITENS a
      JOIN TEMPMARGEMCONTRIBUICAO temp
      ON temp.sequencia = a.sequencia
      WHERE a.idItemDocFiscal = p_idItemDocFiscal
      AND temp.sessaoClient = p_sessaoClient
      AND temp.orcamentoPredocumentoDocumento = 'D'
      AND temp.idCabecalho = p_idDocumentoFiscal;
      r_cabMargem_valorMargem := p_cabMargem_valorMargem - v_item_valorMargem;
    END IF;
  END IF;
  SELECT
    cab.estabelecimento,
    cab.prazoMedioPonderado,
    cab.valorFreteItem,
    cab.valorSeguroItem,
    cab.valorFreteGeral,
    cab.valorSeguroGeral,
    cab.valorAdicFreteMarinhaMerTotal,
    cab.valorDespesasAduaneirasTotal,
    cab.valorLiquidoItem,
    COALESCE((
      SELECT MAX(munEndEst.uf)
      FROM CAENDERECOSPESSOA endEst
      JOIN SIMUNICIPIOS munEndEst
      ON munEndEst.municipio = endEst.municipio
      WHERE endEst.pessoa = est.pessoaEstabelecimento
      AND endEst.ativo = 1
      AND endEst.principal = 1),'  '),
    COALESCE((
      SELECT MAX(munEndPess.uf)
      FROM CAENDERECOSPESSOA endPess
      JOIN SIMUNICIPIOS munEndPess
      ON munEndPess.municipio = endPess.municipio
      WHERE endPess.pessoa = cab.pessoa
      AND endPess.ativo = 1
      AND endPess.principal = 1),'  ')
  INTO
    v_cab_estabelecimento,
    v_cab_prazoMedioPonderado,
    v_cab_valorFreteItem,
    v_cab_valorSeguroItem,
    v_cab_valorFreteGeral,
    v_cab_valorSeguroGeral,
    v_cab_valorAdicFreteMarinTotal,
    v_cab_valorDespesasAduanTotal,
    v_cab_valorLiquidoItem,
    v_munEndEst_uf,
    v_munEndPess_uf
  FROM MODOCUMENTOSFISCAIS cab
  JOIN PAESTABELECIMENTOS est
  ON est.estabelecimento = cab.estabelecimento
  WHERE cab.idDocumentoFiscal = p_idDocumentoFiscal;
  FOR a IN (
    SELECT
      a.sequencia,
      a.cancelado,
      a.modeloDocumento,
      a.gradeProduto,
      a.personalizacao,
      a.quantidade,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorRetIRRF,
      a.valorRetCSLL,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorIPIDevolucao,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMSOperacao,
      a.valorICMSDiferido,
      a.valorICMS,
      a.valorICMSDesoneracao,
      a.valorICMSST,
      a.valorICMSUFDestinatario,
      a.valorICMSUFRemetente,
      a.valorFCP,
      a.valorFCPST,
      a.valorFCPSTAnteriormente,
      a.valorFCPUFDestinatario,
      a.valorLiquidoItem
    FROM MODOCFISCALXITENS a
    WHERE p_idItemDocFiscal = 0
    AND idDocumentoFiscal = p_idDocumentoFiscal
    OR p_idItemDocFiscal <> 0
    AND idItemDocFiscal = p_idItemDocFiscal)
  LOOP
    ADD_CALCULA_MARGEM_CONTRIB (
      p_usuarioLogado,
      p_perfilUsuarioLogado,
      p_config_65_casasDecEntrada,
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_regMarg_tipoPreco,
      p_regMarg_tabelaPreco,
      p_regMarg_fatorMultiplicador,
      p_regMarg_tipoPrecoB,
      p_regMarg_tabelaPrecoB,
      p_regMarg_fatorMultiplicadorB,
      p_regMarg_reduzirImpostos,
      p_regMarg_reduzirTarifaCartao,
      p_regMarg_taxaCapitacaoCustoFi,
      p_regMarg_exibImagemMargemItem,
      p_regMarg_regraImagemItem,
      v_cab_estabelecimento,
      v_cab_prazoMedioPonderado,
      v_cab_valorLiquidoItem,
      r_cabMargem_valorTarifaCartao,
      v_munEndEst_uf,
      v_munEndPess_uf,
      a.modeloDocumento,
      a.gradeProduto,
      a.personalizacao,
      a.quantidade,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorRetIRRF,
      a.valorRetCSLL,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorIPIDevolucao,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMSOperacao,
      a.valorICMSDiferido,
      a.valorICMS,
      a.valorICMSDesoneracao,
      a.valorICMSST,
      a.valorICMSUFDestinatario,
      a.valorICMSUFRemetente,
      a.valorFCP,
      a.valorFCPST,
      a.valorFCPSTAnteriormente,
      a.valorFCPUFDestinatario,
      a.valorLiquidoItem,
      /* Retornos */
      v_item_valorLiquidoSemFreteSeg,
      v_item_valorCaptacao,
      v_item_valorTarifaCartao,
      v_item_valorImpostos,
      v_item_precoCusto,
      v_item_valorCusto,
      v_item_valorMargem,
      v_item_percentualMargem);
    IF p_regMarg_exibImagemMargemItem = 1
      AND p_regMarg_regraImagemItem <> 0
    THEN
      v_item_imagemMargem :=
        FUNC_ADD_BUSCA_IMAGEM_FAIXA (
          p_regMarg_regraImagemItem,
          v_item_percentualMargem);
    ELSE
      v_item_imagemMargem := ' ';
    END IF;
    IF a.cancelado = 0 THEN
      r_cabMargem_valorMargem := r_cabMargem_valorMargem + v_item_valorMargem;
    END IF;
  MERGE INTO TEMPMARGEMCONTRIBUICAO a USING (
    SELECT
      p_sessaoClient                 sessaoClient,
      'D'                            orcamentoPredocumentoDocumento,
      p_idDocumentoFiscal            idCabecalho,
      a.sequencia                    sequencia,
      v_item_valorLiquidoSemFreteSeg valorLiquidoSemFreteSeguro,
      v_item_valorCaptacao           valorCaptacao,
      v_item_valorTarifaCartao       valorTarifaCartao,
      v_item_valorImpostos           valorImpostos,
      v_item_precoCusto              precoCusto,
      v_item_valorCusto              valorCusto,
      v_item_valorMargem             valorMargem,
      v_item_percentualMargem        percentualMargem,
      v_item_imagemMargem            imagemMargem
    FROM DUAL) b ON (
      a.sessaoClient = b.sessaoClient 
      AND a.orcamentoPredocumentoDocumento = b.orcamentoPredocumentoDocumento
      AND a.idCabecalho = b.idCabecalho
      AND a.sequencia = b.sequencia)
  WHEN MATCHED THEN UPDATE SET
    a.valorLiquidoSemFreteSeguro = b.valorLiquidoSemFreteSeguro,
    a.valorCaptacao              = b.valorCaptacao,
    a.valorTarifaCartao          = b.valorTarifaCartao,
    a.valorImpostos              = b.valorImpostos,
    a.precoCusto                 = b.precoCusto,
    a.valorCusto                 = b.valorCusto,
    a.valorMargem                = b.valorMargem,
    a.percentualMargem           = b.percentualMargem,
    a.imagemMargem               = b.imagemMargem
  WHEN NOT MATCHED THEN INSERT (
    sessaoClient,
    orcamentoPredocumentoDocumento,
    idCabecalho,
    sequencia,
    valorLiquidoSemFreteSeguro,
    valorCaptacao,
    valorTarifaCartao,
    valorImpostos,
    precoCusto,
    valorCusto,
    valorMargem,
    percentualMargem,
    imagemMargem)
  VALUES (
    b.sessaoClient,
    b.orcamentoPredocumentoDocumento,
    b.idCabecalho,
    b.sequencia,
    b.valorLiquidoSemFreteSeguro,
    b.valorCaptacao,
    b.valorTarifaCartao,
    b.valorImpostos,
    b.precoCusto,
    b.valorCusto,
    b.valorMargem,
    b.percentualMargem,
    b.imagemMargem);
  END LOOP;
  r_cabMargem_percentualMargem :=
    CASE
      WHEN v_cab_valorLiquidoItem
        - v_cab_valorFreteItem
        - v_cab_valorSeguroItem
        - v_cab_valorFreteGeral
        - v_cab_valorSeguroGeral
        - v_cab_valorAdicFreteMarinTotal
        - v_cab_valorDespesasAduanTotal = 0
      THEN 0
      ELSE ROUND ((100 * r_cabMargem_valorMargem
        / ( v_cab_valorLiquidoItem
          - v_cab_valorFreteItem
          - v_cab_valorSeguroItem
          - v_cab_valorFreteGeral
          - v_cab_valorSeguroGeral
          - v_cab_valorAdicFreteMarinTotal
          - v_cab_valorDespesasAduanTotal)), 8)
    END;
  IF p_regMarg_exibImagemMargemCab = 1
    AND p_regMarg_regraImagemCab <> 0
  THEN
    r_cabMargem_imagemMargem :=
      FUNC_ADD_BUSCA_IMAGEM_FAIXA (
        p_regMarg_regraImagemCab,
        r_cabMargem_percentualMargem);
  ELSE
    r_cabMargem_imagemMargem := ' ';
  END IF;
END ADD_DOC_FISC_GERA_TEMP_MARGEM;

/

create or replace PROCEDURE ADD_PRE_DOC_GERA_TEMP_MARGEM (
  p_sessaoClient                 IN VARCHAR2,
  p_usuarioLogado                IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_regMarg_tipoPreco            IN CHAR,
  p_regMarg_tabelaPreco          IN VARCHAR2,
  p_regMarg_fatorMultiplicador   IN NUMBER,
  p_regMarg_tipoPrecoB           IN CHAR,
  p_regMarg_tabelaPrecoB         IN VARCHAR2,
  p_regMarg_fatorMultiplicadorB  IN NUMBER,
  p_regMarg_reduzirImpostos      IN NUMBER,
  p_regMarg_reduzirTarifaCartao  IN NUMBER,
  p_regMarg_taxaCapitacaoCustoFi IN NUMBER,
  p_regMarg_exibImagemMargemCab  IN NUMBER,
  p_regMarg_regraImagemCab       IN NUMBER,
  p_regMarg_exibImagemMargemItem IN NUMBER,
  p_regMarg_regraImagemItem      IN NUMBER,
  p_preDocumento                 IN NUMBER,
  p_cabMargem_valorTarifaCartao  IN NUMBER,
  p_cabMargem_valorMargem        IN NUMBER,
  p_idItemPreDocumento           IN NUMBER,
  p_item_ini_cancelado           IN NUMBER,
  /* Retornos */
  r_cabMargem_valorTarifaCartao  OUT NUMBER,
  r_cabMargem_valorMargem        OUT NUMBER,
  r_cabMargem_percentualMargem   OUT NUMBER,
  r_cabMargem_imagemMargem       OUT VARCHAR2)
IS
  v_cab_estabelecimento          NUMBER;
  v_cab_tipoPagamentoFrete       CHAR(1);
  v_cab_prazoMedioPonderado      NUMBER;
  v_cab_valorFreteItem           NUMBER;
  v_cab_valorSeguroItem          NUMBER;
  v_cab_valorFreteGeral          NUMBER;
  v_cab_valorSeguroGeral         NUMBER;
  v_cab_valorAdicFreteMarinTotal NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_munEndEst_uf                 CHAR(2);
  v_munEndPess_uf                CHAR(2);
  v_item_valorLiquidoSemFreteSeg NUMBER;
  v_item_valorCaptacao           NUMBER;
  v_item_valorTarifaCartao       NUMBER;
  v_item_valorImpostos           NUMBER;
  v_item_precoCusto              NUMBER;
  v_item_valorCusto              NUMBER;
  v_item_valorMargem             NUMBER;
  v_item_percentualMargem        NUMBER;
  v_item_imagemMargem            VARCHAR2(256);
BEGIN
  IF p_idItemPreDocumento = 0 THEN
    r_cabMargem_valorTarifaCartao := FUNC_ADD_TARIFA_CART_PRE_DOC (p_preDocumento);
    r_cabMargem_valorMargem := 0;
    DELETE TEMPMARGEMCONTRIBUICAO
    WHERE sessaoClient = p_sessaoClient
    AND orcamentoPredocumentoDocumento = 'P'
    AND idCabecalho = p_preDocumento;
  ELSE
    r_cabMargem_valorTarifaCartao := p_cabMargem_valorTarifaCartao;
    r_cabMargem_valorMargem := p_cabMargem_valorMargem;
    IF p_item_ini_cancelado = 0 THEN
      SELECT COALESCE (MAX (temp.valorMargem), 0)
      INTO v_item_valorMargem
      FROM MOPREDOCUMXITENS a
      JOIN TEMPMARGEMCONTRIBUICAO temp
      ON temp.sequencia = a.sequencia
      WHERE a.idItemPreDocumento = p_idItemPreDocumento
      AND temp.sessaoClient = p_sessaoClient
      AND temp.orcamentoPredocumentoDocumento = 'P'
      AND temp.idCabecalho = p_preDocumento;
      r_cabMargem_valorMargem := p_cabMargem_valorMargem - v_item_valorMargem;
    END IF;
  END IF;
  SELECT
    cab.estabelecimento,
    cab.prazoMedioPonderado,
    cab.valorFreteItem,
    cab.valorSeguroItem,
    cab.valorFreteGeral,
    cab.valorSeguroGeral,
    cab.valorAdicFreteMarinhaMerTotal,
    cab.valorDespesasAduaneirasTotal,
    cab.valorLiquidoItem,
    COALESCE((
      SELECT MAX(munEndEst.uf)
      FROM CAENDERECOSPESSOA endEst
      JOIN SIMUNICIPIOS munEndEst
      ON munEndEst.municipio = endEst.municipio
      WHERE endEst.pessoa = est.pessoaEstabelecimento
      AND endEst.ativo = 1
      AND endEst.principal = 1),'  '),
    COALESCE((
      SELECT MAX(munEndPess.uf)
      FROM CAENDERECOSPESSOA endPess
      JOIN SIMUNICIPIOS munEndPess
      ON munEndPess.municipio = endPess.municipio
      WHERE endPess.pessoa = cab.pessoa
      AND endPess.ativo = 1
      AND endPess.principal = 1),'  ')
  INTO
    v_cab_estabelecimento,
    v_cab_prazoMedioPonderado,
    v_cab_valorFreteItem,
    v_cab_valorSeguroItem,
    v_cab_valorFreteGeral,
    v_cab_valorSeguroGeral,
    v_cab_valorAdicFreteMarinTotal,
    v_cab_valorDespesasAduanTotal,
    v_cab_valorLiquidoItem,
    v_munEndEst_uf,
    v_munEndPess_uf
  FROM MOPREDOCUMENTOS cab
  JOIN PAESTABELECIMENTOS est
  ON est.estabelecimento = cab.estabelecimento
  WHERE cab.preDocumento = p_preDocumento;
  FOR a IN (
    SELECT
      a.sequencia,
      a.cancelado,
      a.modeloDocumento,
      a.gradeProduto,
      a.personalizacao,
      a.quantidade,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorRetIRRF,
      a.valorRetCSLL,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorIPIDevolucao,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMSOperacao,
      a.valorICMSDiferido,
      a.valorICMS,
      a.valorICMSDesoneracao,
      a.valorICMSST,
      a.valorICMSUFDestinatario,
      a.valorICMSUFRemetente,
      a.valorFCP,
      a.valorFCPST,
      a.valorFCPSTAnteriormente,
      a.valorFCPUFDestinatario,
      a.valorLiquidoItem
    FROM MOPREDOCUMXITENS a
    WHERE p_idItemPreDocumento = 0
    AND preDocumento = p_preDocumento
    OR p_idItemPreDocumento <> 0
    AND idItemPreDocumento = p_idItemPreDocumento)
  LOOP
    ADD_CALCULA_MARGEM_CONTRIB (
      p_usuarioLogado,
      p_perfilUsuarioLogado,
      p_config_65_casasDecEntrada,
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_regMarg_tipoPreco,
      p_regMarg_tabelaPreco,
      p_regMarg_fatorMultiplicador,
      p_regMarg_tipoPrecoB,
      p_regMarg_tabelaPrecoB,
      p_regMarg_fatorMultiplicadorB,
      p_regMarg_reduzirImpostos,
      p_regMarg_reduzirTarifaCartao,
      p_regMarg_taxaCapitacaoCustoFi,
      p_regMarg_exibImagemMargemItem,
      p_regMarg_regraImagemItem,
      v_cab_estabelecimento,
      v_cab_prazoMedioPonderado,
      v_cab_valorLiquidoItem,
      r_cabMargem_valorTarifaCartao,
      v_munEndEst_uf,
      v_munEndPess_uf,
      a.modeloDocumento,
      a.gradeProduto,
      a.personalizacao,
      a.quantidade,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorRetIRRF,
      a.valorRetCSLL,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorIPIDevolucao,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMSOperacao,
      a.valorICMSDiferido,
      a.valorICMS,
      a.valorICMSDesoneracao,
      a.valorICMSST,
      a.valorICMSUFDestinatario,
      a.valorICMSUFRemetente,
      a.valorFCP,
      a.valorFCPST,
      a.valorFCPSTAnteriormente,
      a.valorFCPUFDestinatario,
      a.valorLiquidoItem,
      /* Retornos */
      v_item_valorLiquidoSemFreteSeg,
      v_item_valorCaptacao,
      v_item_valorTarifaCartao,
      v_item_valorImpostos,
      v_item_precoCusto,
      v_item_valorCusto,
      v_item_valorMargem,
      v_item_percentualMargem);
    IF p_regMarg_exibImagemMargemItem = 1
      AND p_regMarg_regraImagemItem <> 0
    THEN
      v_item_imagemMargem :=
        FUNC_ADD_BUSCA_IMAGEM_FAIXA (
          p_regMarg_regraImagemItem,
          v_item_percentualMargem);
    ELSE
      v_item_imagemMargem := ' ';
    END IF;
    IF a.cancelado = 0 THEN
      r_cabMargem_valorMargem := r_cabMargem_valorMargem + v_item_valorMargem;
    END IF;
  MERGE INTO TEMPMARGEMCONTRIBUICAO a USING (
    SELECT
      p_sessaoClient                 sessaoClient,
      'P'                            orcamentoPredocumentoDocumento,
      p_preDocumento                 idCabecalho,
      a.sequencia                    sequencia,
      v_item_valorLiquidoSemFreteSeg valorLiquidoSemFreteSeguro,
      v_item_valorCaptacao           valorCaptacao,
      v_item_valorTarifaCartao       valorTarifaCartao,
      v_item_valorImpostos           valorImpostos,
      v_item_precoCusto              precoCusto,
      v_item_valorCusto              valorCusto,
      v_item_valorMargem             valorMargem,
      v_item_percentualMargem        percentualMargem,
      v_item_imagemMargem            imagemMargem
    FROM DUAL) b ON (
      a.sessaoClient = b.sessaoClient 
      AND a.orcamentoPredocumentoDocumento = b.orcamentoPredocumentoDocumento
      AND a.idCabecalho = b.idCabecalho
      AND a.sequencia = b.sequencia)
  WHEN MATCHED THEN UPDATE SET
    a.valorLiquidoSemFreteSeguro = b.valorLiquidoSemFreteSeguro,
    a.valorCaptacao              = b.valorCaptacao,
    a.valorTarifaCartao          = b.valorTarifaCartao,
    a.valorImpostos              = b.valorImpostos,
    a.precoCusto                 = b.precoCusto,
    a.valorCusto                 = b.valorCusto,
    a.valorMargem                = b.valorMargem,
    a.percentualMargem           = b.percentualMargem,
    a.imagemMargem               = b.imagemMargem
  WHEN NOT MATCHED THEN INSERT (
    sessaoClient,
    orcamentoPredocumentoDocumento,
    idCabecalho,
    sequencia,
    valorLiquidoSemFreteSeguro,
    valorCaptacao,
    valorTarifaCartao,
    valorImpostos,
    precoCusto,
    valorCusto,
    valorMargem,
    percentualMargem,
    imagemMargem)
  VALUES (
    b.sessaoClient,
    b.orcamentoPredocumentoDocumento,
    b.idCabecalho,
    b.sequencia,
    b.valorLiquidoSemFreteSeguro,
    b.valorCaptacao,
    b.valorTarifaCartao,
    b.valorImpostos,
    b.precoCusto,
    b.valorCusto,
    b.valorMargem,
    b.percentualMargem,
    b.imagemMargem);
  END LOOP;
  r_cabMargem_percentualMargem :=
    CASE
      WHEN v_cab_valorLiquidoItem
        - v_cab_valorFreteItem
        - v_cab_valorSeguroItem
        - v_cab_valorFreteGeral
        - v_cab_valorSeguroGeral
        - v_cab_valorAdicFreteMarinTotal
        - v_cab_valorDespesasAduanTotal = 0
      THEN 0
      ELSE ROUND ((100 * r_cabMargem_valorMargem
        / ( v_cab_valorLiquidoItem
          - v_cab_valorFreteItem
          - v_cab_valorSeguroItem
          - v_cab_valorFreteGeral
          - v_cab_valorSeguroGeral
          - v_cab_valorAdicFreteMarinTotal
          - v_cab_valorDespesasAduanTotal)), 8)
    END;
  IF p_regMarg_exibImagemMargemCab = 1
    AND p_regMarg_regraImagemCab <> 0
  THEN
    r_cabMargem_imagemMargem :=
      FUNC_ADD_BUSCA_IMAGEM_FAIXA (
        p_regMarg_regraImagemCab,
        r_cabMargem_percentualMargem);
  ELSE
    r_cabMargem_imagemMargem := ' ';
  END IF;
END ADD_PRE_DOC_GERA_TEMP_MARGEM;

/

create or replace PROCEDURE ADD_ORCAMENTO_GERA_TEMP_MARGEM (
  p_sessaoClient                 IN VARCHAR2,
  p_usuarioLogado                IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_regMarg_tipoPreco            IN CHAR,
  p_regMarg_tabelaPreco          IN VARCHAR2,
  p_regMarg_fatorMultiplicador   IN NUMBER,
  p_regMarg_tipoPrecoB           IN CHAR,
  p_regMarg_tabelaPrecoB         IN VARCHAR2,
  p_regMarg_fatorMultiplicadorB  IN NUMBER,
  p_regMarg_reduzirImpostos      IN NUMBER,
  p_regMarg_reduzirTarifaCartao  IN NUMBER,
  p_regMarg_taxaCapitacaoCustoFi IN NUMBER,
  p_regMarg_exibImagemMargemCab  IN NUMBER,
  p_regMarg_regraImagemCab       IN NUMBER,
  p_regMarg_exibImagemMargemItem IN NUMBER,
  p_regMarg_regraImagemItem      IN NUMBER,
  p_orcamento                    IN NUMBER,
  p_cabMargem_valorTarifaCartao  IN NUMBER,
  p_cabMargem_valorMargem        IN NUMBER,
  p_idItemOrcamento              IN NUMBER,
  p_item_ini_cancelado           IN NUMBER,
  /* Retornos */
  r_cabMargem_valorTarifaCartao  OUT NUMBER,
  r_cabMargem_valorMargem        OUT NUMBER,
  r_cabMargem_percentualMargem   OUT NUMBER,
  r_cabMargem_imagemMargem       OUT VARCHAR2)
IS
  v_cab_estabelecimento          NUMBER;
  v_cab_tipoPagamentoFrete       CHAR(1);
  v_cab_prazoMedioPonderado      NUMBER;
  v_cab_valorFreteItem           NUMBER;
  v_cab_valorSeguroItem          NUMBER;
  v_cab_valorFreteGeral          NUMBER;
  v_cab_valorSeguroGeral         NUMBER;
  v_cab_valorAdicFreteMarinTotal NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_munEndEst_uf                 CHAR(2);
  v_munEndPess_uf                CHAR(2);
  v_item_valorLiquidoSemFreteSeg NUMBER;
  v_item_valorCaptacao           NUMBER;
  v_item_valorTarifaCartao       NUMBER;
  v_item_valorImpostos           NUMBER;
  v_item_precoCusto              NUMBER;
  v_item_valorCusto              NUMBER;
  v_item_valorMargem             NUMBER;
  v_item_percentualMargem        NUMBER;
  v_item_imagemMargem            VARCHAR2(256);
BEGIN
  IF p_idItemOrcamento = 0 THEN
    r_cabMargem_valorTarifaCartao := FUNC_ADD_TARIFA_CART_ORCAMENTO (p_orcamento);
    r_cabMargem_valorMargem := 0;
    DELETE TEMPMARGEMCONTRIBUICAO
    WHERE sessaoClient = p_sessaoClient
    AND orcamentoPredocumentoDocumento = 'O'
    AND idCabecalho = p_orcamento;
  ELSE
    r_cabMargem_valorTarifaCartao := p_cabMargem_valorTarifaCartao;
    r_cabMargem_valorMargem := p_cabMargem_valorMargem;
    IF p_item_ini_cancelado = 0 THEN
      SELECT COALESCE (MAX (temp.valorMargem), 0)
      INTO v_item_valorMargem
      FROM MOORCAMENTOXITENS a
      JOIN TEMPMARGEMCONTRIBUICAO temp
      ON temp.sequencia = a.sequencia
      WHERE a.idItemOrcamento = p_idItemOrcamento
      AND temp.sessaoClient = p_sessaoClient
      AND temp.orcamentoPredocumentoDocumento = 'O'
      AND temp.idCabecalho = p_orcamento;
      r_cabMargem_valorMargem := p_cabMargem_valorMargem - v_item_valorMargem;
    END IF;
  END IF;
  SELECT
    cab.estabelecimento,
    cab.prazoMedioPonderado,
    cab.valorFreteItem,
    cab.valorSeguroItem,
    cab.valorFreteGeral,
    cab.valorSeguroGeral,
    cab.valorAdicFreteMarinhaMerTotal,
    cab.valorDespesasAduaneirasTotal,
    cab.valorLiquidoItem,
    COALESCE((
      SELECT MAX(munEndEst.uf)
      FROM CAENDERECOSPESSOA endEst
      JOIN SIMUNICIPIOS munEndEst
      ON munEndEst.municipio = endEst.municipio
      WHERE endEst.pessoa = est.pessoaEstabelecimento
      AND endEst.ativo = 1
      AND endEst.principal = 1),'  '),
    COALESCE((
      SELECT MAX(munEndPess.uf)
      FROM CAENDERECOSPESSOA endPess
      JOIN SIMUNICIPIOS munEndPess
      ON munEndPess.municipio = endPess.municipio
      WHERE endPess.pessoa = cab.pessoa
      AND endPess.ativo = 1
      AND endPess.principal = 1),'  ')
  INTO
    v_cab_estabelecimento,
    v_cab_prazoMedioPonderado,
    v_cab_valorFreteItem,
    v_cab_valorSeguroItem,
    v_cab_valorFreteGeral,
    v_cab_valorSeguroGeral,
    v_cab_valorAdicFreteMarinTotal,
    v_cab_valorDespesasAduanTotal,
    v_cab_valorLiquidoItem,
    v_munEndEst_uf,
    v_munEndPess_uf
  FROM MOORCAMENTOS cab
  JOIN PAESTABELECIMENTOS est
  ON est.estabelecimento = cab.estabelecimento
  WHERE cab.orcamento = p_orcamento;
  FOR a IN (
    SELECT
      a.sequencia,
      a.cancelado,
      a.modeloDocumento,
      a.gradeProduto,
      a.personalizacao,
      a.quantidade,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorRetIRRF,
      a.valorRetCSLL,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMSOperacao,
      a.valorICMSDiferido,
      a.valorICMS,
      a.valorICMSDesoneracao,
      a.valorICMSST,
      a.valorICMSUFDestinatario,
      a.valorICMSUFRemetente,
      a.valorFCP,
      a.valorFCPST,
      a.valorFCPSTAnteriormente,
      a.valorFCPUFDestinatario,
      a.valorLiquidoItem
    FROM MOORCAMENTOXITENS a
    WHERE p_idItemOrcamento = 0
    AND orcamento = p_orcamento
    OR p_idItemOrcamento <> 0
    AND idItemOrcamento = p_idItemOrcamento)
  LOOP
    ADD_CALCULA_MARGEM_CONTRIB (
      p_usuarioLogado,
      p_perfilUsuarioLogado,
      p_config_65_casasDecEntrada,
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_regMarg_tipoPreco,
      p_regMarg_tabelaPreco,
      p_regMarg_fatorMultiplicador,
      p_regMarg_tipoPrecoB,
      p_regMarg_tabelaPrecoB,
      p_regMarg_fatorMultiplicadorB,
      p_regMarg_reduzirImpostos,
      p_regMarg_reduzirTarifaCartao,
      p_regMarg_taxaCapitacaoCustoFi,
      p_regMarg_exibImagemMargemItem,
      p_regMarg_regraImagemItem,
      v_cab_estabelecimento,
      v_cab_prazoMedioPonderado,
      v_cab_valorLiquidoItem,
      r_cabMargem_valorTarifaCartao,
      v_munEndEst_uf,
      v_munEndPess_uf,
      a.modeloDocumento,
      a.gradeProduto,
      a.personalizacao,
      a.quantidade,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorRetIRRF,
      a.valorRetCSLL,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      0,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMSOperacao,
      a.valorICMSDiferido,
      a.valorICMS,
      a.valorICMSDesoneracao,
      a.valorICMSST,
      a.valorICMSUFDestinatario,
      a.valorICMSUFRemetente,
      a.valorFCP,
      a.valorFCPST,
      a.valorFCPSTAnteriormente,
      a.valorFCPUFDestinatario,
      a.valorLiquidoItem,
      /* Retornos */
      v_item_valorLiquidoSemFreteSeg,
      v_item_valorCaptacao,
      v_item_valorTarifaCartao,
      v_item_valorImpostos,
      v_item_precoCusto,
      v_item_valorCusto,
      v_item_valorMargem,
      v_item_percentualMargem);
    IF p_regMarg_exibImagemMargemItem = 1
      AND p_regMarg_regraImagemItem <> 0
    THEN
      v_item_imagemMargem :=
        FUNC_ADD_BUSCA_IMAGEM_FAIXA (
          p_regMarg_regraImagemItem,
          v_item_percentualMargem);
    ELSE
      v_item_imagemMargem := ' ';
    END IF;
    IF a.cancelado = 0 THEN
      r_cabMargem_valorMargem := r_cabMargem_valorMargem + v_item_valorMargem;
    END IF;
  MERGE INTO TEMPMARGEMCONTRIBUICAO a USING (
    SELECT
      p_sessaoClient                 sessaoClient,
      'O'                            orcamentoPredocumentoDocumento,
      p_orcamento                    idCabecalho,
      a.sequencia                    sequencia,
      v_item_valorLiquidoSemFreteSeg valorLiquidoSemFreteSeguro,
      v_item_valorCaptacao           valorCaptacao,
      v_item_valorTarifaCartao       valorTarifaCartao,
      v_item_valorImpostos           valorImpostos,
      v_item_precoCusto              precoCusto,
      v_item_valorCusto              valorCusto,
      v_item_valorMargem             valorMargem,
      v_item_percentualMargem        percentualMargem,
      v_item_imagemMargem            imagemMargem
    FROM DUAL) b ON (
      a.sessaoClient = b.sessaoClient 
      AND a.orcamentoPredocumentoDocumento = b.orcamentoPredocumentoDocumento
      AND a.idCabecalho = b.idCabecalho
      AND a.sequencia = b.sequencia)
  WHEN MATCHED THEN UPDATE SET
    a.valorLiquidoSemFreteSeguro = b.valorLiquidoSemFreteSeguro,
    a.valorCaptacao              = b.valorCaptacao,
    a.valorTarifaCartao          = b.valorTarifaCartao,
    a.valorImpostos              = b.valorImpostos,
    a.precoCusto                 = b.precoCusto,
    a.valorCusto                 = b.valorCusto,
    a.valorMargem                = b.valorMargem,
    a.percentualMargem           = b.percentualMargem,
    a.imagemMargem               = b.imagemMargem
  WHEN NOT MATCHED THEN INSERT (
    sessaoClient,
    orcamentoPredocumentoDocumento,
    idCabecalho,
    sequencia,
    valorLiquidoSemFreteSeguro,
    valorCaptacao,
    valorTarifaCartao,
    valorImpostos,
    precoCusto,
    valorCusto,
    valorMargem,
    percentualMargem,
    imagemMargem)
  VALUES (
    b.sessaoClient,
    b.orcamentoPredocumentoDocumento,
    b.idCabecalho,
    b.sequencia,
    b.valorLiquidoSemFreteSeguro,
    b.valorCaptacao,
    b.valorTarifaCartao,
    b.valorImpostos,
    b.precoCusto,
    b.valorCusto,
    b.valorMargem,
    b.percentualMargem,
    b.imagemMargem);
  END LOOP;
  r_cabMargem_percentualMargem :=
    CASE
      WHEN v_cab_valorLiquidoItem
        - v_cab_valorFreteItem
        - v_cab_valorSeguroItem
        - v_cab_valorFreteGeral
        - v_cab_valorSeguroGeral
        - v_cab_valorAdicFreteMarinTotal
        - v_cab_valorDespesasAduanTotal = 0
      THEN 0
      ELSE ROUND ((100 * r_cabMargem_valorMargem
        / ( v_cab_valorLiquidoItem
          - v_cab_valorFreteItem
          - v_cab_valorSeguroItem
          - v_cab_valorFreteGeral
          - v_cab_valorSeguroGeral
          - v_cab_valorAdicFreteMarinTotal
          - v_cab_valorDespesasAduanTotal)), 8)
    END;
  IF p_regMarg_exibImagemMargemCab = 1
    AND p_regMarg_regraImagemCab <> 0
  THEN
    r_cabMargem_imagemMargem :=
      FUNC_ADD_BUSCA_IMAGEM_FAIXA (
        p_regMarg_regraImagemCab,
        r_cabMargem_percentualMargem);
  ELSE
    r_cabMargem_imagemMargem := ' ';
  END IF;
END ADD_ORCAMENTO_GERA_TEMP_MARGEM;

/

create or replace PROCEDURE ADD_DOC_FISC_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_227_manterPessoaOrcam IN NUMBER,
  p_config_230_etapaPedComprParc IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     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, -- B = Balanço, D = Documento Fiscal, G = Grade DF-e, O = Orçamento, P, Pré-Documento, T = Transferência
  p_idItemReferenciado           IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_tempComp_nomeTempComposicao  IN VARCHAR2,
  p_tempComp_sequencia           IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_idDocumentoFiscal       IN NUMBER,
  p_item_pedidoCompraFornecedor  IN VARCHAR2,
  p_item_sequenciaPedidoCompraFo IN NUMBER,
  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_quantidadeExtemporanea  IN NUMBER,
  p_item_acrescimoUnitarioExtemp IN NUMBER,
  p_item_valorAcrescimoExtempIte IN NUMBER,
  p_item_valorDescontoCustoOpIte IN NUMBER,
  p_item_valorAcrescimoCustoOpIt 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_valorAcrescimoExtempGer IN NUMBER,
  p_item_valorDescontoCustoOpGer IN NUMBER,
  p_item_valorAcrescimoCustoOpGe IN NUMBER,
  p_item_valorDescontoPagamento  IN NUMBER,
  p_item_valorOutrasDespPagament IN NUMBER,
  p_item_valorJurosPagamento     IN NUMBER,
  p_item_percentualDevolucao     IN NUMBER,
  p_item_valorIPIDevolucao       IN NUMBER,
  p_item_operacaoFiscal          IN NUMBER,
  p_item_movimentaEstoque        IN NUMBER,
  p_item_movimentaEstoqueFiscal  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_stICMSEscrituracao      IN CHAR,
  p_item_reducaoBaseICMSEscritur IN NUMBER,
  p_item_aliquotaICMSEscrituraca IN NUMBER,
  p_item_diferimentoICMSEscritur IN NUMBER,
  p_item_margemValorAdicSTEscrit IN NUMBER,
  p_item_reducaoBaseSTEscriturac IN NUMBER,
  p_item_aliquotaICMSSTEscritura IN NUMBER,
  p_item_somarICMSST             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_baseICMSEscrituracao    IN NUMBER,
  p_item_valorICMSEscrituracao   IN NUMBER,
  p_item_valorICMSDesonEscritura IN NUMBER,
  p_item_baseICMSSTEscrituracao  IN NUMBER,
  p_item_valorICMSSTEscrituracao 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_idItemDocFiscal       IN VARCHAR2,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER,
  r_item_idItemDocFiscal         OUT NUMBER,
  r_buffer_idItemDocFiscal       OUT VARCHAR2,
  r_valorInserido                OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_finalidadeNota           CHAR (1);
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_nfFornecedor             NUMBER;
  v_cab_documentoFiscal          NUMBER;
  v_cab_estabelecimento          NUMBER;
  v_cab_dataEmissao              DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_vendaConsumidor          NUMBER;
  v_cab_enderecoEntregaPessoa    NUMBER;
  v_cab_municipioFatoGerador     NUMBER;
  v_cab_localDestinoOperacao     CHAR (1);
  v_cab_indicadorConsumidorFinal CHAR (1);
  v_cab_projeto                  VARCHAR2 (60);
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  v_cab_situacaoDocumentoFiscal  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_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota 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_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_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_item_sequencia               NUMBER;
  v_item_cancelado               NUMBER;
  v_item_quantidadeDevolvidaRet  NUMBER;
  v_item_precoUnitario           NUMBER;
  v_item_precoUnitarioConvertido NUMBER;
  v_item_valorProdutoServicoBrut NUMBER;
  v_item_valorProdutoServico     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_movimentaEstoqueFiscal  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_stICMSEscrituracao      CHAR (2);
  v_item_reducaoBaseICMSEscritur NUMBER;
  v_item_aliquotaICMSEscrituraca NUMBER;
  v_item_diferimentoICMSEscritur NUMBER;
  v_item_margemValorAdicSTEscrit NUMBER;
  v_item_reducaoBaseSTEscriturac NUMBER;
  v_item_aliquotaICMSSTEscritura NUMBER;
  v_item_somarICMSST             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_baseICMSEscrituracao    NUMBER;
  v_item_valorICMSEscrituracao   NUMBER;
  v_item_valorICMSDesonEscritura NUMBER;
  v_item_baseICMSSTEscrituracao  NUMBER;
  v_item_valorICMSSTEscrituracao 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_item_valorDescontoCustoOpTot NUMBER;
  v_item_valorAcrescimoCustoOpTo NUMBER;
  v_item_precoCustoOperacao      NUMBER;
  v_item_valorCustoOperacao      NUMBER;
  v_item_precoCMV                NUMBER;
  v_item_valorCMV                NUMBER;
  v_item_valorAcrescimoExtempSub NUMBER;
  v_item_valorAcrescimoExtempTot 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_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_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  r_item_idItemDocFiscal := p_item_idItemDocFiscal;
  r_buffer_idItemDocFiscal := p_buffer_idItemDocFiscal;
  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.devolucaoAnulacaoRetorno,
    cab.finalidadeNota,
    cab.atualizaCustoMedio,
    cab.nfFornecedor,
    cab.documentoFiscal,
    cab.estabelecimento,
    cab.dataEmissao,
    cab.pessoa,
    cab.vendaConsumidor,
    cab.enderecoEntregaPessoa,
    cab.municipioFatoGerador,
    cab.localDestinoOperacao,
    cab.indicadorConsumidorFinal,
    cab.projeto,
    cab.modalidadeFrete,
    cab.tipoPagamentoFrete,
    cab.situacaoDocumentoFiscal,
    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,
    cab.valorDescontoCustoOpItem,
    cab.valorDescontoCustoOpGeral,
    cab.valorDescontoCustoOpTotal,
    cab.valorAcrescimoCustoOpItem,
    cab.valorAcrescimoCustoOpGeral,
    cab.valorAcrescimoCustoOpTotal,
    cab.valorCustoOperacao,
    cab.valorCMV,
    cab.quantidadeExtemporanea,
    cab.valorAcrescimoExtempSubtotal,
    cab.valorAcrescimoExtempItem,
    cab.valorAcrescimoExtempGeral,
    cab.valorAcrescimoExtempTotal,
    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
  INTO
    v_cab_origemDocumento,
    v_cab_tipoDocumento,
    v_cab_entradaSaida,
    v_cab_devolucaoAnulacaoRetorno,
    v_cab_finalidadeNota,
    v_cab_atualizaCustoMedio,
    v_cab_nfFornecedor,
    v_cab_documentoFiscal,
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_pessoa,
    v_cab_vendaConsumidor,
    v_cab_enderecoEntregaPessoa,
    v_cab_municipioFatoGerador,
    v_cab_localDestinoOperacao,
    v_cab_indicadorConsumidorFinal,
    v_cab_projeto,
    v_cab_modalidadeFrete,
    v_cab_tipoPagamentoFrete,
    v_cab_situacaoDocumentoFiscal,
    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_cab_valorDescontoCustoOpItem,
    v_cab_valorDescontoCustoOpGera,
    v_cab_valorDescontoCustoOpTota,
    v_cab_valorAcrescimoCustoOpIte,
    v_cab_valorAcrescimoCustoOpGer,
    v_cab_valorAcrescimoCustoOpTot,
    v_cab_valorCustoOperacao,
    v_cab_valorCMV,
    v_cab_quantidadeExtemporanea,
    v_cab_valorAcrescimoExtempSubt,
    v_cab_valorAcrescimoExtempItem,
    v_cab_valorAcrescimoExtempGera,
    v_cab_valorAcrescimoExtempTota,
    v_est_grupoFiscal,
    v_pessEst_regimeTributario,
    v_munEndEst_uf,
    v_pess_indicadorInscricaoEstad,
    v_endPess_enderecoPessoa,
    v_munEndPess_uf,
    v_munEndEntr_uf
  FROM MODOCUMENTOSFISCAIS 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
  WHERE cab.idDocumentoFiscal = p_item_idDocumentoFiscal;
  v_ini_cab_valorFreteItem := v_cab_valorFreteItem;
  v_ini_cab_valorFreteGeral := v_cab_valorFreteGeral;
  SELECT
    diminuiDescontoPrUnit,
    somaAcrescimosPrUnit,
    somaFreteSeguroPrUnit
  INTO
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit
  FROM PAMODELOSDOCUMENTO
  WHERE modeloDocumento = p_item_modeloDocumento;
  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_valorFreteTotal          := 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_item_quantidadeDevolvidaRet  := 0;
  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_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_movimentaEstoqueFiscal  := p_item_movimentaEstoqueFiscal;
  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_stICMSEscrituracao      := p_item_stICMSEscrituracao;
  v_item_reducaoBaseICMSEscritur := p_item_reducaoBaseICMSEscritur;
  v_item_aliquotaICMSEscrituraca := p_item_aliquotaICMSEscrituraca;
  v_item_diferimentoICMSEscritur := p_item_diferimentoICMSEscritur;
  v_item_margemValorAdicSTEscrit := p_item_margemValorAdicSTEscrit;
  v_item_reducaoBaseSTEscriturac := p_item_reducaoBaseSTEscriturac;
  v_item_aliquotaICMSSTEscritura := p_item_aliquotaICMSSTEscritura;
  v_item_somarICMSST             := p_item_somarICMSST;
  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_baseICMSEscrituracao    := p_item_baseICMSEscrituracao;
  v_item_valorICMSEscrituracao   := p_item_valorICMSEscrituracao;
  v_item_valorICMSDesonEscritura := p_item_valorICMSDesonEscritura;
  v_item_baseICMSSTEscrituracao  := p_item_baseICMSSTEscrituracao;
  v_item_valorICMSSTEscrituracao := p_item_valorICMSSTEscrituracao;
  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;
  IF p_manterFinanceiro_Retotalizar = 0 THEN
    SELECT COALESCE (MAX(1), 0)
    INTO v_cab_promocaoExiste
    FROM MODOCFISCALXPROMOCOES
    WHERE idDocumentoFiscal = p_item_idDocumentoFiscal;
  END IF;
  IF p_item_idItemDocFiscal > 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.quantidadeDevolvidaRetornada,
        a.pesoLiquido,
        a.pesoBruto,
        a.valorProdutoServicoBruto,
        a.valorProdutoServico,
        a.valorDescontoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.quantidadeExtemporanea,
        a.valorAcrescimoExtempSubtotal,
        a.valorAcrescimoExtempItem,
        a.valorDescontoCustoOpItem,
        a.valorAcrescimoCustoOpItem,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorAcrescimoExtempGeral,
        a.valorDescontoCustoOpGeral,
        a.valorAcrescimoCustoOpGeral,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.valorFreteTotal,
        a.valorSeguroTotal,
        a.valorDescontoTotal,
        a.valorOutrasDespesasTotal,
        a.valorAdicFreteMarinhaMerTotal,
        a.valorDespesasAduaneirasTotal,
        a.valorAcrescimoExtempTotal,
        a.valorDescontoCustoOpTotal,
        a.valorAcrescimoCustoOpTotal,
        a.operacaoFiscal,
        a.movimentaEstoque,
        a.movimentaEstoqueFiscal,
        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.stICMSEscrituracao,
        a.reducaoBaseICMSEscrituracao,
        a.aliquotaICMSEscrituracao,
        a.diferimentoICMSEscrituracao,
        a.margemValorAdicSTEscrituracao,
        a.reducaoBaseSTEscrituracao,
        a.aliquotaICMSSTEscrituracao,
        a.somarICMSST,
        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.baseICMSEscrituracao,
        a.valorICMSEscrituracao,
        a.valorICMSDesonEscrituracao,
        a.baseICMSSTEscrituracao,
        a.valorICMSSTEscrituracao,
        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,
        a.valorCustoOperacao,
        a.valorCMV,
        prod.tipoProduto
      FROM MODOCFISCALXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      WHERE a.idItemDocFiscal = p_item_idItemDocFiscal)
    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_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_item_quantidadeDevolvidaRet := a.quantidadeDevolvidaRetornada;
      IF p_buscarAliquotas_CalcularImp ='T'
      THEN
        v_item_movimentaEstoque        := a.movimentaEstoque;
        v_item_movimentaEstoqueFiscal  := a.movimentaEstoqueFiscal;
        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_stICMSEscrituracao      := a.stICMSEscrituracao;
        v_item_reducaoBaseICMSEscritur := a.reducaoBaseICMSEscrituracao;
        v_item_aliquotaICMSEscrituraca := a.aliquotaICMSEscrituracao;
        v_item_diferimentoICMSEscritur := a.diferimentoICMSEscrituracao;
        v_item_margemValorAdicSTEscrit := a.margemValorAdicSTEscrituracao;
        v_item_reducaoBaseSTEscriturac := a.reducaoBaseSTEscrituracao;
        v_item_aliquotaICMSSTEscritura := a.aliquotaICMSSTEscrituracao;
        v_item_somarICMSST             := a.somarICMSST;
        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_baseICMSEscrituracao    := a.baseICMSEscrituracao;
        v_item_valorICMSEscrituracao   := a.valorICMSEscrituracao;
        v_item_valorICMSDesonEscritura := a.valorICMSDesonEscrituracao;
        v_item_baseICMSSTEscrituracao  := a.baseICMSSTEscrituracao;
        v_item_valorICMSSTEscrituracao := a.valorICMSSTEscrituracao;
        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 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 <> p_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;
        v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
        v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
        v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
        v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
        v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
        v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
        v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
        v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
        v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
        v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
        v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
        v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
        v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      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,
    p_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);
  v_item_valorAcrescimoExtempSub := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
    p_item_quantidade,
    v_item_precoUnitario,
    p_item_quantidadeExtemporanea,
    p_item_acrescimoUnitarioExtemp);
  v_item_valorAcrescimoExtempTot := FUNC_ADD_CALC_EXTEMP_TOTAL(
    v_item_valorAcrescimoExtempSub,
    p_item_valorAcrescimoExtempIte,
    p_item_valorAcrescimoExtempGer);
  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,
        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 = CASE WHEN v_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
      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,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_estabelecimento,
        NULL, -- p_cab_dataPrecoInicial
        TRUNC(SYSDATE), -- p_cab_dataPrecoFinal
        v_cab_pessoa,
        v_cab_projeto,
        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_DOC_FISC_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_227_manterPessoaOrcam,
        p_config_230_etapaPedComprParc,
        p_config_362_calcCustoPorGrade,
        p_config_378_calcularVolumes,
        p_config_413_obs_add_marca,
        p_manterFinanceiro_Retotalizar,
        'S', -- p_buscarAliquotas_CalcularImp
        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_calcularImpostos,
        0, -- p_item_idItemDocFiscal
        p_item_idDocumentoFiscal,
        p_item_pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo,
        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
        CASE
          WHEN p_item_quantidade = 0
          THEN 0
          ELSE ROUND(p_item_quantidadeExtemporanea * a.quantidade / p_item_quantidade, 2)
        END, -- p_item_quantidadeExtemporanea
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_acrescimoUnitarioExtemp
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_acrescimoUnitarioExtemp
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoExtempIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpIt
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpIt
        p_item_observacoesDigitadas,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorFreteGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_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_valorAcrescimoExtempGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpGe
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpGe
        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
        p_item_percentualDevolucao,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorIPIDevolucao
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorIPIDevolucao,
        v_combo_operacaoFiscal,
        p_item_movimentaEstoque,
        p_item_movimentaEstoqueFiscal,
        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
        '  ', -- p_item_stICMSEscrituracao
        0, -- p_item_reducaoBaseICMSEscritur
        0, -- p_item_aliquotaICMSEscrituraca
        0, -- p_item_diferimentoICMSEscritur
        0, -- p_item_margemValorAdicSTEscrit
        0, -- p_item_reducaoBaseSTEscriturac
        0, -- p_item_aliquotaICMSSTEscritura
        0, -- p_item_somarICMSST
        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_baseICMSEscrituracao
        0, -- p_item_valorICMSEscrituracao
        0, -- p_item_valorICMSDesonEscritura
        0, -- p_item_baseICMSSTEscrituracao
        0, -- p_item_valorICMSSTEscrituracao
        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_idItemDocFiscal,
        /* Retornos */
        r_calcularImpostos,
        v_auxNumber, -- r_item_idItemDocFiscal
        r_buffer_idItemDocFiscal,
        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_DOC_FISC_ITEM_COMBO_RESID (
        p_item_idDocumentoFiscal,
        v_item_valorProdutoServico,
        p_item_valorDescontoItem,
        p_item_valorAcrescimoItem,
        v_modDoc_diminuiDescontoPrUnit,
        v_modDoc_somaAcrescimosPrUnit,
        r_buffer_idItemDocFiscal,
        r_valorInserido);
      r_calcularImpostos := 1;
    END IF;
  ELSE
    IF r_item_idItemDocFiscal <= 0 THEN
      r_item_idItemDocFiscal := FUNC_ADD_BUSCA_PROXIMO_ID ('MODOCFISCALXITENS', 'idItemDocFiscal', 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
          OR p_item_valorAcrescimoExtempGer <> 0
          OR p_item_valorDescontoCustoOpGer <> 0
          OR p_item_valorAcrescimoCustoOpGe <> 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_DOC_FISC_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          p_item_idDocumentoFiscal,
          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 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,
        p_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,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_finalidadeNota,
        v_cab_estabelecimento,
        v_cab_nfFornecedor,
        SYSDATE, -- p_cab_dataEmissao
        v_cab_pessoa,
        v_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,
        p_item_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
        1, -- 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_item_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_item_stICMSEscrituracao,
        v_item_reducaoBaseICMSEscritur,
        v_item_aliquotaICMSEscrituraca,
        v_item_diferimentoICMSEscritur,
        v_item_margemValorAdicSTEscrit,
        v_item_reducaoBaseSTEscriturac,
        v_item_aliquotaICMSSTEscritura,
        v_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,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_estabelecimento,
        v_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
        p_item_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
        1, -- p_calcularICMSEscrituracao
        v_item_stICMSEscrituracao,
        v_item_reducaoBaseICMSEscritur,
        v_item_aliquotaICMSEscrituraca,
        v_item_diferimentoICMSEscritur,
        0, -- p_baseICMSEscrituracao
        0, -- p_valorICMSEscrituracao
        0, -- p_valorICMSDesonEscrituracao
        1, -- p_calcularICMSSTEscrituracao
        v_item_margemValorAdicSTEscrit,
        v_item_reducaoBaseSTEscriturac,
        v_item_aliquotaICMSSTEscritura,
        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_item_baseICMSEscrituracao,
        v_item_valorICMSEscrituracao,
        v_item_valorICMSDesonEscritura,
        v_item_baseICMSSTEscrituracao,
        v_item_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,
      v_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,
      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,
      v_item_valorICMSSTEscrituracao,
      v_item_somarICMSST,
      v_item_valorAcrescimoExtempTot,
      v_modDoc_geraFinanceiro);
    v_item_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
      v_cab_nfFornecedor,
      v_cab_tipoPagamentoFrete,
      v_item_valorProdutoServico,
      v_item_valorFreteTotal,
      v_item_valorSeguroTotal,
      v_item_valorDescontoTotal,
      v_item_valorOutrasDespesasTot,
      p_item_valorIPIDevolucao,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      v_item_valorICMSST,
      v_item_valorICMSSTEscrituracao,
      v_item_somarICMSST
      );

    ADD_CALCULA_CUSTO_CMV (
      v_cab_atualizaCustoMedio,
      v_cab_estabelecimento,
      v_cab_nfFornecedor,
      p_item_modeloDocumento,
      p_item_quantidade,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      p_item_valorIPIDevolucao,
      v_item_valorPIS,
      v_item_valorPISST,
      v_item_valorCOFINS,
      v_item_valorCOFINSST,
      v_item_valorCreditoSimplesNac,
      v_item_valorICMS,
      v_item_valorICMSST,
      v_item_valorICMSSTEscrituracao,
      v_item_valorLiquidoItem,
      p_item_valorDescontoCustoOpIte,
      p_item_valorDescontoCustoOpGer,
      p_item_valorAcrescimoCustoOpIt,
      p_item_valorAcrescimoCustoOpGe,
      v_item_valorAcrescimoExtempTot,
      v_item_valorDescontoCustoOpTot,
      v_item_valorAcrescimoCustoOpTo,
      v_item_precoCustoOperacao,
      v_item_valorCustoOperacao,
      v_item_precoCMV,
      v_item_valorCMV);
    IF v_inserindoItem = 1 THEN
      SELECT COALESCE (MAX (sequencia),0) + 1
      INTO v_item_sequencia
      FROM MODOCFISCALXITENS
      WHERE idDocumentoFiscal = p_item_idDocumentoFiscal;
      v_cab_ultimoVendedorItem := p_item_vendedor;
    END IF;
    IF v_item_cancelado = 0 THEN
      IF p_manterFinanceiro_Retotalizar <> 2 THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume + TRUNC(CASE WHEN p_item_controleQuantidade = 1 AND p_item_loteMultiplo <> 0 THEN p_item_quantidade / p_item_loteMultiplo ELSE p_item_quantidadeConvertida END,0);
        END IF;
        v_cab_pesoLiquido := v_cab_pesoLiquido + p_item_pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto + p_item_pesoBruto;
      END IF;
      v_cab_quantidade := v_cab_quantidade + p_item_quantidadeConvertida;
      IF v_prod_tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorServicos := v_cab_valorServicos + v_item_valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos + p_item_valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorProdutos := v_cab_valorProdutos + v_item_valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos + p_item_valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem + p_item_valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem + p_item_valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem + p_item_valorAdicFreteMarItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem + p_item_valorDespesasAduanItem;
      v_cab_valorFreteGeral := v_cab_valorFreteGeral + p_item_valorFreteGeral;
      v_cab_valorSeguroGeral := v_cab_valorSeguroGeral + p_item_valorSeguroGeral;
      v_cab_valorDescontoGeral := v_cab_valorDescontoGeral + v_item_valorDescontoGeral;
      v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral + p_item_valorOutrasDespesasGer;
      v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral + p_item_valorAdicFreteMarGeral;
      v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral + p_item_valorDespesasAduanGeral;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento + v_item_valorBasePagamento;
      IF p_item_usarPrecoAVista = 1
        AND v_item_geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo + v_item_valorProdutoServico - v_item_valorDescontoTotal + v_item_valorOutrasDespesasTot;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento + v_item_valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento + v_item_valorOutrasDespPagament;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento + v_item_valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal + v_item_valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal + v_item_valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal + v_item_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_item_valorOutrasDespesasTot;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal + v_item_valorAdicFreteMarTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal + v_item_valorDespesasAduanTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem + v_item_valorLiquidoItem;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem + p_item_valorDescontoCustoOpIte;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera + p_item_valorDescontoCustoOpGer;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota + v_item_valorDescontoCustoOpTot;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte + p_item_valorAcrescimoCustoOpIt;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer + p_item_valorAcrescimoCustoOpGe;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot + v_item_valorAcrescimoCustoOpTo;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao + v_item_valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV + v_item_valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea + p_item_quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt + v_item_valorAcrescimoExtempSub;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem + p_item_valorAcrescimoExtempIte;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera + p_item_valorAcrescimoExtempGer;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota + v_item_valorAcrescimoExtempTot;
    END IF;
    UPDATE MODOCUMENTOSFISCAIS SET
      modalidadeFrete               = v_cab_modalidadeFrete,
      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,
      valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
      valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
      valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
      valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
      valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
      valorCustoOperacao            = v_cab_valorCustoOperacao,
      valorCMV                      = v_cab_valorCMV,
      quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
      valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
      valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
      valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
    WHERE idDocumentoFiscal = p_item_idDocumentoFiscal;
    IF p_item_idItemDocFiscal > 0 THEN
      DELETE MODOCFISCALXCOMPOSICOESPR compDoc
      WHERE compDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND EXISTS(
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.produto = comp.produto
        WHERE comp.composicaoPreco = compDoc.composicaoPreco
        AND gradProd.gradeProduto <> p_item_gradeProduto);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      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_413_obs_add_marca,
      ' ',
      0,
      'D',
      p_item_idItemDocFiscal,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    MERGE INTO MODOCFISCALXITENS a USING (
      SELECT
        r_item_idItemDocFiscal         idItemDocFiscal,
        p_item_idDocumentoFiscal       idDocumentoFiscal,
        v_item_sequencia               sequencia,
        v_item_cancelado               cancelado,
        p_item_pedidoCompraFornecedor  pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo sequenciaPedidoCompraFornec,
        p_item_modeloDocumento         modeloDocumento,
        p_item_estabelecimentoOriginal estabelecimentoOriginal,
        p_item_vendedor                vendedor,
        p_item_gradeProduto            gradeProduto,
        p_item_idFormulaTinta          idFormulaTinta,
        p_item_personalizacao          personalizacao,
        p_item_idLoteEstoque           idLoteEstoque,
        p_item_operacaoFiscal          operacaoFiscal,
        v_item_movimentaEstoque        movimentaEstoque,
        v_item_movimentaEstoqueFiscal  movimentaEstoqueFiscal,
        v_item_geraFinanceiro          geraFinanceiro,
        p_item_localEstoque            localEstoque,
        p_item_pessoaParticipante      pessoaParticipante,
        p_item_controleQuantidade      controleQuantidade,
        p_item_unidadeMedidaConversao  unidadeMedidaConversao,
        p_item_conversorQuantidade     conversorQuantidade,
        p_item_loteMinimo              loteMinimo,
        p_item_loteMultiplo            loteMultiplo,
        p_item_altura                  altura,
        p_item_largura                 largura,
        p_item_comprimento             comprimento,
        p_item_pecas                   pecas,
        p_item_quantidade              quantidade,
        p_item_quantidadeConvertida    quantidadeConvertida,
        v_item_quantidadeDevolvidaRet  quantidadeDevolvidaRetornada,
        p_item_percentualDevolucao     percentualDevolucao,
        p_item_pesoLiquido             pesoLiquido,
        p_item_pesoBruto               pesoBruto,
        p_item_tipoPreco               tipoPreco,
        p_item_tabelaPreco             tabelaPreco,
        p_item_precoSugestaoAPrazo     precoSugestaoAPrazo,
        p_item_precoSugestaoAVista     precoSugestaoAVista,
        p_item_precoDesconto           precoDesconto,
        p_item_precoMinimo             precoMinimo,
        p_item_usarPrecoAVista         usarPrecoAVista,
        p_item_precoUnitarioBruto      precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos acrescimoUnitarioComposicao,
        v_item_precoUnitario           precoUnitario,
        v_item_precoUnitarioConvertido precoUnitarioConvertido,
        v_item_valorProdutoServicoBrut valorProdutoServicoBruto,
        v_item_valorProdutoServico     valorProdutoServico,
        p_item_percDescontoItem        percDescontoItem,
        p_item_valorDescontoItem       valorDescontoItem,
        p_item_percAcrescimoItem       percAcrescimoItem,
        p_item_valorAcrescimoItem      valorAcrescimoItem,
        p_item_valorFreteItem          valorFreteItem,
        p_item_valorSeguroItem         valorSeguroItem,
        p_item_valorAdicFreteMarItem   valorAdicFreteMarinhaMerItem,
        p_item_valorDespesasAduanItem  valorDespesasAduaneirasItem,
        p_item_valorFreteGeral         valorFreteGeral,
        p_item_valorSeguroGeral        valorSeguroGeral,
        v_item_valorDescontoGeral      valorDescontoGeral,
        p_item_valorOutrasDespesasGer  valorOutrasDespesasGeral,
        p_item_valorAdicFreteMarGeral  valorAdicFreteMarinhaMerGeral,
        p_item_valorDespesasAduanGeral valorDespesasAduaneirasGeral,
        v_item_valorBasePagamento      valorBasePagamento,
        v_item_valorDescontoPagamento  valorDescontoPagamento,
        v_item_valorOutrasDespPagament valorOutrasDespesasPagamento,
        v_item_valorJurosPagamento     valorJurosPagamento,
        v_item_valorFreteTotal         valorFreteTotal,
        v_item_valorSeguroTotal        valorSeguroTotal,
        v_item_valorDescontoTotal      valorDescontoTotal,
        v_item_valorOutrasDespesasTot  valorOutrasDespesasTotal,
        v_item_valorAdicFreteMarTotal  valorAdicFreteMarinhaMerTotal,
        v_item_valorDespesasAduanTotal valorDespesasAduaneirasTotal,
        v_item_cfop                    cfop,
        v_item_indicadorISSQN          indicadorISSQN,
        v_item_aliquotaISSQN           aliquotaISSQN,
        v_item_retidoISSQN             retidoISSQN,
        v_item_tributadoForaMunicipio  tributadoForaMunicipio,
        v_item_incentivoFiscal         incentivoFiscal,
        v_item_listaServicos           listaServicos,
        v_item_cnae                    cnae,
        v_item_idServicoMunicipio      idServicoMunicipio,
        v_item_numeroProcessoAdministr numeroProcessoAdministrativo,
        v_item_baseISSQN               baseISSQN,
        v_item_valorISSQN              valorISSQN,
        v_item_retencaoIRRF            retencaoIRRF,
        v_item_baseRetIRRF             baseRetIRRF,
        v_item_valorRetIRRF            valorRetIRRF,
        v_item_retencaoINSS            retencaoINSS,
        v_item_baseRetINSS             baseRetINSS,
        v_item_valorRetINSS            valorRetINSS,
        v_item_retencaoPIS             retencaoPIS,
        v_item_baseRetPIS              baseRetPIS,
        v_item_valorRetPIS             valorRetPIS,
        v_item_retencaoCOFINS          retencaoCOFINS,
        v_item_baseRetCOFINS           baseRetCOFINS,
        v_item_valorRetCOFINS          valorRetCOFINS,
        v_item_retencaoCSLL            retencaoCSLL,
        v_item_baseRetCSLL             baseRetCSLL,
        v_item_valorRetCSLL            valorRetCSLL,
        v_item_retencaoOutros          retencaoOutros,
        v_item_baseRetOutros           baseRetOutros,
        v_item_valorRetOutros          valorRetOutros,
        v_item_aliquotaII              aliquotaII,
        v_item_baseII                  baseII,
        v_item_valorII                 valorII,
        v_item_aliquotaIOF             aliquotaIOF,
        v_item_baseIOF                 baseIOF,
        v_item_valorIOF                valorIOF,
        v_item_codigoEnquadramentoIPI  codigoEnquadramentoIPI,
        v_item_stIPI                   stIPI,
        v_item_aliquotaIPI             aliquotaIPI,
        v_item_valorAliquotaIPI        valorAliquotaIPI,
        v_item_baseIPI                 baseIPI,
        v_item_valorIPI                valorIPI,
        p_item_valorIPIDevolucao       valorIPIDevolucao,
        v_item_stPIS                   stPIS,
        v_item_aliquotaPIS             aliquotaPIS,
        v_item_valorAliquotaPIS        valorAliquotaPIS,
        v_item_basePIS                 basePIS,
        v_item_valorPIS                valorPIS,
        v_item_aliquotaPISST           aliquotaPISST,
        v_item_valorAliquotaPISST      valorAliquotaPISST,
        v_item_basePISST               basePISST,
        v_item_valorPISST              valorPISST,
        v_item_stCOFINS                stCOFINS,
        v_item_aliquotaCOFINS          aliquotaCOFINS,
        v_item_valorAliquotaCOFINS     valorAliquotaCOFINS,
        v_item_baseCOFINS              baseCOFINS,
        v_item_valorCOFINS             valorCOFINS,
        v_item_aliquotaCOFINSST        aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST   valorAliquotaCOFINSST,
        v_item_baseCOFINSST            baseCOFINSST,
        v_item_valorCOFINSST           valorCOFINSST,
        v_item_stSimplesNacional       stSimplesNacional,
        v_item_creditoSimplesNacional  creditoSimplesNacional,
        v_item_baseCreditoSimplesNac   baseCreditoSimplesNacional,
        v_item_valorCreditoSimplesNac  valorCreditoSimplesNacional,
        v_item_stICMS                  stICMS,
        v_item_modalBaseCalcICMS       modalidadeBaseCalcICMS,
        v_item_reducaoBaseICMS         reducaoBaseICMS,
        v_item_aliquotaICMS            aliquotaICMS,
        v_item_diferimentoICMS         diferimentoICMS,
        v_item_motivoDesoneracaoICMS   motivoDesoneracaoICMS,
        v_item_idBeneficio             idBeneficio,
        v_item_baseICMS                baseICMS,
        v_item_valorICMSOperacao       valorICMSOperacao,
        v_item_valorICMSDiferido       valorICMSDiferido,
        v_item_valorICMS               valorICMS,
        v_item_valorICMSDesoneracao    valorICMSDesoneracao,
        v_item_modalBaseCalcICMSST     modalidadeBaseCalcICMSST,
        v_item_margemValorAdicionadoST margemValorAdicionadoST,
        v_item_reducaoBaseST           reducaoBaseST,
        v_item_aliquotaICMSST          aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin aliquotaSTSuportConsFinal,
        v_item_baseICMSST              baseICMSST,
        v_item_valorICMSST             valorICMSST,
        v_item_baseICMSSTAnteriormente baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment valorICMSSTAnteriormente,
        v_item_valorICMSProprioSubstit valorICMSProprioSubstituto,
        v_item_reducaoBaseICMSEfetivo  reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo     aliquotaICMSEfetivo,
        v_item_baseICMSEfetivo         baseICMSEfetivo,
        v_item_valorICMSEfetivo        valorICMSEfetivo,
        v_item_stICMSEscrituracao      stICMSEscrituracao,
        v_item_reducaoBaseICMSEscritur reducaoBaseICMSEscrituracao,
        v_item_aliquotaICMSEscrituraca aliquotaICMSEscrituracao,
        v_item_diferimentoICMSEscritur diferimentoICMSEscrituracao,
        v_item_baseICMSEscrituracao    baseICMSEscrituracao,
        v_item_valorICMSEscrituracao   valorICMSEscrituracao,
        v_item_valorICMSDesonEscritura valorICMSDesonEscrituracao,
        v_item_margemValorAdicSTEscrit margemValorAdicSTEscrituracao,
        v_item_reducaoBaseSTEscriturac reducaoBaseSTEscrituracao,
        v_item_aliquotaICMSSTEscritura aliquotaICMSSTEscrituracao,
        v_item_baseICMSSTEscrituracao  baseICMSSTEscrituracao,
        v_item_valorICMSSTEscrituracao valorICMSSTEscrituracao,
        v_item_somarICMSST             somarICMSST,
        v_item_aliquotaICMSUFDestinat  aliquotaICMSUFDestinatario,
        v_item_aliquotaICMSInterestad  aliquotaICMSInterestadual,
        v_item_partilhaICMSInterestad  partilhaICMSInterestadual,
        v_item_baseICMSUFDestinatario  baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente     baseICMSUFRemetente,
        v_item_valorICMSUFRemetente    valorICMSUFRemetente,
        v_item_aliquotaFCP             aliquotaFCP,
        v_item_baseFCP                 baseFCP,
        v_item_valorFCP                valorFCP,
        v_item_aliquotaFCPST           aliquotaFCPST,
        v_item_baseFCPST               baseFCPST,
        v_item_valorFCPST              valorFCPST,
        v_item_aliquotaFCPSTAnteriorm  aliquotaFCPSTAnteriormente,
        v_item_baseFCPSTAnteriormente  baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente valorFCPSTAnteriormente,
        v_item_aliquotaFCPUFDestinat   aliquotaFCPUFDestinatario,
        v_item_baseFCPUFDestinatario   baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario  valorFCPUFDestinatario,
        v_item_aliquotaEstImpFederais  aliquotaEstimadaImpFederais,
        v_item_aliquotaEstImpEstaduais aliquotaEstimadaImpEstaduais,
        v_item_aliquotaEstImpMunicipai aliquotaEstimadaImpMunicipais,
        v_item_baseEstimadaImpostos    baseEstimadaImpostos,
        v_item_valorEstImpFederais     valorEstimadoImpFederais,
        v_item_valorEstImpEstaduais    valorEstimadoImpEstaduais,
        v_item_valorEstImpMunicipais   valorEstimadoImpMunicipais,
        v_item_valorLiquidoItem        valorLiquidoItem,
        p_item_valorDescontoCustoOpIte valorDescontoCustoOpItem,
        p_item_valorDescontoCustoOpGer valorDescontoCustoOpGeral,
        v_item_valorDescontoCustoOpTot valorDescontoCustoOpTotal,
        p_item_valorAcrescimoCustoOpIt valorAcrescimoCustoOpItem,
        p_item_valorAcrescimoCustoOpGe valorAcrescimoCustoOpGeral,
        v_item_valorAcrescimoCustoOpTo valorAcrescimoCustoOpTotal,
        v_item_precoCustoOperacao      precoCustoOperacao,
        v_item_valorCustoOperacao      valorCustoOperacao,
        v_item_precoCMV                precoCMV,
        v_item_valorCMV                valorCMV,
        p_item_quantidadeExtemporanea  quantidadeExtemporanea,
        p_item_acrescimoUnitarioExtemp acrescimoUnitarioExtemporaneo,
        v_item_valorAcrescimoExtempSub valorAcrescimoExtempSubtotal,
        p_item_valorAcrescimoExtempIte valorAcrescimoExtempItem,
        p_item_valorAcrescimoExtempGer valorAcrescimoExtempGeral,
        v_item_valorAcrescimoExtempTot valorAcrescimoExtempTotal,
        p_item_observacoesDigitadas    observacoesDigitadas,
        v_observacoes                  observacoes
      FROM DUAL) b
    ON (a.idItemDocFiscal = b.idItemDocFiscal)
    WHEN MATCHED THEN UPDATE SET
      a.idDocumentoFiscal             = b.idDocumentoFiscal,
      a.sequencia                     = b.sequencia,
      a.cancelado                     = b.cancelado,
      a.pedidoCompraFornecedor        = b.pedidoCompraFornecedor,
      a.sequenciaPedidoCompraFornec   = b.sequenciaPedidoCompraFornec,
      a.vendedor                      = b.vendedor,
      a.modeloDocumento               = b.modeloDocumento,
      a.estabelecimentoOriginal       = b.estabelecimentoOriginal,
      a.gradeProduto                  = b.gradeProduto,
      a.idFormulaTinta                = b.idFormulaTinta,
      a.personalizacao                = b.personalizacao,
      a.idLoteEstoque                 = b.idLoteEstoque,
      a.operacaoFiscal                = b.operacaoFiscal,
      a.movimentaEstoque              = b.movimentaEstoque,
      a.movimentaEstoqueFiscal        = b.movimentaEstoqueFiscal,
      a.geraFinanceiro                = b.geraFinanceiro,
      a.localEstoque                  = b.localEstoque,
      a.pessoaParticipante            = b.pessoaParticipante,
      a.controleQuantidade            = b.controleQuantidade,
      a.unidadeMedidaConversao        = b.unidadeMedidaConversao,
      a.conversorQuantidade           = b.conversorQuantidade,
      a.loteMinimo                    = b.loteMinimo,
      a.loteMultiplo                  = b.loteMultiplo,
      a.altura                        = b.altura,
      a.largura                       = b.largura,
      a.comprimento                   = b.comprimento,
      a.pecas                         = b.pecas,
      a.quantidade                    = b.quantidade,
      a.quantidadeConvertida          = b.quantidadeConvertida,
      a.quantidadeDevolvidaRetornada  = b.quantidadeDevolvidaRetornada,
      a.percentualDevolucao           = b.percentualDevolucao,
      a.pesoLiquido                   = b.pesoLiquido,
      a.pesoBruto                     = b.pesoBruto,
      a.tipoPreco                     = b.tipoPreco,
      a.tabelaPreco                   = b.tabelaPreco,
      a.precoSugestaoAPrazo           = b.precoSugestaoAPrazo,
      a.precoSugestaoAVista           = b.precoSugestaoAVista,
      a.precoDesconto                 = b.precoDesconto,
      a.precoMinimo                   = b.precoMinimo,
      a.usarPrecoAVista               = b.usarPrecoAVista,
      a.precoUnitarioBruto            = b.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao   = b.acrescimoUnitarioComposicao,
      a.precoUnitario                 = b.precoUnitario,
      a.precoUnitarioConvertido       = b.precounitarioConvertido,
      a.valorProdutoServicoBruto      = b.valorProdutoServicoBruto,
      a.valorProdutoServico           = b.valorProdutoServico,
      a.percDescontoItem              = b.percDescontoItem,
      a.valorDescontoItem             = b.valorDescontoItem,
      a.percAcrescimoItem             = b.percAcrescimoItem,
      a.valorAcrescimoItem            = b.valorAcrescimoItem,
      a.valorFreteItem                = b.valorFreteItem,
      a.valorSeguroItem               = b.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem  = b.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem   = b.valorDespesasAduaneirasItem,
      a.valorFreteGeral               = b.valorFreteGeral,
      a.valorSeguroGeral              = b.valorSeguroGeral,
      a.valorDescontoGeral            = b.valorDescontoGeral,
      a.valorOutrasDespesasGeral      = b.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral = b.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral  = b.valorDespesasAduaneirasGeral,
      a.valorBasePagamento            = b.valorBasePagamento,
      a.valorDescontoPagamento        = b.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento  = b.valorOutrasDespesasPagamento,
      a.valorJurosPagamento           = b.valorJurosPagamento,
      a.valorFreteTotal               = b.valorFreteTotal,
      a.valorSeguroTotal              = b.valorSeguroTotal,
      a.valorDescontoTotal            = b.valorDescontoTotal,
      a.valorOutrasDespesasTotal      = b.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal = b.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal  = b.valorDespesasAduaneirasTotal,
      a.cfop                          = b.cfop,
      a.indicadorISSQN                = b.indicadorISSQN,
      a.aliquotaISSQN                 = b.aliquotaISSQN,
      a.retidoISSQN                   = b.retidoISSQN,
      a.tributadoForaMunicipio        = b.tributadoForaMunicipio,
      a.incentivoFiscal               = b.incentivoFiscal,
      a.listaServicos                 = b.listaServicos,
      a.cnae                          = b.cnae,
      a.idServicoMunicipio            = b.idServicoMunicipio,
      a.numeroProcessoAdministrativo  = b.numeroProcessoAdministrativo,
      a.baseISSQN                     = b.baseISSQN,
      a.valorISSQN                    = b.valorISSQN,
      a.retencaoIRRF                  = b.retencaoIRRF,
      a.baseRetIRRF                   = b.baseRetIRRF,
      a.valorRetIRRF                  = b.valorRetIRRF,
      a.retencaoINSS                  = b.retencaoINSS,
      a.baseRetINSS                   = b.baseRetINSS,
      a.valorRetINSS                  = b.valorRetINSS,
      a.retencaoPIS                   = b.retencaoPIS,
      a.baseRetPIS                    = b.baseRetPIS,
      a.valorRetPIS                   = b.valorRetPIS,
      a.retencaoCOFINS                = b.retencaoCOFINS,
      a.baseRetCOFINS                 = b.baseRetCOFINS,
      a.valorRetCOFINS                = b.valorRetCOFINS,
      a.retencaoCSLL                  = b.retencaoCSLL,
      a.baseRetCSLL                   = b.baseRetCSLL,
      a.valorRetCSLL                  = b.valorRetCSLL,
      a.retencaoOutros                = b.retencaoOutros,
      a.baseRetOutros                 = b.baseRetOutros,
      a.valorRetOutros                = b.valorRetOutros,
      a.aliquotaII                    = b.aliquotaII,
      a.baseII                        = b.baseII,
      a.valorII                       = b.valorII,
      a.aliquotaIOF                   = b.aliquotaIOF,
      a.baseIOF                       = b.baseIOF,
      a.valorIOF                      = b.valorIOF,
      a.codigoEnquadramentoIPI        = b.codigoEnquadramentoIPI,
      a.stIPI                         = b.stIPI,
      a.aliquotaIPI                   = b.aliquotaIPI,
      a.valorAliquotaIPI              = b.valorAliquotaIPI,
      a.baseIPI                       = b.baseIPI,
      a.valorIPI                      = b.valorIPI,
      a.valorIPIDevolucao             = b.valorIPIDevolucao,
      a.stPIS                         = b.stPIS,
      a.aliquotaPIS                   = b.aliquotaPIS,
      a.valorAliquotaPIS              = b.valorAliquotaPIS,
      a.basePIS                       = b.basePIS,
      a.valorPIS                      = b.valorPIS,
      a.aliquotaPISST                 = b.aliquotaPISST,
      a.valorAliquotaPISST            = b.valorAliquotaPISST,
      a.basePISST                     = b.basePISST,
      a.valorPISST                    = b.valorPISST,
      a.stCOFINS                      = b.stCOFINS,
      a.aliquotaCOFINS                = b.aliquotaCOFINS,
      a.valorAliquotaCOFINS           = b.valorAliquotaCOFINS,
      a.baseCOFINS                    = b.baseCOFINS,
      a.valorCOFINS                   = b.valorCOFINS,
      a.aliquotaCOFINSST              = b.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST         = b.valorAliquotaCOFINSST,
      a.baseCOFINSST                  = b.baseCOFINSST,
      a.valorCOFINSST                 = b.valorCOFINSST,
      a.stSimplesNacional             = b.stSimplesNacional,
      a.creditoSimplesNacional        = b.creditoSimplesNacional,
      a.baseCreditoSimplesNacional    = b.baseCreditoSimplesNacional,
      a.valorCreditoSimplesNacional   = b.valorCreditoSimplesNacional,
      a.stICMS                        = b.stICMS,
      a.modalidadeBaseCalcICMS        = b.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS               = b.reducaoBaseICMS,
      a.aliquotaICMS                  = b.aliquotaICMS,
      a.diferimentoICMS               = b.diferimentoICMS,
      a.motivoDesoneracaoICMS         = b.motivoDesoneracaoICMS,
      a.idBeneficio                   = b.idBeneficio,
      a.baseICMS                      = b.baseICMS,
      a.valorICMSoperacao             = b.valorICMSoperacao,
      a.valorICMSdiferido             = b.valorICMSdiferido,
      a.valorICMS                     = b.valorICMS,
      a.valorICMSdesoneracao          = b.valorICMSdesoneracao,
      a.modalidadeBaseCalcICMSST      = b.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST       = b.margemValorAdicionadoST,
      a.reducaoBaseST                 = b.reducaoBaseST,
      a.aliquotaICMSST                = b.aliquotaICMSST,
      a.aliquotaSTSuportConsFinal     = b.aliquotaSTSuportConsFinal,
      a.baseICMSST                    = b.baseICMSST,
      a.valorICMSST                   = b.valorICMSST,
      a.baseICMSSTAnteriormente       = b.baseICMSSTAnteriormente,
      a.valorICMSSTAnteriormente      = b.valorICMSSTAnteriormente,
      a.valorICMSProprioSubstituto    = b.valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo        = b.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo           = b.aliquotaICMSEfetivo,
      a.baseICMSEfetivo               = b.baseICMSEfetivo,
      a.valorICMSEfetivo              = b.valorICMSEfetivo,
      a.stICMSEscrituracao            = b.stICMSEscrituracao,
      a.reducaoBaseICMSEscrituracao   = b.reducaoBaseICMSEscrituracao,
      a.aliquotaICMSEscrituracao      = b.aliquotaICMSEscrituracao,
      a.diferimentoICMSEscrituracao   = b.diferimentoICMSEscrituracao,
      a.baseICMSEscrituracao          = b.baseICMSEscrituracao,
      a.valorICMSEscrituracao         = b.valorICMSEscrituracao,
      a.valorICMSDesonEscrituracao    = b.valorICMSDesonEscrituracao,
      a.margemValorAdicSTEscrituracao = b.margemValorAdicSTEscrituracao,
      a.reducaoBaseSTEscrituracao     = b.reducaoBaseSTEscrituracao,
      a.aliquotaICMSSTEscrituracao    = b.aliquotaICMSSTEscrituracao,
      a.baseICMSSTEscrituracao        = b.baseICMSSTEscrituracao,
      a.valorICMSSTEscrituracao       = b.valorICMSSTEscrituracao,
      a.somarICMSST                   = b.somarICMSST,
      a.aliquotaICMSUFDestinatario    = b.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual     = b.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual     = b.partilhaICMSInterestadual,
      a.baseICMSUFDestinatario        = b.baseICMSUFDestinatario,
      a.valorICMSUFDestinatario       = b.valorICMSUFDestinatario,
      a.baseICMSUFRemetente           = b.baseICMSUFRemetente,
      a.valorICMSUFRemetente          = b.valorICMSUFRemetente,
      a.aliquotaFCP                   = b.aliquotaFCP,
      a.baseFCP                       = b.baseFCP,
      a.valorFCP                      = b.valorFCP,
      a.aliquotaFCPST                 = b.aliquotaFCPST,
      a.baseFCPST                     = b.baseFCPST,
      a.valorFCPST                    = b.valorFCPST,
      a.aliquotaFCPSTAnteriormente    = b.aliquotaFCPSTAnteriormente,
      a.baseFCPSTAnteriormente        = b.baseFCPSTAnteriormente,
      a.valorFCPSTAnteriormente       = b.valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario     = b.aliquotaFCPUFDestinatario,
      a.baseFCPUFDestinatario         = b.baseFCPUFDestinatario,
      a.valorFCPUFDestinatario        = b.valorFCPUFDestinatario,
      a.aliquotaestimadaimpfederais   = b.aliquotaestimadaimpfederais,
      a.aliquotaestimadaimpestaduais  = b.aliquotaestimadaimpestaduais,
      a.aliquotaestimadaimpmunicipais = b.aliquotaestimadaimpmunicipais,
      a.baseestimadaimpostos          = b.baseestimadaimpostos,
      a.valorestimadoimpfederais      = b.valorestimadoimpfederais,
      a.valorEstimadoImpEstaduais     = b.valorEstimadoImpEstaduais,
      a.valorEstimadoImpMunicipais    = b.valorEstimadoImpMunicipais,
      a.valorLiquidoItem              = b.valorLiquidoItem,
      a.valorDescontoCustoOpItem      = b.valorDescontoCustoOpItem,
      a.valorDescontoCustoOpGeral     = b.valorDescontoCustoOpGeral,
      a.valorDescontoCustoOpTotal     = b.valorDescontoCustoOpTotal,
      a.valorAcrescimoCustoOpItem     = b.valorAcrescimoCustoOpItem,
      a.valorAcrescimoCustoOpGeral    = b.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoCustoOpTotal    = b.valorAcrescimoCustoOpTotal,
      a.precoCustoOperacao            = b.precoCustoOperacao,
      a.valorCustoOperacao            = b.valorCustoOperacao,
      a.precoCMV                      = b.precoCMV,
      a.valorCMV                      = b.valorCMV,
      a.quantidadeExtemporanea        = b.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo = b.acrescimoUnitarioExtemporaneo,
      a.valorAcrescimoExtempSubtotal  = b.valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem      = b.valorAcrescimoExtempItem,
      a.valorAcrescimoExtempGeral     = b.valorAcrescimoExtempGeral,
      a.valorAcrescimoExtempTotal     = b.valorAcrescimoExtempTotal,
      a.observacoesDigitadas          = b.observacoesDigitadas,
      a.observacoes                   = b.observacoes
    WHEN NOT MATCHED THEN INSERT (
      idItemDocFiscal,
      idDocumentoFiscal,
      sequencia,
      cancelado,
      pedidoCompraFornecedor,
      sequenciaPedidoCompraFornec,
      modeloDocumento,
      estabelecimentoOriginal,
      vendedor,
      gradeProduto,
      idFormulaTinta,
      personalizacao,
      idLoteEstoque,
      operacaoFiscal,
      movimentaEstoque,
      movimentaEstoqueFiscal,
      geraFinanceiro,
      localEstoque,
      pessoaParticipante,
      controleQuantidade,
      unidadeMedidaConversao,
      conversorQuantidade,
      loteMinimo,
      loteMultiplo,
      altura,
      largura,
      comprimento,
      pecas,
      quantidade,
      quantidadeConvertida,
      quantidadeDevolvidaRetornada,
      percentualDevolucao,
      pesoLiquido,
      pesoBruto,
      tipoPreco,
      tabelaPreco,
      precoSugestaoAPrazo,
      precoSugestaoAVista,
      precoDesconto,
      precoMinimo,
      usarPrecoAVista,
      precoUnitarioBruto,
      acrescimoUnitarioComposicao,
      precoUnitario,
      precoUnitarioConvertido,
      valorProdutoServicoBruto,
      valorProdutoServico,
      percDescontoItem,
      valorDescontoItem,
      percAcrescimoItem,
      valorAcrescimoItem,
      valorFreteItem,
      valorSeguroItem,
      valorAdicFreteMarinhaMerItem,
      valorDespesasAduaneirasItem,
      valorFreteGeral,
      valorSeguroGeral,
      valorDescontoGeral,
      valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral,
      valorDespesasAduaneirasGeral,
      valorBasePagamento,
      valorDescontoPagamento,
      valorOutrasDespesasPagamento,
      valorJurosPagamento,
      valorFreteTotal,
      valorSeguroTotal,
      valorDescontoTotal,
      valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal,
      valorDespesasAduaneirasTotal,
      cfop,
      indicadorISSQN,
      aliquotaISSQN,
      retidoISSQN,
      tributadoForaMunicipio,
      incentivoFiscal,
      listaServicos,
      cnae,
      idServicoMunicipio,
      numeroProcessoAdministrativo,
      baseISSQN,
      valorISSQN,
      retencaoIRRF,
      baseRetIRRF,
      valorRetIRRF,
      retencaoINSS,
      baseRetINSS,
      valorRetINSS,
      retencaoPIS,
      baseRetPIS,
      valorRetPIS,
      retencaoCOFINS,
      baseRetCOFINS,
      valorRetCOFINS,
      retencaoCSLL,
      baseRetCSLL,
      valorRetCSLL,
      retencaoOutros,
      baseRetOutros,
      valorRetOutros,
      aliquotaII,
      baseII,
      valorII,
      aliquotaIOF,
      baseIOF,
      valorIOF,
      codigoEnquadramentoIPI,
      stIPI,
      aliquotaIPI,
      valorAliquotaIPI,
      baseIPI,
      valorIPI,
      valorIPIDevolucao,
      stPIS,
      aliquotaPIS,
      valorAliquotaPIS,
      basePIS,
      valorPIS,
      aliquotaPISST,
      valorAliquotaPISST,
      basePISST,
      valorPISST,
      stCOFINS,
      aliquotaCOFINS,
      valorAliquotaCOFINS,
      baseCOFINS,
      valorCOFINS,
      aliquotaCOFINSST,
      valorAliquotaCOFINSST,
      baseCOFINSST,
      valorCOFINSST,
      stSimplesNacional,
      creditoSimplesNacional,
      baseCreditoSimplesNacional,
      valorCreditoSimplesNacional,
      stICMS,
      modalidadeBaseCalcICMS,
      reducaoBaseICMS,
      aliquotaICMS,
      diferimentoICMS,
      motivoDesoneracaoICMS,
      idBeneficio,
      baseICMS,
      valorICMSOperacao,
      valorICMSDiferido,
      valorICMS,
      valorICMSDesoneracao,
      modalidadeBaseCalcICMSST,
      margemValorAdicionadoST,
      reducaoBaseST,
      aliquotaICMSST,
      aliquotaSTSuportConsFinal,
      baseICMSST,
      valorICMSST,
      baseICMSSTAnteriormente,
      valorICMSSTAnteriormente,
      valorICMSProprioSubstituto,
      reducaoBaseICMSEfetivo,
      aliquotaICMSEfetivo,
      baseICMSEfetivo,
      valorICMSEfetivo,
      stICMSEscrituracao,
      reducaoBaseICMSEscrituracao,
      aliquotaICMSEscrituracao,
      diferimentoICMSEscrituracao,
      baseICMSEscrituracao,
      valorICMSEscrituracao,
      valorICMSDesonEscrituracao,
      margemValorAdicSTEscrituracao,
      reducaoBaseSTEscrituracao,
      aliquotaICMSSTEscrituracao,
      baseICMSSTEscrituracao,
      valorICMSSTEscrituracao,
      somarICMSST,
      aliquotaICMSUFDestinatario,
      aliquotaICMSInterestadual,
      partilhaICMSInterestadual,
      baseICMSUFDestinatario,
      valorICMSUFDestinatario,
      baseICMSUFRemetente,
      valorICMSUFRemetente,
      aliquotaFCP,
      baseFCP,
      valorFCP,
      aliquotaFCPST,
      baseFCPST,
      valorFCPST,
      aliquotaFCPSTAnteriormente,
      baseFCPSTAnteriormente,
      valorFCPSTAnteriormente,
      aliquotaFCPUFDestinatario,
      baseFCPUFDestinatario,
      valorFCPUFDestinatario,
      aliquotaEstimadaImpFederais,
      aliquotaEstimadaImpEstaduais,
      aliquotaEstimadaImpMunicipais,
      baseEstimadaImpostos,
      valorEstimadoImpFederais,
      valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais,
      valorLiquidoItem,
      valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral,
      valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpItem,
      valorAcrescimoCustoOpGeral,
      valorAcrescimoCustoOpTotal,
      precoCustoOperacao,
      valorCustoOperacao,
      precoCMV,
      valorCMV,
      quantidadeExtemporanea,
      acrescimoUnitarioExtemporaneo,
      valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral,
      valorAcrescimoExtempTotal,
      observacoesDigitadas,
      observacoes)
    VALUES (
      b.idItemDocFiscal,
      b.idDocumentoFiscal,
      b.sequencia,
      b.cancelado,
      b.pedidoCompraFornecedor,
      b.sequenciaPedidoCompraFornec,
      b.modeloDocumento,
      b.estabelecimentoOriginal,
      b.vendedor,
      b.gradeProduto,
      b.idFormulaTinta,
      b.personalizacao,
      b.idLoteEstoque,
      b.operacaoFiscal,
      b.movimentaEstoque,
      b.movimentaEstoqueFiscal,
      b.geraFinanceiro,
      b.localEstoque,
      b.pessoaParticipante,
      b.controleQuantidade,
      b.unidadeMedidaConversao,
      b.conversorQuantidade,
      b.loteMinimo,
      b.loteMultiplo,
      b.altura,
      b.largura,
      b.comprimento,
      b.pecas,
      b.quantidade,
      b.quantidadeConvertida,
      b.quantidadeDevolvidaRetornada,
      b.percentualDevolucao,
      b.pesoLiquido,
      b.pesoBruto,
      b.tipoPreco,
      b.tabelaPreco,
      b.precoSugestaoAPrazo,
      b.precoSugestaoAVista,
      b.precoDesconto,
      b.precoMinimo,
      b.usarPrecoAVista,
      b.precoUnitarioBruto,
      b.acrescimoUnitarioComposicao,
      b.precoUnitario,
      b.precoUnitarioConvertido,
      b.valorProdutoServicoBruto,
      b.valorProdutoServico,
      b.percDescontoItem,
      b.valorDescontoItem,
      b.percAcrescimoItem,
      b.valorAcrescimoItem,
      b.valorFreteItem,
      b.valorSeguroItem,
      b.valorAdicFreteMarinhaMerItem,
      b.valorDespesasAduaneirasItem,
      b.valorFreteGeral,
      b.valorSeguroGeral,
      b.valorDescontoGeral,
      b.valorOutrasDespesasGeral,
      b.valorAdicFreteMarinhaMerGeral,
      b.valorDespesasAduaneirasGeral,
      b.valorBasePagamento,
      b.valorDescontoPagamento,
      b.valorOutrasDespesasPagamento,
      b.valorJurosPagamento,
      b.valorFreteTotal,
      b.valorSeguroTotal,
      b.valorDescontoTotal,
      b.valorOutrasDespesasTotal,
      b.valorAdicFreteMarinhaMerTotal,
      b.valorDespesasAduaneirasTotal,
      b.cfop,
      b.indicadorISSQN,
      b.aliquotaISSQN,
      b.retidoISSQN,
      b.tributadoForaMunicipio,
      b.incentivoFiscal,
      b.listaServicos,
      b.cnae,
      b.idServicoMunicipio,
      b.numeroProcessoAdministrativo,
      b.baseISSQN,
      b.valorISSQN,
      b.retencaoIRRF,
      b.baseRetIRRF,
      b.valorRetIRRF,
      b.retencaoINSS,
      b.baseRetINSS,
      b.valorRetINSS,
      b.retencaoPIS,
      b.baseRetPIS,
      b.valorRetPIS,
      b.retencaoCOFINS,
      b.baseRetCOFINS,
      b.valorRetCOFINS,
      b.retencaoCSLL,
      b.baseRetCSLL,
      b.valorRetCSLL,
      b.retencaoOutros,
      b.baseRetOutros,
      b.valorRetOutros,
      b.aliquotaII,
      b.baseII,
      b.valorII,
      b.aliquotaIOF,
      b.baseIOF,
      b.valorIOF,
      b.codigoEnquadramentoIPI,
      b.stIPI,
      b.aliquotaIPI,
      b.valorAliquotaIPI,
      b.baseIPI,
      b.valorIPI,
      b.valorIPIDevolucao,
      b.stPIS,
      b.aliquotaPIS,
      b.valorAliquotaPIS,
      b.basePIS,
      b.valorPIS,
      b.aliquotaPISST,
      b.valorAliquotaPISST,
      b.basePISST,
      b.valorPISST,
      b.stCOFINS,
      b.aliquotaCOFINS,
      b.valorAliquotaCOFINS,
      b.baseCOFINS,
      b.valorCOFINS,
      b.aliquotaCOFINSST,
      b.valorAliquotaCOFINSST,
      b.baseCOFINSST,
      b.valorCOFINSST,
      b.stSimplesNacional,
      b.creditoSimplesNacional,
      b.baseCreditoSimplesNacional,
      b.valorCreditoSimplesNacional,
      b.stICMS,
      b.modalidadeBaseCalcICMS,
      b.reducaoBaseICMS,
      b.aliquotaICMS,
      b.diferimentoICMS,
      b.motivoDesoneracaoICMS,
      b.idBeneficio,
      b.baseICMS,
      b.valorICMSOperacao,
      b.valorICMSDiferido,
      b.valorICMS,
      b.valorICMSDesoneracao,
      b.modalidadeBaseCalcICMSST,
      b.margemValorAdicionadoST,
      b.reducaoBaseST,
      b.aliquotaICMSST,
      b.aliquotaSTSuportConsFinal,
      b.baseICMSST,
      b.valorICMSST,
      b.baseICMSSTAnteriormente,
      b.valorICMSSTAnteriormente,
      b.valorICMSProprioSubstituto,
      b.reducaoBaseICMSEfetivo,
      b.aliquotaICMSEfetivo,
      b.baseICMSEfetivo,
      b.valorICMSEfetivo,
      b.stICMSEscrituracao,
      b.reducaoBaseICMSEscrituracao,
      b.aliquotaICMSEscrituracao,
      b.diferimentoICMSEscrituracao,
      b.baseICMSEscrituracao,
      b.valorICMSEscrituracao,
      b.valorICMSDesonEscrituracao,
      b.margemValorAdicSTEscrituracao,
      b.reducaoBaseSTEscrituracao,
      b.aliquotaICMSSTEscrituracao,
      b.baseICMSSTEscrituracao,
      b.valorICMSSTEscrituracao,
      b.somarICMSST,
      b.aliquotaICMSUFDestinatario,
      b.aliquotaICMSInterestadual,
      b.partilhaICMSInterestadual,
      b.baseICMSUFDestinatario,
      b.valorICMSUFDestinatario,
      b.baseICMSUFRemetente,
      b.valorICMSUFRemetente,
      b.aliquotaFCP,
      b.baseFCP,
      b.valorFCP,
      b.aliquotaFCPST,
      b.baseFCPST,
      b.valorFCPST,
      b.aliquotaFCPSTAnteriormente,
      b.baseFCPSTAnteriormente,
      b.valorFCPSTAnteriormente,
      b.aliquotaFCPUFDestinatario,
      b.baseFCPUFDestinatario,
      b.valorFCPUFDestinatario,
      b.aliquotaEstimadaImpFederais,
      b.aliquotaEstimadaImpEstaduais,
      b.aliquotaEstimadaImpMunicipais,
      b.baseEstimadaImpostos,
      b.valorEstimadoImpFederais,
      b.valorEstimadoImpEstaduais,
      b.valorEstimadoImpMunicipais,
      b.valorLiquidoItem,
      b.valorDescontoCustoOpItem,
      b.valorDescontoCustoOpGeral,
      b.valorDescontoCustoOpTotal,
      b.valorAcrescimoCustoOpItem,
      b.valorAcrescimoCustoOpGeral,
      b.valorAcrescimoCustoOpTotal,
      b.precoCustoOperacao,
      b.valorCustoOperacao,
      b.precoCMV,
      b.valorCMV,
      b.quantidadeExtemporanea,
      b.acrescimoUnitarioExtemporaneo,
      b.valorAcrescimoExtempSubtotal,
      b.valorAcrescimoExtempItem,
      b.valorAcrescimoExtempGeral,
      b.valorAcrescimoExtempTotal,
      b.observacoesDigitadas,
      b.observacoes);
    v_atualizarObservacoes := 0;
    IF p_idItemReferenciado > 0 THEN
      IF p_tipoDocumentoReferenciado IN ('D','P') THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV(
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_devolucaoAnulacaoRetorno,
          'D',
          r_item_idItemDocFiscal,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          p_tipoDocumentoReferenciado,
          p_idItemReferenciado);
      END IF;
      IF p_tipoDocumentoReferenciado = 'B' THEN
        ADD_DOC_FISC_ITEM_BALANC_GRAVA (
          p_estabelecimentoAtivo,
          p_idItemReferenciado,
          r_item_idItemDocFiscal);
      ELSIF p_tipoDocumentoReferenciado = 'D' THEN
        ADD_DOC_FISC_ITEM_REF_DOC_FIS (
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'G' THEN
        ADD_DOC_FISC_ITEM_REF_DFE_GRAD (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_person_190_modeloFrete,
          p_config_227_manterPessoaOrcam,
          p_config_230_etapaPedComprParc,
          p_config_378_calcularVolumes,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'O' THEN
        ADD_DOC_FISC_ITEM_REF_ORCAMEN (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'P' THEN
        ADD_DOC_FISC_ITEM_REF_PRE_DOC (
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'T' THEN
        ADD_DOC_FISC_ITEM_TRANS_GRAVA (
          p_estabelecimentoAtivo,
          v_cab_entradaSaida,
          p_idItemReferenciado,
          r_item_idItemDocFiscal,
          p_quantidadeReferenciada);
      END IF;
    END IF;
    IF p_tempComp_nomeTempComposicao <> ' '
      AND (NOT (p_tipoDocumentoReferenciado IN ('D','O','P'))
        OR p_idItemReferenciado <= 0)
    THEN
      ADD_DOC_FISC_ITEM_COMP_TEMP (
        p_sessaoClient,
        p_estabelecimentoAtivo,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        r_item_idItemDocFiscal,
        v_atualizarObservacoes,
        v_atualizarObservacoes);
    END IF;
    v_idEnderecoEstoque := 0;
    IF p_item_idEnderecoEstoque > 0 THEN
      ADD_DOC_FISC_ITEM_ENDER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemDocFiscal,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_quantidade,
        ' ',
        v_idEnderecoEstoque);
    END IF;
    IF p_item_idNumeroSerie > 0 THEN
      ADD_DOC_FISC_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemDocFiscal,
        v_idEnderecoEstoque,
        p_item_gradeProduto,
        p_item_idNumeroSerie,
        0,
        v_auxNumber);
      v_atualizarObservacoes := 1;
    END IF;
    IF v_atualizarObservacoes = 1 THEN
      v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
        p_sessaoClient,
        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_413_obs_add_marca,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        'D',
        r_item_idItemDocFiscal,
        p_item_gradeProduto,
        p_item_idFormulaTinta,
        p_item_personalizacao,
        p_item_idLoteEstoque,
        p_item_controleQuantidade,
        p_item_loteMultiplo,
        p_item_altura,
        p_item_largura,
        p_item_comprimento,
        p_item_quantidade,
        p_item_observacoesDigitadas);
      UPDATE MODOCFISCALXITENS
      SET observacoes = v_observacoes
      WHERE idItemDocFiscal = r_item_idItemDocFiscal;
    END IF;
    IF v_cab_situacaoDocumentoFiscal > 20 THEN
      ADD_DOC_FISC_ITEM_EST_ATUALIZA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_item_idItemDocFiscal,
        p_estabelecimentoAtivo);
      ADD_DOC_FISC_ITEM_FIL_ATUALIZA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_item_idItemDocFiscal,
        p_estabelecimentoAtivo);
    END IF;
    r_buffer_idItemDocFiscal := CASE WHEN (r_buffer_idItemDocFiscal IS NULL OR r_buffer_idItemDocFiscal = '' OR r_buffer_idItemDocFiscal = ' ') THEN '' ELSE RTRIM (r_buffer_idItemDocFiscal) || ';' END || TO_CHAR (LPAD(r_item_idItemDocFiscal,14,'0'));
    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;
  END IF;
END ADD_DOC_FISC_ITEM_GRAVA;

/

create or replace PROCEDURE ADD_PRE_DOC_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_227_manterPessoaOrcam IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     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, -- D = Documento Fiscal, O = Orçamento, P, Pré-Documento, T = Transferência
  p_idItemReferenciado           IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_tempComp_nomeTempComposicao  IN VARCHAR2,
  p_tempComp_sequencia           IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemPreDocumento      IN NUMBER,
  p_item_preDocumento            IN NUMBER,
  p_item_pedidoCompraFornecedor  IN VARCHAR2,
  p_item_sequenciaPedidoCompraFo IN NUMBER,
  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_quantidadeExtemporanea  IN NUMBER,
  p_item_acrescimoUnitarioExtemp IN NUMBER,
  p_item_valorAcrescimoExtempIte IN NUMBER,
  p_item_valorDescontoCustoOpIte IN NUMBER,
  p_item_valorAcrescimoCustoOpIt 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_valorAcrescimoExtempGer IN NUMBER,
  p_item_valorDescontoCustoOpGer IN NUMBER,
  p_item_valorAcrescimoCustoOpGe IN NUMBER,
  p_item_valorDescontoPagamento  IN NUMBER,
  p_item_valorOutrasDespPagament IN NUMBER,
  p_item_valorJurosPagamento     IN NUMBER,
  p_item_percentualDevolucao     IN NUMBER,
  p_item_valorIPIDevolucao       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_idItemPreDocumento    IN VARCHAR2,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER,
  r_item_idItemPreDocumento      OUT NUMBER,
  r_buffer_idItemPreDocumento    OUT VARCHAR2,
  r_valorInserido                OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_finalidadeNota           CHAR (1);
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_documentoFiscal          NUMBER;
  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_projeto                  VARCHAR2 (60);
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  v_cab_statusPreDocumento       CHAR (1);
  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_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota 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_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_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_item_sequencia               NUMBER;
  v_item_cancelado               NUMBER;
  v_item_quantidadeDevolvidaRet  NUMBER;
  v_item_precoUnitario           NUMBER;
  v_item_precoUnitarioConvertido NUMBER;
  v_item_valorProdutoServicoBrut NUMBER;
  v_item_valorProdutoServico     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_item_valorDescontoCustoOpTot NUMBER;
  v_item_valorAcrescimoCustoOpTo NUMBER;
  v_item_precoCustoOperacao      NUMBER;
  v_item_valorCustoOperacao      NUMBER;
  v_item_precoCMV                NUMBER;
  v_item_valorCMV                NUMBER;
  v_item_valorAcrescimoExtempSub NUMBER;
  v_item_valorAcrescimoExtempTot 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_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_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  r_item_idItemPreDocumento := p_item_idItemPreDocumento;
  r_buffer_idItemPreDocumento := p_buffer_idItemPreDocumento;
  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.devolucaoAnulacaoRetorno,
    cab.finalidadeNota,
    cab.atualizaCustoMedio,
    cab.documentoFiscal,
    cab.estabelecimento,
    cab.dataEmissao,
    cab.pessoa,
    cab.enderecoEntregaPessoa,
    cab.municipioFatoGerador,
    cab.localDestinoOperacao,
    cab.indicadorConsumidorFinal,
    cab.projeto,
    cab.modalidadeFrete,
    cab.tipoPagamentoFrete,
    cab.statusPreDocumento,
    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,
    cab.valorDescontoCustoOpItem,
    cab.valorDescontoCustoOpGeral,
    cab.valorDescontoCustoOpTotal,
    cab.valorAcrescimoCustoOpItem,
    cab.valorAcrescimoCustoOpGeral,
    cab.valorAcrescimoCustoOpTotal,
    cab.valorCustoOperacao,
    cab.valorCMV,
    cab.quantidadeExtemporanea,
    cab.valorAcrescimoExtempSubtotal,
    cab.valorAcrescimoExtempItem,
    cab.valorAcrescimoExtempGeral,
    cab.valorAcrescimoExtempTotal,
    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
  INTO
    v_cab_origemDocumento,
    v_cab_tipoDocumento,
    v_cab_entradaSaida,
    v_cab_devolucaoAnulacaoRetorno,
    v_cab_finalidadeNota,
    v_cab_atualizaCustoMedio,
    v_cab_documentoFiscal,
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_pessoa,
    v_cab_enderecoEntregaPessoa,
    v_cab_municipioFatoGerador,
    v_cab_localDestinoOperacao,
    v_cab_indicadorConsumidorFinal,
    v_cab_projeto,
    v_cab_modalidadeFrete,
    v_cab_tipoPagamentoFrete,
    v_cab_statusPreDocumento,
    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_cab_valorDescontoCustoOpItem,
    v_cab_valorDescontoCustoOpGera,
    v_cab_valorDescontoCustoOpTota,
    v_cab_valorAcrescimoCustoOpIte,
    v_cab_valorAcrescimoCustoOpGer,
    v_cab_valorAcrescimoCustoOpTot,
    v_cab_valorCustoOperacao,
    v_cab_valorCMV,
    v_cab_quantidadeExtemporanea,
    v_cab_valorAcrescimoExtempSubt,
    v_cab_valorAcrescimoExtempItem,
    v_cab_valorAcrescimoExtempGera,
    v_cab_valorAcrescimoExtempTota,
    v_est_grupoFiscal,
    v_pessEst_regimeTributario,
    v_munEndEst_uf,
    v_pess_indicadorInscricaoEstad,
    v_endPess_enderecoPessoa,
    v_munEndPess_uf,
    v_munEndEntr_uf
  FROM MOPREDOCUMENTOS 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
  WHERE cab.preDocumento = p_item_preDocumento;
  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_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_item_quantidadeDevolvidaRet  := 0;
  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_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;
  IF p_manterFinanceiro_Retotalizar = 0 THEN
    SELECT COALESCE (MAX(1), 0)
    INTO v_cab_promocaoExiste
    FROM MOPREDOCUMXPROMOCOES
    WHERE preDocumento = p_item_preDocumento;
  END IF;
  IF p_item_idItemPreDocumento > 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.quantidadeDevolvidaRetornada,
        a.pesoLiquido,
        a.pesoBruto,
        a.valorProdutoServicoBruto,
        a.valorProdutoServico,
        a.valorDescontoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.quantidadeExtemporanea,
        a.valorAcrescimoExtempSubtotal,
        a.valorAcrescimoExtempItem,
        a.valorDescontoCustoOpItem,
        a.valorAcrescimoCustoOpItem,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorAcrescimoExtempGeral,
        a.valorDescontoCustoOpGeral,
        a.valorAcrescimoCustoOpGeral,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.valorFreteTotal,
        a.valorSeguroTotal,
        a.valorDescontoTotal,
        a.valorOutrasDespesasTotal,
        a.valorAdicFreteMarinhaMerTotal,
        a.valorDespesasAduaneirasTotal,
        a.valorAcrescimoExtempTotal,
        a.valorDescontoCustoOpTotal,
        a.valorAcrescimoCustoOpTotal,
        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,
        a.valorCustoOperacao,
        a.valorCMV,
        prod.tipoProduto
      FROM MOPREDOCUMXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      WHERE a.idItemPreDocumento = p_item_idItemPreDocumento)
    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_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_item_quantidadeDevolvidaRet := a.quantidadeDevolvidaRetornada;
      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 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 <> p_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;
        v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
        v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
        v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
        v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
        v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
        v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
        v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
        v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
        v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
        v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
        v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
        v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
        v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      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,
    p_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);
  v_item_valorAcrescimoExtempSub := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
    p_item_quantidade,
    v_item_precoUnitario,
    p_item_quantidadeExtemporanea,
    p_item_acrescimoUnitarioExtemp);
  v_item_valorAcrescimoExtempTot := FUNC_ADD_CALC_EXTEMP_TOTAL(
    v_item_valorAcrescimoExtempSub,
    p_item_valorAcrescimoExtempIte,
    p_item_valorAcrescimoExtempGer);
  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 = CASE WHEN v_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
      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,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_estabelecimento,
        NULL, -- p_cab_dataPrecoInicial
        TRUNC(SYSDATE), -- p_cab_dataPrecoFinal
        v_cab_pessoa,
        v_cab_projeto,
        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_PRE_DOC_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_227_manterPessoaOrcam,
        p_config_362_calcCustoPorGrade,
        p_config_378_calcularVolumes,
        p_config_413_obs_add_marca,
        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, -- D = Documento Fiscal, G = Grade DF-e, O = Orçamento, 'P', Pré-Documento, T = Transferência
        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_calcularImpostos,
        0, -- p_item_idItemPreDocumento
        p_item_preDocumento,
        p_item_pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo,
        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
        CASE
          WHEN p_item_quantidade = 0
          THEN 0
          ELSE ROUND(p_item_quantidadeExtemporanea * a.quantidade / p_item_quantidade, 2)
        END, -- p_item_quantidadeExtemporanea
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_acrescimoUnitarioExtemp
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_acrescimoUnitarioExtemp
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoExtempIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpIt
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpIt
        p_item_observacoesDigitadas,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorFreteGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_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_valorAcrescimoExtempGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpGe
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpGe
        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
        p_item_percentualDevolucao,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorIPIDevolucao
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorIPIDevolucao,
        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_idItemPreDocumento,
        /* Retornos */
        r_calcularImpostos,
        v_auxNumber, -- idItemPreDocumento
        r_buffer_idItemPreDocumento,
        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_PRE_DOC_ITEM_COMBO_RESIDUO (
        p_item_preDocumento,
        v_item_valorProdutoServico,
        p_item_valorDescontoItem,
        p_item_valorAcrescimoItem,
        v_modDoc_diminuiDescontoPrUnit,
        v_modDoc_somaAcrescimosPrUnit,
        r_buffer_idItemPreDocumento,
        r_valorInserido);
      r_calcularImpostos := 1;
    END IF;
  ELSE
    IF r_item_idItemPreDocumento <= 0 THEN
      r_item_idItemPreDocumento := FUNC_ADD_BUSCA_PROXIMO_ID ('MOPREDOCUMXITENS', 'idItemPreDocumento', 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
          OR p_item_valorAcrescimoExtempGer <> 0
          OR p_item_valorDescontoCustoOpGer <> 0
          OR p_item_valorAcrescimoCustoOpGe <> 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_PRE_DOC_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          p_item_preDocumento,
          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 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,
        p_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,
        v_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,
        v_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
        p_item_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,
      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
      v_item_valorAcrescimoExtempTot,
      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,
      p_item_valorIPIDevolucao,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      v_item_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0 -- p_item_somarICMSST
      );
    ADD_CALCULA_CUSTO_CMV (
      v_cab_atualizaCustoMedio,
      v_cab_estabelecimento,
      0, -- p_cab_nfFornecedor
      p_item_modeloDocumento,
      p_item_quantidade,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      p_item_valorIPIDevolucao,
      v_item_valorPIS,
      v_item_valorPISST,
      v_item_valorCOFINS,
      v_item_valorCOFINSST,
      v_item_valorCreditoSimplesNac,
      v_item_valorICMS,
      v_item_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      v_item_valorLiquidoItem,
      p_item_valorDescontoCustoOpIte,
      p_item_valorDescontoCustoOpGer,
      p_item_valorAcrescimoCustoOpIt,
      p_item_valorAcrescimoCustoOpGe,
      v_item_valorAcrescimoExtempTot,
      v_item_valorDescontoCustoOpTot,
      v_item_valorAcrescimoCustoOpTo,
      v_item_precoCustoOperacao,
      v_item_valorCustoOperacao,
      v_item_precoCMV,
      v_item_valorCMV);
    IF v_inserindoItem = 1 THEN
      SELECT COALESCE (MAX (sequencia),0) + 1
      INTO v_item_sequencia
      FROM MOPREDOCUMXITENS
      WHERE preDocumento = p_item_preDocumento;
      v_cab_ultimoVendedorItem := p_item_vendedor;
    END IF;
    IF v_item_cancelado = 0 THEN
      IF p_manterFinanceiro_Retotalizar <> 2 THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume + TRUNC(CASE WHEN p_item_controleQuantidade = 1 AND p_item_loteMultiplo <> 0 THEN p_item_quantidade / p_item_loteMultiplo ELSE p_item_quantidadeConvertida END,0);
        END IF;
        v_cab_pesoLiquido := v_cab_pesoLiquido + p_item_pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto + p_item_pesoBruto;
      END IF;
      v_cab_quantidade := v_cab_quantidade + p_item_quantidadeConvertida;
      IF v_prod_tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorServicos := v_cab_valorServicos + v_item_valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos + p_item_valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorProdutos := v_cab_valorProdutos + v_item_valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos + p_item_valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem + p_item_valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem + p_item_valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem + p_item_valorAdicFreteMarItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem + p_item_valorDespesasAduanItem;
      v_cab_valorFreteGeral := v_cab_valorFreteGeral + p_item_valorFreteGeral;
      v_cab_valorSeguroGeral := v_cab_valorSeguroGeral + p_item_valorSeguroGeral;
      v_cab_valorDescontoGeral := v_cab_valorDescontoGeral + v_item_valorDescontoGeral;
      v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral + p_item_valorOutrasDespesasGer;
      v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral + p_item_valorAdicFreteMarGeral;
      v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral + p_item_valorDespesasAduanGeral;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento + v_item_valorBasePagamento;
      IF p_item_usarPrecoAVista = 1
        AND v_item_geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo + v_item_valorProdutoServico - v_item_valorDescontoTotal + v_item_valorOutrasDespesasTot;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento + v_item_valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento + v_item_valorOutrasDespPagament;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento + v_item_valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal + v_item_valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal + v_item_valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal + v_item_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_item_valorOutrasDespesasTot;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal + v_item_valorAdicFreteMarTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal + v_item_valorDespesasAduanTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem + v_item_valorLiquidoItem;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem + p_item_valorDescontoCustoOpIte;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera + p_item_valorDescontoCustoOpGer;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota + v_item_valorDescontoCustoOpTot;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte + p_item_valorAcrescimoCustoOpIt;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer + p_item_valorAcrescimoCustoOpGe;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot + v_item_valorAcrescimoCustoOpTo;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao + v_item_valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV + v_item_valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea + p_item_quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt + v_item_valorAcrescimoExtempSub;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem + p_item_valorAcrescimoExtempIte;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera + p_item_valorAcrescimoExtempGer;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota + v_item_valorAcrescimoExtempTot;
    END IF;
    UPDATE MOPREDOCUMENTOS SET
      modalidadeFrete               = v_cab_modalidadeFrete,
      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,
      valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
      valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
      valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
      valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
      valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
      valorCustoOperacao            = v_cab_valorCustoOperacao,
      valorCMV                      = v_cab_valorCMV,
      quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
      valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
      valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
      valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
    WHERE preDocumento = p_item_preDocumento;
    IF p_item_idItemPreDocumento > 0 THEN
      DELETE MOPREDOCUMXCOMPOSICOESPR compDoc
      WHERE compDoc.idItemPreDocumento = p_item_idItemPreDocumento
      AND EXISTS(
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.produto = comp.produto
        WHERE comp.composicaoPreco = compDoc.composicaoPreco
        AND gradProd.gradeProduto <> p_item_gradeProduto);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      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_413_obs_add_marca,
      ' ',
      0,
      'P',
      p_item_idItemPreDocumento,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    MERGE INTO MOPREDOCUMXITENS a USING (
      SELECT
        r_item_idItemPreDocumento      idItemPreDocumento,
        p_item_preDocumento            preDocumento,
        v_item_sequencia               sequencia,
        v_item_cancelado               cancelado,
        p_item_pedidoCompraFornecedor  pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo sequenciaPedidoCompraFornec,
        p_item_modeloDocumento         modeloDocumento,
        p_item_estabelecimentoOriginal estabelecimentoOriginal,
        p_item_vendedor                vendedor,
        p_item_gradeProduto            gradeProduto,
        p_item_idFormulaTinta          idFormulaTinta,
        p_item_personalizacao          personalizacao,
        p_item_idLoteEstoque           idLoteEstoque,
        p_item_operacaoFiscal          operacaoFiscal,
        v_item_movimentaEstoque        movimentaEstoque,
        v_item_geraFinanceiro          geraFinanceiro,
        p_item_localEstoque            localEstoque,
        p_item_pessoaParticipante      pessoaParticipante,
        p_item_controleQuantidade      controleQuantidade,
        p_item_unidadeMedidaConversao  unidadeMedidaConversao,
        p_item_conversorQuantidade     conversorQuantidade,
        p_item_loteMinimo              loteMinimo,
        p_item_loteMultiplo            loteMultiplo,
        p_item_altura                  altura,
        p_item_largura                 largura,
        p_item_comprimento             comprimento,
        p_item_pecas                   pecas,
        p_item_quantidade              quantidade,
        p_item_quantidadeConvertida    quantidadeConvertida,
        v_item_quantidadeDevolvidaRet  quantidadeDevolvidaRetornada,
        p_item_percentualDevolucao     percentualDevolucao,
        p_item_pesoLiquido             pesoLiquido,
        p_item_pesoBruto               pesoBruto,
        p_item_tipoPreco               tipoPreco,
        p_item_tabelaPreco             tabelaPreco,
        p_item_precoSugestaoAPrazo     precoSugestaoAPrazo,
        p_item_precoSugestaoAVista     precoSugestaoAVista,
        p_item_precoDesconto           precoDesconto,
        p_item_precoMinimo             precoMinimo,
        p_item_usarPrecoAVista         usarPrecoAVista,
        p_item_precoUnitarioBruto      precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos acrescimoUnitarioComposicao,
        v_item_precoUnitario           precoUnitario,
        v_item_precoUnitarioConvertido precoUnitarioConvertido,
        v_item_valorProdutoServicoBrut valorProdutoServicoBruto,
        v_item_valorProdutoServico     valorProdutoServico,
        p_item_percDescontoItem        percDescontoItem,
        p_item_valorDescontoItem       valorDescontoItem,
        p_item_percAcrescimoItem       percAcrescimoItem,
        p_item_valorAcrescimoItem      valorAcrescimoItem,
        p_item_valorFreteItem          valorFreteItem,
        p_item_valorSeguroItem         valorSeguroItem,
        p_item_valorAdicFreteMarItem   valorAdicFreteMarinhaMerItem,
        p_item_valorDespesasAduanItem  valorDespesasAduaneirasItem,
        p_item_valorFreteGeral         valorFreteGeral,
        p_item_valorSeguroGeral        valorSeguroGeral,
        v_item_valorDescontoGeral      valorDescontoGeral,
        p_item_valorOutrasDespesasGer  valorOutrasDespesasGeral,
        p_item_valorAdicFreteMarGeral  valorAdicFreteMarinhaMerGeral,
        p_item_valorDespesasAduanGeral valorDespesasAduaneirasGeral,
        v_item_valorBasePagamento      valorBasePagamento,
        v_item_valorDescontoPagamento  valorDescontoPagamento,
        v_item_valorOutrasDespPagament valorOutrasDespesasPagamento,
        v_item_valorJurosPagamento     valorJurosPagamento,
        v_item_valorFreteTotal         valorFreteTotal,
        v_item_valorSeguroTotal        valorSeguroTotal,
        v_item_valorDescontoTotal      valorDescontoTotal,
        v_item_valorOutrasDespesasTot  valorOutrasDespesasTotal,
        v_item_valorAdicFreteMarTotal  valorAdicFreteMarinhaMerTotal,
        v_item_valorDespesasAduanTotal valorDespesasAduaneirasTotal,
        v_item_cfop                    cfop,
        v_item_indicadorISSQN          indicadorISSQN,
        v_item_aliquotaISSQN           aliquotaISSQN,
        v_item_retidoISSQN             retidoISSQN,
        v_item_tributadoForaMunicipio  tributadoForaMunicipio,
        v_item_incentivoFiscal         incentivoFiscal,
        v_item_listaServicos           listaServicos,
        v_item_cnae                    cnae,
        v_item_idServicoMunicipio      idServicoMunicipio,
        v_item_numeroProcessoAdministr numeroProcessoAdministrativo,
        v_item_baseISSQN               baseISSQN,
        v_item_valorISSQN              valorISSQN,
        v_item_retencaoIRRF            retencaoIRRF,
        v_item_baseRetIRRF             baseRetIRRF,
        v_item_valorRetIRRF            valorRetIRRF,
        v_item_retencaoINSS            retencaoINSS,
        v_item_baseRetINSS             baseRetINSS,
        v_item_valorRetINSS            valorRetINSS,
        v_item_retencaoPIS             retencaoPIS,
        v_item_baseRetPIS              baseRetPIS,
        v_item_valorRetPIS             valorRetPIS,
        v_item_retencaoCOFINS          retencaoCOFINS,
        v_item_baseRetCOFINS           baseRetCOFINS,
        v_item_valorRetCOFINS          valorRetCOFINS,
        v_item_retencaoCSLL            retencaoCSLL,
        v_item_baseRetCSLL             baseRetCSLL,
        v_item_valorRetCSLL            valorRetCSLL,
        v_item_retencaoOutros          retencaoOutros,
        v_item_baseRetOutros           baseRetOutros,
        v_item_valorRetOutros          valorRetOutros,
        v_item_aliquotaII              aliquotaII,
        v_item_baseII                  baseII,
        v_item_valorII                 valorII,
        v_item_aliquotaIOF             aliquotaIOF,
        v_item_baseIOF                 baseIOF,
        v_item_valorIOF                valorIOF,
        v_item_codigoEnquadramentoIPI  codigoEnquadramentoIPI,
        v_item_stIPI                   stIPI,
        v_item_aliquotaIPI             aliquotaIPI,
        v_item_valorAliquotaIPI        valorAliquotaIPI,
        v_item_baseIPI                 baseIPI,
        v_item_valorIPI                valorIPI,
        p_item_valorIPIDevolucao       valorIPIDevolucao,
        v_item_stPIS                   stPIS,
        v_item_aliquotaPIS             aliquotaPIS,
        v_item_valorAliquotaPIS        valorAliquotaPIS,
        v_item_basePIS                 basePIS,
        v_item_valorPIS                valorPIS,
        v_item_aliquotaPISST           aliquotaPISST,
        v_item_valorAliquotaPISST      valorAliquotaPISST,
        v_item_basePISST               basePISST,
        v_item_valorPISST              valorPISST,
        v_item_stCOFINS                stCOFINS,
        v_item_aliquotaCOFINS          aliquotaCOFINS,
        v_item_valorAliquotaCOFINS     valorAliquotaCOFINS,
        v_item_baseCOFINS              baseCOFINS,
        v_item_valorCOFINS             valorCOFINS,
        v_item_aliquotaCOFINSST        aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST   valorAliquotaCOFINSST,
        v_item_baseCOFINSST            baseCOFINSST,
        v_item_valorCOFINSST           valorCOFINSST,
        v_item_stSimplesNacional       stSimplesNacional,
        v_item_creditoSimplesNacional  creditoSimplesNacional,
        v_item_baseCreditoSimplesNac   baseCreditoSimplesNacional,
        v_item_valorCreditoSimplesNac  valorCreditoSimplesNacional,
        v_item_stICMS                  stICMS,
        v_item_modalBaseCalcICMS       modalidadeBaseCalcICMS,
        v_item_reducaoBaseICMS         reducaoBaseICMS,
        v_item_aliquotaICMS            aliquotaICMS,
        v_item_diferimentoICMS         diferimentoICMS,
        v_item_motivoDesoneracaoICMS   motivoDesoneracaoICMS,
        v_item_idBeneficio             idBeneficio,
        v_item_baseICMS                baseICMS,
        v_item_valorICMSOperacao       valorICMSOperacao,
        v_item_valorICMSDiferido       valorICMSDiferido,
        v_item_valorICMS               valorICMS,
        v_item_valorICMSDesoneracao    valorICMSDesoneracao,
        v_item_modalBaseCalcICMSST     modalidadeBaseCalcICMSST,
        v_item_margemValorAdicionadoST margemValorAdicionadoST,
        v_item_reducaoBaseST           reducaoBaseST,
        v_item_aliquotaICMSST          aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin aliquotaSTSuportConsFinal,
        v_item_baseICMSST              baseICMSST,
        v_item_valorICMSST             valorICMSST,
        v_item_baseICMSSTAnteriormente baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment valorICMSSTAnteriormente,
        v_item_valorICMSProprioSubstit valorICMSProprioSubstituto,
        v_item_reducaoBaseICMSEfetivo  reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo     aliquotaICMSEfetivo,
        v_item_baseICMSEfetivo         baseICMSEfetivo,
        v_item_valorICMSEfetivo        valorICMSEfetivo,
        v_item_aliquotaICMSUFDestinat  aliquotaICMSUFDestinatario,
        v_item_aliquotaICMSInterestad  aliquotaICMSInterestadual,
        v_item_partilhaICMSInterestad  partilhaICMSInterestadual,
        v_item_baseICMSUFDestinatario  baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente     baseICMSUFRemetente,
        v_item_valorICMSUFRemetente    valorICMSUFRemetente,
        v_item_aliquotaFCP             aliquotaFCP,
        v_item_baseFCP                 baseFCP,
        v_item_valorFCP                valorFCP,
        v_item_aliquotaFCPST           aliquotaFCPST,
        v_item_baseFCPST               baseFCPST,
        v_item_valorFCPST              valorFCPST,
        v_item_aliquotaFCPSTAnteriorm  aliquotaFCPSTAnteriormente,
        v_item_baseFCPSTAnteriormente  baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente valorFCPSTAnteriormente,
        v_item_aliquotaFCPUFDestinat   aliquotaFCPUFDestinatario,
        v_item_baseFCPUFDestinatario   baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario  valorFCPUFDestinatario,
        v_item_aliquotaEstImpFederais  aliquotaEstimadaImpFederais,
        v_item_aliquotaEstImpEstaduais aliquotaEstimadaImpEstaduais,
        v_item_aliquotaEstImpMunicipai aliquotaEstimadaImpMunicipais,
        v_item_baseEstimadaImpostos    baseEstimadaImpostos,
        v_item_valorEstImpFederais     valorEstimadoImpFederais,
        v_item_valorEstImpEstaduais    valorEstimadoImpEstaduais,
        v_item_valorEstImpMunicipais   valorEstimadoImpMunicipais,
        v_item_valorLiquidoItem        valorLiquidoItem,
        p_item_valorDescontoCustoOpIte valorDescontoCustoOpItem,
        p_item_valorDescontoCustoOpGer valorDescontoCustoOpGeral,
        v_item_valorDescontoCustoOpTot valorDescontoCustoOpTotal,
        p_item_valorAcrescimoCustoOpIt valorAcrescimoCustoOpItem,
        p_item_valorAcrescimoCustoOpGe valorAcrescimoCustoOpGeral,
        v_item_valorAcrescimoCustoOpTo valorAcrescimoCustoOpTotal,
        v_item_precoCustoOperacao      precoCustoOperacao,
        v_item_valorCustoOperacao      valorCustoOperacao,
        v_item_precoCMV                precoCMV,
        v_item_valorCMV                valorCMV,
        p_item_quantidadeExtemporanea  quantidadeExtemporanea,
        p_item_acrescimoUnitarioExtemp acrescimoUnitarioExtemporaneo,
        v_item_valorAcrescimoExtempSub valorAcrescimoExtempSubtotal,
        p_item_valorAcrescimoExtempIte valorAcrescimoExtempItem,
        p_item_valorAcrescimoExtempGer valorAcrescimoExtempGeral,
        v_item_valorAcrescimoExtempTot valorAcrescimoExtempTotal,
        p_item_observacoesDigitadas    observacoesDigitadas,
        v_observacoes                  observacoes
      FROM DUAL) b
    ON (a.idItemPreDocumento = b.idItemPreDocumento)
    WHEN MATCHED THEN UPDATE SET
      a.preDocumento                  = b.preDocumento,
      a.sequencia                     = b.sequencia,
      a.cancelado                     = b.cancelado,
      a.pedidoCompraFornecedor        = b.pedidoCompraFornecedor,
      a.sequenciaPedidoCompraFornec   = b.sequenciaPedidoCompraFornec,
      a.vendedor                      = b.vendedor,
      a.modeloDocumento               = b.modeloDocumento,
      a.estabelecimentoOriginal       = b.estabelecimentoOriginal,
      a.gradeProduto                  = b.gradeProduto,
      a.idFormulaTinta                = b.idFormulaTinta,
      a.personalizacao                = b.personalizacao,
      a.idLoteEstoque                 = b.idLoteEstoque,
      a.operacaoFiscal                = b.operacaoFiscal,
      a.movimentaEstoque              = b.movimentaEstoque,
      a.geraFinanceiro                = b.geraFinanceiro,
      a.localEstoque                  = b.localEstoque,
      a.pessoaParticipante            = b.pessoaParticipante,
      a.controleQuantidade            = b.controleQuantidade,
      a.unidadeMedidaConversao        = b.unidadeMedidaConversao,
      a.conversorQuantidade           = b.conversorQuantidade,
      a.loteMinimo                    = b.loteMinimo,
      a.loteMultiplo                  = b.loteMultiplo,
      a.altura                        = b.altura,
      a.largura                       = b.largura,
      a.comprimento                   = b.comprimento,
      a.pecas                         = b.pecas,
      a.quantidade                    = b.quantidade,
      a.quantidadeConvertida          = b.quantidadeConvertida,
      a.quantidadeDevolvidaRetornada  = b.quantidadeDevolvidaRetornada,
      a.percentualDevolucao           = b.percentualDevolucao,
      a.pesoLiquido                   = b.pesoLiquido,
      a.pesoBruto                     = b.pesoBruto,
      a.tipoPreco                     = b.tipoPreco,
      a.tabelaPreco                   = b.tabelaPreco,
      a.precoSugestaoAPrazo           = b.precoSugestaoAPrazo,
      a.precoSugestaoAVista           = b.precoSugestaoAVista,
      a.precoDesconto                 = b.precoDesconto,
      a.precoMinimo                   = b.precoMinimo,
      a.usarPrecoAVista               = b.usarPrecoAVista,
      a.precoUnitarioBruto            = b.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao   = b.acrescimoUnitarioComposicao,
      a.precoUnitario                 = b.precoUnitario,
      a.precoUnitarioConvertido       = b.precounitarioConvertido,
      a.valorProdutoServicoBruto      = b.valorProdutoServicoBruto,
      a.valorProdutoServico           = b.valorProdutoServico,
      a.percDescontoItem              = b.percDescontoItem,
      a.valorDescontoItem             = b.valorDescontoItem,
      a.percAcrescimoItem             = b.percAcrescimoItem,
      a.valorAcrescimoItem            = b.valorAcrescimoItem,
      a.valorFreteItem                = b.valorFreteItem,
      a.valorSeguroItem               = b.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem  = b.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem   = b.valorDespesasAduaneirasItem,
      a.valorFreteGeral               = b.valorFreteGeral,
      a.valorSeguroGeral              = b.valorSeguroGeral,
      a.valorDescontoGeral            = b.valorDescontoGeral,
      a.valorOutrasDespesasGeral      = b.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral = b.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral  = b.valorDespesasAduaneirasGeral,
      a.valorBasePagamento            = b.valorBasePagamento,
      a.valorDescontoPagamento        = b.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento  = b.valorOutrasDespesasPagamento,
      a.valorJurosPagamento           = b.valorJurosPagamento,
      a.valorFreteTotal               = b.valorFreteTotal,
      a.valorSeguroTotal              = b.valorSeguroTotal,
      a.valorDescontoTotal            = b.valorDescontoTotal,
      a.valorOutrasDespesasTotal      = b.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal = b.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal  = b.valorDespesasAduaneirasTotal,
      a.cfop                          = b.cfop,
      a.indicadorISSQN                = b.indicadorISSQN,
      a.aliquotaISSQN                 = b.aliquotaISSQN,
      a.retidoISSQN                   = b.retidoISSQN,
      a.tributadoForaMunicipio        = b.tributadoForaMunicipio,
      a.incentivoFiscal               = b.incentivoFiscal,
      a.listaServicos                 = b.listaServicos,
      a.cnae                          = b.cnae,
      a.idServicoMunicipio            = b.idServicoMunicipio,
      a.numeroProcessoAdministrativo  = b.numeroProcessoAdministrativo,
      a.baseISSQN                     = b.baseISSQN,
      a.valorISSQN                    = b.valorISSQN,
      a.retencaoIRRF                  = b.retencaoIRRF,
      a.baseRetIRRF                   = b.baseRetIRRF,
      a.valorRetIRRF                  = b.valorRetIRRF,
      a.retencaoINSS                  = b.retencaoINSS,
      a.baseRetINSS                   = b.baseRetINSS,
      a.valorRetINSS                  = b.valorRetINSS,
      a.retencaoPIS                   = b.retencaoPIS,
      a.baseRetPIS                    = b.baseRetPIS,
      a.valorRetPIS                   = b.valorRetPIS,
      a.retencaoCOFINS                = b.retencaoCOFINS,
      a.baseRetCOFINS                 = b.baseRetCOFINS,
      a.valorRetCOFINS                = b.valorRetCOFINS,
      a.retencaoCSLL                  = b.retencaoCSLL,
      a.baseRetCSLL                   = b.baseRetCSLL,
      a.valorRetCSLL                  = b.valorRetCSLL,
      a.retencaoOutros                = b.retencaoOutros,
      a.baseRetOutros                 = b.baseRetOutros,
      a.valorRetOutros                = b.valorRetOutros,
      a.aliquotaII                    = b.aliquotaII,
      a.baseII                        = b.baseII,
      a.valorII                       = b.valorII,
      a.aliquotaIOF                   = b.aliquotaIOF,
      a.baseIOF                       = b.baseIOF,
      a.valorIOF                      = b.valorIOF,
      a.codigoEnquadramentoIPI        = b.codigoEnquadramentoIPI,
      a.stIPI                         = b.stIPI,
      a.aliquotaIPI                   = b.aliquotaIPI,
      a.valorAliquotaIPI              = b.valorAliquotaIPI,
      a.baseIPI                       = b.baseIPI,
      a.valorIPI                      = b.valorIPI,
      a.valorIPIDevolucao             = b.valorIPIDevolucao,
      a.stPIS                         = b.stPIS,
      a.aliquotaPIS                   = b.aliquotaPIS,
      a.valorAliquotaPIS              = b.valorAliquotaPIS,
      a.basePIS                       = b.basePIS,
      a.valorPIS                      = b.valorPIS,
      a.aliquotaPISST                 = b.aliquotaPISST,
      a.valorAliquotaPISST            = b.valorAliquotaPISST,
      a.basePISST                     = b.basePISST,
      a.valorPISST                    = b.valorPISST,
      a.stCOFINS                      = b.stCOFINS,
      a.aliquotaCOFINS                = b.aliquotaCOFINS,
      a.valorAliquotaCOFINS           = b.valorAliquotaCOFINS,
      a.baseCOFINS                    = b.baseCOFINS,
      a.valorCOFINS                   = b.valorCOFINS,
      a.aliquotaCOFINSST              = b.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST         = b.valorAliquotaCOFINSST,
      a.baseCOFINSST                  = b.baseCOFINSST,
      a.valorCOFINSST                 = b.valorCOFINSST,
      a.stSimplesNacional             = b.stSimplesNacional,
      a.creditoSimplesNacional        = b.creditoSimplesNacional,
      a.baseCreditoSimplesNacional    = b.baseCreditoSimplesNacional,
      a.valorCreditoSimplesNacional   = b.valorCreditoSimplesNacional,
      a.stICMS                        = b.stICMS,
      a.modalidadeBaseCalcICMS        = b.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS               = b.reducaoBaseICMS,
      a.aliquotaICMS                  = b.aliquotaICMS,
      a.diferimentoICMS               = b.diferimentoICMS,
      a.motivoDesoneracaoICMS         = b.motivoDesoneracaoICMS,
      a.idBeneficio                   = b.idBeneficio,
      a.baseICMS                      = b.baseICMS,
      a.valorICMSoperacao             = b.valorICMSoperacao,
      a.valorICMSdiferido             = b.valorICMSdiferido,
      a.valorICMS                     = b.valorICMS,
      a.valorICMSdesoneracao          = b.valorICMSdesoneracao,
      a.modalidadeBaseCalcICMSST      = b.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST       = b.margemValorAdicionadoST,
      a.reducaoBaseST                 = b.reducaoBaseST,
      a.aliquotaICMSST                = b.aliquotaICMSST,
      a.aliquotaSTSuportConsFinal     = b.aliquotaSTSuportConsFinal,
      a.baseICMSST                    = b.baseICMSST,
      a.valorICMSST                   = b.valorICMSST,
      a.baseICMSSTAnteriormente       = b.baseICMSSTAnteriormente,
      a.valorICMSSTAnteriormente      = b.valorICMSSTAnteriormente,
      a.valorICMSProprioSubstituto    = b.valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo        = b.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo           = b.aliquotaICMSEfetivo,
      a.baseICMSEfetivo               = b.baseICMSEfetivo,
      a.valorICMSEfetivo              = b.valorICMSEfetivo,
      a.aliquotaICMSUFDestinatario    = b.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual     = b.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual     = b.partilhaICMSInterestadual,
      a.baseICMSUFDestinatario        = b.baseICMSUFDestinatario,
      a.valorICMSUFDestinatario       = b.valorICMSUFDestinatario,
      a.baseICMSUFRemetente           = b.baseICMSUFRemetente,
      a.valorICMSUFRemetente          = b.valorICMSUFRemetente,
      a.aliquotaFCP                   = b.aliquotaFCP,
      a.baseFCP                       = b.baseFCP,
      a.valorFCP                      = b.valorFCP,
      a.aliquotaFCPST                 = b.aliquotaFCPST,
      a.baseFCPST                     = b.baseFCPST,
      a.valorFCPST                    = b.valorFCPST,
      a.aliquotaFCPSTAnteriormente    = b.aliquotaFCPSTAnteriormente,
      a.baseFCPSTAnteriormente        = b.baseFCPSTAnteriormente,
      a.valorFCPSTAnteriormente       = b.valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario     = b.aliquotaFCPUFDestinatario,
      a.baseFCPUFDestinatario         = b.baseFCPUFDestinatario,
      a.valorFCPUFDestinatario        = b.valorFCPUFDestinatario,
      a.aliquotaestimadaimpfederais   = b.aliquotaestimadaimpfederais,
      a.aliquotaestimadaimpestaduais  = b.aliquotaestimadaimpestaduais,
      a.aliquotaestimadaimpmunicipais = b.aliquotaestimadaimpmunicipais,
      a.baseestimadaimpostos          = b.baseestimadaimpostos,
      a.valorestimadoimpfederais      = b.valorestimadoimpfederais,
      a.valorEstimadoImpEstaduais     = b.valorEstimadoImpEstaduais,
      a.valorEstimadoImpMunicipais    = b.valorEstimadoImpMunicipais,
      a.valorLiquidoItem              = b.valorLiquidoItem,
      a.valorDescontoCustoOpItem      = b.valorDescontoCustoOpItem,
      a.valorDescontoCustoOpGeral     = b.valorDescontoCustoOpGeral,
      a.valorDescontoCustoOpTotal     = b.valorDescontoCustoOpTotal,
      a.valorAcrescimoCustoOpItem     = b.valorAcrescimoCustoOpItem,
      a.valorAcrescimoCustoOpGeral    = b.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoCustoOpTotal    = b.valorAcrescimoCustoOpTotal,
      a.precoCustoOperacao            = b.precoCustoOperacao,
      a.valorCustoOperacao            = b.valorCustoOperacao,
      a.precoCMV                      = b.precoCMV,
      a.valorCMV                      = b.valorCMV,
      a.quantidadeExtemporanea        = b.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo = b.acrescimoUnitarioExtemporaneo,
      a.valorAcrescimoExtempSubtotal  = b.valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem      = b.valorAcrescimoExtempItem,
      a.valorAcrescimoExtempGeral     = b.valorAcrescimoExtempGeral,
      a.valorAcrescimoExtempTotal     = b.valorAcrescimoExtempTotal,
      a.observacoesDigitadas          = b.observacoesDigitadas,
      a.observacoes                   = b.observacoes
    WHEN NOT MATCHED THEN INSERT (
      idItemPreDocumento,
      preDocumento,
      sequencia,
      cancelado,
      pedidoCompraFornecedor,
      sequenciaPedidoCompraFornec,
      modeloDocumento,
      estabelecimentoOriginal,
      vendedor,
      gradeProduto,
      idFormulaTinta,
      personalizacao,
      idLoteEstoque,
      operacaoFiscal,
      movimentaEstoque,
      geraFinanceiro,
      localEstoque,
      pessoaParticipante,
      controleQuantidade,
      unidadeMedidaConversao,
      conversorQuantidade,
      loteMinimo,
      loteMultiplo,
      altura,
      largura,
      comprimento,
      pecas,
      quantidade,
      quantidadeConvertida,
      quantidadeDevolvidaRetornada,
      percentualDevolucao,
      pesoLiquido,
      pesoBruto,
      tipoPreco,
      tabelaPreco,
      precoSugestaoAPrazo,
      precoSugestaoAVista,
      precoDesconto,
      precoMinimo,
      usarPrecoAVista,
      precoUnitarioBruto,
      acrescimoUnitarioComposicao,
      precoUnitario,
      precoUnitarioConvertido,
      valorProdutoServicoBruto,
      valorProdutoServico,
      percDescontoItem,
      valorDescontoItem,
      percAcrescimoItem,
      valorAcrescimoItem,
      valorFreteItem,
      valorSeguroItem,
      valorAdicFreteMarinhaMerItem,
      valorDespesasAduaneirasItem,
      valorFreteGeral,
      valorSeguroGeral,
      valorDescontoGeral,
      valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral,
      valorDespesasAduaneirasGeral,
      valorBasePagamento,
      valorDescontoPagamento,
      valorOutrasDespesasPagamento,
      valorJurosPagamento,
      valorFreteTotal,
      valorSeguroTotal,
      valorDescontoTotal,
      valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal,
      valorDespesasAduaneirasTotal,
      cfop,
      indicadorISSQN,
      aliquotaISSQN,
      retidoISSQN,
      tributadoForaMunicipio,
      incentivoFiscal,
      listaServicos,
      cnae,
      idServicoMunicipio,
      numeroProcessoAdministrativo,
      baseISSQN,
      valorISSQN,
      retencaoIRRF,
      baseRetIRRF,
      valorRetIRRF,
      retencaoINSS,
      baseRetINSS,
      valorRetINSS,
      retencaoPIS,
      baseRetPIS,
      valorRetPIS,
      retencaoCOFINS,
      baseRetCOFINS,
      valorRetCOFINS,
      retencaoCSLL,
      baseRetCSLL,
      valorRetCSLL,
      retencaoOutros,
      baseRetOutros,
      valorRetOutros,
      aliquotaII,
      baseII,
      valorII,
      aliquotaIOF,
      baseIOF,
      valorIOF,
      codigoEnquadramentoIPI,
      stIPI,
      aliquotaIPI,
      valorAliquotaIPI,
      baseIPI,
      valorIPI,
      valorIPIDevolucao,
      stPIS,
      aliquotaPIS,
      valorAliquotaPIS,
      basePIS,
      valorPIS,
      aliquotaPISST,
      valorAliquotaPISST,
      basePISST,
      valorPISST,
      stCOFINS,
      aliquotaCOFINS,
      valorAliquotaCOFINS,
      baseCOFINS,
      valorCOFINS,
      aliquotaCOFINSST,
      valorAliquotaCOFINSST,
      baseCOFINSST,
      valorCOFINSST,
      stSimplesNacional,
      creditoSimplesNacional,
      baseCreditoSimplesNacional,
      valorCreditoSimplesNacional,
      stICMS,
      modalidadeBaseCalcICMS,
      reducaoBaseICMS,
      aliquotaICMS,
      diferimentoICMS,
      motivoDesoneracaoICMS,
      idBeneficio,
      baseICMS,
      valorICMSOperacao,
      valorICMSDiferido,
      valorICMS,
      valorICMSDesoneracao,
      modalidadeBaseCalcICMSST,
      margemValorAdicionadoST,
      reducaoBaseST,
      aliquotaICMSST,
      aliquotaSTSuportConsFinal,
      baseICMSST,
      valorICMSST,
      baseICMSSTAnteriormente,
      valorICMSSTAnteriormente,
      valorICMSProprioSubstituto,
      reducaoBaseICMSEfetivo,
      aliquotaICMSEfetivo,
      baseICMSEfetivo,
      valorICMSEfetivo,
      aliquotaICMSUFDestinatario,
      aliquotaICMSInterestadual,
      partilhaICMSInterestadual,
      baseICMSUFDestinatario,
      valorICMSUFDestinatario,
      baseICMSUFRemetente,
      valorICMSUFRemetente,
      aliquotaFCP,
      baseFCP,
      valorFCP,
      aliquotaFCPST,
      baseFCPST,
      valorFCPST,
      aliquotaFCPSTAnteriormente,
      baseFCPSTAnteriormente,
      valorFCPSTAnteriormente,
      aliquotaFCPUFDestinatario,
      baseFCPUFDestinatario,
      valorFCPUFDestinatario,
      aliquotaEstimadaImpFederais,
      aliquotaEstimadaImpEstaduais,
      aliquotaEstimadaImpMunicipais,
      baseEstimadaImpostos,
      valorEstimadoImpFederais,
      valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais,
      valorLiquidoItem,
      valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral,
      valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpItem,
      valorAcrescimoCustoOpGeral,
      valorAcrescimoCustoOpTotal,
      precoCustoOperacao,
      valorCustoOperacao,
      precoCMV,
      valorCMV,
      quantidadeExtemporanea,
      acrescimoUnitarioExtemporaneo,
      valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral,
      valorAcrescimoExtempTotal,
      observacoesDigitadas,
      observacoes)
    VALUES (
      b.idItemPreDocumento,
      b.preDocumento,
      b.sequencia,
      b.cancelado,
      b.pedidoCompraFornecedor,
      b.sequenciaPedidoCompraFornec,
      b.modeloDocumento,
      b.estabelecimentoOriginal,
      b.vendedor,
      b.gradeProduto,
      b.idFormulaTinta,
      b.personalizacao,
      b.idLoteEstoque,
      b.operacaoFiscal,
      b.movimentaEstoque,
      b.geraFinanceiro,
      b.localEstoque,
      b.pessoaParticipante,
      b.controleQuantidade,
      b.unidadeMedidaConversao,
      b.conversorQuantidade,
      b.loteMinimo,
      b.loteMultiplo,
      b.altura,
      b.largura,
      b.comprimento,
      b.pecas,
      b.quantidade,
      b.quantidadeConvertida,
      b.quantidadeDevolvidaRetornada,
      b.percentualDevolucao,
      b.pesoLiquido,
      b.pesoBruto,
      b.tipoPreco,
      b.tabelaPreco,
      b.precoSugestaoAPrazo,
      b.precoSugestaoAVista,
      b.precoDesconto,
      b.precoMinimo,
      b.usarPrecoAVista,
      b.precoUnitarioBruto,
      b.acrescimoUnitarioComposicao,
      b.precoUnitario,
      b.precoUnitarioConvertido,
      b.valorProdutoServicoBruto,
      b.valorProdutoServico,
      b.percDescontoItem,
      b.valorDescontoItem,
      b.percAcrescimoItem,
      b.valorAcrescimoItem,
      b.valorFreteItem,
      b.valorSeguroItem,
      b.valorAdicFreteMarinhaMerItem,
      b.valorDespesasAduaneirasItem,
      b.valorFreteGeral,
      b.valorSeguroGeral,
      b.valorDescontoGeral,
      b.valorOutrasDespesasGeral,
      b.valorAdicFreteMarinhaMerGeral,
      b.valorDespesasAduaneirasGeral,
      b.valorBasePagamento,
      b.valorDescontoPagamento,
      b.valorOutrasDespesasPagamento,
      b.valorJurosPagamento,
      b.valorFreteTotal,
      b.valorSeguroTotal,
      b.valorDescontoTotal,
      b.valorOutrasDespesasTotal,
      b.valorAdicFreteMarinhaMerTotal,
      b.valorDespesasAduaneirasTotal,
      b.cfop,
      b.indicadorISSQN,
      b.aliquotaISSQN,
      b.retidoISSQN,
      b.tributadoForaMunicipio,
      b.incentivoFiscal,
      b.listaServicos,
      b.cnae,
      b.idServicoMunicipio,
      b.numeroProcessoAdministrativo,
      b.baseISSQN,
      b.valorISSQN,
      b.retencaoIRRF,
      b.baseRetIRRF,
      b.valorRetIRRF,
      b.retencaoINSS,
      b.baseRetINSS,
      b.valorRetINSS,
      b.retencaoPIS,
      b.baseRetPIS,
      b.valorRetPIS,
      b.retencaoCOFINS,
      b.baseRetCOFINS,
      b.valorRetCOFINS,
      b.retencaoCSLL,
      b.baseRetCSLL,
      b.valorRetCSLL,
      b.retencaoOutros,
      b.baseRetOutros,
      b.valorRetOutros,
      b.aliquotaII,
      b.baseII,
      b.valorII,
      b.aliquotaIOF,
      b.baseIOF,
      b.valorIOF,
      b.codigoEnquadramentoIPI,
      b.stIPI,
      b.aliquotaIPI,
      b.valorAliquotaIPI,
      b.baseIPI,
      b.valorIPI,
      b.valorIPIDevolucao,
      b.stPIS,
      b.aliquotaPIS,
      b.valorAliquotaPIS,
      b.basePIS,
      b.valorPIS,
      b.aliquotaPISST,
      b.valorAliquotaPISST,
      b.basePISST,
      b.valorPISST,
      b.stCOFINS,
      b.aliquotaCOFINS,
      b.valorAliquotaCOFINS,
      b.baseCOFINS,
      b.valorCOFINS,
      b.aliquotaCOFINSST,
      b.valorAliquotaCOFINSST,
      b.baseCOFINSST,
      b.valorCOFINSST,
      b.stSimplesNacional,
      b.creditoSimplesNacional,
      b.baseCreditoSimplesNacional,
      b.valorCreditoSimplesNacional,
      b.stICMS,
      b.modalidadeBaseCalcICMS,
      b.reducaoBaseICMS,
      b.aliquotaICMS,
      b.diferimentoICMS,
      b.motivoDesoneracaoICMS,
      b.idBeneficio,
      b.baseICMS,
      b.valorICMSOperacao,
      b.valorICMSDiferido,
      b.valorICMS,
      b.valorICMSDesoneracao,
      b.modalidadeBaseCalcICMSST,
      b.margemValorAdicionadoST,
      b.reducaoBaseST,
      b.aliquotaICMSST,
      b.aliquotaSTSuportConsFinal,
      b.baseICMSST,
      b.valorICMSST,
      b.baseICMSSTAnteriormente,
      b.valorICMSSTAnteriormente,
      b.valorICMSProprioSubstituto,
      b.reducaoBaseICMSEfetivo,
      b.aliquotaICMSEfetivo,
      b.baseICMSEfetivo,
      b.valorICMSEfetivo,
      b.aliquotaICMSUFDestinatario,
      b.aliquotaICMSInterestadual,
      b.partilhaICMSInterestadual,
      b.baseICMSUFDestinatario,
      b.valorICMSUFDestinatario,
      b.baseICMSUFRemetente,
      b.valorICMSUFRemetente,
      b.aliquotaFCP,
      b.baseFCP,
      b.valorFCP,
      b.aliquotaFCPST,
      b.baseFCPST,
      b.valorFCPST,
      b.aliquotaFCPSTAnteriormente,
      b.baseFCPSTAnteriormente,
      b.valorFCPSTAnteriormente,
      b.aliquotaFCPUFDestinatario,
      b.baseFCPUFDestinatario,
      b.valorFCPUFDestinatario,
      b.aliquotaEstimadaImpFederais,
      b.aliquotaEstimadaImpEstaduais,
      b.aliquotaEstimadaImpMunicipais,
      b.baseEstimadaImpostos,
      b.valorEstimadoImpFederais,
      b.valorEstimadoImpEstaduais,
      b.valorEstimadoImpMunicipais,
      b.valorLiquidoItem,
      b.valorDescontoCustoOpItem,
      b.valorDescontoCustoOpGeral,
      b.valorDescontoCustoOpTotal,
      b.valorAcrescimoCustoOpItem,
      b.valorAcrescimoCustoOpGeral,
      b.valorAcrescimoCustoOpTotal,
      b.precoCustoOperacao,
      b.valorCustoOperacao,
      b.precoCMV,
      b.valorCMV,
      b.quantidadeExtemporanea,
      b.acrescimoUnitarioExtemporaneo,
      b.valorAcrescimoExtempSubtotal,
      b.valorAcrescimoExtempItem,
      b.valorAcrescimoExtempGeral,
      b.valorAcrescimoExtempTotal,
      b.observacoesDigitadas,
      b.observacoes);
    v_atualizarObservacoes := 0;
    IF p_idItemReferenciado > 0 THEN
      IF p_tipoDocumentoReferenciado IN ('D','P') THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV(
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_devolucaoAnulacaoRetorno,
          'P',
          r_item_idItemPreDocumento,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          p_tipoDocumentoReferenciado,
          p_idItemReferenciado);
      END IF;
      IF p_tipoDocumentoReferenciado = 'D' THEN
        ADD_PRE_DOC_ITEM_REF_DOC_FIS (
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_preDocumento,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemPreDocumento,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'O' THEN
        ADD_PRE_DOC_ITEM_REF_ORCAMEN (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_preDocumento,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemPreDocumento,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'P' THEN
        ADD_PRE_DOC_ITEM_REF_PRE_DOC (
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_preDocumento,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemPreDocumento,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'T' THEN
        ADD_PRE_DOC_ITEM_TRANS_GRAVA (
          p_estabelecimentoAtivo,
          v_cab_entradaSaida,
          p_idItemReferenciado,
          r_item_idItemPreDocumento,
          p_quantidadeReferenciada);
      END IF;
    END IF;
    IF p_tempComp_nomeTempComposicao <> ' '
      AND (NOT (p_tipoDocumentoReferenciado IN ('D','O','P'))
        OR p_idItemReferenciado <= 0)
    THEN
      ADD_PRE_DOC_ITEM_COMP_TEMP (
        p_sessaoClient,
        p_estabelecimentoAtivo,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        r_item_idItemPreDocumento,
        v_atualizarObservacoes,
        v_atualizarObservacoes);
    END IF;
    v_idEnderecoEstoque := 0;
    IF p_item_idEnderecoEstoque > 0 THEN
      ADD_PRE_DOC_ITEM_ENDER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemPreDocumento,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_quantidade,
        ' ',
        v_idEnderecoEstoque);
    END IF;
    IF p_item_idNumeroSerie > 0 THEN
      ADD_PRE_DOC_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemPreDocumento,
        v_idEnderecoEstoque,
        p_item_gradeProduto,
        p_item_idNumeroSerie,
        0,
        v_auxNumber);
      v_atualizarObservacoes := 1;
    END IF;
    IF v_atualizarObservacoes = 1 THEN
      v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
        p_sessaoClient,
        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_413_obs_add_marca,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        'P',
        r_item_idItemPreDocumento,
        p_item_gradeProduto,
        p_item_idFormulaTinta,
        p_item_personalizacao,
        p_item_idLoteEstoque,
        p_item_controleQuantidade,
        p_item_loteMultiplo,
        p_item_altura,
        p_item_largura,
        p_item_comprimento,
        p_item_quantidade,
        p_item_observacoesDigitadas);
      UPDATE MOPREDOCUMXITENS
      SET observacoes = v_observacoes
      WHERE idItemPreDocumento = r_item_idItemPreDocumento;
    END IF;
    IF v_cab_statusPreDocumento = 'A' THEN
      ADD_PRE_DOC_ITEM_EST_ATUALIZA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_item_idItemPreDocumento,
        p_estabelecimentoAtivo);
      ADD_PRE_DOC_ITEM_FIL_ATUALIZA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_item_idItemPreDocumento,
        p_estabelecimentoAtivo);
    END IF;
    r_buffer_idItemPreDocumento := CASE WHEN (r_buffer_idItemPreDocumento IS NULL OR r_buffer_idItemPreDocumento = '' OR r_buffer_idItemPreDocumento = ' ') THEN '' ELSE RTRIM (r_buffer_idItemPreDocumento) || ';' END || TO_CHAR (LPAD(r_item_idItemPreDocumento,14,'0'));
    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;
  END IF;
END ADD_PRE_DOC_ITEM_GRAVA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_PROJ_GRAVA (
  p_estabelecimentoAtivo IN NUMBER,
  p_id                   IN NUMBER,
  p_idItemOrcamento      IN NUMBER,
  p_atividadeProjeto     IN NUMBER,
  /* Retornos */
  r_id                   OUT NUMBER)
IS
BEGIN
  r_id := p_id;
  IF r_id = 0 THEN
    SELECT COALESCE(MAX(id),0)
    INTO r_id
    FROM MOORCAMENTOXATIVIDADEPROJ
    WHERE idItemOrcamento = p_idItemOrcamento
    AND atividadeProjeto = p_atividadeProjeto;
  END IF; 
  IF r_id = 0 THEN
    r_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MOORCAMENTOXATIVIDADEPROJ', 'id', 14, p_estabelecimentoAtivo, NULL);
  END IF;
  MERGE INTO MOORCAMENTOXATIVIDADEPROJ a 
  USING (
    SELECT
      r_id               id,
      p_idItemOrcamento  idItemOrcamento,
      p_atividadeProjeto atividadeProjeto
    FROM DUAL
  ) b ON (a.id = b.id)
  WHEN MATCHED THEN UPDATE SET
    a.idItemOrcamento  = b.idItemOrcamento,
    a.atividadeProjeto = b.atividadeProjeto
  WHEN NOT MATCHED THEN INSERT (
    id,
    idItemOrcamento,
    atividadeProjeto)
  VALUES (
    b.id,
    b.idItemOrcamento,
    b.atividadeProjeto);
END ADD_ORCAMENTO_ITEM_PROJ_GRAVA;

/

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_config_413_obs_add_marca     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, 'F' Fatura Contrato, 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_atividadeProjeto        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_projeto                  VARCHAR2 (60);
  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.projeto,
    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_projeto,
    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_cab_projeto,
        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_config_413_obs_add_marca,
        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_atividadeProjeto,
        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
      SELECT COALESCE (MAX (sequencia),0) + 1
      INTO v_item_sequencia
      FROM MOORCAMENTOXITENS
      WHERE orcamento = p_item_orcamento;
      v_cab_ultimoVendedorItem := p_item_vendedor;
    END IF;
    IF v_item_cancelado = 0 THEN
      IF p_manterFinanceiro_Retotalizar <> 2 THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume + TRUNC(CASE WHEN p_item_controleQuantidade = 1 AND p_item_loteMultiplo <> 0 THEN p_item_quantidade / p_item_loteMultiplo ELSE p_item_quantidadeConvertida END,0);
        END IF;
        v_cab_pesoLiquido := v_cab_pesoLiquido + p_item_pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto + p_item_pesoBruto;
      END IF;
      v_cab_quantidade := v_cab_quantidade + p_item_quantidadeConvertida;
      IF v_prod_tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorServicos := v_cab_valorServicos + v_item_valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos + p_item_valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorProdutos := v_cab_valorProdutos + v_item_valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos + p_item_valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem + p_item_valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem + p_item_valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem + p_item_valorAdicFreteMarItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem + p_item_valorDespesasAduanItem;
      v_cab_valorFreteGeral := v_cab_valorFreteGeral + v_item_valorFreteGeral;
      v_cab_valorSeguroGeral := v_cab_valorSeguroGeral + p_item_valorSeguroGeral;
      v_cab_valorDescontoGeral := v_cab_valorDescontoGeral + v_item_valorDescontoGeral;
      v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral + p_item_valorOutrasDespesasGer;
      v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral + p_item_valorAdicFreteMarGeral;
      v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral + p_item_valorDespesasAduanGeral;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento + v_item_valorBasePagamento;
      IF p_item_usarPrecoAVista = 1
        AND v_item_geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo + v_item_valorProdutoServico - v_item_valorDescontoTotal + v_item_valorOutrasDespesasTot;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento + v_item_valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento + v_item_valorOutrasDespPagament;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento + v_item_valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal + v_item_valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal + v_item_valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal + v_item_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_item_valorOutrasDespesasTot;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal + v_item_valorAdicFreteMarTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal + v_item_valorDespesasAduanTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem + v_item_valorLiquidoItem;
    ELSE
      v_item_quantidadeSaldo := 0;
    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 = p_item_orcamento;
    IF p_item_idItemOrcamento > 0 THEN
      DELETE MOORCAMENTOXCOMPOSICOESPR compDoc
      WHERE compDoc.idItemOrcamento = p_item_idItemOrcamento
      AND EXISTS(
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.produto = comp.produto
        WHERE comp.composicaoPreco = compDoc.composicaoPreco
        AND gradProd.gradeProduto <> p_item_gradeProduto);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      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_413_obs_add_marca,
      ' ',
      0,
      'O',
      p_item_idItemOrcamento,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    MERGE INTO MOORCAMENTOXITENS a USING (
      SELECT
        r_item_idItemOrcamento         idItemOrcamento,
        p_item_orcamento               orcamento,
        v_item_sequencia               sequencia,
        v_item_cancelado               cancelado,
        p_item_pedidoCompraFornecedor  pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo sequenciaPedidoCompraFornec,
        p_item_ambiente                ambiente,
        p_item_ambienteObservacoes     ambienteObservacoes,
        p_item_modeloDocumento         modeloDocumento,
        p_item_estabelecimentoOriginal estabelecimentoOriginal,
        p_item_vendedor                vendedor,
        p_item_gradeProduto            gradeProduto,
        p_item_atividadeServico        atividadeServico,
        p_item_statusAtividadeServico  statusAtividadeServico,
        p_item_idFormulaTinta          idFormulaTinta,
        p_item_personalizacao          personalizacao,
        p_item_idLoteEstoque           idLoteEstoque,
        p_item_vinculoItemDocumento    vinculoItemDocumento,
        p_item_operacaoFiscal          operacaoFiscal,
        v_item_movimentaEstoque        movimentaEstoque,
        v_item_geraFinanceiro          geraFinanceiro,
        p_item_localEstoque            localEstoque,
        p_item_pessoaParticipante      pessoaParticipante,
        p_item_dataEntrega             dataEntrega,
        p_item_controleQuantidade      controleQuantidade,
        p_item_unidadeMedidaConversao  unidadeMedidaConversao,
        p_item_conversorQuantidade     conversorQuantidade,
        p_item_loteMinimo              loteMinimo,
        p_item_loteMultiplo            loteMultiplo,
        p_item_altura                  altura,
        p_item_largura                 largura,
        p_item_comprimento             comprimento,
        p_item_pecas                   pecas,
        p_item_quantidade              quantidade,
        p_item_quantidadeConvertida    quantidadeConvertida,
        v_item_quantidadeSaldo         quantidadeSaldo,
        p_item_controleEntrega         controleEntrega,
        p_item_pesoLiquido             pesoLiquido,
        p_item_pesoBruto               pesoBruto,
        p_item_tipoPreco               tipoPreco,
        p_item_tabelaPreco             tabelaPreco,
        p_item_precoSugestaoAPrazo     precoSugestaoAPrazo,
        p_item_precoSugestaoAVista     precoSugestaoAVista,
        p_item_precoDesconto           precoDesconto,
        p_item_precoMinimo             precoMinimo,
        p_item_usarPrecoAVista         usarPrecoAVista,
        p_item_precoUnitarioBruto      precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos acrescimoUnitarioComposicao,
        v_item_precoUnitario           precoUnitario,
        v_item_precoUnitarioConvertido precoUnitarioConvertido,
        v_item_valorProdutoServicoBrut valorProdutoServicoBruto,
        v_item_valorProdutoServico     valorProdutoServico,
        p_item_percDescontoItem        percDescontoItem,
        p_item_valorDescontoItem       valorDescontoItem,
        p_item_percAcrescimoItem       percAcrescimoItem,
        p_item_valorAcrescimoItem      valorAcrescimoItem,
        p_item_valorFreteItem          valorFreteItem,
        p_item_valorSeguroItem         valorSeguroItem,
        p_item_valorAdicFreteMarItem   valorAdicFreteMarinhaMerItem,
        p_item_valorDespesasAduanItem  valorDespesasAduaneirasItem,
        v_item_valorFreteGeral         valorFreteGeral,
        p_item_valorSeguroGeral        valorSeguroGeral,
        v_item_valorDescontoGeral      valorDescontoGeral,
        p_item_valorOutrasDespesasGer  valorOutrasDespesasGeral,
        p_item_valorAdicFreteMarGeral  valorAdicFreteMarinhaMerGeral,
        p_item_valorDespesasAduanGeral valorDespesasAduaneirasGeral,
        v_item_valorBasePagamento      valorBasePagamento,
        v_item_valorDescontoPagamento  valorDescontoPagamento,
        v_item_valorOutrasDespPagament valorOutrasDespesasPagamento,
        v_item_valorJurosPagamento     valorJurosPagamento,
        v_item_valorFreteTotal         valorFreteTotal,
        v_item_valorSeguroTotal        valorSeguroTotal,
        v_item_valorDescontoTotal      valorDescontoTotal,
        v_item_valorOutrasDespesasTot  valorOutrasDespesasTotal,
        v_item_valorAdicFreteMarTotal  valorAdicFreteMarinhaMerTotal,
        v_item_valorDespesasAduanTotal valorDespesasAduaneirasTotal,
        v_item_cfop                    cfop,
        v_item_indicadorISSQN          indicadorISSQN,
        v_item_aliquotaISSQN           aliquotaISSQN,
        v_item_retidoISSQN             retidoISSQN,
        v_item_tributadoForaMunicipio  tributadoForaMunicipio,
        v_item_incentivoFiscal         incentivoFiscal,
        v_item_listaServicos           listaServicos,
        v_item_cnae                    cnae,
        v_item_idServicoMunicipio      idServicoMunicipio,
        v_item_numeroProcessoAdministr numeroProcessoAdministrativo,
        v_item_baseISSQN               baseISSQN,
        v_item_valorISSQN              valorISSQN,
        v_item_retencaoIRRF            retencaoIRRF,
        v_item_baseRetIRRF             baseRetIRRF,
        v_item_valorRetIRRF            valorRetIRRF,
        v_item_retencaoINSS            retencaoINSS,
        v_item_baseRetINSS             baseRetINSS,
        v_item_valorRetINSS            valorRetINSS,
        v_item_retencaoPIS             retencaoPIS,
        v_item_baseRetPIS              baseRetPIS,
        v_item_valorRetPIS             valorRetPIS,
        v_item_retencaoCOFINS          retencaoCOFINS,
        v_item_baseRetCOFINS           baseRetCOFINS,
        v_item_valorRetCOFINS          valorRetCOFINS,
        v_item_retencaoCSLL            retencaoCSLL,
        v_item_baseRetCSLL             baseRetCSLL,
        v_item_valorRetCSLL            valorRetCSLL,
        v_item_retencaoOutros          retencaoOutros,
        v_item_baseRetOutros           baseRetOutros,
        v_item_valorRetOutros          valorRetOutros,
        v_item_aliquotaII              aliquotaII,
        v_item_baseII                  baseII,
        v_item_valorII                 valorII,
        v_item_aliquotaIOF             aliquotaIOF,
        v_item_baseIOF                 baseIOF,
        v_item_valorIOF                valorIOF,
        v_item_codigoEnquadramentoIPI  codigoEnquadramentoIPI,
        v_item_stIPI                   stIPI,
        v_item_aliquotaIPI             aliquotaIPI,
        v_item_valorAliquotaIPI        valorAliquotaIPI,
        v_item_baseIPI                 baseIPI,
        v_item_valorIPI                valorIPI,
        v_item_stPIS                   stPIS,
        v_item_aliquotaPIS             aliquotaPIS,
        v_item_valorAliquotaPIS        valorAliquotaPIS,
        v_item_basePIS                 basePIS,
        v_item_valorPIS                valorPIS,
        v_item_aliquotaPISST           aliquotaPISST,
        v_item_valorAliquotaPISST      valorAliquotaPISST,
        v_item_basePISST               basePISST,
        v_item_valorPISST              valorPISST,
        v_item_stCOFINS                stCOFINS,
        v_item_aliquotaCOFINS          aliquotaCOFINS,
        v_item_valorAliquotaCOFINS     valorAliquotaCOFINS,
        v_item_baseCOFINS              baseCOFINS,
        v_item_valorCOFINS             valorCOFINS,
        v_item_aliquotaCOFINSST        aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST   valorAliquotaCOFINSST,
        v_item_baseCOFINSST            baseCOFINSST,
        v_item_valorCOFINSST           valorCOFINSST,
        v_item_stSimplesNacional       stSimplesNacional,
        v_item_creditoSimplesNacional  creditoSimplesNacional,
        v_item_baseCreditoSimplesNac   baseCreditoSimplesNacional,
        v_item_valorCreditoSimplesNac  valorCreditoSimplesNacional,
        v_item_stICMS                  stICMS,
        v_item_modalBaseCalcICMS       modalidadeBaseCalcICMS,
        v_item_reducaoBaseICMS         reducaoBaseICMS,
        v_item_aliquotaICMS            aliquotaICMS,
        v_item_diferimentoICMS         diferimentoICMS,
        v_item_motivoDesoneracaoICMS   motivoDesoneracaoICMS,
        v_item_idBeneficio             idBeneficio,
        v_item_baseICMS                baseICMS,
        v_item_valorICMSOperacao       valorICMSOperacao,
        v_item_valorICMSDiferido       valorICMSDiferido,
        v_item_valorICMS               valorICMS,
        v_item_valorICMSDesoneracao    valorICMSDesoneracao,
        v_item_modalBaseCalcICMSST     modalidadeBaseCalcICMSST,
        v_item_margemValorAdicionadoST margemValorAdicionadoST,
        v_item_reducaoBaseST           reducaoBaseST,
        v_item_aliquotaICMSST          aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin aliquotaSTSuportConsFinal,
        v_item_baseICMSST              baseICMSST,
        v_item_valorICMSST             valorICMSST,
        v_item_baseICMSSTAnteriormente baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment valorICMSSTAnteriormente,
        v_item_valorICMSProprioSubstit valorICMSProprioSubstituto,
        v_item_reducaoBaseICMSEfetivo  reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo     aliquotaICMSEfetivo,
        v_item_baseICMSEfetivo         baseICMSEfetivo,
        v_item_valorICMSEfetivo        valorICMSEfetivo,
        v_item_aliquotaICMSUFDestinat  aliquotaICMSUFDestinatario,
        v_item_aliquotaICMSInterestad  aliquotaICMSInterestadual,
        v_item_partilhaICMSInterestad  partilhaICMSInterestadual,
        v_item_baseICMSUFDestinatario  baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente     baseICMSUFRemetente,
        v_item_valorICMSUFRemetente    valorICMSUFRemetente,
        v_item_aliquotaFCP             aliquotaFCP,
        v_item_baseFCP                 baseFCP,
        v_item_valorFCP                valorFCP,
        v_item_aliquotaFCPST           aliquotaFCPST,
        v_item_baseFCPST               baseFCPST,
        v_item_valorFCPST              valorFCPST,
        v_item_aliquotaFCPSTAnteriorm  aliquotaFCPSTAnteriormente,
        v_item_baseFCPSTAnteriormente  baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente valorFCPSTAnteriormente,
        v_item_aliquotaFCPUFDestinat   aliquotaFCPUFDestinatario,
        v_item_baseFCPUFDestinatario   baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario  valorFCPUFDestinatario,
        v_item_aliquotaEstImpFederais  aliquotaEstimadaImpFederais,
        v_item_aliquotaEstImpEstaduais aliquotaEstimadaImpEstaduais,
        v_item_aliquotaEstImpMunicipai aliquotaEstimadaImpMunicipais,
        v_item_baseEstimadaImpostos    baseEstimadaImpostos,
        v_item_valorEstImpFederais     valorEstimadoImpFederais,
        v_item_valorEstImpEstaduais    valorEstimadoImpEstaduais,
        v_item_valorEstImpMunicipais   valorEstimadoImpMunicipais,
        v_item_valorLiquidoItem        valorLiquidoItem,
        p_item_observacoesDigitadas    observacoesDigitadas,
        v_observacoes                  observacoes
      FROM DUAL) b
    ON (a.idItemOrcamento = b.idItemOrcamento)
    WHEN MATCHED THEN UPDATE SET
      a.orcamento                     = b.orcamento,
      a.sequencia                     = b.sequencia,
      a.cancelado                     = b.cancelado,
      a.pedidoCompraFornecedor        = b.pedidoCompraFornecedor,
      a.sequenciaPedidoCompraFornec   = b.sequenciaPedidoCompraFornec,
      a.ambiente                      = b.ambiente,
      a.ambienteObservacoes           = b.ambienteObservacoes,
      a.vendedor                      = b.vendedor,
      a.modeloDocumento               = b.modeloDocumento,
      a.estabelecimentoOriginal       = b.estabelecimentoOriginal,
      a.gradeProduto                  = b.gradeProduto,
      a.atividadeServico              = b.atividadeServico,
      a.statusAtividadeServico        = b.statusAtividadeServico,
      a.idFormulaTinta                = b.idFormulaTinta,
      a.personalizacao                = b.personalizacao,
      a.idLoteEstoque                 = b.idLoteEstoque,
      a.vinculoItemDocumento          = b.vinculoItemDocumento,
      a.operacaoFiscal                = b.operacaoFiscal,
      a.movimentaEstoque              = b.movimentaEstoque,
      a.geraFinanceiro                = b.geraFinanceiro,
      a.localEstoque                  = b.localEstoque,
      a.pessoaParticipante            = b.pessoaParticipante,
      a.dataEntrega                   = b.dataEntrega,
      a.controleQuantidade            = b.controleQuantidade,
      a.unidadeMedidaConversao        = b.unidadeMedidaConversao,
      a.conversorQuantidade           = b.conversorQuantidade,
      a.loteMinimo                    = b.loteMinimo,
      a.loteMultiplo                  = b.loteMultiplo,
      a.altura                        = b.altura,
      a.largura                       = b.largura,
      a.comprimento                   = b.comprimento,
      a.pecas                         = b.pecas,
      a.quantidade                    = b.quantidade,
      a.quantidadeConvertida          = b.quantidadeConvertida,
      a.quantidadeSaldo               = b.quantidadeSaldo,
      a.controleEntrega               = b.controleEntrega,
      a.pesoLiquido                   = b.pesoLiquido,
      a.pesoBruto                     = b.pesoBruto,
      a.tipoPreco                     = b.tipoPreco,
      a.tabelaPreco                   = b.tabelaPreco,
      a.precoSugestaoAPrazo           = b.precoSugestaoAPrazo,
      a.precoSugestaoAVista           = b.precoSugestaoAVista,
      a.precoDesconto                 = b.precoDesconto,
      a.precoMinimo                   = b.precoMinimo,
      a.usarPrecoAVista               = b.usarPrecoAVista,
      a.precoUnitarioBruto            = b.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao   = b.acrescimoUnitarioComposicao,
      a.precoUnitario                 = b.precoUnitario,
      a.precoUnitarioConvertido       = b.precounitarioConvertido,
      a.valorProdutoServicoBruto      = b.valorProdutoServicoBruto,
      a.valorProdutoServico           = b.valorProdutoServico,
      a.percDescontoItem              = b.percDescontoItem,
      a.valorDescontoItem             = b.valorDescontoItem,
      a.percAcrescimoItem             = b.percAcrescimoItem,
      a.valorAcrescimoItem            = b.valorAcrescimoItem,
      a.valorFreteItem                = b.valorFreteItem,
      a.valorSeguroItem               = b.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem  = b.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem   = b.valorDespesasAduaneirasItem,
      a.valorFreteGeral               = b.valorFreteGeral,
      a.valorSeguroGeral              = b.valorSeguroGeral,
      a.valorDescontoGeral            = b.valorDescontoGeral,
      a.valorOutrasDespesasGeral      = b.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral = b.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral  = b.valorDespesasAduaneirasGeral,
      a.valorBasePagamento            = b.valorBasePagamento,
      a.valorDescontoPagamento        = b.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento  = b.valorOutrasDespesasPagamento,
      a.valorJurosPagamento           = b.valorJurosPagamento,
      a.valorFreteTotal               = b.valorFreteTotal,
      a.valorSeguroTotal              = b.valorSeguroTotal,
      a.valorDescontoTotal            = b.valorDescontoTotal,
      a.valorOutrasDespesasTotal      = b.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal = b.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal  = b.valorDespesasAduaneirasTotal,
      a.cfop                          = b.cfop,
      a.indicadorISSQN                = b.indicadorISSQN,
      a.aliquotaISSQN                 = b.aliquotaISSQN,
      a.baseISSQN                     = b.baseISSQN,
      a.valorISSQN                    = b.valorISSQN,
      a.retidoISSQN                   = b.retidoISSQN,
      a.tributadoForaMunicipio        = b.tributadoForaMunicipio,
      a.incentivoFiscal               = b.incentivoFiscal,
      a.listaServicos                 = b.listaServicos,
      a.cnae                          = b.cnae,
      a.idServicoMunicipio            = b.idServicoMunicipio,
      a.numeroProcessoAdministrativo  = b.numeroProcessoAdministrativo,
      a.retencaoIRRF                  = b.retencaoIRRF,
      a.baseRetIRRF                   = b.baseRetIRRF,
      a.valorRetIRRF                  = b.valorRetIRRF,
      a.retencaoINSS                  = b.retencaoINSS,
      a.baseRetINSS                   = b.baseRetINSS,
      a.valorRetINSS                  = b.valorRetINSS,
      a.retencaoPIS                   = b.retencaoPIS,
      a.baseRetPIS                    = b.baseRetPIS,
      a.valorRetPIS                   = b.valorRetPIS,
      a.retencaoCOFINS                = b.retencaoCOFINS,
      a.baseRetCOFINS                 = b.baseRetCOFINS,
      a.valorRetCOFINS                = b.valorRetCOFINS,
      a.retencaoCSLL                  = b.retencaoCSLL,
      a.baseRetCSLL                   = b.baseRetCSLL,
      a.valorRetCSLL                  = b.valorRetCSLL,
      a.retencaoOutros                = b.retencaoOutros,
      a.baseRetOutros                 = b.baseRetOutros,
      a.valorRetOutros                = b.valorRetOutros,
      a.aliquotaII                    = b.aliquotaII,
      a.baseII                        = b.baseII,
      a.valorII                       = b.valorII,
      a.aliquotaIOF                   = b.aliquotaIOF,
      a.baseIOF                       = b.baseIOF,
      a.valorIOF                      = b.valorIOF,
      a.codigoEnquadramentoIPI        = b.codigoEnquadramentoIPI,
      a.stIPI                         = b.stIPI,
      a.aliquotaIPI                   = b.aliquotaIPI,
      a.valorAliquotaIPI              = b.valorAliquotaIPI,
      a.baseIPI                       = b.baseIPI,
      a.valorIPI                      = b.valorIPI,
      a.stPIS                         = b.stPIS,
      a.aliquotaPIS                   = b.aliquotaPIS,
      a.valorAliquotaPIS              = b.valorAliquotaPIS,
      a.basePIS                       = b.basePIS,
      a.valorPIS                      = b.valorPIS,
      a.aliquotaPISST                 = b.aliquotaPISST,
      a.valorAliquotaPISST            = b.valorAliquotaPISST,
      a.basePISST                     = b.basePISST,
      a.valorPISST                    = b.valorPISST,
      a.stCOFINS                      = b.stCOFINS,
      a.aliquotaCOFINS                = b.aliquotaCOFINS,
      a.valorAliquotaCOFINS           = b.valorAliquotaCOFINS,
      a.baseCOFINS                    = b.baseCOFINS,
      a.valorCOFINS                   = b.valorCOFINS,
      a.aliquotaCOFINSST              = b.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST         = b.valorAliquotaCOFINSST,
      a.baseCOFINSST                  = b.baseCOFINSST,
      a.valorCOFINSST                 = b.valorCOFINSST,
      a.stSimplesNacional             = b.stSimplesNacional,
      a.creditoSimplesNacional        = b.creditoSimplesNacional,
      a.baseCreditoSimplesNacional    = b.baseCreditoSimplesNacional,
      a.valorCreditoSimplesNacional   = b.valorCreditoSimplesNacional,
      a.stICMS                        = b.stICMS,
      a.modalidadeBaseCalcICMS        = b.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS               = b.reducaoBaseICMS,
      a.aliquotaICMS                  = b.aliquotaICMS,
      a.diferimentoICMS               = b.diferimentoICMS,
      a.motivoDesoneracaoICMS         = b.motivoDesoneracaoICMS,
      a.idBeneficio                   = b.idBeneficio,
      a.baseICMS                      = b.baseICMS,
      a.valorICMSoperacao             = b.valorICMSoperacao,
      a.valorICMSdiferido             = b.valorICMSdiferido,
      a.valorICMS                     = b.valorICMS,
      a.valorICMSdesoneracao          = b.valorICMSdesoneracao,
      a.modalidadeBaseCalcICMSST      = b.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST       = b.margemValorAdicionadoST,
      a.reducaoBaseST                 = b.reducaoBaseST,
      a.aliquotaICMSST                = b.aliquotaICMSST,
      a.aliquotaSTSuportConsFinal     = b.aliquotaSTSuportConsFinal,
      a.baseICMSST                    = b.baseICMSST,
      a.valorICMSST                   = b.valorICMSST,
      a.baseICMSSTAnteriormente       = b.baseICMSSTAnteriormente,
      a.valorICMSSTAnteriormente      = b.valorICMSSTAnteriormente,
      a.valorICMSProprioSubstituto    = b.valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo        = b.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo           = b.aliquotaICMSEfetivo,
      a.baseICMSEfetivo               = b.baseICMSEfetivo,
      a.valorICMSEfetivo              = b.valorICMSEfetivo,
      a.aliquotaICMSUFDestinatario    = b.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual     = b.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual     = b.partilhaICMSInterestadual,
      a.baseICMSUFDestinatario        = b.baseICMSUFDestinatario,
      a.valorICMSUFDestinatario       = b.valorICMSUFDestinatario,
      a.baseICMSUFRemetente           = b.baseICMSUFRemetente,
      a.valorICMSUFRemetente          = b.valorICMSUFRemetente,
      a.aliquotaFCP                   = b.aliquotaFCP,
      a.baseFCP                       = b.baseFCP,
      a.valorFCP                      = b.valorFCP,
      a.aliquotaFCPST                 = b.aliquotaFCPST,
      a.baseFCPST                     = b.baseFCPST,
      a.valorFCPST                    = b.valorFCPST,
      a.aliquotaFCPSTAnteriormente    = b.aliquotaFCPSTAnteriormente,
      a.baseFCPSTAnteriormente        = b.baseFCPSTAnteriormente,
      a.valorFCPSTAnteriormente       = b.valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario     = b.aliquotaFCPUFDestinatario,
      a.baseFCPUFDestinatario         = b.baseFCPUFDestinatario,
      a.valorFCPUFDestinatario        = b.valorFCPUFDestinatario,
      a.aliquotaestimadaimpfederais   = b.aliquotaestimadaimpfederais,
      a.aliquotaestimadaimpestaduais  = b.aliquotaestimadaimpestaduais,
      a.aliquotaestimadaimpmunicipais = b.aliquotaestimadaimpmunicipais,
      a.baseestimadaimpostos          = b.baseestimadaimpostos,
      a.valorestimadoimpfederais      = b.valorestimadoimpfederais,
      a.valorEstimadoImpEstaduais     = b.valorEstimadoImpEstaduais,
      a.valorEstimadoImpMunicipais    = b.valorEstimadoImpMunicipais,
      a.valorLiquidoItem              = b.valorLiquidoItem,
      a.observacoesDigitadas          = b.observacoesDigitadas,
      a.observacoes                   = b.observacoes
    WHEN NOT MATCHED THEN INSERT (
      idItemOrcamento,
      orcamento,
      sequencia,
      cancelado,
      pedidoCompraFornecedor,
      sequenciaPedidoCompraFornec,
      ambiente,
      ambienteObservacoes,
      modeloDocumento,
      estabelecimentoOriginal,
      vendedor,
      gradeProduto,
      atividadeServico,
      statusAtividadeServico,
      idFormulaTinta,
      personalizacao,
      idLoteEstoque,
      vinculoItemDocumento,
      operacaoFiscal,
      movimentaEstoque,
      geraFinanceiro,
      localEstoque,
      pessoaParticipante,
      dataEntrega,
      controleQuantidade,
      unidadeMedidaConversao,
      conversorQuantidade,
      loteMinimo,
      loteMultiplo,
      altura,
      largura,
      comprimento,
      pecas,
      quantidade,
      quantidadeConvertida,
      quantidadeSaldo,
      controleEntrega,
      pesoLiquido,
      pesoBruto,
      tipoPreco,
      tabelaPreco,
      precoSugestaoAPrazo,
      precoSugestaoAVista,
      precoDesconto,
      precoMinimo,
      usarPrecoAVista,
      precoUnitarioBruto,
      acrescimoUnitarioComposicao,
      precoUnitario,
      precoUnitarioConvertido,
      valorProdutoServicoBruto,
      valorProdutoServico,
      percDescontoItem,
      valorDescontoItem,
      percAcrescimoItem,
      valorAcrescimoItem,
      valorFreteItem,
      valorSeguroItem,
      valorAdicFreteMarinhaMerItem,
      valorDespesasAduaneirasItem,
      valorFreteGeral,
      valorSeguroGeral,
      valorDescontoGeral,
      valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral,
      valorDespesasAduaneirasGeral,
      valorBasePagamento,
      valorDescontoPagamento,
      valorOutrasDespesasPagamento,
      valorJurosPagamento,
      valorFreteTotal,
      valorSeguroTotal,
      valorDescontoTotal,
      valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal,
      valorDespesasAduaneirasTotal,
      cfop,
      indicadorISSQN,
      aliquotaISSQN,
      retidoISSQN,
      tributadoForaMunicipio,
      incentivoFiscal,
      listaServicos,
      cnae,
      idServicoMunicipio,
      numeroProcessoAdministrativo,
      baseISSQN,
      valorISSQN,
      retencaoIRRF,
      baseRetIRRF,
      valorRetIRRF,
      retencaoINSS,
      baseRetINSS,
      valorRetINSS,
      retencaoPIS,
      baseRetPIS,
      valorRetPIS,
      retencaoCOFINS,
      baseRetCOFINS,
      valorRetCOFINS,
      retencaoCSLL,
      baseRetCSLL,
      valorRetCSLL,
      retencaoOutros,
      baseRetOutros,
      valorRetOutros,
      aliquotaII,
      baseII,
      valorII,
      aliquotaIOF,
      baseIOF,
      valorIOF,
      codigoEnquadramentoIPI,
      stIPI,
      aliquotaIPI,
      valorAliquotaIPI,
      baseIPI,
      valorIPI,
      stPIS,
      aliquotaPIS,
      valorAliquotaPIS,
      basePIS,
      valorPIS,
      aliquotaPISST,
      valorAliquotaPISST,
      basePISST,
      valorPISST,
      stCOFINS,
      aliquotaCOFINS,
      valorAliquotaCOFINS,
      baseCOFINS,
      valorCOFINS,
      aliquotaCOFINSST,
      valorAliquotaCOFINSST,
      baseCOFINSST,
      valorCOFINSST,
      stSimplesNacional,
      creditoSimplesNacional,
      baseCreditoSimplesNacional,
      valorCreditoSimplesNacional,
      stICMS,
      modalidadeBaseCalcICMS,
      reducaoBaseICMS,
      aliquotaICMS,
      diferimentoICMS,
      motivoDesoneracaoICMS,
      idBeneficio,
      baseICMS,
      valorICMSOperacao,
      valorICMSDiferido,
      valorICMS,
      valorICMSDesoneracao,
      modalidadeBaseCalcICMSST,
      margemValorAdicionadoST,
      reducaoBaseST,
      aliquotaICMSST,
      aliquotaSTSuportConsFinal,
      baseICMSST,
      valorICMSST,
      baseICMSSTAnteriormente,
      valorICMSSTAnteriormente,
      valorICMSProprioSubstituto,
      reducaoBaseICMSEfetivo,
      aliquotaICMSEfetivo,
      baseICMSEfetivo,
      valorICMSEfetivo,
      aliquotaICMSUFDestinatario,
      aliquotaICMSInterestadual,
      partilhaICMSInterestadual,
      baseICMSUFDestinatario,
      valorICMSUFDestinatario,
      baseICMSUFRemetente,
      valorICMSUFRemetente,
      aliquotaFCP,
      baseFCP,
      valorFCP,
      aliquotaFCPST,
      baseFCPST,
      valorFCPST,
      aliquotaFCPSTAnteriormente,
      baseFCPSTAnteriormente,
      valorFCPSTAnteriormente,
      aliquotaFCPUFDestinatario,
      baseFCPUFDestinatario,
      valorFCPUFDestinatario,
      aliquotaEstimadaImpFederais,
      aliquotaEstimadaImpEstaduais,
      aliquotaEstimadaImpMunicipais,
      baseEstimadaImpostos,
      valorEstimadoImpFederais,
      valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais,
      valorLiquidoItem,
      observacoesDigitadas,
      observacoes)
    VALUES (
      b.idItemOrcamento,
      b.orcamento,
      b.sequencia,
      b.cancelado,
      b.pedidoCompraFornecedor,
      b.sequenciaPedidoCompraFornec,
      b.ambiente,
      b.ambienteObservacoes,
      b.modeloDocumento,
      b.estabelecimentoOriginal,
      b.vendedor,
      b.gradeProduto,
      b.atividadeServico,
      b.statusAtividadeServico,
      b.idFormulaTinta,
      b.personalizacao,
      b.idLoteEstoque,
      b.vinculoItemDocumento,
      b.operacaoFiscal,
      b.movimentaEstoque,
      b.geraFinanceiro,
      b.localEstoque,
      b.pessoaParticipante,
      b.dataEntrega,
      b.controleQuantidade,
      b.unidadeMedidaConversao,
      b.conversorQuantidade,
      b.loteMinimo,
      b.loteMultiplo,
      b.altura,
      b.largura,
      b.comprimento,
      b.pecas,
      b.quantidade,
      b.quantidadeConvertida,
      b.quantidadeSaldo,
      b.controleEntrega,
      b.pesoLiquido,
      b.pesoBruto,
      b.tipoPreco,
      b.tabelaPreco,
      b.precoSugestaoAPrazo,
      b.precoSugestaoAVista,
      b.precoDesconto,
      b.precoMinimo,
      b.usarPrecoAVista,
      b.precoUnitarioBruto,
      b.acrescimoUnitarioComposicao,
      b.precoUnitario,
      b.precoUnitarioConvertido,
      b.valorProdutoServicoBruto,
      b.valorProdutoServico,
      b.percDescontoItem,
      b.valorDescontoItem,
      b.percAcrescimoItem,
      b.valorAcrescimoItem,
      b.valorFreteItem,
      b.valorSeguroItem,
      b.valorAdicFreteMarinhaMerItem,
      b.valorDespesasAduaneirasItem,
      b.valorFreteGeral,
      b.valorSeguroGeral,
      b.valorDescontoGeral,
      b.valorOutrasDespesasGeral,
      b.valorAdicFreteMarinhaMerGeral,
      b.valorDespesasAduaneirasGeral,
      b.valorBasePagamento,
      b.valorDescontoPagamento,
      b.valorOutrasDespesasPagamento,
      b.valorJurosPagamento,
      b.valorFreteTotal,
      b.valorSeguroTotal,
      b.valorDescontoTotal,
      b.valorOutrasDespesasTotal,
      b.valorAdicFreteMarinhaMerTotal,
      b.valorDespesasAduaneirasTotal,
      b.cfop,
      b.indicadorISSQN,
      b.aliquotaISSQN,
      b.retidoISSQN,
      b.tributadoForaMunicipio,
      b.incentivoFiscal,
      b.listaServicos,
      b.cnae,
      b.idServicoMunicipio,
      b.numeroProcessoAdministrativo,
      b.baseISSQN,
      b.valorISSQN,
      b.retencaoIRRF,
      b.baseRetIRRF,
      b.valorRetIRRF,
      b.retencaoINSS,
      b.baseRetINSS,
      b.valorRetINSS,
      b.retencaoPIS,
      b.baseRetPIS,
      b.valorRetPIS,
      b.retencaoCOFINS,
      b.baseRetCOFINS,
      b.valorRetCOFINS,
      b.retencaoCSLL,
      b.baseRetCSLL,
      b.valorRetCSLL,
      b.retencaoOutros,
      b.baseRetOutros,
      b.valorRetOutros,
      b.aliquotaII,
      b.baseII,
      b.valorII,
      b.aliquotaIOF,
      b.baseIOF,
      b.valorIOF,
      b.codigoEnquadramentoIPI,
      b.stIPI,
      b.aliquotaIPI,
      b.valorAliquotaIPI,
      b.baseIPI,
      b.valorIPI,
      b.stPIS,
      b.aliquotaPIS,
      b.valorAliquotaPIS,
      b.basePIS,
      b.valorPIS,
      b.aliquotaPISST,
      b.valorAliquotaPISST,
      b.basePISST,
      b.valorPISST,
      b.stCOFINS,
      b.aliquotaCOFINS,
      b.valorAliquotaCOFINS,
      b.baseCOFINS,
      b.valorCOFINS,
      b.aliquotaCOFINSST,
      b.valorAliquotaCOFINSST,
      b.baseCOFINSST,
      b.valorCOFINSST,
      b.stSimplesNacional,
      b.creditoSimplesNacional,
      b.baseCreditoSimplesNacional,
      b.valorCreditoSimplesNacional,
      b.stICMS,
      b.modalidadeBaseCalcICMS,
      b.reducaoBaseICMS,
      b.aliquotaICMS,
      b.diferimentoICMS,
      b.motivoDesoneracaoICMS,
      b.idBeneficio,
      b.baseICMS,
      b.valorICMSOperacao,
      b.valorICMSDiferido,
      b.valorICMS,
      b.valorICMSDesoneracao,
      b.modalidadeBaseCalcICMSST,
      b.margemValorAdicionadoST,
      b.reducaoBaseST,
      b.aliquotaICMSST,
      b.aliquotaSTSuportConsFinal,
      b.baseICMSST,
      b.valorICMSST,
      b.baseICMSSTAnteriormente,
      b.valorICMSSTAnteriormente,
      b.valorICMSProprioSubstituto,
      b.reducaoBaseICMSEfetivo,
      b.aliquotaICMSEfetivo,
      b.baseICMSEfetivo,
      b.valorICMSEfetivo,
      b.aliquotaICMSUFDestinatario,
      b.aliquotaICMSInterestadual,
      b.partilhaICMSInterestadual,
      b.baseICMSUFDestinatario,
      b.valorICMSUFDestinatario,
      b.baseICMSUFRemetente,
      b.valorICMSUFRemetente,
      b.aliquotaFCP,
      b.baseFCP,
      b.valorFCP,
      b.aliquotaFCPST,
      b.baseFCPST,
      b.valorFCPST,
      b.aliquotaFCPSTAnteriormente,
      b.baseFCPSTAnteriormente,
      b.valorFCPSTAnteriormente,
      b.aliquotaFCPUFDestinatario,
      b.baseFCPUFDestinatario,
      b.valorFCPUFDestinatario,
      b.aliquotaEstimadaImpFederais,
      b.aliquotaEstimadaImpEstaduais,
      b.aliquotaEstimadaImpMunicipais,
      b.baseEstimadaImpostos,
      b.valorEstimadoImpFederais,
      b.valorEstimadoImpEstaduais,
      b.valorEstimadoImpMunicipais,
      b.valorLiquidoItem,
      b.observacoesDigitadas,
      b.observacoes);
    IF p_item_idItemOrcamento <= 0
      AND v_item_cancelado = 0
      AND p_item_atividadeServico > 0
    THEN
      SELECT
        validoPrevisto,
        habilitaAtividadePrevista
      INTO
        v_ativServ_validoPrevisto,
        v_ativServ_habilitaAtivPrev
      FROM PAATIVIDADESSERVICO
      WHERE atividadeServico = p_item_atividadeServico;
      IF v_ativServ_habilitaAtivPrev = 1 THEN
        ADD_ORCAMENTO_ITEM_PREV_INSERE (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          r_item_idItemOrcamento,
          p_item_atividadeServico,
          v_ativServ_validoPrevisto);
      END IF;
    END IF;
    v_atualizarObservacoes := 0;
    IF p_idItemReferenciado > 0 THEN
      IF p_tipoDocumentoReferenciado = 'C' THEN
        UPDATE MOPAINELCOMPRAXGRADE
        SET idItemOrcamento = r_item_idItemOrcamento
        WHERE idGradePainelCompra = p_idItemReferenciado;
      ELSIF p_tipoDocumentoReferenciado = 'F' THEN
        ADD_ORCAMENTO_ITEM_REF_CONTR (
          p_estabelecimentoAtivo,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      ELSIF p_tipoDocumentoReferenciado = 'L' THEN
        ADD_ORCAMENTO_ITEM_LISTA_GRAVA (
          p_estabelecimentoAtivo,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      ELSIF p_tipoDocumentoReferenciado = 'O' THEN
        ADD_ORCAMENTO_ITEM_REF_ORCAMEN (
          p_estabelecimentoAtivo,
          r_item_idItemOrcamento,
          p_item_quantidade,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'T' THEN
        ADD_ORCAMENTO_ITEM_TRANS_GRAVA (
          p_estabelecimentoAtivo,
          v_cab_entradaSaida,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      END IF;
    END IF;
    IF p_tempComp_nomeTempComposicao <> ' '
      AND (p_tipoDocumentoReferenciado <> 'O'
        OR p_idItemReferenciado <= 0)
    THEN
      ADD_ORCAMENTO_ITEM_COMP_TEMP (
        p_sessaoClient,
        p_estabelecimentoAtivo,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        r_item_idItemOrcamento,
        v_atualizarObservacoes,
        v_atualizarObservacoes);
    END IF;
    v_idEnderecoEstoque := 0;
    IF p_item_idEnderecoEstoque > 0 THEN
      ADD_ORCAMENTO_ITEM_ENDER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemOrcamento,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_quantidade,
        ' ',
        v_idEnderecoEstoque);
    END IF;
    IF p_item_idNumeroSerie > 0 THEN
      ADD_ORCAMENTO_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemOrcamento,
        v_idEnderecoEstoque,
        p_item_gradeProduto,
        p_item_idNumeroSerie,
        0,
        v_auxNumber);
      v_atualizarObservacoes := 1;
    END IF;
    IF p_item_atividadeProjeto > 0 THEN
      ADD_ORCAMENTO_ITEM_PROJ_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemOrcamento,
        p_item_atividadeProjeto,
        v_auxNumber);
    END IF;
    IF v_atualizarObservacoes = 1 THEN
      v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
        p_sessaoClient,
        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_413_obs_add_marca,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        'O',
        r_item_idItemOrcamento,
        p_item_gradeProduto,
        p_item_idFormulaTinta,
        p_item_personalizacao,
        p_item_idLoteEstoque,
        p_item_controleQuantidade,
        p_item_loteMultiplo,
        p_item_altura,
        p_item_largura,
        p_item_comprimento,
        p_item_quantidade,
        p_item_observacoesDigitadas);
      UPDATE MOORCAMENTOXITENS
      SET observacoes = v_observacoes
      WHERE idItemOrcamento = r_item_idItemOrcamento;
    END IF;
    IF v_etOrc_situacaoOrcamento > 40 THEN
      ADD_ORCAMENTO_ITEM_RES_ITEM (
        r_item_idItemOrcamento,
        p_estabelecimentoAtivo,
        ' ',
        v_auxVarchar);
    END IF;
    r_buffer_idItemOrcamento := CASE WHEN (r_buffer_idItemOrcamento IS NULL OR r_buffer_idItemOrcamento = '' OR r_buffer_idItemOrcamento = ' ') THEN '' ELSE RTRIM (r_buffer_idItemOrcamento) || ';' END || TO_CHAR (LPAD(r_item_idItemOrcamento,14,'0'));
    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;
  END IF;
END ADD_ORCAMENTO_ITEM_GRAVA;

/

create or replace PROCEDURE ADD_DOC_FISC_CALC_IMP_ITENS (
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_idDocumentoFiscal        IN NUMBER,
  p_cab_origemDocumento          IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_devolucaoAnulacaoRetorno IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_nfFornecedor             IN NUMBER,
  p_cab_dataEntradaSaida         IN DATE,
  p_cab_pessoa                   IN NUMBER,
  p_cab_localDestinoOperacao     IN CHAR,
  p_cab_indicadorConsumidorFinal IN CHAR,
  p_cab_tipoPagamentoFrete       IN CHAR,
  p_pess_indicadorInscricaoEstad IN CHAR,
  /* Retornos */
  r_cab_valorProdutos            OUT NUMBER,
  r_cab_valorServicos            OUT NUMBER,
  r_cab_valorBasePagamento       OUT NUMBER,
  r_cab_valorAVistaMinimo        OUT NUMBER,
  r_cab_valorFreteTotal          OUT NUMBER,
  r_cab_valorSeguroTotal         OUT NUMBER,
  r_cab_valorDescontoTotal       OUT NUMBER,
  r_cab_valorOutrasDespesasTotal OUT NUMBER,
  r_cab_valorAdicFreteMarinTotal OUT NUMBER,
  r_cab_valorDespesasAduanTotal  OUT NUMBER,
  r_cab_valorLiquidoItem         OUT NUMBER,
  r_cab_valorDescCustoOpTotal    OUT NUMBER,
  r_cab_valorAcrescCustoOpTotal  OUT NUMBER,
  r_cab_valorCustoOperacao       OUT NUMBER,
  r_cab_valorCMV                 OUT NUMBER,
  r_cab_valorAcrescExtempTotal   OUT NUMBER)
IS
  v_auxNumber                    NUMBER;
  v_precoUnitario                NUMBER;
  v_precoUnitarioConvertido      NUMBER;
  v_valorProdutoServico          NUMBER;
  v_valorBasePagamento           NUMBER;
  v_valorFreteTotal              NUMBER;
  v_valorSeguroTotal             NUMBER;
  v_valorDescontoTotal           NUMBER;
  v_valorOutrasDespesasTotal     NUMBER;
  v_valorAdicFreteMarinMerTotal  NUMBER;
  v_valorDespesasAduaneirasTotal NUMBER;
  v_baseISSQN                    NUMBER;
  v_valorISSQN                   NUMBER;
  v_baseRetIRRF                  NUMBER;
  v_valorRetIRRF                 NUMBER;
  v_baseRetINSS                  NUMBER;
  v_valorRetINSS                 NUMBER;
  v_baseRetPIS                   NUMBER;
  v_valorRetPIS                  NUMBER;
  v_baseRetCOFINS                NUMBER;
  v_valorRetCOFINS               NUMBER;
  v_baseRetCSLL                  NUMBER;
  v_valorRetCSLL                 NUMBER;
  v_baseRetOutros                NUMBER;
  v_valorRetOutros               NUMBER;
  v_baseII                       NUMBER;
  v_valorII                      NUMBER;
  v_baseIOF                      NUMBER;
  v_valorIOF                     NUMBER;
  v_baseIPI                      NUMBER;
  v_valorIPI                     NUMBER;
  v_basePIS                      NUMBER;
  v_valorPIS                     NUMBER;
  v_basePISST                    NUMBER;
  v_valorPISST                   NUMBER;
  v_baseCOFINS                   NUMBER;
  v_valorCOFINS                  NUMBER;
  v_baseCOFINSST                 NUMBER;
  v_valorCOFINSST                NUMBER;
  v_baseCreditoSimplesNacional   NUMBER;
  v_valorCreditoSimplesNacional  NUMBER;
  v_baseICMS                     NUMBER;
  v_valorICMSOperacao            NUMBER;
  v_valorICMSDiferido            NUMBER;
  v_valorICMS                    NUMBER;
  v_valorICMSDesoneracao         NUMBER;
  v_baseICMSST                   NUMBER;
  v_valorICMSST                  NUMBER;
  v_baseICMSSTAnteriormente      NUMBER;
  v_valorICMSSTAnteriormente     NUMBER;
  v_valorICMSProprioSubstituto   NUMBER;
  v_baseICMSEfetivo              NUMBER;
  v_valorICMSEfetivo             NUMBER;
  v_baseICMSEscrituracao         NUMBER;
  v_valorICMSEscrituracao        NUMBER;
  v_valorICMSDesonEscrituracao   NUMBER;
  v_baseICMSSTEscrituracao       NUMBER;
  v_valorICMSSTEscrituracao      NUMBER;
  v_baseICMSUFDestinatario       NUMBER;
  v_valorICMSUFDestinatario      NUMBER;
  v_baseICMSUFRemetente          NUMBER;
  v_valorICMSUFRemetente         NUMBER;
  v_baseFCP                      NUMBER;
  v_valorFCP                     NUMBER;
  v_baseFCPST                    NUMBER;
  v_valorFCPST                   NUMBER;
  v_baseFCPSTAnteriormente       NUMBER;
  v_valorFCPSTAnteriormente      NUMBER;
  v_baseFCPUFDestinatario        NUMBER;
  v_valorFCPUFDestinatario       NUMBER;
  v_baseEstimadaImpostos         NUMBER;
  v_valorEstimadoImpFederais     NUMBER;
  v_valorEstimadoImpEstaduais    NUMBER;
  v_valorEstimadoImpMunicipais   NUMBER;
  v_valorLiquidoItem             NUMBER;
  v_valorDescontoCustoOpTotal    NUMBER;
  v_valorAcrescimoCustoOpTotal   NUMBER;
  v_precoCustoOperacao           NUMBER;
  v_valorCustoOperacao           NUMBER;
  v_precoCMV                     NUMBER;
  v_valorCMV                     NUMBER;
  v_valorAcrescimoExtempSubtotal NUMBER;
  v_valorAcrescimoExtempTotal    NUMBER;
BEGIN  
  r_cab_valorProdutos            := 0;
  r_cab_valorServicos            := 0;
  r_cab_valorBasePagamento       := 0;
  r_cab_valorAVistaMinimo        := 0;
  r_cab_valorFreteTotal          := 0;
  r_cab_valorSeguroTotal         := 0;
  r_cab_valorDescontoTotal       := 0;
  r_cab_valorOutrasDespesasTotal := 0;
  r_cab_valorAdicFreteMarinTotal := 0;
  r_cab_valorDespesasAduanTotal  := 0;
  r_cab_valorLiquidoItem         := 0;
  r_cab_valorDescCustoOpTotal    := 0;
  r_cab_valorAcrescCustoOpTotal  := 0;
  r_cab_valorCustoOperacao       := 0;
  r_cab_valorCMV                 := 0;
  r_cab_valorAcrescExtempTotal   := 0;
  FOR a IN (
    SELECT
      a.*,
      gradProd.produto,
      gradProd.cor,
      gradProd.tamanho,
      prod.controleEstoque,
      prod.tipoProduto,
      prod.precoPautaTabelado,
      modDoc.geraFinanceiro modDoc_geraFinanceiro,
      modDoc.diminuiDescontoPrUnit,
      modDoc.somaAcrescimosPrUnit,
      modDoc.somaFreteSeguroPrUnit,
      CASE
        WHEN EXISTS (
          SELECT 1
          FROM CAPRODUTOXCOMPOSICOESPREC compPrec
          WHERE compPrec.produto = gradProd.produto
          AND compPrec.ativo = 1)
        THEN 1
        ELSE 0
      END composicaoPreco
    FROM MODOCFISCALXITENS a
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = a.modeloDocumento
    WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
    AND a.cancelado = 0
    ORDER BY a.sequencia)
  LOOP
    v_precoUnitario                := a.precoUnitario;
    v_precoUnitarioConvertido      := a.precoUnitarioConvertido;
    v_valorProdutoServico          := a.valorProdutoServico;
    v_valorBasePagamento           := a.valorBasePagamento;
    v_valorFreteTotal              := a.valorFreteTotal;
    v_valorSeguroTotal             := a.valorSeguroTotal;
    v_valorDescontoTotal           := a.valorDescontoTotal;
    v_valorOutrasDespesasTotal     := a.valorOutrasDespesasTotal;
    v_valorAdicFreteMarinMerTotal  := a.valorAdicFreteMarinhaMerTotal;
    v_valorDespesasAduaneirasTotal := a.valorDespesasAduaneirasTotal;
    v_baseISSQN                    := a.baseISSQN;
    v_valorISSQN                   := a.valorISSQN;
    v_baseRetIRRF                  := a.baseRetIRRF;
    v_valorRetIRRF                 := a.valorRetIRRF;
    v_baseRetINSS                  := a.baseRetINSS;
    v_valorRetINSS                 := a.valorRetINSS;
    v_baseRetPIS                   := a.baseRetPIS;
    v_valorRetPIS                  := a.valorRetPIS;
    v_baseRetCOFINS                := a.baseRetCOFINS;
    v_valorRetCOFINS               := a.valorRetCOFINS;
    v_baseRetCSLL                  := a.baseRetCSLL;
    v_valorRetCSLL                 := a.valorRetCSLL;
    v_baseRetOutros                := a.baseRetOutros;
    v_valorRetOutros               := a.valorRetOutros;
    v_baseII                       := a.baseII;
    v_valorII                      := a.valorII;
    v_baseIOF                      := a.baseIOF;
    v_valorIOF                     := a.valorIOF;
    v_baseIPI                      := a.baseIPI;
    v_valorIPI                     := a.valorIPI;
    v_basePIS                      := a.basePIS;
    v_valorPIS                     := a.valorPIS;
    v_basePISST                    := a.basePISST;
    v_valorPISST                   := a.valorPISST;
    v_baseCOFINS                   := a.baseCOFINS;
    v_valorCOFINS                  := a.valorCOFINS;
    v_baseCOFINSST                 := a.baseCOFINSST;
    v_valorCOFINSST                := a.valorCOFINSST;
    v_baseCreditoSimplesNacional   := a.baseCreditoSimplesNacional;
    v_valorCreditoSimplesNacional  := a.valorCreditoSimplesNacional;
    v_baseICMS                     := a.baseICMS;
    v_valorICMSOperacao            := a.valorICMSOperacao;
    v_valorICMSDiferido            := a.valorICMSDiferido;
    v_valorICMS                    := a.valorICMS;
    v_valorICMSDesoneracao         := a.valorICMSDesoneracao;
    v_baseICMSST                   := a.baseICMSST;
    v_valorICMSST                  := a.valorICMSST;
    v_baseICMSSTAnteriormente      := a.baseICMSSTAnteriormente;
    v_valorICMSSTAnteriormente     := a.valorICMSSTAnteriormente;
    v_valorICMSProprioSubstituto   := a.valorICMSProprioSubstituto;
    v_baseICMSEfetivo              := a.baseICMSEfetivo;
    v_valorICMSEfetivo             := a.valorICMSEfetivo;
    v_baseICMSEscrituracao         := a.baseICMSEscrituracao;
    v_valorICMSEscrituracao        := a.valorICMSEscrituracao;
    v_valorICMSDesonEscrituracao   := a.valorICMSDesonEscrituracao;
    v_baseICMSSTEscrituracao       := a.baseICMSSTEscrituracao;
    v_valorICMSSTEscrituracao      := a.valorICMSSTEscrituracao;
    v_baseICMSUFDestinatario       := a.baseICMSUFDestinatario;
    v_valorICMSUFDestinatario      := a.valorICMSUFDestinatario;
    v_baseICMSUFRemetente          := a.baseICMSUFRemetente;
    v_valorICMSUFRemetente         := a.valorICMSUFRemetente;
    v_baseFCP                      := a.baseFCP;
    v_valorFCP                     := a.valorFCP;
    v_baseFCPST                    := a.baseFCPST;
    v_valorFCPST                   := a.valorFCPST;
    v_baseFCPSTAnteriormente       := a.baseFCPSTAnteriormente;
    v_valorFCPSTAnteriormente      := a.valorFCPSTAnteriormente;
    v_baseFCPUFDestinatario        := a.baseFCPUFDestinatario;
    v_valorFCPUFDestinatario       := a.valorFCPUFDestinatario;
    v_baseEstimadaImpostos         := a.baseEstimadaImpostos;
    v_valorEstimadoImpFederais     := a.valorEstimadoImpFederais;
    v_valorEstimadoImpEstaduais    := a.valorEstimadoImpEstaduais;
    v_valorEstimadoImpMunicipais   := a.valorEstimadoImpMunicipais;
    v_valorLiquidoItem             := a.valorLiquidoItem;
    v_valorDescontoCustoOpTotal    := a.valorDescontoCustoOpTotal;
    v_valorAcrescimoCustoOpTotal   := a.valorAcrescimoCustoOpTotal;
    v_precoCustoOperacao           := a.precoCustoOperacao;
    v_valorCustoOperacao           := a.valorCustoOperacao;
    v_precoCMV                     := a.precoCMV;
    v_valorCMV                     := a.valorCMV;
    v_valorAcrescimoExtempSubtotal := a.valorAcrescimoExtempSubtotal;
    v_valorAcrescimoExtempTotal    := a.valorAcrescimoExtempTotal;
    ADD_CALCULA_TOTAIS_ITEM(
      p_cab_tipoPagamentoFrete,
      a.quantidade,
      a.quantidadeConvertida,
      a.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao,
      a.precoUnitario,
      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.diminuiDescontoPrUnit,
      a.somaAcrescimosPrUnit,
      a.somaFreteSeguroPrUnit,
      a.composicaoPreco,
      /* Retornos */
      v_precoUnitario,
      v_precoUnitarioConvertido,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal);
    v_valorAcrescimoExtempSubtotal := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
      a.quantidade,
      v_precoUnitario,
      a.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo);
    v_valorAcrescimoExtempTotal := FUNC_ADD_CALC_EXTEMP_TOTAL(
      v_valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem,
      a.valorAcrescimoExtempGeral);
    ADD_CALCULA_IMPOSTOS_ITEM (
      p_config_64_casasDecSaidas,
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_cab_entradaSaida,
      p_cab_devolucaoAnulacaoRetorno,
      p_cab_estabelecimento,
      p_cab_nfFornecedor,
      p_cab_dataEntradaSaida,
      p_cab_pessoa,
      p_cab_localDestinoOperacao,
      p_cab_indicadorConsumidorFinal,
      p_cab_tipoPagamentoFrete,
      p_pess_indicadorInscricaoEstad,
      a.personalizacao,
      a.quantidade,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal,
      a.cfop,
      1,
      a.indicadorISSQN,
      a.aliquotaISSQN,
      v_baseISSQN,
      v_valorISSQN,
      1,
      a.retencaoIRRF,
      v_baseRetIRRF,
      v_valorRetIRRF,
      1,
      a.retencaoINSS,
      v_baseRetINSS,
      v_valorRetINSS,
      1,
      a.retencaoPIS,
      v_baseRetPIS,
      v_valorRetPIS,
      1,
      a.retencaoCOFINS,
      v_baseRetCOFINS,
      v_valorRetCOFINS,
      1,
      a.retencaoCSLL,
      v_baseRetCSLL,
      v_valorRetCSLL,
      1,
      a.retencaoOutros,
      v_baseRetOutros,
      v_valorRetOutros,
      1,
      a.aliquotaII,
      v_baseII,
      v_valorII,
      1,
      a.aliquotaIOF,
      v_baseIOF,
      v_valorIOF,
      1,
      a.aliquotaIPI,
      a.valorAliquotaIPI,
      v_baseIPI,
      v_valorIPI,
      a.valorIPIDevolucao,
      1,
      a.aliquotaPIS,
      a.valorAliquotaPIS,
      v_basePIS,
      v_valorPIS,
      1,
      a.aliquotaPISST,
      a.valorAliquotaPISST,
      v_basePISST,
      v_valorPISST,
      1,
      a.aliquotaCOFINS,
      a.valorAliquotaCOFINS,
      v_baseCOFINS,
      v_valorCOFINS,
      1,
      a.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST,
      v_baseCOFINSST,
      v_valorCOFINSST,
      1,
      a.stSimplesNacional,
      a.creditoSimplesNacional,
      v_baseCreditoSimplesNacional,
      v_valorCreditoSimplesNacional,
      1,
      a.stICMS,
      a.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS,
      a.aliquotaICMS,
      a.diferimentoICMS,
      v_baseICMS,
      v_valorICMSOperacao,
      v_valorICMSDiferido,
      v_valorICMS,
      v_valorICMSDesoneracao,
      1,
      a.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST,
      a.reducaoBaseST,
      a.aliquotaICMSST,
      v_baseICMSST,
      v_valorICMSST,
      1,
      v_baseICMSSTAnteriormente,
      v_valorICMSSTAnteriormente,
      v_valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo,
      v_baseICMSEfetivo,
      v_valorICMSEfetivo,
      1,
      a.stICMSEscrituracao,
      a.reducaoBaseICMSEscrituracao,
      a.aliquotaICMSEscrituracao,
      a.diferimentoICMSEscrituracao,
      v_baseICMSEscrituracao,
      v_valorICMSEscrituracao,
      v_valorICMSDesonEscrituracao,
      1,
      a.margemValorAdicSTEscrituracao,
      a.reducaoBaseSTEscrituracao,
      a.aliquotaICMSSTEscrituracao,
      v_baseICMSSTEscrituracao,
      v_valorICMSSTEscrituracao,
      1,
      a.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual,
      v_baseICMSUFDestinatario,
      v_valorICMSUFDestinatario,
      v_baseICMSUFRemetente,
      v_valorICMSUFRemetente,
      1,
      a.aliquotaFCP,
      v_baseFCP,
      v_valorFCP,
      a.aliquotaFCPST,
      v_baseFCPST,
      v_valorFCPST,
      a.aliquotaFCPSTAnteriormente,
      v_baseFCPSTAnteriormente,
      v_valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario,
      v_baseFCPUFDestinatario,
      v_valorFCPUFDestinatario,
      1,
      a.aliquotaEstimadaImpFederais,
      a.aliquotaEstimadaImpEstaduais,
      a.aliquotaEstimadaImpMunicipais,
      v_baseEstimadaImpostos,
      v_valorEstimadoImpFederais,
      v_valorEstimadoImpEstaduais,
      v_valorEstimadoImpMunicipais,
      a.produto,
      a.cor,
      a.tamanho,
      a.controleEstoque,
      a.tipoProduto,
      a.precoPautaTabelado,
      /* Retornos */
      v_baseISSQN,
      v_valorISSQN,
      v_baseRetIRRF,
      v_valorRetIRRF,
      v_baseRetINSS,
      v_valorRetINSS,
      v_baseRetPIS,
      v_valorRetPIS,
      v_baseRetCOFINS,
      v_valorRetCOFINS,
      v_baseRetCSLL,
      v_valorRetCSLL,
      v_baseRetOutros,
      v_valorRetOutros,
      v_baseII,
      v_valorII,
      v_baseIOF,
      v_valorIOF,
      v_baseIPI,
      v_valorIPI,
      v_basePIS,
      v_valorPIS,
      v_basePISST,
      v_valorPISST,
      v_baseCOFINS,
      v_valorCOFINS,
      v_baseCOFINSST,
      v_valorCOFINSST,
      v_baseCreditoSimplesNacional,
      v_valorCreditoSimplesNacional,
      v_baseICMS,
      v_valorICMSOperacao,
      v_valorICMSDiferido,
      v_valorICMS,
      v_valorICMSDesoneracao,
      v_baseICMSST,
      v_valorICMSST,
      v_baseICMSSTAnteriormente,
      v_valorICMSSTAnteriormente,
      v_valorICMSProprioSubstituto,
      v_baseICMSEfetivo,
      v_valorICMSEfetivo,
      v_baseICMSEscrituracao,
      v_valorICMSEscrituracao,
      v_valorICMSDesonEscrituracao,
      v_baseICMSSTEscrituracao,
      v_valorICMSSTEscrituracao,
      v_baseICMSUFDestinatario,
      v_valorICMSUFDestinatario,
      v_baseICMSUFRemetente,
      v_valorICMSUFRemetente,
      v_baseFCP,
      v_valorFCP,
      v_baseFCPST,
      v_valorFCPST,
      v_baseFCPSTAnteriormente,
      v_valorFCPSTAnteriormente,
      v_baseFCPUFDestinatario,
      v_valorFCPUFDestinatario,
      v_baseEstimadaImpostos,
      v_valorEstimadoImpFederais,
      v_valorEstimadoImpEstaduais,
      v_valorEstimadoImpMunicipais);    
    v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
      p_cab_origemDocumento,
      p_cab_nfFornecedor,
      p_cab_tipoPagamentoFrete,
      a.geraFinanceiro,
      v_valorProdutoServico,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      a.valorIPIDevolucao,
      a.retidoISSQN,
      v_valorISSQN,
      v_valorRetIRRF,
      v_valorRetINSS,
      v_valorRetPIS,
      v_valorRetCOFINS,
      v_valorRetCSLL,
      v_valorRetOutros,
      v_valorII,
      v_valorIOF,
      v_valorIPI,
      v_valorICMSST,
      v_valorICMSSTEscrituracao,
      a.somarICMSST,
      v_valorAcrescimoExtempTotal,
      a.modDoc_geraFinanceiro);
    v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
      p_cab_nfFornecedor,
      p_cab_tipoPagamentoFrete,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      a.valorIPIDevolucao,
      v_valorII,
      v_valorIOF,
      v_valorIPI,
      v_valorICMSST,
      v_valorICMSSTEscrituracao,
      a.somarICMSST);
    ADD_CALCULA_CUSTO_CMV (
      p_cab_atualizaCustoMedio,
      p_cab_estabelecimento,
      p_cab_nfFornecedor,
      a.modeloDocumento,
      a.quantidade,
      v_valorII,
      v_valorIOF,
      v_valorIPI,
      a.valorIPIDevolucao,
      v_valorPIS,
      v_valorPISST,
      v_valorCOFINS,
      v_valorCOFINSST,
      v_valorCreditoSimplesNacional,
      v_valorICMS,
      v_valorICMSST,
      v_valorICMSSTEscrituracao,
      v_valorLiquidoItem,
      a.valorDescontoCustoOpItem,
      a.valorDescontoCustoOpGeral,
      a.valorAcrescimoCustoOpItem,
      a.valorAcrescimoCustoOpGeral,
      v_valorAcrescimoExtempTotal,
      /* Retornos */
      v_valorDescontoCustoOpTotal,
      v_valorAcrescimoCustoOpTotal,
      v_precoCustoOperacao,
      v_valorCustoOperacao,
      v_precoCMV,
      v_valorCMV);
    UPDATE MODOCFISCALXITENS SET
      precoUnitario                 = v_precoUnitario,
      precoUnitarioConvertido       = v_precoUnitarioConvertido,
      valorProdutoServico           = v_valorProdutoServico,
      valorBasePagamento            = v_valorBasePagamento,
      valorFreteTotal               = v_valorFreteTotal,
      valorSeguroTotal              = v_valorSeguroTotal,
      valorDescontoTotal            = v_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
      valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
      baseISSQN                     = v_baseISSQN,
      valorISSQN                    = v_valorISSQN,
      baseRetIRRF                   = v_baseRetIRRF,
      valorRetIRRF                  = v_valorRetIRRF,
      baseRetINSS                   = v_baseRetINSS,
      valorRetINSS                  = v_valorRetINSS,
      baseRetPIS                    = v_baseRetPIS,
      valorRetPIS                   = v_valorRetPIS,
      baseRetCOFINS                 = v_baseRetCOFINS,
      valorRetCOFINS                = v_valorRetCOFINS,
      baseRetCSLL                   = v_baseRetCSLL,
      valorRetCSLL                  = v_valorRetCSLL,
      baseRetOutros                 = v_baseRetOutros,
      valorRetOutros                = v_valorRetOutros,
      baseII                        = v_baseII,
      valorII                       = v_valorII,
      baseIOF                       = v_baseIOF,
      valorIOF                      = v_valorIOF,
      baseIPI                       = v_baseIPI,
      valorIPI                      = v_valorIPI,
      basePIS                       = v_basePIS,
      valorPIS                      = v_valorPIS,
      basePISST                     = v_basePISST,
      valorPISST                    = v_valorPISST,
      baseCOFINS                    = v_baseCOFINS,
      valorCOFINS                   = v_valorCOFINS,
      baseCOFINSST                  = v_baseCOFINSST,
      valorCOFINSST                 = v_valorCOFINSST,
      baseCreditoSimplesNacional    = v_baseCreditoSimplesNacional,
      valorCreditoSimplesNacional   = v_valorCreditoSimplesNacional,
      baseICMS                      = v_baseICMS,
      valorICMSOperacao             = v_valorICMSOperacao,
      valorICMSDiferido             = v_valorICMSDiferido,
      valorICMS                     = v_valorICMS,
      valorICMSDesoneracao          = v_valorICMSDesoneracao,
      baseICMSST                    = v_baseICMSST,
      valorICMSST                   = v_valorICMSST,
      baseICMSSTAnteriormente       = v_baseICMSSTAnteriormente,
      valorICMSSTAnteriormente      = v_valorICMSSTAnteriormente,
      valorICMSProprioSubstituto    = v_valorICMSProprioSubstituto,
      baseICMSEfetivo               = v_baseICMSEfetivo,
      valorICMSEfetivo              = v_valorICMSEfetivo,
      baseICMSEscrituracao          = v_baseICMSEscrituracao,
      valorICMSEscrituracao         = v_valorICMSEscrituracao,
      valorICMSDesonEscrituracao    = v_valorICMSDesonEscrituracao,
      baseICMSSTEscrituracao        = v_baseICMSSTEscrituracao,
      valorICMSSTEscrituracao       = v_valorICMSSTEscrituracao,
      baseICMSUFDestinatario        = v_baseICMSUFDestinatario,
      valorICMSUFDestinatario       = v_valorICMSUFDestinatario,
      baseICMSUFRemetente           = v_baseICMSUFRemetente,
      valorICMSUFRemetente          = v_valorICMSUFRemetente,
      baseFCP                       = v_baseFCP,
      valorFCP                      = v_valorFCP,
      baseFCPST                     = v_baseFCPST,
      valorFCPST                    = v_valorFCPST,
      baseFCPSTAnteriormente        = v_baseFCPSTAnteriormente,
      valorFCPSTAnteriormente       = v_valorFCPSTAnteriormente,
      baseFCPUFDestinatario         = v_baseFCPUFDestinatario,
      valorFCPUFDestinatario        = v_valorFCPUFDestinatario,
      baseEstimadaImpostos          = v_baseEstimadaImpostos,
      valorEstimadoImpFederais      = v_valorEstimadoImpFederais,
      valorEstimadoImpEstaduais     = v_valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais    = v_valorEstimadoImpMunicipais,
      valorLiquidoItem              = v_valorLiquidoItem,
      valorDescontoCustoOpTotal     = v_valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpTotal    = v_valorAcrescimoCustoOpTotal,
      precoCustoOperacao            = v_precoCustoOperacao,
      valorCustoOperacao            = v_valorCustoOperacao,
      precoCMV                      = v_precoCMV,
      valorCMV                      = v_valorCMV,
      valorAcrescimoExtempSubtotal  = v_valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempTotal     = v_valorAcrescimoExtempTotal
    WHERE idItemDocFiscal           = a.idItemDocFiscal;
    IF a.tipoProduto = '09' THEN
      r_cab_valorServicos            := r_cab_valorServicos + v_valorProdutoServico;
    ELSE
      r_cab_valorProdutos            := r_cab_valorProdutos + v_valorProdutoServico;
    END IF;
    r_cab_valorBasePagamento       := r_cab_valorBasePagamento + v_valorBasePagamento;
    IF a.usarPrecoAVista = 1 AND a.geraFinanceiro = 1 THEN
      r_cab_valorAVistaMinimo        := r_cab_valorAVistaMinimo + v_valorProdutoServico + a.valorDescontoPagamento - a.valorOutrasDespesasPagamento - a.valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
    END IF;
    r_cab_valorFreteTotal          := r_cab_valorFreteTotal + v_valorFreteTotal;
    r_cab_valorSeguroTotal         := r_cab_valorSeguroTotal + v_valorSeguroTotal;
    r_cab_valorDescontoTotal       := r_cab_valorDescontoTotal + v_valorDescontoTotal;
    r_cab_valorOutrasDespesasTotal := r_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
    r_cab_valorAdicFreteMarinTotal := r_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
    r_cab_valorDespesasAduanTotal  := r_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
    r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem + v_valorLiquidoItem;
    r_cab_valorDescCustoOpTotal    := r_cab_valorDescCustoOpTotal + v_valorDescontoCustoOpTotal;
    r_cab_valorAcrescCustoOpTotal  := r_cab_valorAcrescCustoOpTotal + v_valorAcrescimoCustoOpTotal;
    r_cab_valorCustoOperacao       := r_cab_valorCustoOperacao + v_valorCustoOperacao;
    r_cab_valorCMV                 := r_cab_valorCMV + v_valorCMV;
    r_cab_valorAcrescExtempTotal   := r_cab_valorAcrescExtempTotal + v_valorAcrescimoExtempTotal;
  END LOOP;
END ADD_DOC_FISC_CALC_IMP_ITENS;

/

create or replace PROCEDURE ADD_DOC_FISC_CALC_IMP_CAB (
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_idDocumentoFiscal        IN NUMBER,
  p_troca_tipoPagamentoFrete     IN NUMBER,
  p_a_cab_tipoPagamentoFrete     IN CHAR)
IS
  v_cab_valorProdutos            NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarinTotal NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_valorDescCustoOpTotal    NUMBER;
  v_cab_valorAcrescCustoOpTotal  NUMBER;
  v_cab_valorAcrescExtempTotal   NUMBER;
  v_calcularImpostosItem         NUMBER;
  v_habilitaControleEntrega      NUMBER;
BEGIN
  FOR a IN (
    SELECT a.*,
      pess.indicadorInscricaoEstadual,
      COALESCE((
        SELECT MIN(munEndEst.uf)
        FROM PAESTABELECIMENTOS est
        JOIN CAENDERECOSPESSOA endEst
        ON endEst.pessoa = est.pessoaEstabelecimento
        JOIN SIMUNICIPIOS munEndEst
        ON munEndEst.municipio = endEst.municipio
        WHERE est.estabelecimento = a.estabelecimento
        AND endEst.ativo = 1
        AND endEst.principal = 1),'  ') munEndEst_uf
    FROM MODOCUMENTOSFISCAIS a
    JOIN CAPESSOAS pess
    ON pess.pessoa = a.pessoa
    WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal)
  LOOP
    v_cab_valorProdutos            := a.valorProdutos;
    v_cab_valorServicos            := a.valorServicos;
    v_cab_valorBasePagamento       := a.valorBasePagamento;
    v_cab_valorAVistaMinimo        := a.valorAVistaMinimo;
    v_cab_valorFreteTotal          := a.valorFreteTotal;
    v_cab_valorSeguroTotal         := a.valorSeguroTotal;
    v_cab_valorDescontoTotal       := a.valorDescontoTotal;
    v_cab_valorOutrasDespesasTotal := a.valorOutrasDespesasTotal;
    v_cab_valorAdicFreteMarinTotal := a.valorAdicFreteMarinhaMerTotal;
    v_cab_valorDespesasAduanTotal  := a.valorDespesasAduaneirasTotal;
    v_cab_valorLiquidoItem         := a.valorLiquidoItem;
    v_cab_valorDescCustoOpTotal    := a.valorDescontoCustoOpTotal;
    v_cab_valorAcrescCustoOpTotal  := a.valorAcrescimoCustoOpTotal;
    v_cab_valorCustoOperacao       := a.valorCustoOperacao;
    v_cab_valorCMV                 := a.valorCMV;
    v_cab_valorAcrescExtempTotal   := a.valorAcrescimoExtempTotal;
    SELECT
      CASE
        WHEN EXISTS (
          SELECT 1
          FROM MODOCFISCALXITENS a
          JOIN MODOCFISCALXORCAMENTOITEM docXorc
          ON docXorc.idItemDocFiscal = a.idItemDocFiscal
          JOIN MOORCAMENTOXITENS itemOrc
          ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento
          JOIN PACONTROLESENTREGA contr
          ON contr.controleEntrega = itemOrc.controleEntrega
          WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
          AND itemOrc.controleEntrega <> 0
          AND contr.habilitaFrete = 1)
        THEN 1
        ELSE 0
      END
    INTO v_habilitaControleEntrega
    FROM DUAL;
    ADD_DOC_FISC_CALC_IMP_RATEIO (
      a.idDocumentoFiscal,
      p_troca_tipoPagamentoFrete,
      p_a_cab_tipoPagamentoFrete,
      a.origemDocumento,
      a.entradaSaida,
      a.devolucaoAnulacaoRetorno,
      a.atualizaCustoMedio,
      a.estabelecimento,
      a.nfFornecedor,
      a.tipoPagamentoFrete,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorDescontoGeral,
      a.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      a.impostosEditados,
      a.valorDescontoCustoOpGeral,
      a.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoExtempGeral,
      v_habilitaControleEntrega,
      /* Retornos */
      v_cab_valorProdutos,
      v_cab_valorServicos,
      v_cab_valorBasePagamento,
      v_cab_valorAVistaMinimo,
      v_cab_valorFreteTotal,
      v_cab_valorSeguroTotal,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespesasTotal,
      v_cab_valorAdicFreteMarinTotal,
      v_cab_valorDespesasAduanTotal,
      v_cab_valorLiquidoItem,
      v_cab_valorDescCustoOpTotal,
      v_cab_valorAcrescCustoOpTotal,
      v_cab_valorCustoOperacao,
      v_cab_valorCMV,
      v_cab_valorAcrescExtempTotal,
      v_calcularImpostosItem);
    IF v_calcularImpostosItem = 1 THEN
      ADD_DOC_FISC_CALC_IMP_ITENS (
        p_config_64_casasDecSaidas,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        a.idDocumentoFiscal,
        a.origemDocumento,
        a.entradaSaida,
        a.devolucaoAnulacaoRetorno,
        a.atualizaCustoMedio,
        a.estabelecimento,
        a.nfFornecedor,
        a.dataEntradaSaida,
        a.pessoa,
        a.localDestinoOperacao,
        a.indicadorConsumidorFinal,
        a.tipoPagamentoFrete,
        a.indicadorInscricaoEstadual,
        /* Retornos */
        v_cab_valorProdutos,
        v_cab_valorServicos,
        v_cab_valorBasePagamento,
        v_cab_valorAVistaMinimo,
        v_cab_valorFreteTotal,
        v_cab_valorSeguroTotal,
        v_cab_valorDescontoTotal,
        v_cab_valorOutrasDespesasTotal,
        v_cab_valorAdicFreteMarinTotal,
        v_cab_valorDespesasAduanTotal,
        v_cab_valorLiquidoItem,
        v_cab_valorDescCustoOpTotal,
        v_cab_valorAcrescCustoOpTotal,
        v_cab_valorCustoOperacao,
        v_cab_valorCMV,
        v_cab_valorAcrescExtempTotal);
    END IF;
    UPDATE MODOCUMENTOSFISCAIS SET 
      valorProdutos                 = v_cab_valorProdutos,
      valorServicos                 = v_cab_valorServicos,
      valorBasePagamento            = v_cab_valorBasePagamento,
      valorAVistaMinimo             = v_cab_valorAVistaMinimo,
      valorFreteTotal               = v_cab_valorFreteTotal,
      valorSeguroTotal              = v_cab_valorSeguroTotal,
      valorDescontoTotal            = v_cab_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarinTotal,
      valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
      valorLiquidoItem              = v_cab_valorLiquidoItem,
      valorDescontoCustoOpTotal     = v_cab_valorDescCustoOpTotal,
      valorAcrescimoCustoOpTotal    = v_cab_valorAcrescCustoOpTotal,
      valorCustoOperacao            = v_cab_valorCustoOperacao,
      valorCMV                      = v_cab_valorCMV,
      valorAcrescimoExtempTotal     = v_cab_valorAcrescExtempTotal
    WHERE idDocumentoFiscal         = a.idDocumentoFiscal;
  END LOOP;
END ADD_DOC_FISC_CALC_IMP_CAB;

/

create or replace PROCEDURE ADD_PRE_DOC_CALC_IMP_ITENS (
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_preDocumento             IN NUMBER,
  p_cab_origemDocumento          IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_devolucaoAnulacaoRetorno IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEntradaSaida         IN DATE,
  p_cab_pessoa                   IN NUMBER,
  p_cab_localDestinoOperacao     IN CHAR,
  p_cab_indicadorConsumidorFinal IN CHAR,
  p_cab_tipoPagamentoFrete       IN CHAR,
  p_pess_indicadorInscricaoEstad IN CHAR,
  /* Retornos */
  r_cab_valorProdutos            OUT NUMBER,
  r_cab_valorServicos            OUT NUMBER,
  r_cab_valorBasePagamento       OUT NUMBER,
  r_cab_valorAVistaMinimo        OUT NUMBER,
  r_cab_valorFreteTotal          OUT NUMBER,
  r_cab_valorSeguroTotal         OUT NUMBER,
  r_cab_valorDescontoTotal       OUT NUMBER,
  r_cab_valorOutrasDespesasTotal OUT NUMBER,
  r_cab_valorAdicFreteMarinTotal OUT NUMBER,
  r_cab_valorDespesasAduanTotal  OUT NUMBER,
  r_cab_valorLiquidoItem         OUT NUMBER,
  r_cab_valorDescCustoOpTotal    OUT NUMBER,
  r_cab_valorAcrescCustoOpTotal  OUT NUMBER,
  r_cab_valorCustoOperacao       OUT NUMBER,
  r_cab_valorCMV                 OUT NUMBER,
  r_cab_valorAcrescExtempTotal   OUT NUMBER)
IS
  v_auxNumber                    NUMBER;
  v_precoUnitario                NUMBER;
  v_precoUnitarioConvertido      NUMBER;
  v_valorProdutoServico          NUMBER;
  v_valorBasePagamento           NUMBER;
  v_valorFreteTotal              NUMBER;
  v_valorSeguroTotal             NUMBER;
  v_valorDescontoTotal           NUMBER;
  v_valorOutrasDespesasTotal     NUMBER;
  v_valorAdicFreteMarinMerTotal  NUMBER;
  v_valorDespesasAduaneirasTotal NUMBER;
  v_baseISSQN                    NUMBER;
  v_valorISSQN                   NUMBER;
  v_baseRetIRRF                  NUMBER;
  v_valorRetIRRF                 NUMBER;
  v_baseRetINSS                  NUMBER;
  v_valorRetINSS                 NUMBER;
  v_baseRetPIS                   NUMBER;
  v_valorRetPIS                  NUMBER;
  v_baseRetCOFINS                NUMBER;
  v_valorRetCOFINS               NUMBER;
  v_baseRetCSLL                  NUMBER;
  v_valorRetCSLL                 NUMBER;
  v_baseRetOutros                NUMBER;
  v_valorRetOutros               NUMBER;
  v_baseII                       NUMBER;
  v_valorII                      NUMBER;
  v_baseIOF                      NUMBER;
  v_valorIOF                     NUMBER;
  v_baseIPI                      NUMBER;
  v_valorIPI                     NUMBER;
  v_basePIS                      NUMBER;
  v_valorPIS                     NUMBER;
  v_basePISST                    NUMBER;
  v_valorPISST                   NUMBER;
  v_baseCOFINS                   NUMBER;
  v_valorCOFINS                  NUMBER;
  v_baseCOFINSST                 NUMBER;
  v_valorCOFINSST                NUMBER;
  v_baseCreditoSimplesNacional   NUMBER;
  v_valorCreditoSimplesNacional  NUMBER;
  v_baseICMS                     NUMBER;
  v_valorICMSOperacao            NUMBER;
  v_valorICMSDiferido            NUMBER;
  v_valorICMS                    NUMBER;
  v_valorICMSDesoneracao         NUMBER;
  v_baseICMSST                   NUMBER;
  v_valorICMSST                  NUMBER;
  v_baseICMSSTAnteriormente      NUMBER;
  v_valorICMSSTAnteriormente     NUMBER;
  v_valorICMSProprioSubstituto   NUMBER;
  v_baseICMSEfetivo              NUMBER;
  v_valorICMSEfetivo             NUMBER;
  v_baseICMSUFDestinatario       NUMBER;
  v_valorICMSUFDestinatario      NUMBER;
  v_baseICMSUFRemetente          NUMBER;
  v_valorICMSUFRemetente         NUMBER;
  v_baseFCP                      NUMBER;
  v_valorFCP                     NUMBER;
  v_baseFCPST                    NUMBER;
  v_valorFCPST                   NUMBER;
  v_baseFCPSTAnteriormente       NUMBER;
  v_valorFCPSTAnteriormente      NUMBER;
  v_baseFCPUFDestinatario        NUMBER;
  v_valorFCPUFDestinatario       NUMBER;
  v_baseEstimadaImpostos         NUMBER;
  v_valorEstimadoImpFederais     NUMBER;
  v_valorEstimadoImpEstaduais    NUMBER;
  v_valorEstimadoImpMunicipais   NUMBER;
  v_valorLiquidoItem             NUMBER;
  v_valorDescontoCustoOpTotal    NUMBER;
  v_valorAcrescimoCustoOpTotal   NUMBER;
  v_precoCustoOperacao           NUMBER;
  v_valorCustoOperacao           NUMBER;
  v_precoCMV                     NUMBER;
  v_valorCMV                     NUMBER;
  v_valorAcrescimoExtempSubtotal NUMBER;
  v_valorAcrescimoExtempTotal    NUMBER;
BEGIN
  r_cab_valorProdutos            := 0;
  r_cab_valorServicos            := 0;
  r_cab_valorBasePagamento       := 0;
  r_cab_valorAVistaMinimo        := 0;
  r_cab_valorFreteTotal          := 0;
  r_cab_valorSeguroTotal         := 0;
  r_cab_valorDescontoTotal       := 0;
  r_cab_valorOutrasDespesasTotal := 0;
  r_cab_valorAdicFreteMarinTotal := 0;
  r_cab_valorDespesasAduanTotal  := 0;
  r_cab_valorLiquidoItem         := 0;
  r_cab_valorDescCustoOpTotal    := 0;
  r_cab_valorAcrescCustoOpTotal  := 0;
  r_cab_valorCustoOperacao       := 0;
  r_cab_valorCMV                 := 0;
  r_cab_valorAcrescExtempTotal   := 0;  
  FOR a IN (
    SELECT
      a.*,
      gradProd.produto,
      gradProd.cor,
      gradProd.tamanho,
      prod.controleEstoque,
      prod.tipoProduto,
      prod.precoPautaTabelado,
      modDoc.geraFinanceiro modDoc_geraFinanceiro,
      modDoc.diminuiDescontoPrUnit,
      modDoc.somaAcrescimosPrUnit,
      modDoc.somaFreteSeguroPrUnit,
      CASE
        WHEN EXISTS (
          SELECT 1
          FROM CAPRODUTOXCOMPOSICOESPREC compPrec
          WHERE compPrec.produto = gradProd.produto
          AND compPrec.ativo = 1)
        THEN 1
        ELSE 0
      END composicaoPreco
    FROM MOPREDOCUMXITENS a
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = a.modeloDocumento
    WHERE a.preDocumento = p_cab_preDocumento
    AND a.cancelado = 0
    ORDER BY a.sequencia)
  LOOP
    v_precoUnitario                := a.precoUnitario;
    v_precoUnitarioConvertido      := a.precoUnitarioConvertido;
    v_valorProdutoServico          := a.valorProdutoServico;
    v_valorBasePagamento           := a.valorBasePagamento;
    v_valorFreteTotal              := a.valorFreteTotal;
    v_valorSeguroTotal             := a.valorSeguroTotal;
    v_valorDescontoTotal           := a.valorDescontoTotal;
    v_valorOutrasDespesasTotal     := a.valorOutrasDespesasTotal;
    v_valorAdicFreteMarinMerTotal  := a.valorAdicFreteMarinhaMerTotal;
    v_valorDespesasAduaneirasTotal := a.valorDespesasAduaneirasTotal;
    v_baseISSQN                    := a.baseISSQN;
    v_valorISSQN                   := a.valorISSQN;
    v_baseRetIRRF                  := a.baseRetIRRF;
    v_valorRetIRRF                 := a.valorRetIRRF;
    v_baseRetINSS                  := a.baseRetINSS;
    v_valorRetINSS                 := a.valorRetINSS;
    v_baseRetPIS                   := a.baseRetPIS;
    v_valorRetPIS                  := a.valorRetPIS;
    v_baseRetCOFINS                := a.baseRetCOFINS;
    v_valorRetCOFINS               := a.valorRetCOFINS;
    v_baseRetCSLL                  := a.baseRetCSLL;
    v_valorRetCSLL                 := a.valorRetCSLL;
    v_baseRetOutros                := a.baseRetOutros;
    v_valorRetOutros               := a.valorRetOutros;
    v_baseII                       := a.baseII;
    v_valorII                      := a.valorII;
    v_baseIOF                      := a.baseIOF;
    v_valorIOF                     := a.valorIOF;
    v_baseIPI                      := a.baseIPI;
    v_valorIPI                     := a.valorIPI;
    v_basePIS                      := a.basePIS;
    v_valorPIS                     := a.valorPIS;
    v_basePISST                    := a.basePISST;
    v_valorPISST                   := a.valorPISST;
    v_baseCOFINS                   := a.baseCOFINS;
    v_valorCOFINS                  := a.valorCOFINS;
    v_baseCOFINSST                 := a.baseCOFINSST;
    v_valorCOFINSST                := a.valorCOFINSST;
    v_baseCreditoSimplesNacional   := a.baseCreditoSimplesNacional;
    v_valorCreditoSimplesNacional  := a.valorCreditoSimplesNacional;
    v_baseICMS                     := a.baseICMS;
    v_valorICMSOperacao            := a.valorICMSOperacao;
    v_valorICMSDiferido            := a.valorICMSDiferido;
    v_valorICMS                    := a.valorICMS;
    v_valorICMSDesoneracao         := a.valorICMSDesoneracao;
    v_baseICMSST                   := a.baseICMSST;
    v_valorICMSST                  := a.valorICMSST;
    v_baseICMSSTAnteriormente      := a.baseICMSSTAnteriormente;
    v_valorICMSSTAnteriormente     := a.valorICMSSTAnteriormente;
    v_valorICMSProprioSubstituto   := a.valorICMSProprioSubstituto;
    v_baseICMSEfetivo              := a.baseICMSEfetivo;
    v_valorICMSEfetivo             := a.valorICMSEfetivo;
    v_baseICMSUFDestinatario       := a.baseICMSUFDestinatario;
    v_valorICMSUFDestinatario      := a.valorICMSUFDestinatario;
    v_baseICMSUFRemetente          := a.baseICMSUFRemetente;
    v_valorICMSUFRemetente         := a.valorICMSUFRemetente;
    v_baseFCP                      := a.baseFCP;
    v_valorFCP                     := a.valorFCP;
    v_baseFCPST                    := a.baseFCPST;
    v_valorFCPST                   := a.valorFCPST;
    v_baseFCPSTAnteriormente       := a.baseFCPSTAnteriormente;
    v_valorFCPSTAnteriormente      := a.valorFCPSTAnteriormente;
    v_baseFCPUFDestinatario        := a.baseFCPUFDestinatario;
    v_valorFCPUFDestinatario       := a.valorFCPUFDestinatario;
    v_baseEstimadaImpostos         := a.baseEstimadaImpostos;
    v_valorEstimadoImpFederais     := a.valorEstimadoImpFederais;
    v_valorEstimadoImpEstaduais    := a.valorEstimadoImpEstaduais;
    v_valorEstimadoImpMunicipais   := a.valorEstimadoImpMunicipais;
    v_valorLiquidoItem             := a.valorLiquidoItem;
    v_valorDescontoCustoOpTotal    := a.valorDescontoCustoOpTotal;
    v_valorAcrescimoCustoOpTotal   := a.valorAcrescimoCustoOpTotal;
    v_precoCustoOperacao           := a.precoCustoOperacao;
    v_valorCustoOperacao           := a.valorCustoOperacao;
    v_precoCMV                     := a.precoCMV;
    v_valorCMV                     := a.valorCMV;
    v_valorAcrescimoExtempSubtotal := a.valorAcrescimoExtempSubtotal;
    v_valorAcrescimoExtempTotal    := a.valorAcrescimoExtempTotal;
    ADD_CALCULA_TOTAIS_ITEM(
      p_cab_tipoPagamentoFrete,
      a.quantidade,
      a.quantidadeConvertida,
      a.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao,
      a.precoUnitario,
      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.diminuiDescontoPrUnit,
      a.somaAcrescimosPrUnit,
      a.somaFreteSeguroPrUnit,
      a.composicaoPreco,
      /* Retornos */
      v_precoUnitario,
      v_precoUnitarioConvertido,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal);
    v_valorAcrescimoExtempSubtotal := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
      a.quantidade,
      v_precoUnitario,
      a.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo);
    v_valorAcrescimoExtempTotal := FUNC_ADD_CALC_EXTEMP_TOTAL(
      v_valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem,
      a.valorAcrescimoExtempGeral);
    ADD_CALCULA_IMPOSTOS_ITEM (
      p_config_64_casasDecSaidas,
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_cab_entradaSaida,
      p_cab_devolucaoAnulacaoRetorno,
      p_cab_estabelecimento,
      0,
      p_cab_dataEntradaSaida,
      p_cab_pessoa,
      p_cab_localDestinoOperacao,
      p_cab_indicadorConsumidorFinal,
      p_cab_tipoPagamentoFrete,
      p_pess_indicadorInscricaoEstad,
      a.personalizacao,
      a.quantidade,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal,
      a.cfop,
      1,
      a.indicadorISSQN,
      a.aliquotaISSQN,
      v_baseISSQN,
      v_valorISSQN,
      1,
      a.retencaoIRRF,
      v_baseRetIRRF,
      v_valorRetIRRF,
      1,
      a.retencaoINSS,
      v_baseRetINSS,
      v_valorRetINSS,
      1,
      a.retencaoPIS,
      v_baseRetPIS,
      v_valorRetPIS,
      1,
      a.retencaoCOFINS,
      v_baseRetCOFINS,
      v_valorRetCOFINS,
      1,
      a.retencaoCSLL,
      v_baseRetCSLL,
      v_valorRetCSLL,
      1,
      a.retencaoOutros,
      v_baseRetOutros,
      v_valorRetOutros,
      1,
      a.aliquotaII,
      v_baseII,
      v_valorII,
      1,
      a.aliquotaIOF,
      v_baseIOF,
      v_valorIOF,
      1,
      a.aliquotaIPI,
      a.valorAliquotaIPI,
      v_baseIPI,
      v_valorIPI,
      a.valorIPIDevolucao,
      1,
      a.aliquotaPIS,
      a.valorAliquotaPIS,
      v_basePIS,
      v_valorPIS,
      1,
      a.aliquotaPISST,
      a.valorAliquotaPISST,
      v_basePISST,
      v_valorPISST,
      1,
      a.aliquotaCOFINS,
      a.valorAliquotaCOFINS,
      v_baseCOFINS,
      v_valorCOFINS,
      1,
      a.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST,
      v_baseCOFINSST,
      v_valorCOFINSST,
      1,
      a.stSimplesNacional,
      a.creditoSimplesNacional,
      v_baseCreditoSimplesNacional,
      v_valorCreditoSimplesNacional,
      1,
      a.stICMS,
      a.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS,
      a.aliquotaICMS,
      a.diferimentoICMS,
      v_baseICMS,
      v_valorICMSOperacao,
      v_valorICMSDiferido,
      v_valorICMS,
      v_valorICMSDesoneracao,
      1,
      a.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST,
      a.reducaoBaseST,
      a.aliquotaICMSST,
      v_baseICMSST,
      v_valorICMSST,
      1,
      v_baseICMSSTAnteriormente,
      v_valorICMSSTAnteriormente,
      v_valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo,
      v_baseICMSEfetivo,
      v_valorICMSEfetivo,
      0,
      '  ',
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      1,
      a.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual,
      v_baseICMSUFDestinatario,
      v_valorICMSUFDestinatario,
      v_baseICMSUFRemetente,
      v_valorICMSUFRemetente,
      1,
      a.aliquotaFCP,
      v_baseFCP,
      v_valorFCP,
      a.aliquotaFCPST,
      v_baseFCPST,
      v_valorFCPST,
      a.aliquotaFCPSTAnteriormente,
      v_baseFCPSTAnteriormente,
      v_valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario,
      v_baseFCPUFDestinatario,
      v_valorFCPUFDestinatario,
      1,
      a.aliquotaEstimadaImpFederais,
      a.aliquotaEstimadaImpEstaduais,
      a.aliquotaEstimadaImpMunicipais,
      v_baseEstimadaImpostos,
      v_valorEstimadoImpFederais,
      v_valorEstimadoImpEstaduais,
      v_valorEstimadoImpMunicipais,
      a.produto,
      a.cor,
      a.tamanho,
      a.controleEstoque,
      a.tipoProduto,
      a.precoPautaTabelado,
      /* Retornos */
      v_baseISSQN,
      v_valorISSQN,
      v_baseRetIRRF,
      v_valorRetIRRF,
      v_baseRetINSS,
      v_valorRetINSS,
      v_baseRetPIS,
      v_valorRetPIS,
      v_baseRetCOFINS,
      v_valorRetCOFINS,
      v_baseRetCSLL,
      v_valorRetCSLL,
      v_baseRetOutros,
      v_valorRetOutros,
      v_baseII,
      v_valorII,
      v_baseIOF,
      v_valorIOF,
      v_baseIPI,
      v_valorIPI,
      v_basePIS,
      v_valorPIS,
      v_basePISST,
      v_valorPISST,
      v_baseCOFINS,
      v_valorCOFINS,
      v_baseCOFINSST,
      v_valorCOFINSST,
      v_baseCreditoSimplesNacional,
      v_valorCreditoSimplesNacional,
      v_baseICMS,
      v_valorICMSOperacao,
      v_valorICMSDiferido,
      v_valorICMS,
      v_valorICMSDesoneracao,
      v_baseICMSST,
      v_valorICMSST,
      v_baseICMSSTAnteriormente,
      v_valorICMSSTAnteriormente,
      v_valorICMSProprioSubstituto,
      v_baseICMSEfetivo,
      v_valorICMSEfetivo,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_baseICMSUFDestinatario,
      v_valorICMSUFDestinatario,
      v_baseICMSUFRemetente,
      v_valorICMSUFRemetente,
      v_baseFCP,
      v_valorFCP,
      v_baseFCPST,
      v_valorFCPST,
      v_baseFCPSTAnteriormente,
      v_valorFCPSTAnteriormente,
      v_baseFCPUFDestinatario,
      v_valorFCPUFDestinatario,
      v_baseEstimadaImpostos,
      v_valorEstimadoImpFederais,
      v_valorEstimadoImpEstaduais,
      v_valorEstimadoImpMunicipais);
    v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
      p_cab_origemDocumento,
      0, -- p_cab_nfFornecedor
      p_cab_tipoPagamentoFrete,
      a.geraFinanceiro,
      v_valorProdutoServico,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      a.valorIPIDevolucao,
      a.retidoISSQN,
      v_valorISSQN,
      v_valorRetIRRF,
      v_valorRetINSS,
      v_valorRetPIS,
      v_valorRetCOFINS,
      v_valorRetCSLL,
      v_valorRetOutros,
      v_valorII,
      v_valorIOF,
      v_valorIPI,
      v_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0, -- p_item_somarICMSST
      v_valorAcrescimoExtempTotal,
      a.modDoc_geraFinanceiro);
    v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
      0, -- p_cab_nfFornecedor
      p_cab_tipoPagamentoFrete,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      a.valorIPIDevolucao,
      v_valorII,
      v_valorIOF,
      v_valorIPI,
      v_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0 -- p_item_somarICMSST
      );
    ADD_CALCULA_CUSTO_CMV (
      p_cab_atualizaCustoMedio,
      p_cab_estabelecimento,
      0,
      a.modeloDocumento,
      a.quantidade,
      v_valorII,
      v_valorIOF,
      v_valorIPI,
      a.valorIPIDevolucao,
      v_valorPIS,
      v_valorPISST,
      v_valorCOFINS,
      v_valorCOFINSST,
      v_valorCreditoSimplesNacional,
      v_valorICMS,
      v_valorICMSST,
      0,
      v_valorLiquidoItem,
      a.valorDescontoCustoOpItem,
      a.valorDescontoCustoOpGeral,
      a.valorAcrescimoCustoOpItem,
      a.valorAcrescimoCustoOpGeral,
      v_valorAcrescimoExtempTotal,
      /* Retornos */
      v_valorDescontoCustoOpTotal,
      v_valorAcrescimoCustoOpTotal,
      v_precoCustoOperacao,
      v_valorCustoOperacao,
      v_precoCMV,
      v_valorCMV);
    UPDATE MOPREDOCUMXITENS SET
      precoUnitario                 = v_precoUnitario,
      precoUnitarioConvertido       = v_precoUnitarioConvertido,
      valorProdutoServico           = v_valorProdutoServico,
      valorBasePagamento            = v_valorBasePagamento,
      valorFreteTotal               = v_valorFreteTotal,
      valorSeguroTotal              = v_valorSeguroTotal,
      valorDescontoTotal            = v_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
      valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
      baseISSQN                     = v_baseISSQN,
      valorISSQN                    = v_valorISSQN,
      baseRetIRRF                   = v_baseRetIRRF,
      valorRetIRRF                  = v_valorRetIRRF,
      baseRetINSS                   = v_baseRetINSS,
      valorRetINSS                  = v_valorRetINSS,
      baseRetPIS                    = v_baseRetPIS,
      valorRetPIS                   = v_valorRetPIS,
      baseRetCOFINS                 = v_baseRetCOFINS,
      valorRetCOFINS                = v_valorRetCOFINS,
      baseRetCSLL                   = v_baseRetCSLL,
      valorRetCSLL                  = v_valorRetCSLL,
      baseRetOutros                 = v_baseRetOutros,
      valorRetOutros                = v_valorRetOutros,
      baseII                        = v_baseII,
      valorII                       = v_valorII,
      baseIOF                       = v_baseIOF,
      valorIOF                      = v_valorIOF,
      baseIPI                       = v_baseIPI,
      valorIPI                      = v_valorIPI,
      basePIS                       = v_basePIS,
      valorPIS                      = v_valorPIS,
      basePISST                     = v_basePISST,
      valorPISST                    = v_valorPISST,
      baseCOFINS                    = v_baseCOFINS,
      valorCOFINS                   = v_valorCOFINS,
      baseCOFINSST                  = v_baseCOFINSST,
      valorCOFINSST                 = v_valorCOFINSST,
      baseCreditoSimplesNacional    = v_baseCreditoSimplesNacional,
      valorCreditoSimplesNacional   = v_valorCreditoSimplesNacional,
      baseICMS                      = v_baseICMS,
      valorICMSOperacao             = v_valorICMSOperacao,
      valorICMSDiferido             = v_valorICMSDiferido,
      valorICMS                     = v_valorICMS,
      valorICMSDesoneracao          = v_valorICMSDesoneracao,
      baseICMSST                    = v_baseICMSST,
      valorICMSST                   = v_valorICMSST,
      baseICMSSTAnteriormente       = v_baseICMSSTAnteriormente,
      valorICMSSTAnteriormente      = v_valorICMSSTAnteriormente,
      valorICMSProprioSubstituto    = v_valorICMSProprioSubstituto,
      baseICMSEfetivo               = v_baseICMSEfetivo,
      valorICMSEfetivo              = v_valorICMSEfetivo,
      baseICMSUFDestinatario        = v_baseICMSUFDestinatario,
      valorICMSUFDestinatario       = v_valorICMSUFDestinatario,
      baseICMSUFRemetente           = v_baseICMSUFRemetente,
      valorICMSUFRemetente          = v_valorICMSUFRemetente,
      baseFCP                       = v_baseFCP,
      valorFCP                      = v_valorFCP,
      baseFCPST                     = v_baseFCPST,
      valorFCPST                    = v_valorFCPST,
      baseFCPSTAnteriormente        = v_baseFCPSTAnteriormente,
      valorFCPSTAnteriormente       = v_valorFCPSTAnteriormente,
      baseFCPUFDestinatario         = v_baseFCPUFDestinatario,
      valorFCPUFDestinatario        = v_valorFCPUFDestinatario,
      baseEstimadaImpostos          = v_baseEstimadaImpostos,
      valorEstimadoImpFederais      = v_valorEstimadoImpFederais,
      valorEstimadoImpEstaduais     = v_valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais    = v_valorEstimadoImpMunicipais,
      valorLiquidoItem              = v_valorLiquidoItem,
      valorDescontoCustoOpTotal     = v_valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpTotal    = v_valorAcrescimoCustoOpTotal,
      precoCustoOperacao            = v_precoCustoOperacao,
      valorCustoOperacao            = v_valorCustoOperacao,
      precoCMV                      = v_precoCMV,
      valorCMV                      = v_valorCMV,
      valorAcrescimoExtempSubtotal  = v_valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempTotal     = v_valorAcrescimoExtempTotal
    WHERE idItemPreDocumento        = a.idItemPreDocumento;
    IF a.tipoProduto = '09' THEN
      r_cab_valorServicos            := r_cab_valorServicos + v_valorProdutoServico;
    ELSE
      r_cab_valorProdutos            := r_cab_valorProdutos + v_valorProdutoServico;
    END IF;
    r_cab_valorBasePagamento       := r_cab_valorBasePagamento + v_valorBasePagamento;
    IF a.usarPrecoAVista = 1 AND a.geraFinanceiro = 1 THEN
      r_cab_valorAVistaMinimo        := r_cab_valorAVistaMinimo + v_valorProdutoServico + a.valorDescontoPagamento - a.valorOutrasDespesasPagamento - a.valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
    END IF;
    r_cab_valorFreteTotal          := r_cab_valorFreteTotal + v_valorFreteTotal;
    r_cab_valorSeguroTotal         := r_cab_valorSeguroTotal + v_valorSeguroTotal;
    r_cab_valorDescontoTotal       := r_cab_valorDescontoTotal + v_valorDescontoTotal;
    r_cab_valorOutrasDespesasTotal := r_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
    r_cab_valorAdicFreteMarinTotal := r_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
    r_cab_valorDespesasAduanTotal  := r_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
    r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem + v_valorLiquidoItem;
    r_cab_valorDescCustoOpTotal    := r_cab_valorDescCustoOpTotal + v_valorDescontoCustoOpTotal;
    r_cab_valorAcrescCustoOpTotal  := r_cab_valorAcrescCustoOpTotal + v_valorAcrescimoCustoOpTotal;
    r_cab_valorCustoOperacao       := r_cab_valorCustoOperacao + v_valorCustoOperacao;
    r_cab_valorCMV                 := r_cab_valorCMV + v_valorCMV;
    r_cab_valorAcrescExtempTotal   := r_cab_valorAcrescExtempTotal + v_valorAcrescimoExtempTotal;
  END LOOP;
END ADD_PRE_DOC_CALC_IMP_ITENS;

/

create or replace PROCEDURE ADD_PRE_DOC_CALC_IMP_CAB (
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_preDocumento             IN NUMBER,
  p_troca_tipoPagamentoFrete     IN NUMBER,
  p_a_cab_tipoPagamentoFrete     IN CHAR)
IS
  v_cab_valorProdutos            NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarinTotal NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_valorDescCustoOpTotal    NUMBER;
  v_cab_valorAcrescCustoOpTotal  NUMBER;
  v_cab_valorAcrescExtempTotal   NUMBER;
  v_calcularImpostosItem         NUMBER;
  v_habilitaControleEntrega      NUMBER;
BEGIN
  FOR a IN (
    SELECT a.*,
      pess.indicadorInscricaoEstadual,
      COALESCE((
        SELECT MIN(munEndEst.uf)
        FROM PAESTABELECIMENTOS est
        JOIN CAENDERECOSPESSOA endEst
        ON endEst.pessoa = est.pessoaEstabelecimento
        JOIN SIMUNICIPIOS munEndEst
        ON munEndEst.municipio = endEst.municipio
        WHERE est.estabelecimento = a.estabelecimento
        AND endEst.ativo = 1
        AND endEst.principal = 1),'  ') munEndEst_uf
    FROM MOPREDOCUMENTOS a
    JOIN CAPESSOAS pess
    ON pess.pessoa = a.pessoa
    WHERE a.preDocumento = p_cab_preDocumento)
  LOOP
    v_cab_valorProdutos            := a.valorProdutos;
    v_cab_valorServicos            := a.valorServicos;
    v_cab_valorBasePagamento       := a.valorBasePagamento;
    v_cab_valorAVistaMinimo        := a.valorAVistaMinimo;
    v_cab_valorFreteTotal          := a.valorFreteTotal;
    v_cab_valorSeguroTotal         := a.valorSeguroTotal;
    v_cab_valorDescontoTotal       := a.valorDescontoTotal;
    v_cab_valorOutrasDespesasTotal := a.valorOutrasDespesasTotal;
    v_cab_valorAdicFreteMarinTotal := a.valorAdicFreteMarinhaMerTotal;
    v_cab_valorDespesasAduanTotal  := a.valorDespesasAduaneirasTotal;
    v_cab_valorLiquidoItem         := a.valorLiquidoItem;
    v_cab_valorDescCustoOpTotal    := a.valorDescontoCustoOpTotal;
    v_cab_valorAcrescCustoOpTotal  := a.valorAcrescimoCustoOpTotal;
    v_cab_valorCustoOperacao       := a.valorCustoOperacao;
    v_cab_valorCMV                 := a.valorCMV;
    v_cab_valorAcrescExtempTotal   := a.valorAcrescimoExtempTotal;    
    SELECT
      CASE
        WHEN EXISTS (
          SELECT 1
          FROM MOPREDOCUMXITENS a
          JOIN MOPREDOCUMXORCAMENTOITEM docXorc
          ON docXorc.idItemPreDocumento = a.idItemPreDocumento
          JOIN MOORCAMENTOXITENS itemOrc
          ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento
          JOIN PACONTROLESENTREGA contr
          ON contr.controleEntrega = itemOrc.controleEntrega
          WHERE a.preDocumento = p_cab_preDocumento
          AND itemOrc.controleEntrega <> 0
          AND contr.habilitaFrete = 1)
        THEN 1
        ELSE 0
      END
    INTO v_habilitaControleEntrega
    FROM DUAL;
    ADD_PRE_DOC_CALC_IMP_RATEIO (
      a.preDocumento,
      p_troca_tipoPagamentoFrete,
      p_a_cab_tipoPagamentoFrete,
      a.origemDocumento,
      a.entradaSaida,
      a.devolucaoAnulacaoRetorno,
      a.atualizaCustoMedio,
      a.estabelecimento,
      a.tipoPagamentoFrete,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorDescontoGeral,
      a.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      a.impostosEditados,
      a.valorDescontoCustoOpGeral,
      a.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoExtempGeral,
      v_habilitaControleEntrega,
      /* Retornos */
      v_cab_valorProdutos,
      v_cab_valorServicos,
      v_cab_valorBasePagamento,
      v_cab_valorAVistaMinimo,
      v_cab_valorFreteTotal,
      v_cab_valorSeguroTotal,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespesasTotal,
      v_cab_valorAdicFreteMarinTotal,
      v_cab_valorDespesasAduanTotal,
      v_cab_valorLiquidoItem,
      v_cab_valorDescCustoOpTotal,
      v_cab_valorAcrescCustoOpTotal,
      v_cab_valorCustoOperacao,
      v_cab_valorCMV,
      v_cab_valorAcrescExtempTotal,
      v_calcularImpostosItem);
    IF v_calcularImpostosItem = 1 THEN
      ADD_PRE_DOC_CALC_IMP_ITENS(
        p_config_64_casasDecSaidas,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        a.preDocumento,
        a.origemDocumento,
        a.entradaSaida,
        a.devolucaoAnulacaoRetorno,
        a.atualizaCustoMedio,
        a.estabelecimento,
        a.dataEntradaSaida,
        a.pessoa,
        a.localDestinoOperacao,
        a.indicadorConsumidorFinal,
        a.tipoPagamentoFrete,
        a.indicadorInscricaoEstadual,
        /* Retornos */
        v_cab_valorProdutos,
        v_cab_valorServicos,
        v_cab_valorBasePagamento,
        v_cab_valorAVistaMinimo,
        v_cab_valorFreteTotal,
        v_cab_valorSeguroTotal,
        v_cab_valorDescontoTotal,
        v_cab_valorOutrasDespesasTotal,
        v_cab_valorAdicFreteMarinTotal,
        v_cab_valorDespesasAduanTotal,
        v_cab_valorLiquidoItem,
        v_cab_valorDescCustoOpTotal,
        v_cab_valorAcrescCustoOpTotal,
        v_cab_valorCustoOperacao,
        v_cab_valorCMV,
        v_cab_valorAcrescExtempTotal);
    END IF;
    UPDATE MOPREDOCUMENTOS SET 
      valorProdutos                 = v_cab_valorProdutos,
      valorServicos                 = v_cab_valorServicos,
      valorBasePagamento            = v_cab_valorBasePagamento,
      valorAVistaMinimo             = v_cab_valorAVistaMinimo,
      valorFreteTotal               = v_cab_valorFreteTotal,
      valorSeguroTotal              = v_cab_valorSeguroTotal,
      valorDescontoTotal            = v_cab_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarinTotal,
      valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
      valorLiquidoItem              = v_cab_valorLiquidoItem,
      valorDescontoCustoOpTotal     = v_cab_valorDescCustoOpTotal,
      valorAcrescimoCustoOpTotal    = v_cab_valorAcrescCustoOpTotal,
      valorCustoOperacao            = v_cab_valorCustoOperacao,
      valorCMV                      = v_cab_valorCMV,
      valorAcrescimoExtempTotal     = v_cab_valorAcrescExtempTotal
    WHERE preDocumento              = a.preDocumento;
  END LOOP;
END ADD_PRE_DOC_CALC_IMP_CAB;

/

create or replace PROCEDURE ADD_ORCAMENTO_CALC_IMP_ITENS (
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_orcamento                IN NUMBER,
  p_cab_origemDocumento          IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEntradaSaida         IN DATE,
  p_cab_pessoa                   IN NUMBER,
  p_cab_localDestinoOperacao     IN CHAR,
  p_cab_indicadorConsumidorFinal IN CHAR,
  p_cab_tipoPagamentoFrete       IN CHAR,
  p_pess_indicadorInscricaoEstad IN CHAR,
  /* Retornos */
  r_cab_valorProdutos            OUT NUMBER,
  r_cab_valorServicos            OUT NUMBER,
  r_cab_valorBasePagamento       OUT NUMBER,
  r_cab_valorAVistaMinimo        OUT NUMBER,
  r_cab_valorFreteTotal          OUT NUMBER,
  r_cab_valorSeguroTotal         OUT NUMBER,
  r_cab_valorDescontoTotal       OUT NUMBER,
  r_cab_valorOutrasDespesasTotal OUT NUMBER,
  r_cab_valorAdicFreteMarinTotal OUT NUMBER,
  r_cab_valorDespesasAduanTotal  OUT NUMBER,
  r_cab_valorLiquidoItem         OUT NUMBER)
IS
  v_auxNumber                    NUMBER;
  v_precoUnitario                NUMBER;
  v_precoUnitarioConvertido      NUMBER;
  v_valorProdutoServico          NUMBER;
  v_valorBasePagamento           NUMBER;
  v_valorFreteTotal              NUMBER;
  v_valorSeguroTotal             NUMBER;
  v_valorDescontoTotal           NUMBER;
  v_valorOutrasDespesasTotal     NUMBER;
  v_valorAdicFreteMarinMerTotal  NUMBER;
  v_valorDespesasAduaneirasTotal NUMBER;
  v_baseISSQN                    NUMBER;
  v_valorISSQN                   NUMBER;
  v_baseRetIRRF                  NUMBER;
  v_valorRetIRRF                 NUMBER;
  v_baseRetINSS                  NUMBER;
  v_valorRetINSS                 NUMBER;
  v_baseRetPIS                   NUMBER;
  v_valorRetPIS                  NUMBER;
  v_baseRetCOFINS                NUMBER;
  v_valorRetCOFINS               NUMBER;
  v_baseRetCSLL                  NUMBER;
  v_valorRetCSLL                 NUMBER;
  v_baseRetOutros                NUMBER;
  v_valorRetOutros               NUMBER;
  v_baseII                       NUMBER;
  v_valorII                      NUMBER;
  v_baseIOF                      NUMBER;
  v_valorIOF                     NUMBER;
  v_baseIPI                      NUMBER;
  v_valorIPI                     NUMBER;
  v_basePIS                      NUMBER;
  v_valorPIS                     NUMBER;
  v_basePISST                    NUMBER;
  v_valorPISST                   NUMBER;
  v_baseCOFINS                   NUMBER;
  v_valorCOFINS                  NUMBER;
  v_baseCOFINSST                 NUMBER;
  v_valorCOFINSST                NUMBER;
  v_baseCreditoSimplesNacional   NUMBER;
  v_valorCreditoSimplesNacional  NUMBER;
  v_baseICMS                     NUMBER;
  v_valorICMSOperacao            NUMBER;
  v_valorICMSDiferido            NUMBER;
  v_valorICMS                    NUMBER;
  v_valorICMSDesoneracao         NUMBER;
  v_baseICMSST                   NUMBER;
  v_valorICMSST                  NUMBER;
  v_baseICMSSTAnteriormente      NUMBER;
  v_valorICMSSTAnteriormente     NUMBER;
  v_valorICMSProprioSubstituto   NUMBER;
  v_baseICMSEfetivo              NUMBER;
  v_valorICMSEfetivo             NUMBER;
  v_baseICMSUFDestinatario       NUMBER;
  v_valorICMSUFDestinatario      NUMBER;
  v_baseICMSUFRemetente          NUMBER;
  v_valorICMSUFRemetente         NUMBER;
  v_baseFCP                      NUMBER;
  v_valorFCP                     NUMBER;
  v_baseFCPST                    NUMBER;
  v_valorFCPST                   NUMBER;
  v_baseFCPSTAnteriormente       NUMBER;
  v_valorFCPSTAnteriormente      NUMBER;
  v_baseFCPUFDestinatario        NUMBER;
  v_valorFCPUFDestinatario       NUMBER;
  v_baseEstimadaImpostos         NUMBER;
  v_valorEstimadoImpFederais     NUMBER;
  v_valorEstimadoImpEstaduais    NUMBER;
  v_valorEstimadoImpMunicipais   NUMBER;
  v_valorLiquidoItem             NUMBER;
BEGIN
  r_cab_valorProdutos            := 0;
  r_cab_valorServicos            := 0;
  r_cab_valorBasePagamento       := 0;
  r_cab_valorAVistaMinimo        := 0;
  r_cab_valorFreteTotal          := 0;
  r_cab_valorSeguroTotal         := 0;
  r_cab_valorDescontoTotal       := 0;
  r_cab_valorOutrasDespesasTotal := 0;
  r_cab_valorAdicFreteMarinTotal := 0;
  r_cab_valorDespesasAduanTotal  := 0;
  r_cab_valorLiquidoItem         := 0;
  FOR a IN (
    SELECT
      a.*,
      gradProd.produto,
      gradProd.cor,
      gradProd.tamanho,
      prod.controleEstoque,
      prod.tipoProduto,
      prod.precoPautaTabelado,
      modDoc.geraFinanceiro modDoc_geraFinanceiro,
      modDoc.diminuiDescontoPrUnit,
      modDoc.somaAcrescimosPrUnit,
      modDoc.somaFreteSeguroPrUnit,
      CASE
        WHEN EXISTS (
          SELECT 1
          FROM CAPRODUTOXCOMPOSICOESPREC compPrec
          WHERE compPrec.produto = gradProd.produto
          AND compPrec.ativo = 1)
        THEN 1
        ELSE 0
      END composicaoPreco
    FROM MOORCAMENTOXITENS a
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = a.modeloDocumento
    WHERE a.orcamento = p_cab_orcamento
    AND a.cancelado = 0
    ORDER BY a.sequencia)
  LOOP
    v_precoUnitario                := a.precoUnitario;
    v_precoUnitarioConvertido      := a.precoUnitarioConvertido;
    v_valorProdutoServico          := a.valorProdutoServico;
    v_valorBasePagamento           := a.valorBasePagamento;
    v_valorFreteTotal              := a.valorFreteTotal;
    v_valorSeguroTotal             := a.valorSeguroTotal;
    v_valorDescontoTotal           := a.valorDescontoTotal;
    v_valorOutrasDespesasTotal     := a.valorOutrasDespesasTotal;
    v_valorAdicFreteMarinMerTotal  := a.valorAdicFreteMarinhaMerTotal;
    v_valorDespesasAduaneirasTotal := a.valorDespesasAduaneirasTotal;
    v_baseISSQN                    := a.baseISSQN;
    v_valorISSQN                   := a.valorISSQN;
    v_baseRetIRRF                  := a.baseRetIRRF;
    v_valorRetIRRF                 := a.valorRetIRRF;
    v_baseRetINSS                  := a.baseRetINSS;
    v_valorRetINSS                 := a.valorRetINSS;
    v_baseRetOutros                := a.baseRetOutros;
    v_valorRetOutros               := a.valorRetOutros;
    v_baseRetPIS                   := a.baseRetPIS;
    v_valorRetPIS                  := a.valorRetPIS;
    v_baseRetCOFINS                := a.baseRetCOFINS;
    v_valorRetCOFINS               := a.valorRetCOFINS;
    v_baseRetCSLL                  := a.baseRetCSLL;
    v_valorRetCSLL                 := a.valorRetCSLL;
    v_baseII                       := a.baseII;
    v_valorII                      := a.valorII;
    v_baseIOF                      := a.baseIOF;
    v_valorIOF                     := a.valorIOF;
    v_baseIPI                      := a.baseIPI;
    v_valorIPI                     := a.valorIPI;
    v_basePIS                      := a.basePIS;
    v_valorPIS                     := a.valorPIS;
    v_basePISST                    := a.basePISST;
    v_valorPISST                   := a.valorPISST;
    v_baseCOFINS                   := a.baseCOFINS;
    v_valorCOFINS                  := a.valorCOFINS;
    v_baseCOFINSST                 := a.baseCOFINSST;
    v_valorCOFINSST                := a.valorCOFINSST;
    v_baseCreditoSimplesNacional   := a.baseCreditoSimplesNacional;
    v_valorCreditoSimplesNacional  := a.valorCreditoSimplesNacional;
    v_baseICMS                     := a.baseICMS;
    v_valorICMSOperacao            := a.valorICMSOperacao;
    v_valorICMSDiferido            := a.valorICMSDiferido;
    v_valorICMS                    := a.valorICMS;
    v_valorICMSDesoneracao         := a.valorICMSDesoneracao;
    v_baseICMSST                   := a.baseICMSST;
    v_valorICMSST                  := a.valorICMSST;
    v_baseICMSSTAnteriormente      := a.baseICMSSTAnteriormente;
    v_valorICMSSTAnteriormente     := a.valorICMSSTAnteriormente;
    v_valorICMSProprioSubstituto   := a.valorICMSProprioSubstituto;
    v_baseICMSEfetivo              := a.baseICMSEfetivo;
    v_valorICMSEfetivo             := a.valorICMSEfetivo;
    v_baseICMSUFDestinatario       := a.baseICMSUFDestinatario;
    v_valorICMSUFDestinatario      := a.valorICMSUFDestinatario;
    v_baseICMSUFRemetente          := a.baseICMSUFRemetente;
    v_valorICMSUFRemetente         := a.valorICMSUFRemetente;
    v_baseFCP                      := a.baseFCP;
    v_valorFCP                     := a.valorFCP;
    v_baseFCPST                    := a.baseFCPST;
    v_valorFCPST                   := a.valorFCPST;
    v_baseFCPSTAnteriormente       := a.baseFCPSTAnteriormente;
    v_valorFCPSTAnteriormente      := a.valorFCPSTAnteriormente;
    v_baseFCPUFDestinatario        := a.baseFCPUFDestinatario;
    v_valorFCPUFDestinatario       := a.valorFCPUFDestinatario;
    v_baseEstimadaImpostos         := a.baseEstimadaImpostos;
    v_valorEstimadoImpFederais     := a.valorEstimadoImpFederais;
    v_valorEstimadoImpEstaduais    := a.valorEstimadoImpEstaduais;
    v_valorEstimadoImpMunicipais   := a.valorEstimadoImpMunicipais;
    v_valorLiquidoItem             := a.valorLiquidoItem;
    ADD_CALCULA_TOTAIS_ITEM(
      p_cab_tipoPagamentoFrete,
      a.quantidade,
      a.quantidadeConvertida,
      a.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao,
      a.precoUnitario,
      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.diminuiDescontoPrUnit,
      a.somaAcrescimosPrUnit,
      a.somaFreteSeguroPrUnit,
      a.composicaoPreco,
      /* Retornos */
      v_precoUnitario,
      v_precoUnitarioConvertido,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal);
    ADD_CALCULA_IMPOSTOS_ITEM (
      p_config_64_casasDecSaidas,
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_cab_entradaSaida,
      0,
      p_cab_estabelecimento,
      0,
      p_cab_dataEntradaSaida,
      p_cab_pessoa,
      p_cab_localDestinoOperacao,
      p_cab_indicadorConsumidorFinal,
      p_cab_tipoPagamentoFrete,
      p_pess_indicadorInscricaoEstad,
      a.personalizacao,
      a.quantidade,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal,
      a.cfop,
      1,
      a.indicadorISSQN,
      a.aliquotaISSQN,
      v_baseISSQN,
      v_valorISSQN,
      1,
      a.retencaoIRRF,
      v_baseRetIRRF,
      v_valorRetIRRF,
      1,
      a.retencaoINSS,
      v_baseRetINSS,
      v_valorRetINSS,
      1,
      a.retencaoPIS,
      v_baseRetPIS,
      v_valorRetPIS,
      1,
      a.retencaoCOFINS,
      v_baseRetCOFINS,
      v_valorRetCOFINS,
      1,
      a.retencaoCSLL,
      v_baseRetCSLL,
      v_valorRetCSLL,
      1,
      a.retencaoOutros,
      v_baseRetOutros,
      v_valorRetOutros,
      1,
      a.aliquotaII,
      v_baseII,
      v_valorII,
      1,
      a.aliquotaIOF,
      v_baseIOF,
      v_valorIOF,
      1,
      a.aliquotaIPI,
      a.valorAliquotaIPI,
      v_baseIPI,
      v_valorIPI,
      0,
      1,
      a.aliquotaPIS,
      a.valorAliquotaPIS,
      v_basePIS,
      v_valorPIS,
      1,
      a.aliquotaPISST,
      a.valorAliquotaPISST,
      v_basePISST,
      v_valorPISST,
      1,
      a.aliquotaCOFINS,
      a.valorAliquotaCOFINS,
      v_baseCOFINS,
      v_valorCOFINS,
      1,
      a.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST,
      v_baseCOFINSST,
      v_valorCOFINSST,
      1,
      a.stSimplesNacional,
      a.creditoSimplesNacional,
      v_baseCreditoSimplesNacional,
      v_valorCreditoSimplesNacional,
      1,
      a.stICMS,
      a.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS,
      a.aliquotaICMS,
      a.diferimentoICMS,
      v_baseICMS,
      v_valorICMSOperacao,
      v_valorICMSDiferido,
      v_valorICMS,
      v_valorICMSDesoneracao,
      1,
      a.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST,
      a.reducaoBaseST,
      a.aliquotaICMSST,
      v_baseICMSST,
      v_valorICMSST,
      1,
      v_baseICMSSTAnteriormente,
      v_valorICMSSTAnteriormente,
      v_valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo,
      v_baseICMSEfetivo,
      v_valorICMSEfetivo,
      0,
      '  ',
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      1,
      a.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual,
      v_baseICMSUFDestinatario,
      v_valorICMSUFDestinatario,
      v_baseICMSUFRemetente,
      v_valorICMSUFRemetente,
      1,
      a.aliquotaFCP,
      v_baseFCP,
      v_valorFCP,
      a.aliquotaFCPST,
      v_baseFCPST,
      v_valorFCPST,
      a.aliquotaFCPSTAnteriormente,
      v_baseFCPSTAnteriormente,
      v_valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario,
      v_baseFCPUFDestinatario,
      v_valorFCPUFDestinatario,
      1,
      a.aliquotaEstimadaImpFederais,
      a.aliquotaEstimadaImpEstaduais,
      a.aliquotaEstimadaImpMunicipais,
      v_baseEstimadaImpostos,
      v_valorEstimadoImpFederais,
      v_valorEstimadoImpEstaduais,
      v_valorEstimadoImpMunicipais,
      a.produto,
      a.cor,
      a.tamanho,
      a.controleEstoque,
      a.tipoProduto,
      a.precoPautaTabelado,
      /* Retornos */
      v_baseISSQN,
      v_valorISSQN,
      v_baseRetIRRF,
      v_valorRetIRRF,
      v_baseRetINSS,
      v_valorRetINSS,
      v_baseRetPIS,
      v_valorRetPIS,
      v_baseRetCOFINS,
      v_valorRetCOFINS,
      v_baseRetCSLL,
      v_valorRetCSLL,
      v_baseRetOutros,
      v_valorRetOutros,
      v_baseII,
      v_valorII,
      v_baseIOF,
      v_valorIOF,
      v_baseIPI,
      v_valorIPI,
      v_basePIS,
      v_valorPIS,
      v_basePISST,
      v_valorPISST,
      v_baseCOFINS,
      v_valorCOFINS,
      v_baseCOFINSST,
      v_valorCOFINSST,
      v_baseCreditoSimplesNacional,
      v_valorCreditoSimplesNacional,
      v_baseICMS,
      v_valorICMSOperacao,
      v_valorICMSDiferido,
      v_valorICMS,
      v_valorICMSDesoneracao,
      v_baseICMSST,
      v_valorICMSST,
      v_baseICMSSTAnteriormente,
      v_valorICMSSTAnteriormente,
      v_valorICMSProprioSubstituto,
      v_baseICMSEfetivo,
      v_valorICMSEfetivo,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_baseICMSUFDestinatario,
      v_valorICMSUFDestinatario,
      v_baseICMSUFRemetente,
      v_valorICMSUFRemetente,
      v_baseFCP,
      v_valorFCP,
      v_baseFCPST,
      v_valorFCPST,
      v_baseFCPSTAnteriormente,
      v_valorFCPSTAnteriormente,
      v_baseFCPUFDestinatario,
      v_valorFCPUFDestinatario,
      v_baseEstimadaImpostos,
      v_valorEstimadoImpFederais,
      v_valorEstimadoImpEstaduais,
      v_valorEstimadoImpMunicipais);
    v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
      p_cab_origemDocumento,
      0, -- p_cab_nfFornecedor
      p_cab_tipoPagamentoFrete,
      a.geraFinanceiro,
      v_valorProdutoServico,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      0, -- p_item_valorIPIDevolucao
      a.retidoISSQN,
      v_valorISSQN,
      v_valorRetIRRF,
      v_valorRetINSS,
      v_valorRetPIS,
      v_valorRetCOFINS,
      v_valorRetCSLL,
      v_valorRetOutros,
      v_valorII,
      v_valorIOF,
      v_valorIPI,
      v_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0, -- p_item_somarICMSST
      0, -- p_item_valorAcrescExtempTotal
      a.modDoc_geraFinanceiro);
    v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
      0, -- p_cab_nfFornecedor
      p_cab_tipoPagamentoFrete,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      0, -- p_item_valorIPIDevolucao
      v_valorII,
      v_valorIOF,
      v_valorIPI,
      v_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0 -- p_item_somarICMSST
      );
    UPDATE MOORCAMENTOXITENS SET
      precoUnitario                 = v_precoUnitario,
      precoUnitarioConvertido       = v_precoUnitarioConvertido,
      valorProdutoServico           = v_valorProdutoServico,
      valorBasePagamento            = v_valorBasePagamento,
      valorFreteTotal               = v_valorFreteTotal,
      valorSeguroTotal              = v_valorSeguroTotal,
      valorDescontoTotal            = v_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
      valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
      baseISSQN                     = v_baseISSQN,
      valorISSQN                    = v_valorISSQN,
      baseRetIRRF                   = v_baseRetIRRF,
      valorRetIRRF                  = v_valorRetIRRF,
      baseRetINSS                   = v_baseRetINSS,
      valorRetINSS                  = v_valorRetINSS,
      baseRetPIS                    = v_baseRetPIS,
      valorRetPIS                   = v_valorRetPIS,
      baseRetCOFINS                 = v_baseRetCOFINS,
      valorRetCOFINS                = v_valorRetCOFINS,
      baseRetCSLL                   = v_baseRetCSLL,
      valorRetCSLL                  = v_valorRetCSLL,
      baseRetOutros                 = v_baseRetOutros,
      valorRetOutros                = v_valorRetOutros,
      baseII                        = v_baseII,
      valorII                       = v_valorII,
      baseIOF                       = v_baseIOF,
      valorIOF                      = v_valorIOF,
      baseIPI                       = v_baseIPI,
      valorIPI                      = v_valorIPI,
      basePIS                       = v_basePIS,
      valorPIS                      = v_valorPIS,
      basePISST                     = v_basePISST,
      valorPISST                    = v_valorPISST,
      baseCOFINS                    = v_baseCOFINS,
      valorCOFINS                   = v_valorCOFINS,
      baseCOFINSST                  = v_baseCOFINSST,
      valorCOFINSST                 = v_valorCOFINSST,
      baseCreditoSimplesNacional    = v_baseCreditoSimplesNacional,
      valorCreditoSimplesNacional   = v_valorCreditoSimplesNacional,
      baseICMS                      = v_baseICMS,
      valorICMSOperacao             = v_valorICMSOperacao,
      valorICMSDiferido             = v_valorICMSDiferido,
      valorICMS                     = v_valorICMS,
      valorICMSDesoneracao          = v_valorICMSDesoneracao,
      baseICMSST                    = v_baseICMSST,
      valorICMSST                   = v_valorICMSST,
      baseICMSSTAnteriormente       = v_baseICMSSTAnteriormente,
      valorICMSSTAnteriormente      = v_valorICMSSTAnteriormente,
      valorICMSProprioSubstituto    = v_valorICMSProprioSubstituto,
      baseICMSEfetivo               = v_baseICMSEfetivo,
      valorICMSEfetivo              = v_valorICMSEfetivo,
      baseICMSUFDestinatario        = v_baseICMSUFDestinatario,
      valorICMSUFDestinatario       = v_valorICMSUFDestinatario,
      baseICMSUFRemetente           = v_baseICMSUFRemetente,
      valorICMSUFRemetente          = v_valorICMSUFRemetente,
      baseFCP                       = v_baseFCP,
      valorFCP                      = v_valorFCP,
      baseFCPST                     = v_baseFCPST,
      valorFCPST                    = v_valorFCPST,
      baseFCPSTAnteriormente        = v_baseFCPSTAnteriormente,
      valorFCPSTAnteriormente       = v_valorFCPSTAnteriormente,
      baseFCPUFDestinatario         = v_baseFCPUFDestinatario,
      valorFCPUFDestinatario        = v_valorFCPUFDestinatario,
      baseEstimadaImpostos          = v_baseEstimadaImpostos,
      valorEstimadoImpFederais      = v_valorEstimadoImpFederais,
      valorEstimadoImpEstaduais     = v_valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais    = v_valorEstimadoImpMunicipais,
      valorLiquidoItem              = v_valorLiquidoItem
    WHERE idItemOrcamento           = a.idItemOrcamento;
    IF a.tipoProduto = '09' THEN
      r_cab_valorServicos            := r_cab_valorServicos + v_valorProdutoServico;
    ELSE
      r_cab_valorProdutos            := r_cab_valorProdutos + v_valorProdutoServico;
    END IF;
    r_cab_valorBasePagamento       := r_cab_valorBasePagamento + v_valorBasePagamento;
    IF a.usarPrecoAVista = 1 AND a.geraFinanceiro = 1 THEN
      r_cab_valorAVistaMinimo        := r_cab_valorAVistaMinimo + v_valorProdutoServico + a.valorDescontoPagamento - a.valorOutrasDespesasPagamento - a.valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
    END IF;
    r_cab_valorFreteTotal          := r_cab_valorFreteTotal + v_valorFreteTotal;
    r_cab_valorSeguroTotal         := r_cab_valorSeguroTotal + v_valorSeguroTotal;
    r_cab_valorDescontoTotal       := r_cab_valorDescontoTotal + v_valorDescontoTotal;
    r_cab_valorOutrasDespesasTotal := r_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
    r_cab_valorAdicFreteMarinTotal := r_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
    r_cab_valorDespesasAduanTotal  := r_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
    r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem + v_valorLiquidoItem;
  END LOOP;
END ADD_ORCAMENTO_CALC_IMP_ITENS;

/

create or replace PROCEDURE ADD_ORCAMENTO_CALC_IMP_CAB (
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_orcamento                IN NUMBER,
  p_troca_tipoPagamentoFrete     IN NUMBER,
  p_a_cab_tipoPagamentoFrete     IN CHAR)
IS
  v_cab_valorProdutos            NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarinTotal NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_calcularImpostosItem         NUMBER;
BEGIN
  FOR a IN (
    SELECT a.*,
      pess.indicadorInscricaoEstadual,
      COALESCE((
        SELECT MIN(munEndEst.uf)
        FROM PAESTABELECIMENTOS est
        JOIN CAENDERECOSPESSOA endEst
        ON endEst.pessoa = est.pessoaEstabelecimento
        JOIN SIMUNICIPIOS munEndEst
        ON munEndEst.municipio = endEst.municipio
        WHERE est.estabelecimento = a.estabelecimento
        AND endEst.ativo = 1
        AND endEst.principal = 1
        ),'  ') munEndEst_uf
    FROM MOORCAMENTOS a
    JOIN CAPESSOAS pess
    ON pess.pessoa = a.pessoa
    WHERE a.orcamento = p_cab_orcamento)
  LOOP
    v_cab_valorProdutos            := a.valorProdutos;
    v_cab_valorServicos            := a.valorServicos;
    v_cab_valorBasePagamento       := a.valorBasePagamento;
    v_cab_valorAVistaMinimo        := a.valorAVistaMinimo;
    v_cab_valorFreteTotal          := a.valorFreteTotal;
    v_cab_valorSeguroTotal         := a.valorSeguroTotal;
    v_cab_valorDescontoTotal       := a.valorDescontoTotal;
    v_cab_valorOutrasDespesasTotal := a.valorOutrasDespesasTotal;
    v_cab_valorAdicFreteMarinTotal := a.valorAdicFreteMarinhaMerTotal;
    v_cab_valorDespesasAduanTotal  := a.valorDespesasAduaneirasTotal;
    v_cab_valorLiquidoItem         := a.valorLiquidoItem;
    ADD_ORCAMENTO_CALC_IMP_RATEIO (
      a.orcamento,
      p_troca_tipoPagamentoFrete,
      p_a_cab_tipoPagamentoFrete,
      a.origemDocumento,
      a.modeloDocumento,
      a.entradaSaida,
      a.atualizaCustoMedio,
      a.tipoPagamentoFrete,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorDescontoGeral,
      a.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      a.impostosEditados,
      /* Retornos */
      v_cab_valorProdutos,
      v_cab_valorServicos,
      v_cab_valorBasePagamento,
      v_cab_valorAVistaMinimo,
      v_cab_valorFreteTotal,
      v_cab_valorSeguroTotal,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespesasTotal,
      v_cab_valorAdicFreteMarinTotal,
      v_cab_valorDespesasAduanTotal,
      v_cab_valorLiquidoItem,
      v_calcularImpostosItem);
    IF v_calcularImpostosItem = 1 THEN
      ADD_ORCAMENTO_CALC_IMP_ITENS (
        p_config_64_casasDecSaidas,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        a.orcamento,
        a.origemDocumento,
        a.entradaSaida,
        a.estabelecimento,
        a.dataEmissao,
        a.pessoa,
        a.localDestinoOperacao,
        a.indicadorConsumidorFinal,
        a.tipoPagamentoFrete,
        a.indicadorInscricaoEstadual,
        /* Retornos */
        v_cab_valorProdutos,
        v_cab_valorServicos,
        v_cab_valorBasePagamento,
        v_cab_valorAVistaMinimo,
        v_cab_valorFreteTotal,
        v_cab_valorSeguroTotal,
        v_cab_valorDescontoTotal,
        v_cab_valorOutrasDespesasTotal,
        v_cab_valorAdicFreteMarinTotal,
        v_cab_valorDespesasAduanTotal,
        v_cab_valorLiquidoItem);
    END IF;
    UPDATE MOORCAMENTOS SET 
      valorProdutos                 = v_cab_valorProdutos,
      valorServicos                 = v_cab_valorServicos,
      valorBasePagamento            = v_cab_valorBasePagamento,
      valorAVistaMinimo             = v_cab_valorAVistaMinimo,
      valorFreteTotal               = v_cab_valorFreteTotal,
      valorSeguroTotal              = v_cab_valorSeguroTotal,
      valorDescontoTotal            = v_cab_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarinTotal,
      valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
      valorLiquidoItem              = v_cab_valorLiquidoItem
    WHERE orcamento                 = a.orcamento;
  END LOOP;
END ADD_ORCAMENTO_CALC_IMP_CAB;

/

-- FIM BETA 3 - 22/4/24

-- MODOCTRANSFXORCAMENTOS
CREATE TABLE MODOCTRANSFXORCAMENTOS
  (
    idItemDocTransferencia NUMERIC (14,0) DEFAULT 0 NOT NULL,
    orcamento              NUMERIC (14,0) DEFAULT 0 NOT NULL
  );
ALTER TABLE MODOCTRANSFXORCAMENTOS ADD CONSTRAINT MODOCTRANSFXORCAMENTOS_PK1 PRIMARY KEY (idItemDocTransferencia);
CREATE INDEX MODOCTRANSFXORCAMENTOS_K2 ON MODOCTRANSFXORCAMENTOS (orcamento);
ALTER TABLE MODOCTRANSFXORCAMENTOS ADD CONSTRAINT MODOCTRANSFXORCAMENTOS_FK1 FOREIGN KEY (idItemDocTransferencia) REFERENCES MODOCUMENTOTRANSFXITENS (idItemDocTransferencia);
ALTER TABLE MODOCTRANSFXORCAMENTOS ADD CONSTRAINT MODOCTRANSFXORCAMENTOS_FK2 FOREIGN KEY (orcamento) REFERENCES MOORCAMENTOS (orcamento);

INSERT INTO MODOCTRANSFXORCAMENTOS (idItemDocTransferencia, orcamento) VALUES (0, 0);

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MODOCTRANSFXORCAMENTOS', 'Documento Transferência X Orçamentos', 1, 50552, 'MO', 'idItemDocTransferencia', 'N', 14, ' ', 1, ' ', 0, 100003, ' ', ' ', 1, 1, ' '); 

COMMIT;

DROP TABLE TEMPSELECAODOCUMENTO;

CREATE GLOBAL TEMPORARY TABLE TEMPSELECAODOCUMENTO
  (
    sessaoClient               VARCHAR (30) DEFAULT ' ' NOT NULL,
    nomePublico                VARCHAR (30) DEFAULT ' ' NOT NULL,
    quebra                     VARCHAR2(190) NOT NULL,
    origem                     CHAR (1) DEFAULT ' ' NOT NULL,
    idCabecalho                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sequencia                  NUMERIC (3,0) DEFAULT 0 NOT NULL,
    idItem                     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    quebraB                    VARCHAR2(190) NOT NULL,
    selecionado                NUMERIC (1,0) DEFAULT 0 NOT NULL,
    linhaA                     VARCHAR (300) DEFAULT ' ' NOT NULL,
    linhaB                     VARCHAR (300) DEFAULT ' ' NOT NULL,
    campoA                     VARCHAR (256) DEFAULT ' ' NOT NULL,
    campoB                     VARCHAR (256) DEFAULT ' ' NOT NULL,
    campoC                     VARCHAR (256) DEFAULT ' ' NOT NULL,
    campoD                     VARCHAR (256) DEFAULT ' ' NOT NULL,
    idA                        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idB                        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idC                        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idD                        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idE                        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idF                        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idG                        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idH                        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idI                        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idJ                        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idK                        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idL                        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idM                        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idN                        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idO                        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    simNaoA                    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    simNaoB                    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    simNaoC                    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    simNaoD                    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    simNaoE                    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    vendedor                   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    gradeProduto               NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idFormulaTinta             NUMERIC (14,0) DEFAULT 0 NOT NULL,
    personalizacao             NUMERIC (7,0) DEFAULT 0 NOT NULL,
    localEstoque               NUMERIC (4,0) DEFAULT 0 NOT NULL,
    pessoaParticipante         NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idLoteEstoque              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    operacaoFiscal             NUMERIC (14,0) DEFAULT 0 NOT NULL,
    controleQuantidade         NUMERIC (1,0) DEFAULT 0 NOT NULL,
    unidadeMedida              VARCHAR (6) DEFAULT ' ' NOT NULL,
    unidadeMedidaConversao     VARCHAR (6) DEFAULT ' ' NOT NULL,
    casasDecimaisUnidadeMedida NUMERIC (1,0) DEFAULT 0 NOT NULL,
    conversorQuantidade        NUMERIC (15,8) DEFAULT 0 NOT NULL,
    loteMinimo                 NUMERIC (15,6) DEFAULT 0 NOT NULL,
    loteMultiplo               NUMERIC (15,6) DEFAULT 0 NOT NULL,
    altura                     NUMERIC (14,3) DEFAULT 0 NOT NULL,
    largura                    NUMERIC (14,3) DEFAULT 0 NOT NULL,
    comprimento                NUMERIC (14,3) DEFAULT 0 NOT NULL,
    pecas                      NUMERIC (15,6) DEFAULT 0 NOT NULL,
    pecasSelecionada           NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidade                 NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeSelecionada      NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeConvertida       NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeConvertidaSelec  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    pesoLiquido                NUMERIC (15,6) DEFAULT 0 NOT NULL,
    pesoLiquidoSelecionado     NUMERIC (15,6) DEFAULT 0 NOT NULL,
    pesoBruto                  NUMERIC (15,6) DEFAULT 0 NOT NULL,
    pesoBrutoSelecionado       NUMERIC (15,6) DEFAULT 0 NOT NULL,
    valor                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorSelecionado           NUMERIC (15,2) DEFAULT 0 NOT NULL,
    data                       DATE,
    hora                       CHAR(6),
    dataSelecionada            DATE,
    horaSelecionada            CHAR(6),
    quantidadeA                NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeB                NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeC                NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeD                NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeE                NUMERIC (15,6) DEFAULT 0 NOT NULL,
    tipoPreco                  CHAR (1) DEFAULT ' ' NOT NULL,
    tabelaPreco                VARCHAR (10) DEFAULT ' ' NOT NULL,
    precoUnitarioA             NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoUnitarioB             NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoUnitarioC             NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoUnitarioD             NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoUnitarioE             NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoUnitarioF             NUMERIC (15,7) DEFAULT 0 NOT NULL,
    valorA                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorB                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorC                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorD                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorE                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorF                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorG                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorH                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorI                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorJ                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    observacoesDigitadas       VARCHAR (4000) DEFAULT ' ' NOT NULL,
    observacoes                VARCHAR (4000) DEFAULT ' ' NOT NULL,
    BLOB                       NCLOB
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPSELECAODOCUMENTO_PK1 ON TEMPSELECAODOCUMENTO (sessaoClient, nomePublico, quebra, origem, idCabecalho, sequencia, idItem);
CREATE INDEX TEMPSELECAODOCUMENTO_K2 ON TEMPSELECAODOCUMENTO (sessaoClient, nomePublico, quebraB, origem, idCabecalho, sequencia, idItem);

CREATE TABLE PALISTASCRM_2401 AS SELECT * FROM PALISTASCRM;

ALTER TABLE PALISTACRMXESTABELEC DROP CONSTRAINT PALISTACRMXESTABELEC_FK1;
ALTER TABLE PALISTACRMXPERFISUSUARIOS DROP CONSTRAINT PALISTACRMXPERFISUSUARIOS_FK1;
ALTER TABLE PALISTACRMXUSUARIOS DROP CONSTRAINT PALISTACRMXUSUARIOS_FK1;
ALTER TABLE PALISTACRMXREGRAS DROP CONSTRAINT PALISTACRMXREGRAS_FK1;
ALTER TABLE MOHISTORICOCRM DROP CONSTRAINT MOHISTORICOCRM_FK6;

DROP TABLE PALISTASCRM;

-- PALISTASCRM
CREATE TABLE PALISTASCRM
  (
    listaCRM                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    descricao                VARCHAR (120) DEFAULT ' ' NOT NULL,
    ativo                    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    ordenacao                NUMERIC (11,0) DEFAULT 0 NOT NULL,
    vendedorFiltrar          CHAR (1) DEFAULT ' ' NOT NULL,
    vendasFiltrar            CHAR (1) DEFAULT ' ' NOT NULL,
    vendasDiasInicial        NUMERIC (6,0) DEFAULT 0 NOT NULL,
    vendasDiasFinal          NUMERIC (6,0) DEFAULT 0 NOT NULL,
    cadastroFiltrar          CHAR (1) DEFAULT ' ' NOT NULL,
    cadastroDiasInicial      NUMERIC (6,0) DEFAULT 0 NOT NULL,
    cadastroDiasFinal        NUMERIC (6,0) DEFAULT 0 NOT NULL,
    diasUltimaListaEncerrada NUMERIC (6,0) DEFAULT 0 NOT NULL,
    filtrarEstabelecimentos  NUMERIC (1,0) DEFAULT 0 NOT NULL,
    produtoSelecionados      CLOB,
    produtoJoin              CLOB,
    produtoAndWhere          CLOB,
    enviarSms                NUMERIC (1,0) DEFAULT 0 NOT NULL,
    enviarWhatsApp           NUMERIC (1,0) DEFAULT 0 NOT NULL,
    textoSmsWhatsApp         VARCHAR (4000) DEFAULT ' ' NOT NULL,
    exibirDataNascimento     NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirDiasSemComprar     NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirTotalCompras       NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirTotalOrcamentos    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirDiasAtraso         NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirTotalAbertos       NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirTotalAVencer       NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirTotalVencidos      NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirPontuacaoBloqueada NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirValorBloqueado     NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirPontuacaoLiberada  NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirValorLiberado      NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirPontuacaoResgatada NUMERIC (1,0) DEFAULT 0 NOT NULL,
    exibirValorResgatado     NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes              VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PALISTASCRM ADD CONSTRAINT PALISTASCRM_PK1 PRIMARY KEY (listaCRM);
CREATE INDEX PALISTASCRM_K2 ON PALISTASCRM (descricao);
CREATE INDEX PALISTASCRM_K3 ON PALISTASCRM (ordenacao, descricao, listaCRM);

INSERT INTO PALISTASCRM (listaCRM, descricao, ativo, ordenacao, vendedorFiltrar, vendasFiltrar, vendasDiasInicial, vendasDiasFinal, cadastroFiltrar, cadastroDiasInicial, cadastroDiasFinal, diasUltimaListaEncerrada, filtrarEstabelecimentos, produtoSelecionados, produtoJoin, produtoAndWhere, enviarSms, enviarWhatsApp, textoSmsWhatsApp, exibirDataNascimento, exibirDiasSemComprar, exibirTotalCompras, exibirTotalOrcamentos, exibirDiasAtraso, exibirTotalAbertos, exibirTotalAVencer, exibirTotalVencidos, exibirPontuacaoBloqueada, exibirValorBloqueado, exibirPontuacaoLiberada, exibirValorLiberado, exibirPontuacaoResgatada, exibirValorResgatado, observacoes) VALUES (0, 'SELECIONE', 1, 0, ' ', ' ', 0, 0, ' ', 0, 0, 0, 0,  NULL,  NULL,  NULL, 0, 0, ' ', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ' ');
INSERT INTO PALISTASCRM (listaCRM, descricao, ativo, ordenacao, vendedorFiltrar, vendasFiltrar, vendasDiasInicial, vendasDiasFinal, cadastroFiltrar, cadastroDiasInicial, cadastroDiasFinal, diasUltimaListaEncerrada, filtrarEstabelecimentos, produtoSelecionados, produtoJoin, produtoAndWhere, enviarSms, enviarWhatsApp, textoSmsWhatsApp, exibirDataNascimento, exibirDiasSemComprar, exibirTotalCompras, exibirTotalOrcamentos, exibirDiasAtraso, exibirTotalAbertos, exibirTotalAVencer, exibirTotalVencidos, exibirPontuacaoBloqueada, exibirValorBloqueado, exibirPontuacaoLiberada, exibirValorLiberado, exibirPontuacaoResgatada, exibirValorResgatado, observacoes) SELECT listaCRM, descricao, ativo, ordenacao, vendedorFiltrar, vendasFiltrar, vendasDiasInicial, vendasDiasFinal, cadastroFiltrar, cadastroDiasInicial, cadastroDiasFinal, diasUltimaListaEncerrada, filtrarEstabelecimentos, produtoSelecionados, produtoJoin, produtoAndWhere, enviarSms, enviarWhatsApp, textoSmsWhatsApp, exibirDataNascimento, exibirDiasSemComprar, exibirTotalCompras, 0, exibirDiasAtraso, exibirTotalAbertos, exibirTotalAVencer, exibirTotalVencidos, exibirPontuacaoBloqueada, exibirValorBloqueado, exibirPontuacaoLiberada, exibirValorLiberado, exibirPontuacaoResgatada, exibirValorResgatado, observacoes FROM PALISTASCRM_2401 WHERE listaCRM > 0;

COMMIT;

ALTER TABLE PALISTACRMXESTABELEC ADD CONSTRAINT PALISTACRMXESTABELEC_FK1 FOREIGN KEY (listaCRM) REFERENCES PALISTASCRM (listaCRM);
ALTER TABLE PALISTACRMXPERFISUSUARIOS ADD CONSTRAINT PALISTACRMXPERFISUSUARIOS_FK1 FOREIGN KEY (listaCRM) REFERENCES PALISTASCRM (listaCRM);
ALTER TABLE PALISTACRMXUSUARIOS ADD CONSTRAINT PALISTACRMXUSUARIOS_FK1 FOREIGN KEY (listaCRM) REFERENCES PALISTASCRM (listaCRM);
ALTER TABLE PALISTACRMXREGRAS ADD CONSTRAINT PALISTACRMXREGRAS_FK1 FOREIGN KEY (listaCRM) REFERENCES PALISTASCRM (listaCRM);
ALTER TABLE MOHISTORICOCRM ADD CONSTRAINT MOHISTORICOCRM_FK6 FOREIGN KEY (listaCRM) REFERENCES PALISTASCRM (listaCRM);

INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (166, '55', '55 - HOUSE SPORTS', 204, 1, 55, ' ');

COMMIT;

-- FIM BETA 4 - 28/4/24

create or replace PROCEDURE ADD_CALCULA_TOTAIS_ITEM (
    p_cab_tipoPagamentoFrete       IN CHAR,
    p_item_quantidade              IN NUMBER,
    p_item_quantidadeConvertida    IN NUMBER,
    p_item_precoUnitarioBruto      IN NUMBER,
    p_item_acrescimoUnitarioCompos IN NUMBER,
    p_item_precoUnitario           IN NUMBER,
    p_item_valorDescontoItem       IN NUMBER,
    p_item_valorAcrescimoItem      IN NUMBER,
    p_item_valorFreteItem          IN NUMBER,
    p_item_valorSeguroItem         IN NUMBER,
    p_item_valorAdicFreteMarItem   IN NUMBER,
    p_item_valorDespesasAduanItem  IN NUMBER,
    p_item_valorFreteGeral         IN NUMBER,
    p_item_valorSeguroGeral        IN NUMBER,
    p_item_valorDescontoGeral      IN NUMBER,
    p_item_valorOutrasDespGeral    IN NUMBER,
    p_item_valorAdicFreteMarGeral  IN NUMBER,
    p_item_valorDespesasAduanGeral IN NUMBER,
    p_item_valorDescontoPagamento  IN NUMBER,
    p_item_valorOutrasDespPagam    IN NUMBER,
    p_item_valorJurosPagamento     IN NUMBER,
    p_modDoc_diminuiDescontoPrUnit IN NUMBER,
    p_modDoc_somaAcrescimosPrUnit  IN NUMBER,
    p_modDoc_somaFreteSeguroPrUnit IN NUMBER,
    p_composicaoPreco              IN NUMBER,
    /* Retornos */
    r_item_precoUnitario           OUT NUMBER,
    r_item_precoUnitarioConvertido OUT NUMBER,
    r_item_valorProdutoServico     OUT NUMBER,
    r_item_valorFreteTotal         OUT NUMBER,
    r_item_valorSeguroTotal        OUT NUMBER,
    r_item_valorDescontoTotal      OUT NUMBER,
    r_item_valorOutrasDespTotal    OUT NUMBER,
    r_item_valorAdicFreteMarTotal  OUT NUMBER,
    r_item_valorDespesasAduanTotal OUT NUMBER)
IS
BEGIN
  IF p_item_precoUnitarioBruto <> 0
    AND (p_modDoc_diminuiDescontoPrUnit = 1
      OR p_modDoc_somaAcrescimosPrUnit = 1
      OR p_modDoc_somaFreteSeguroPrUnit = 1
      AND p_cab_tipoPagamentoFrete <> 'V'
      OR p_composicaoPreco = 1)
  THEN
    r_item_valorProdutoServico :=
      ROUND (p_item_quantidade * (p_item_precoUnitarioBruto + p_item_acrescimoUnitarioCompos), 2)
      - CASE
          WHEN p_modDoc_diminuiDescontoPrUnit = 1
          THEN p_item_valorDescontoItem + p_item_valorDescontoGeral + p_item_valorDescontoPagamento
          ELSE 0
        END
      + CASE
          WHEN p_modDoc_somaAcrescimosPrUnit = 1
          THEN p_item_valorAcrescimoItem + p_item_valorOutrasDespGeral + p_item_valorOutrasDespPagam + p_item_valorJurosPagamento
          ELSE 0
        END
      + CASE
          WHEN p_modDoc_somaFreteSeguroPrUnit = 1 AND p_cab_tipoPagamentoFrete <> 'V'
          THEN p_item_valorFreteItem + p_item_valorFreteGeral + p_item_valorSeguroItem + p_item_valorSeguroGeral
          ELSE 0
        END;
    IF
      CASE
        WHEN p_modDoc_diminuiDescontoPrUnit = 1
        THEN p_item_valorDescontoItem + p_item_valorDescontoGeral + p_item_valorDescontoPagamento
         ELSE 0
      END =
      CASE
        WHEN p_modDoc_somaAcrescimosPrUnit = 1
        THEN p_item_valorAcrescimoItem + p_item_valorOutrasDespGeral + p_item_valorOutrasDespPagam + p_item_valorJurosPagamento
        ELSE 0
      END
      + CASE
          WHEN p_modDoc_somaFreteSeguroPrUnit = 1 AND p_cab_tipoPagamentoFrete <> 'V'
          THEN p_item_valorFreteItem + p_item_valorFreteGeral + p_item_valorSeguroItem + p_item_valorSeguroGeral
          ELSE 0
        END THEN
      r_item_precoUnitario := p_item_precoUnitarioBruto + p_item_acrescimoUnitarioCompos;
    ELSE
      r_item_precoUnitario := ROUND (r_item_valorProdutoServico / CASE WHEN p_item_quantidade = 0 THEN 1 ELSE p_item_quantidade END, 7);
    END IF;
  ELSE
    r_item_valorProdutoServico := ROUND (p_item_quantidade * p_item_precoUnitario, 2);
    r_item_precoUnitario := p_item_precoUnitario;
  END IF;
  r_item_valorDescontoTotal :=
    CASE
      WHEN p_modDoc_diminuiDescontoPrUnit = 1
      THEN 0
      ELSE p_item_valorDescontoItem + p_item_valorDescontoGeral + p_item_valorDescontoPagamento
    END;
  r_item_valorOutrasDespTotal :=
    CASE
      WHEN p_modDoc_somaAcrescimosPrUnit = 1
      THEN 0
      ELSE p_item_valorAcrescimoItem + p_item_valorOutrasDespGeral + p_item_valorOutrasDespPagam + p_item_valorJurosPagamento
    END;
  r_item_valorFreteTotal :=
    CASE
      WHEN p_modDoc_somaFreteSeguroPrUnit = 1 AND p_cab_tipoPagamentoFrete <> 'V'
      THEN 0
      ELSE p_item_valorFreteItem  + p_item_valorFreteGeral
    END;
  r_item_valorSeguroTotal :=
    CASE
      WHEN p_modDoc_somaFreteSeguroPrUnit = 1 AND p_cab_tipoPagamentoFrete <> 'V'
      THEN 0
      ELSE p_item_valorSeguroItem + p_item_valorSeguroGeral
    END;
  r_item_valorAdicFreteMarTotal := p_item_valorAdicFreteMarItem + p_item_valorAdicFreteMarGeral;
  r_item_valorDespesasAduanTotal := p_item_valorDespesasAduanItem + p_item_valorDespesasAduanGeral;
  r_item_precoUnitarioConvertido :=
    CASE
      WHEN p_item_quantidadeConvertida <> 0 AND p_item_quantidadeConvertida <> p_item_quantidade
      THEN ROUND (r_item_valorProdutoServico / p_item_quantidadeConvertida, 7)
      ELSE r_item_precoUnitario
    END;
END ADD_CALCULA_TOTAIS_ITEM;

/

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 itemOrc.controleEntrega > 0
          AND contrEntr.estabelecimentoRemessa > 0
        THEN contrEntr.estabelecimentoRemessa
        WHEN prod.estabelecimentoFaturamento > 0
        THEN prod.estabelecimentoFaturamento
        WHEN itemOrc.controleEntrega > 0
          AND contrEntr.estabelecimentoSaida > 0
        THEN contrEntr.estabelecimentoSaida
        ELSE cabOrc.estabelecimento
      END estabelecimento,
      cabOrc.dataEmissao,
      itemOrc.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 itemOrc.controleEntrega > 0
          AND contrEntr.estabelecimentoRemessa > 0
        THEN contrEntr.estabelecimentoRemessa
        WHEN prod.estabelecimentoFaturamento > 0
        THEN prod.estabelecimentoFaturamento
        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,
      CASE
        WHEN contrEntr.estabelecimentoRemessa > 0
        THEN contrEntr.estabelecimentoRemessa
        ELSE doc.estabelecimento
      END estabelecimento,
      doc.dataEmissao,
      CASE WHEN doc.dataEntradaSaida IS NOT NULL AND doc.dataEntradaSaida > itemOrc.dataEntrega THEN doc.dataEntradaSaida ELSE itemOrc.dataEntrega END 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 =
      CASE
        WHEN contrEntr.estabelecimentoRemessa > 0
        THEN contrEntr.estabelecimentoRemessa
        ELSE doc.estabelecimento
      END    
    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,
      CASE
        WHEN contrEntr.estabelecimentoRemessa > 0
        THEN contrEntr.estabelecimentoRemessa
        ELSE doc.estabelecimento
      END 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 =
      CASE
        WHEN contrEntr.estabelecimentoRemessa > 0
        THEN contrEntr.estabelecimentoRemessa
        ELSE doc.estabelecimento
      END
    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_GERA_TEMP_INVENTARIO (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_335_cmvGerencIgualFis IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_sessaoClient                 IN VARCHAR2,
  p_contadorSessaoFiscal         IN NUMBER,
  p_contadorSessaoGerencial      IN NUMBER,
  p_gerandoInventario            IN NUMBER,
  p_buscarPrecoUnitarioCMV       IN NUMBER,
  p_buscarPrecoUnitUltimaCompra  IN NUMBER,
  p_buscarPrecoCustoUltimaCompra IN NUMBER,
  p_buscarPrecoCustoUltimaFormac IN NUMBER,
  p_buscarICMS                   IN NUMBER,
  p_invEst_data                  IN DATE,
  p_invEst_motivoInventario      IN CHAR,
  p_inEstabelecimentos           IN VARCHAR2,
  p_produto                      IN NUMBER,
  p_prod_join                    IN VARCHAR2,
  p_prod_andWhere                IN VARCHAR2,
  p_filtroProduto                IN NUMBER,
  p_inventario_join              IN VARCHAR2,
  p_inventario_andWhere          IN VARCHAR2,
  p_movimentos_join              IN VARCHAR2,
  p_movimentos_andWhere          IN VARCHAR2,
  p_docFiscal_join               IN VARCHAR2,
  p_docFiscal_andWhere           IN VARCHAR2,
  p_docFiscalFilho_join          IN VARCHAR2,
  p_docFiscalFilho_andWhere      IN VARCHAR2,
  p_transfPendente_considerar    IN NUMBER,
  p_transfPendente_joinEntradas  IN VARCHAR2,
  p_transfPendente_andWhereEntra IN VARCHAR2,
  p_transfPendente_joinSaidas    IN VARCHAR2,
  p_transfPendente_andWhereSaida IN VARCHAR2)
IS
  v_prod_join     CLOB;
  v_prod_andWhere CLOB;
BEGIN
  v_prod_join := '
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto'
|| CASE
     WHEN p_prod_join IS NULL OR p_prod_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_prod_join)
   END
|| CASE
     WHEN p_produto <> 0 OR p_filtroProduto = 0
     THEN ''
     ELSE '
    JOIN PAFILTROSPRODUTO filtrProd
    ON filtrProd.filtroProduto = ' || TO_CHAR(p_filtroProduto)
   END;
  v_prod_andWhere := '
      AND gradProd.produto '
|| CASE
     WHEN  p_produto = 0
     THEN '> 0'
       || CASE
            WHEN p_prod_andWhere IS NULL OR p_prod_andWhere = ' '
            THEN '
    AND prod.controleEstoque IN (1,5,11,12,13)'
            ELSE '
    ' || RTRIM(p_prod_andWhere)
          END
       || CASE
            WHEN p_filtroProduto = 0
            THEN ''
            ELSE '
    AND filtrProd.filtrarVendedores              = 0
    AND filtrProd.filtrarLocaisEstoque           = 0
    AND filtrProd.filtrarPersonalizacoes         = 0
    AND (filtrProd.filtrarProdutos               = 0
      AND filtrProd.filtrarCategoriasProdutos    = 0
      AND filtrProd.filtrarSubcategoriasProdutos = 0
      AND filtrProd.filtrarMarcas                = 0
      AND filtrProd.filtrarCaracteristicasA      = 0
      AND filtrProd.filtrarCaracteristicasB      = 0
      AND filtrProd.filtrarCaracteristicasC      = 0
      AND filtrProd.filtrarCaracteristicasD      = 0
      AND filtrProd.filtrarCaracteristicasE      = 0
      AND filtrProd.filtrarCores                 = 0
      AND filtrProd.filtrarTamanhos              = 0
      AND filtrProd.filtrarNCMs                  = 0
      AND filtrProd.filtrarListasServicos        = 0
      OR filtrProd.filtrarProdutos               = 1
      AND EXISTS (
        SELECT 1
        FROM PAFILTROPRODUTOXPRODUTOS filtrProdX
        WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
        AND filtrProdX.produto = prod.produto
        AND filtrProdX.ativo = 1)
      OR (filtrProd.filtrarCategoriasProdutos     = 1
        OR filtrProd.filtrarSubcategoriasProdutos = 1
        OR filtrProd.filtrarMarcas                = 1
        OR filtrProd.filtrarCaracteristicasA      = 1
        OR filtrProd.filtrarCaracteristicasB      = 1
        OR filtrProd.filtrarCaracteristicasC      = 1
        OR filtrProd.filtrarCaracteristicasD      = 1
        OR filtrProd.filtrarCaracteristicasE      = 1
        OR filtrProd.filtrarCores                 = 1
        OR filtrProd.filtrarTamanhos              = 1
        OR filtrProd.filtrarNCMs                  = 1
        OR filtrProd.filtrarListasServicos        = 1)
      AND (filtrProd.filtrarCategoriasProdutos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCATEGPROD filtrProdX
          JOIN PASUBCATEGORIASPRODUTO subCatX
          ON subCatX.categoriaProduto = filtrProdX.categoriaProduto
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND subCatX.subcategoriaProduto = prod.subcategoriaProduto
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarSubcategoriasProdutos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXSUBCAPROD filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.subcategoriaProduto = prod.subcategoriaProduto
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarMarcas = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXMARCAS filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.marca = prod.marca
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarCaracteristicasA = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERA filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.caracteristicaA = prod.caracteristicaA
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarCaracteristicasB = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERB filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.caracteristicaB = prod.caracteristicaB
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarCaracteristicasC = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERC filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.caracteristicaC = prod.caracteristicaC
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarCaracteristicasD = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERD filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.caracteristicaD = prod.caracteristicaD
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarCaracteristicasE = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERE filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.caracteristicaE = prod.caracteristicaE
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarCores = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCORES filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.cor = gradProd.Cor
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarTamanhos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXTAMANHOS filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.tamanho = gradProd.tamanho
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarNCMs = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXNCMS filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.idNcm = prod.idNcm
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarListasServicos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXLISTASSE filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.listaServicos = prod.listaServicos
          AND filtrProdX.ativo = 1)))'
          END
     ELSE ' = ' || TO_CHAR(p_produto)
   END;
  IF p_contadorSessaoFiscal <> 0 THEN
    DELETE TEMPINVENTARIOESTXFISCAL
    WHERE sessaoClient = p_sessaoClient
    AND contadorSessao = p_contadorSessaoFiscal;
    EXECUTE IMMEDIATE 'INSERT INTO TEMPINVENTARIOESTXFISCAL (
  sessaoClient,
  contadorSessao,
  contador,
  estabelecimento,
  gradeProduto,
  indicadorPropriedadePosseItem,
  pessoaParticipante,
  quantidade,
  precoUnitarioCMV,
  stICMS,
  baseICMS,
  valorICMS)
WITH
DATAINVENTARIOSESTOQUE AS (
  SELECT
    a.inventarioEstoque,
    a.estabelecimento,
    TRUNC(a.data) data
  FROM (
    SELECT
      inventarioEstoque,
      estabelecimento,
      data,
      ROW_NUMBER() OVER (
        PARTITION BY estabelecimento
        ORDER BY
          estabelecimento ASC,
          data DESC,
          inventarioEstoque DESC
        ) ordenacao
    FROM MOINVENTARIOSESTOQUE
    WHERE motivoInventarioEstoque = ''01''
    AND data < TO_DATE (''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')'
|| CASE
     WHEN p_gerandoInventario = 0
     THEN ' + 1'
     ELSE ''
   END
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
    AND estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| ') a
  WHERE a.ordenacao = 1),
DATAINVENTARIOESTOQUEXFISC AS (
  SELECT
    a.inventarioEstoque,
    a.estabelecimento,
    a.produto,
    TRUNC(a.data) data
  FROM (
    SELECT
      invEst.inventarioEstoque,
      invEst.estabelecimento,
      gradProd.produto,
      invEst.data,
      ROW_NUMBER() OVER (
        PARTITION BY
          invEst.estabelecimento,
          gradProd.produto
        ORDER BY
          invEst.estabelecimento ASC,
          gradProd.produto ASC,
          invEst.data DESC,
          itemInv.inventarioEstoque DESC
        ) ordenacao
    FROM MOINVENTARIOESTOQUEXFISC itemInv
    JOIN MOINVENTARIOSESTOQUE invEst
    ON invEst.inventarioEstoque = itemInv.inventarioEstoque
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = itemInv.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_inventario_join IS NULL OR p_inventario_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_join)
   END
|| '
    WHERE invEst.motivoInventarioEstoque <> ''01''
    AND invEst.data < TO_DATE (''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')
    AND invEst.data >= COALESCE ((
      SELECT MAX (dataInv.data) + 1
      FROM DATAINVENTARIOSESTOQUE dataInv
      WHERE dataInv.estabelecimento = invEst.estabelecimento),
      TO_DATE (''01/01/1900'',''DD/MM/YYYY''))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
    AND invEst.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_inventario_andWhere IS NULL OR p_inventario_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_andWhere)
   END
|| ') a
  WHERE a.ordenacao = 1),
DATAESTOQUEINICIAL AS (
  SELECT
    a.estabelecimento,
    TRUNC(a.data) data,
    a.produto
  FROM (
    SELECT
      mov.estabelecimento,
      mov.data,
      gradProd.produto,
      ROW_NUMBER() OVER (
        PARTITION BY
          mov.estabelecimento,
          gradProd.produto
        ORDER BY
          mov.estabelecimento ASC,
          gradProd.produto ASC,
          mov.data DESC,
          mov.idEstoque DESC
        ) ordenacao
    FROM MOESTOQUES mov
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = mov.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_movimentos_join IS NULL OR p_movimentos_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM (p_movimentos_join)
   END
|| '
    WHERE mov.operacaoInternaEstoque = 1
    AND mov.data < TO_DATE (''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') + 1
    AND mov.data >= COALESCE ((
      SELECT MAX (dataInvFisc.data) + 1
      FROM DATAINVENTARIOESTOQUEXFISC dataInvFisc
      WHERE dataInvFisc.estabelecimento = mov.estabelecimento
      AND dataInvFisc.produto = gradProd.produto),
      COALESCE ((
        SELECT MAX (dataInv.data) + 1
        FROM DATAINVENTARIOSESTOQUE dataInv
        WHERE dataInv.estabelecimento = mov.estabelecimento),
        TO_DATE (''01/01/1900'', ''DD/MM/YYYY'')))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
    AND mov.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_movimentos_andWhere IS NULL OR p_movimentos_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_movimentos_andWhere)
   END
|| ') a
  WHERE a.ordenacao = 1)
SELECT
  ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || ''',
  ' || TO_CHAR(p_contadorSessaoFiscal) || ',
  ROW_NUMBER() OVER (
    ORDER BY
      a.estabelecimento,
      a.gradeProduto,
      a.indicadorPropriedadePosseItem,
      a.pessoaParticipante),
  a.estabelecimento,
  a.gradeProduto,
  a.indicadorPropriedadePosseItem,
  a.pessoaParticipante,
  SUM (a.quantidade),
  0 precoUnitarioCMV,
  ''00'' stICMS,
  0 baseICMS,
  0 valorICMS
FROM (
  SELECT DISTINCT
    itemInv.id,
    invEst.estabelecimento,
    itemInv.indicadorPropriedadePosseItem,
    itemInv.pessoaParticipante,
    itemInv.gradeProduto,
    itemInv.quantidade,
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MOINVENTARIOESTOQUEXFISC itemInv
  JOIN MOINVENTARIOSESTOQUE invEst
  ON invEst.inventarioEstoque = itemInv.inventarioEstoque
  JOIN DATAINVENTARIOSESTOQUE dataInv
  ON dataInv.inventarioEstoque = itemInv.inventarioEstoque
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = itemInv.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_inventario_join IS NULL OR p_inventario_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_join)
   END
|| '
  WHERE NOT (EXISTS (
    SELECT 1
    FROM DATAINVENTARIOESTOQUEXFISC dataInvFisc
    WHERE dataInvFisc.estabelecimento = invEst.estabelecimento
    AND dataInvFisc.produto = gradProd.produto))
  AND NOT (EXISTS (
    SELECT 1
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = invEst.estabelecimento
    AND dataEstInic.produto = gradProd.produto))'
|| v_prod_andWhere
|| CASE
     WHEN p_inventario_andWhere IS NULL OR p_inventario_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_andWhere)
   END
|| '
  UNION ALL
  SELECT DISTINCT
    itemInv.id,
    invEst.estabelecimento,
    itemInv.indicadorPropriedadePosseItem,
    itemInv.pessoaParticipante,
    itemInv.gradeProduto,
    itemInv.quantidade,
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MOINVENTARIOESTOQUEXFISC itemInv
  JOIN MOINVENTARIOSESTOQUE invEst
  ON invEst.inventarioEstoque = itemInv.inventarioEstoque
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = itemInv.gradeProduto
  JOIN DATAINVENTARIOESTOQUEXFISC dataInvFisc
  ON dataInvFisc.inventarioEstoque = itemInv.inventarioEstoque
  AND dataInvFisc.produto = gradProd.produto'
|| v_prod_join
|| CASE
     WHEN p_inventario_join IS NULL OR p_inventario_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_join)
   END
|| '
  WHERE NOT (EXISTS (
    SELECT 1
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = dataInvFisc.estabelecimento
    AND dataEstInic.produto = gradProd.produto))'
|| v_prod_andWhere
|| CASE
     WHEN p_inventario_andWhere IS NULL OR p_inventario_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_andWhere)
   END
|| '
  UNION ALL
  SELECT DISTINCT
    mov.idEstoque id,
    mov.estabelecimento,
    mov.indicadorPropriedadePosseItem,
    mov.pessoaParticipante,
    mov.gradeProduto,
    mov.quantidade * CASE WHEN mov.entradaSaida = ''S'' THEN -1 ELSE 1 END quantidade,
    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.operacaoInternaEstoque IN (1,900)
  AND mov.data < TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') + 1
  AND mov.data >= COALESCE((
    SELECT MAX (dataEstInic.data)
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = mov.estabelecimento
    AND dataEstInic.produto = gradProd.produto),
    COALESCE((
      SELECT MAX (dataInvFisc.data) + 1
      FROM DATAINVENTARIOESTOQUEXFISC dataInvFisc
      WHERE dataInvFisc.estabelecimento = mov.estabelecimento
      AND dataInvFisc.produto = gradProd.produto),
      COALESCE((
        SELECT MAX (dataInv.data) + 1
        FROM DATAINVENTARIOSESTOQUE dataInv
        WHERE dataInv.estabelecimento = mov.estabelecimento),
        TO_DATE (''01/01/1900'',''DD/MM/YYYY''))))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
  AND mov.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_movimentos_andWhere IS NULL OR p_movimentos_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_movimentos_andWhere)
   END
|| '
  UNION ALL
  SELECT DISTINCT
    itemDoc.idItemDocFiscal id,
    cabDoc.estabelecimento,
    locEst.indicadorPropriedadePosseItem,
    itemDoc.pessoaParticipante,
    itemDoc.gradeProduto,
    itemDoc.quantidade * CASE WHEN cabDoc.entradaSaida = ''S'' THEN -1 ELSE 1 END quantidade,
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MODOCFISCALXITENS itemDoc
  JOIN MODOCUMENTOSFISCAIS cabDoc
  ON cabDoc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = itemDoc.gradeProduto
  JOIN PALOCAISESTOQUE locEst
  ON locEst.localEstoque = itemDoc.localEstoque'
|| v_prod_join
|| CASE
     WHEN p_docFiscal_join IS NULL OR p_docFiscal_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_docFiscal_join)
   END
|| '
  WHERE itemDoc.cancelado = 0
  AND itemDoc.movimentaEstoqueFiscal = 1
  AND cabDoc.situacaoDocumentoFiscal BETWEEN 21 AND 23
  AND cabDoc.dataEntradaSaida < TO_DATE (''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') + 1
  AND cabDoc.dataEntradaSaida >= COALESCE((
    SELECT MAX (dataEstInic.data)
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = cabDoc.estabelecimento
    AND dataEstInic.produto = gradProd.produto),
    COALESCE((
      SELECT MAX (dataInvFisc.data) + 1
      FROM DATAINVENTARIOESTOQUEXFISC dataInvFisc
      WHERE dataInvFisc.estabelecimento = cabDoc.estabelecimento
      AND dataInvFisc.produto = gradProd.produto),
      COALESCE((
        SELECT MAX (dataInv.data) + 1
        FROM DATAINVENTARIOSESTOQUE dataInv
        WHERE dataInv.estabelecimento = cabDoc.estabelecimento),
        TO_DATE (''01/01/1900'', ''DD/MM/YYYY''))))
  AND NOT(EXISTS(
    SELECT 1
    FROM MODOCFISCALXPRODUTOFILHO filhoDoc
    WHERE filhoDoc.idItemDocFiscal = itemDoc.idItemDocFiscal))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
  AND cabDoc.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_docFiscal_andWhere IS NULL OR p_docFiscal_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_docFiscal_andWhere)
   END
|| '
  UNION ALL
  SELECT DISTINCT
    filhoDoc.id,
    cabDoc.estabelecimento,
    locEst.indicadorPropriedadePosseItem,
    itemDoc.pessoaParticipante,
    filhoDoc.gradeProduto,
    filhoDoc.quantidade * CASE WHEN cabDoc.entradaSaida = ''S'' THEN -1 ELSE 1 END quantidade,
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MODOCFISCALXPRODUTOFILHO filhoDoc
  JOIN MODOCFISCALXITENS itemDoc
  ON itemDoc.idItemDocFiscal = filhoDoc.idItemDocFiscal
  JOIN MODOCUMENTOSFISCAIS cabDoc
  ON cabDoc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = filhoDoc.gradeProduto
  JOIN PALOCAISESTOQUE locEst
  ON locEst.localEstoque = itemDoc.localEstoque'
|| v_prod_join
|| CASE
     WHEN p_inventario_join IS NULL OR p_inventario_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_join)
   END
|| '
  WHERE itemDoc.cancelado = 0
  AND itemDoc.movimentaEstoqueFiscal = 1
  AND cabDoc.situacaoDocumentoFiscal BETWEEN 21 AND 23
  AND cabDoc.dataEntradaSaida < TO_DATE (''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') + 1
  AND cabDoc.dataEntradaSaida >= COALESCE ((
    SELECT MAX (dataEstInic.data)
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = cabDoc.estabelecimento
    AND dataEstInic.produto = gradProd.produto),
    COALESCE ((
      SELECT MAX (dataInvFisc.data) + 1
      FROM DATAINVENTARIOESTOQUEXFISC dataInvFisc
      WHERE dataInvFisc.estabelecimento = cabDoc.estabelecimento
      AND dataInvFisc.produto = gradProd.produto),
      COALESCE ((
        SELECT MAX (dataInv.data) + 1
        FROM DATAINVENTARIOSESTOQUE dataInv
        WHERE dataInv.estabelecimento = cabDoc.estabelecimento),
        TO_DATE (''01/01/1900'', ''DD/MM/YYYY''))))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
  AND cabDoc.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_inventario_andWhere IS NULL OR p_inventario_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_andWhere)
   END
|| ') a
GROUP BY
  a.gradeProduto,
  a.estabelecimento,
  a.indicadorPropriedadePosseItem,
  a.pessoaParticipante,
  a.produto,
  a.cor,
  a.tamanho';
    IF p_buscarPrecoUnitarioCMV = 1 THEN
      EXECUTE IMMEDIATE 'BEGIN
  FOR a IN (
    SELECT
      a.sessaoClient,
      a.contadorSessao,
      a.estabelecimento,
      a.indicadorPropriedadePosseItem,
      a.pessoaParticipante,
      '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'a.gradeProduto'
           ELSE 'a.produto'
          END
      || ',
      FUNC_ADD_BUSCA_PRECO_MEDIO_FIS(
        ' || TO_CHAR (p_config_209_filtrarGrupoEcon) || ', -- p_config_209_filtrarGrupoEcon
        ' || TO_CHAR (p_config_362_calcCustoPorGrade) || ', -- p_config_362_calcCustoPorGrade
        a.estabelecimento,
        TO_DATE (''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY''), -- p_dataFinal
        a.pessoaParticipante,
        a.produto,
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.cor' ELSE '0' END || ',
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.tamanho' ELSE ''' ''' END || ',
        a.indicadorPropriedadePosseItem,
        ' || TO_CHAR (p_gerandoInventario) || ' -- p_gerandoInventario
      ) precoUnitarioCMV
    FROM (
      SELECT
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        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
|| CASE
     WHEN p_transfPendente_considerar = 0
     THEN ''
     ELSE '
  UNION ALL
  SELECT DISTINCT
    itemTransf.idItemDocTransferencia id,
    cabTransf.estabelecimentoEntrada estabelecimento,
    itemTransf.localEstoqueEntrada localEstoque,
    locEst.indicadorPropriedadePosseItem,
    itemTransf.pessoaParticipanteEntrada pessoaParticipante,
    itemTransf.gradeProduto,
    itemTransf.personalizacao,
    itemTransf.idLoteEstoque,
    0 idEnderecoEstoque,
    CASE WHEN prod.controlaNumeroSerie = 1 THEN COALESCE (numSerie.idNumeroSerie, 0) ELSE 0 END idNumeroSerie,
    itemTransf.quantidade,
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MODOCUMENTOTRANSFXITENS itemTransf
  JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
  ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = itemTransf.gradeProduto
  JOIN PALOCAISESTOQUE locEst
  ON locEst.localEstoque = itemTransf.localEstoqueEntrada
  LEFT JOIN MODOCTRANSFXNUMEROSSERIE numSerie
  ON numSerie.idItemDocTransferencia = itemTransf.idItemDocTransferencia
  AND numSerie.gradeProduto = itemTransf.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_transfPendente_joinEntradas IS NULL OR p_transfPendente_joinEntradas = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_transfPendente_joinEntradas)
   END
|| '
  WHERE itemTransf.cancelado = 0
  AND itemTransf.validoEntrada = 1
  AND cabTransf.tipoDocumentoEntrada > 100
  AND cabTransf.situacaoDocTransferencia IN (''A'',''E'')'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
  AND cabTransf.estabelecimentoEntrada IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_transfPendente_andWhereEntra IS NULL OR p_transfPendente_andWhereEntra = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_transfPendente_andWhereEntra)
   END
|| '
  UNION ALL
  SELECT DISTINCT
    itemTransf.idItemDocTransferencia id,
    cabTransf.estabelecimentoSaida estabelecimento,
    itemTransf.localEstoqueSaida localEstoque,
    locEst.indicadorPropriedadePosseItem,
    itemTransf.pessoaParticipanteSaida pessoaParticipante,
    itemTransf.gradeProduto,
    itemTransf.personalizacao,
    itemTransf.idLoteEstoque,
    0 idEnderecoEstoque,
    CASE WHEN prod.controlaNumeroSerie = 1 THEN COALESCE (numSerie.idNumeroSerie, 0) ELSE 0 END idNumeroSerie,
    (- itemTransf.quantidade) quantidade,
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MODOCUMENTOTRANSFXITENS itemTransf
  JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
  ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = itemTransf.gradeProduto
  JOIN PALOCAISESTOQUE locEst
  ON locEst.localEstoque = itemTransf.localEstoqueSaida
  LEFT JOIN MODOCTRANSFXNUMEROSSERIE numSerie
  ON numSerie.idItemDocTransferencia = itemTransf.idItemDocTransferencia
  AND numSerie.gradeProduto = itemTransf.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_transfPendente_joinSaidas IS NULL OR p_transfPendente_joinSaidas = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_transfPendente_joinSaidas)
   END
|| '
  WHERE itemTransf.cancelado = 0
  AND itemTransf.validoEntrada = 1
  AND cabTransf.tipoDocumentoSaida > 100
  AND cabTransf.situacaoDocTransferencia IN (''A'',''E'')'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
  AND cabTransf.estabelecimentoSaida IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_transfPendente_andWhereSaida IS NULL OR p_transfPendente_andWhereSaida = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_transfPendente_andWhereSaida)
   END
   END
|| ') a
GROUP BY
  a.gradeProduto,
  a.estabelecimento,
  a.localEstoque,
  a.indicadorPropriedadePosseItem,
  a.pessoaParticipante,
  a.personalizacao,
  a.idLoteEstoque,
  a.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;

/

-- FIM BETA 5 - 09/5/24

-- SIFATURARATIVIDADES
CREATE TABLE SIFATURARATIVIDADES
  (
    faturarAtividade CHAR (1) DEFAULT ' ' NOT NULL,
    ordenacao        NUMERIC (11,0) DEFAULT 0 NOT NULL,
    descricao        VARCHAR (256) DEFAULT ' ' NOT NULL,
    ativo            NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes      VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE SIFATURARATIVIDADES ADD CONSTRAINT SIFATURARATIVIDADES_PK1 PRIMARY KEY (faturarAtividade);
CREATE INDEX SIFATURARATIVIDADES_K2 ON SIFATURARATIVIDADES (descricao);
CREATE INDEX SIFATURARATIVIDADES_K3 ON SIFATURARATIVIDADES (ordenacao, faturarAtividade);

INSERT INTO SIFATURARATIVIDADES (faturarAtividade, ordenacao, descricao, ativo, observacoes) values (' ', 0, 'SELECIONE', 1, ' ');
INSERT INTO SIFATURARATIVIDADES (faturarAtividade, ordenacao, descricao, ativo, observacoes) values ('N', 1, 'Não Faturar', 1, ' ');
INSERT INTO SIFATURARATIVIDADES (faturarAtividade, ordenacao, descricao, ativo, observacoes) values ('P', 2, 'Atividade Prevista', 1, ' ');
INSERT INTO SIFATURARATIVIDADES (faturarAtividade, ordenacao, descricao, ativo, observacoes) values ('R', 3, 'Atitidade Realizada', 1, ' ');

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('SIFATURARATIVIDADES', 'Faturar Atividades', 1, 613, 'SI', 'faturarAtividade', 'A', 1, 'descricao', 0, ' ', 0, 999999, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqFaturarAtividades', 1, 1, ' '); 

COMMIT;

INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (954, 'Faturar Atividades', 1, 9090009540, 90, 'SIS', 0, 954, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqFaturarAtividades', ' ', 0, 0, NULL, ' ');

COMMIT;

-- PAETAPASATIVIDADE
CREATE TABLE PAETAPASATIVIDADE
  (
    etapaAtividade NUMERIC (4,0) DEFAULT 0 NOT NULL,
    descricao      VARCHAR (60) DEFAULT ' ' NOT NULL,
    ativo          NUMERIC (1,0) DEFAULT 0 NOT NULL,
    ordenacao      NUMERIC (11,0) DEFAULT 0 NOT NULL,
    imagemLegenda  VARCHAR (256) DEFAULT ' ' NOT NULL,
    observacoes    VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PAETAPASATIVIDADE ADD CONSTRAINT PAETAPASATIVIDADE_PK1 PRIMARY KEY (etapaAtividade);
CREATE INDEX PAETAPASATIVIDADE_K2 ON PAETAPASATIVIDADE (descricao);
CREATE INDEX PAETAPASATIVIDADE_K3 ON PAETAPASATIVIDADE (ordenacao, etapaAtividade);

INSERT INTO PAETAPASATIVIDADE (etapaAtividade, descricao, ativo, ordenacao, imagemLegenda, observacoes) VALUES (0, 'SELECIONE', 1, 0, ' ', ' ');

COMMIT;

INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (955, 'Etapas Atividade', 1, 2060009550, 20, 'PAR', 0, 955, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqEtapasAtividade', ' ', 0, 0, NULL, ' ');

COMMIT;

CREATE TABLE PAATIVIDADESSERVICO_0401 AS SELECT * FROM PAATIVIDADESSERVICO;

ALTER TABLE PAATIVIDADEOSXPREVISTA DROP CONSTRAINT PAATIVIDADEOSXPREVISTA_FK1;
ALTER TABLE PAATIVIDADEOSXPREVISTA DROP CONSTRAINT PAATIVIDADEOSXPREVISTA_FK2;
ALTER TABLE PAATIVIDADEPREVISTAXREAL DROP CONSTRAINT PAATIVIDADEPREVISTAXREAL_FK1;
ALTER TABLE PAATIVIDADEPREVISTAXREAL DROP CONSTRAINT PAATIVIDADEPREVISTAXREAL_FK2;
ALTER TABLE PAATIVIDADESERVXCHECKLIST DROP CONSTRAINT PAATIVIDADESERVXCHECKLIST_FK1;
ALTER TABLE MOORCAMENTOXITENS DROP CONSTRAINT MOORCAMENTOXITENS_FK4;
ALTER TABLE MOORCAMENTOXATIVIDADEPREV DROP CONSTRAINT MOORCAMENTOXATIVIDADEPREV_FK2;
ALTER TABLE MOORCAMENTOXATIVIDADEREAL DROP CONSTRAINT MOORCAMENTOXATIVIDADEREAL_FK2;

DROP TABLE PAATIVIDADESSERVICO;

-- PAATIVIDADESSERVICO
CREATE TABLE PAATIVIDADESSERVICO
  (
    atividadeServico          NUMERIC (4,0) DEFAULT 0 NOT NULL,
    descricao                 VARCHAR (120) DEFAULT ' ' NOT NULL,
    ativo                     NUMERIC (1,0) DEFAULT 0 NOT NULL,
    tipoServico               NUMERIC (4,0) DEFAULT 0 NOT NULL,
    gradeProduto              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    validoAtividadeOs         NUMERIC (1,0) DEFAULT 0 NOT NULL,
    validoPrevisto            NUMERIC (1,0) DEFAULT 0 NOT NULL,
    validoRealizado           NUMERIC (1,0) DEFAULT 0 NOT NULL,
    habilitaAtividadePrevista NUMERIC (1,0) DEFAULT 0 NOT NULL,
    externo                   NUMERIC (1,0) DEFAULT 0 NOT NULL,
    restrito                  NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes               VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PAATIVIDADESSERVICO ADD CONSTRAINT PAATIVIDADESSERVICO_PK1 PRIMARY KEY (atividadeServico);
CREATE INDEX PAATIVIDADESSERVICO_K2 ON PAATIVIDADESSERVICO (descricao);
ALTER TABLE PAATIVIDADESSERVICO ADD CONSTRAINT PAATIVIDADESSERVICO_FK1 FOREIGN KEY (tipoServico) REFERENCES PATIPOSSERVICO (tipoServico);
ALTER TABLE PAATIVIDADESSERVICO ADD CONSTRAINT PAATIVIDADESSERVICO_FK3 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);

INSERT INTO PAATIVIDADESSERVICO (atividadeServico, descricao, ativo, tipoServico, gradeProduto, validoAtividadeOs, validoPrevisto, validoRealizado, habilitaAtividadePrevista, externo, restrito, observacoes) VALUES (0, 'SELECIONE', 1, 0, 0, 0, 0, 0, 0, 0, 0, ' ');
INSERT INTO PAATIVIDADESSERVICO (atividadeServico, descricao, ativo, tipoServico, gradeProduto, validoAtividadeOs, validoPrevisto, validoRealizado, habilitaAtividadePrevista, externo, restrito, observacoes) SELECT atividadeServico, descricao, ativo, tipoServico, gradeProduto, validoAtividadeOs, validoPrevisto, validoRealizado, habilitaAtividadePrevista, externo, restrito, observacoes FROM PAATIVIDADESSERVICO_0401 WHERE atividadeServico > 0;

COMMIT;

ALTER TABLE PAATIVIDADEOSXPREVISTA ADD CONSTRAINT PAATIVIDADEOSXPREVISTA_FK1 FOREIGN KEY (atividadeServicoOs) REFERENCES PAATIVIDADESSERVICO (atividadeServico);
ALTER TABLE PAATIVIDADEOSXPREVISTA ADD CONSTRAINT PAATIVIDADEOSXPREVISTA_FK2 FOREIGN KEY (atividadeServicoPrevista) REFERENCES PAATIVIDADESSERVICO (atividadeServico);
ALTER TABLE PAATIVIDADEPREVISTAXREAL ADD CONSTRAINT PAATIVIDADEPREVISTAXREAL_FK1 FOREIGN KEY (atividadeServicoPrevista) REFERENCES PAATIVIDADESSERVICO (atividadeServico);
ALTER TABLE PAATIVIDADEPREVISTAXREAL ADD CONSTRAINT PAATIVIDADEPREVISTAXREAL_FK2 FOREIGN KEY (atividadeServicoRealizada) REFERENCES PAATIVIDADESSERVICO (atividadeServico);
ALTER TABLE PAATIVIDADESERVXCHECKLIST ADD CONSTRAINT PAATIVIDADESERVXCHECKLIST_FK1 FOREIGN KEY (atividadeServico) REFERENCES PAATIVIDADESSERVICO (atividadeServico);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK4 FOREIGN KEY (atividadeServico) REFERENCES PAATIVIDADESSERVICO (atividadeServico);
ALTER TABLE MOORCAMENTOXATIVIDADEPREV ADD CONSTRAINT MOORCAMENTOXATIVIDADEPREV_FK2 FOREIGN KEY (atividadeServico) REFERENCES PAATIVIDADESSERVICO (atividadeServico);
ALTER TABLE MOORCAMENTOXATIVIDADEREAL ADD CONSTRAINT MOORCAMENTOXATIVIDADEREAL_FK2 FOREIGN KEY (atividadeServico) REFERENCES PAATIVIDADESSERVICO (atividadeServico);

CREATE TABLE PAATIVIDADEOSXPREVISTA_0401 AS SELECT * FROM PAATIVIDADEOSXPREVISTA;

DROP TABLE PAATIVIDADEOSXPREVISTA;

-- PAATIVIDADEOSXPREVISTA
CREATE TABLE PAATIVIDADEOSXPREVISTA
  (
    id                       NUMERIC (14,0) DEFAULT 0 NOT NULL,
    atividadeServicoOs       NUMERIC (4,0) DEFAULT 0 NOT NULL,
    ordenacao                NUMERIC (11,0) DEFAULT 0 NOT NULL,
    atividadeServicoPrevista NUMERIC (4,0) DEFAULT 0 NOT NULL,
    ativo                    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    sugestao                 NUMERIC (1,0) DEFAULT 0 NOT NULL,
    tecnico                  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    faturarAtividade         CHAR (1) DEFAULT ' ' NOT NULL,
    etapaAtividade           NUMERIC (4,0) DEFAULT 0 NOT NULL,
    observacoes              VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PAATIVIDADEOSXPREVISTA ADD CONSTRAINT PAATIVIDADEOSXPREVISTA_PK1 PRIMARY KEY (id);
CREATE UNIQUE INDEX PAATIVIDADEOSXPREVISTA_K2 ON PAATIVIDADEOSXPREVISTA (atividadeServicoOs, ordenacao, id);
ALTER TABLE PAATIVIDADEOSXPREVISTA ADD CONSTRAINT PAATIVIDADEOSXPREVISTA_FK1 FOREIGN KEY (atividadeServicoOs) REFERENCES PAATIVIDADESSERVICO (atividadeServico);
ALTER TABLE PAATIVIDADEOSXPREVISTA ADD CONSTRAINT PAATIVIDADEOSXPREVISTA_FK2 FOREIGN KEY (atividadeServicoPrevista) REFERENCES PAATIVIDADESSERVICO (atividadeServico);
ALTER TABLE PAATIVIDADEOSXPREVISTA ADD CONSTRAINT PAATIVIDADEOSXPREVISTA_FK3 FOREIGN KEY (tecnico) REFERENCES CATECNICOS (tecnico);
ALTER TABLE PAATIVIDADEOSXPREVISTA ADD CONSTRAINT PAATIVIDADEOSXPREVISTA_FK4 FOREIGN KEY (faturarAtividade) REFERENCES SIFATURARATIVIDADES (faturarAtividade);
ALTER TABLE PAATIVIDADEOSXPREVISTA ADD CONSTRAINT PAATIVIDADEOSXPREVISTA_FK5 FOREIGN KEY (etapaAtividade) REFERENCES PAETAPASATIVIDADE (etapaAtividade);

INSERT INTO PAATIVIDADEOSXPREVISTA (id, atividadeServicoOs, ordenacao, atividadeServicoPrevista, ativo, sugestao, tecnico, faturarAtividade, etapaAtividade, observacoes) VALUES (0, 0, 0, 0, 1, 0, 0, ' ', 0, ' ');
INSERT INTO PAATIVIDADEOSXPREVISTA (id, atividadeServicoOs, ordenacao, atividadeServicoPrevista, ativo, sugestao, tecnico, faturarAtividade, etapaAtividade, observacoes) SELECT id, atividadeServicoOs, ordenacao, atividadeServicoPrevista, ativo, sugestao, tecnico, 'N', 0, observacoes FROM PAATIVIDADEOSXPREVISTA_0401 WHERE id > 0;

COMMIT;

CREATE TABLE MOORCAMENTOXATIVIDADEPREV_0401 AS SELECT * FROM MOORCAMENTOXATIVIDADEPREV;

ALTER TABLE MOORCAMENTOXATIVIDADEREAL DROP CONSTRAINT MOORCAMENTOXATIVIDADEREAL_FK1;
ALTER TABLE MOORCAMENTOXTAREFAS DROP CONSTRAINT MOORCAMENTOXTAREFAS_FK1;
ALTER TABLE MOPLANEJAMENTOXATIVIDPREV DROP CONSTRAINT MOPLANEJAMENTOXATIVIDPREV_FK2;

DROP TABLE MOORCAMENTOXATIVIDADEPREV;

-- MOORCAMENTOXATIVIDADEPREV
CREATE TABLE MOORCAMENTOXATIVIDADEPREV
  (
    idAtividadePrevOrcamento NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idItemOrcamento          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sequencia                NUMERIC (3,0) DEFAULT 0 NOT NULL,
    atividadeServico         NUMERIC (4,0) DEFAULT 0 NOT NULL,
    descricao                VARCHAR (256) DEFAULT ' ' NOT NULL,
    tecnico                  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    faturarAtividade         CHAR (1) DEFAULT ' ' NOT NULL,
    checklist                NUMERIC (4,0) DEFAULT 0 NOT NULL,
    etapaAtividade           NUMERIC (4,0) DEFAULT 0 NOT NULL,
    statusAtividadeServico   CHAR (1) DEFAULT ' ' NOT NULL,
    dataInicio               DATE,
    dataTermino              DATE,
    quantidade               NUMERIC (15,6) DEFAULT 0 NOT NULL,
    precoUnitario            NUMERIC (15,7) DEFAULT 0 NOT NULL,
    observacoes              VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MOORCAMENTOXATIVIDADEPREV ADD CONSTRAINT MOORCAMENTOXATIVIDADEPREV_PK1 PRIMARY KEY (idAtividadePrevOrcamento);
CREATE UNIQUE INDEX MOORCAMENTOXATIVIDADEPREV_K2 ON MOORCAMENTOXATIVIDADEPREV (idItemOrcamento, sequencia);
CREATE INDEX MOORCAMENTOXATIVIDADEPREV_K3 ON MOORCAMENTOXATIVIDADEPREV (idItemOrcamento);
ALTER TABLE MOORCAMENTOXATIVIDADEPREV ADD CONSTRAINT MOORCAMENTOXATIVIDADEPREV_FK1 FOREIGN KEY (idItemOrcamento) REFERENCES MOORCAMENTOXITENS (idItemOrcamento);
ALTER TABLE MOORCAMENTOXATIVIDADEPREV ADD CONSTRAINT MOORCAMENTOXATIVIDADEPREV_FK2 FOREIGN KEY (atividadeServico) REFERENCES PAATIVIDADESSERVICO (atividadeServico);
ALTER TABLE MOORCAMENTOXATIVIDADEPREV ADD CONSTRAINT MOORCAMENTOXATIVIDADEPREV_FK3 FOREIGN KEY (tecnico) REFERENCES CATECNICOS (tecnico);
ALTER TABLE MOORCAMENTOXATIVIDADEPREV ADD CONSTRAINT MOORCAMENTOXATIVIDADEPREV_FK4 FOREIGN KEY (faturarAtividade) REFERENCES SIFATURARATIVIDADES (faturarAtividade);
ALTER TABLE MOORCAMENTOXATIVIDADEPREV ADD CONSTRAINT MOORCAMENTOXATIVIDADEPREV_FK5 FOREIGN KEY (checklist) REFERENCES PACHECKLISTS (checklist);
ALTER TABLE MOORCAMENTOXATIVIDADEPREV ADD CONSTRAINT MOORCAMENTOXATIVIDADEPREV_FK6 FOREIGN KEY (etapaAtividade) REFERENCES PAETAPASATIVIDADE (etapaAtividade);
ALTER TABLE MOORCAMENTOXATIVIDADEPREV ADD CONSTRAINT MOORCAMENTOXATIVIDADEPREV_FK7 FOREIGN KEY (statusAtividadeServico) REFERENCES SISTATUSATIVIDADESERVICO (statusAtividadeServico);

INSERT INTO MOORCAMENTOXATIVIDADEPREV (idAtividadePrevOrcamento, idItemOrcamento, sequencia, atividadeServico, descricao, tecnico, faturarAtividade, checklist, etapaAtividade, statusAtividadeServico, dataInicio, dataTermino, quantidade, precoUnitario, observacoes) VALUES (0, 0, 0, 0, 'SELECIONE', 0, ' ', 0, 0, ' ', NULL, NULL, 0, 0, ' ');
INSERT INTO MOORCAMENTOXATIVIDADEPREV (idAtividadePrevOrcamento, idItemOrcamento, sequencia, atividadeServico, descricao, tecnico, faturarAtividade, checklist, etapaAtividade, statusAtividadeServico, dataInicio, dataTermino, quantidade, precoUnitario, observacoes) SELECT idAtividadePrevOrcamento, idItemOrcamento, sequencia, atividadeServico, descricao, tecnico, 'N', 0, 0, statusAtividadeServico, dataInicio, dataTermino, quantidade, 0, observacoes FROM MOORCAMENTOXATIVIDADEPREV_0401 WHERE idAtividadePrevOrcamento > 0;

COMMIT;

ALTER TABLE MOORCAMENTOXATIVIDADEREAL ADD CONSTRAINT MOORCAMENTOXATIVIDADEREAL_FK1 FOREIGN KEY (idAtividadePrevOrcamento) REFERENCES MOORCAMENTOXATIVIDADEPREV (idAtividadePrevOrcamento);
ALTER TABLE MOORCAMENTOXTAREFAS ADD CONSTRAINT MOORCAMENTOXTAREFAS_FK1 FOREIGN KEY (idAtividadePrevOrcamento) REFERENCES MOORCAMENTOXATIVIDADEPREV (idAtividadePrevOrcamento);
ALTER TABLE MOPLANEJAMENTOXATIVIDPREV ADD CONSTRAINT MOPLANEJAMENTOXATIVIDPREV_FK2 FOREIGN KEY (idAtividadePrevOrcamento) REFERENCES MOORCAMENTOXATIVIDADEPREV (idAtividadePrevOrcamento);

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

/

create or replace PROCEDURE ADD_TROCA_GRADEPRODUTO(
    p_gradeProdutoDe   IN NUMBER,
    p_gradeProdutoPara IN NUMBER)
IS
BEGIN
  UPDATE CAGRADEPRODUTOXPESSOAS a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT (EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXPESSOAS b
    WHERE b.gradeProduto = p_gradeProdutoPara
    AND b.pessoa = a.pessoa
    AND b.codigoProduto = a.codigoProduto));
  DELETE CAGRADEPRODUTOXPESSOAS
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXLOTESESTOQ a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT (EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXLOTESESTOQ b
    WHERE b.gradeProduto = p_gradeProdutoPara
    AND b.loteEstoque = a.loteEstoque));
  UPDATE CAGRADEPRODUTOXLOTESESTOQ
  SET ativo = 0
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXENDERECOS a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT (EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXENDERECOS b
    WHERE b.gradeProduto = p_gradeProdutoPara
    AND b.idLoteEstoque = a.idLoteEstoque
    AND b.idEnderecoEstoque = a.idEnderecoEstoque));
  DELETE CAGRADEPRODUTOXENDERECOS
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXNUMEROSSER a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT (EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXNUMEROSSER b
    WHERE b.gradeProduto = p_gradeProdutoPara
    AND b.numeroSerie = a.numeroSerie));
  UPDATE CAGRADEPRODUTOXNUMEROSSER
  SET ativo = 0
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXKITSCOMBOS a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT (EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXKITSCOMBOS b
    WHERE b.gradeProduto = p_gradeProdutoPara
    AND b.gradeProdutoFilho = a.gradeProdutoFilho));
  UPDATE CAGRADEPRODUTOXKITSCOMBOS
  SET ativo = 0
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXKITSCOMBOS a
  SET a.gradeProdutoFilho = p_gradeProdutoPara
  WHERE a.gradeProdutoFilho = p_gradeProdutoDe
  AND NOT (EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXKITSCOMBOS b
    WHERE b.gradeProdutoFilho = p_gradeProdutoPara
    AND b.gradeProduto = a.gradeProduto));
  UPDATE CAGRADEPRODUTOXKITSCOMBOS
  SET ativo = 0
  WHERE gradeProdutoFilho = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXKITSCOMBOS
  SET ativo = 0
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAPRODUTOXCOMPOSICOESPREC
  SET gradeProdutoEstoque = p_gradeProdutoPara
  WHERE gradeProdutoEstoque = p_gradeProdutoDe;
  UPDATE PAPRODUTOSLINHASTINTAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CABASESTINTAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CACOLORANTESTINTAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE PAATIVIDADESSERVICO
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE PAPROJETOS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOORCAMENTOXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOORCAMENTOXNUMEROSSERIE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOORCAMENTOXBLOQUEIOSEST
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOLISTAEVENTOXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOCONTRATOXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOPREDOCUMXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOPREDOCUMXNUMEROSSERIE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOPREDOCUMXBLOQUEIOSEST
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCFISCALXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCFISCALXPRODUTOFILHO
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCFISCALXNUMEROSSERIE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODISTRIBUICAODFEXGRADE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOSEPARACAOXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOSEPARACAOXNUMEROSSERIE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOSEPARACAOXBLOQUEIOSEST
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOINVENTARIOESTOQUEXITENS a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT (EXISTS (
    SELECT 1
    FROM MOINVENTARIOESTOQUEXITENS b
    WHERE b.inventarioEstoque = a.inventarioEstoque
    AND b.gradeProduto = p_gradeProdutoPara
    AND b.indicadorPropriedadePosseItem = a.indicadorPropriedadePosseItem
    AND b.pessoaParticipante = a.pessoaParticipante
    AND b.localEstoque = a.localEstoque
    AND b.personalizacao = a.personalizacao
    AND b.idLoteEstoque = a.idLoteEstoque
    AND b.idEnderecoEstoque = a.idEnderecoEstoque
    AND b.idNumeroSerie = a.idNumeroSerie));
  DELETE MOINVENTARIOESTOQUEXITENS
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOINVENTARIOESTOQUEXFISC a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT (EXISTS (
    SELECT 1
    FROM MOINVENTARIOESTOQUEXFISC b
    WHERE b.inventarioEstoque = a.inventarioEstoque
    AND b.gradeProduto = p_gradeProdutoPara
    AND b.indicadorPropriedadePosseItem = a.indicadorPropriedadePosseItem
    AND b.pessoaParticipante = a.pessoaParticipante));
  DELETE MOINVENTARIOESTOQUEXFISC
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOESTOQUES
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCTROCAXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOBALANCOXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOBALANCOXDIVERGENCIA
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCUMENTOTRANSFXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCTRANSFXNUMEROSSERIE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCTRANSFXBLOQUEIOSEST
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOORCAMENTOXCONFERENCIAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOPREDOCUMXCONFERENCIAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCFISCALXCONFERENCIAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCTRANSFXCONFERENCIAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOCONSERTOS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MORESERVASESTOQUE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOPAINELCOMPRAXGRADE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOMOTIVOSBLOQUEIOS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOINGRESSOS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADESPRODUTO
  SET ativo = 0
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAPRODUTOS a
  SET a.ativo = 0
  WHERE EXISTS (
    SELECT 1
    FROM CAGRADESPRODUTO b
    WHERE b.produto = a.produto
    AND b.gradeProduto = p_gradeProdutoDe)
  AND NOT (EXISTS (
    SELECT 1
    FROM CAGRADESPRODUTO b
    WHERE b.produto = a.produto
    AND b.ativo = 1));
END ADD_TROCA_GRADEPRODUTO;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_TAREF_GRAVA (
  p_estabelecimentoAtivo     IN NUMBER,
  p_idTarefaOrcamento        IN NUMBER,
  p_idAtividadePrevOrcamento IN NUMBER,
  p_idCheckListXTarefas      IN NUMBER,
  p_ordenacao                IN NUMBER,
  p_conteudo                 IN VARCHAR2,
  /* Retornos */
  r_idTarefaOrcamento        OUT NUMBER)
IS
BEGIN
  r_idTarefaOrcamento := p_idTarefaOrcamento;
  IF r_idTarefaOrcamento = 0 THEN
    r_idTarefaOrcamento := FUNC_ADD_BUSCA_PROXIMO_ID ('MOORCAMENTOXTAREFAS', 'idTarefaOrcamento', 14, p_estabelecimentoAtivo, NULL);
  END IF;
  MERGE INTO MOORCAMENTOXTAREFAS a 
  USING (
    SELECT
      r_idTarefaOrcamento        idTarefaOrcamento,
      p_idAtividadePrevOrcamento idAtividadePrevOrcamento,
      p_idCheckListXTarefas      idCheckListXTarefas,
      p_ordenacao                ordenacao,
      p_conteudo                 conteudo
    FROM DUAL) b
  ON (a.idTarefaOrcamento = b.idTarefaOrcamento)
  WHEN MATCHED THEN UPDATE SET
    a.idAtividadePrevOrcamento = b.idAtividadePrevOrcamento,
    a.idCheckListXTarefas      = b.idCheckListXTarefas,
    a.ordenacao                = b.ordenacao,
    a.conteudo                 = b.conteudo
  WHEN NOT MATCHED THEN INSERT (
    idTarefaOrcamento,
    idAtividadePrevOrcamento,
    idCheckListXTarefas,
    ordenacao,
    conteudo)
  VALUES (
    b.idTarefaOrcamento,
    b.idAtividadePrevOrcamento,
    b.idCheckListXTarefas,
    b.ordenacao,
    b.conteudo);
END ADD_ORCAMENTO_ITEM_TAREF_GRAVA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_TAREF_INSER (
  p_estabelecimentoAtivo     IN NUMBER,
  p_idAtividadePrevOrcamento IN NUMBER,
  p_checklist                IN NUMBER)
IS
  v_ordenacao NUMBER;  
  v_auxNumber NUMBER;  
BEGIN
  v_ordenacao := 0;
  DELETE MOORCAMENTOXTAREFAS
  WHERE idAtividadePrevOrcamento = p_idAtividadePrevOrcamento;
  IF p_checklist <> 0 THEN
    FOR a IN (
      SELECT
        idCheckListXTarefas,
        conteudoSugestao
      FROM PACHECKLISTXTAREFAS
      WHERE checklist = p_checklist
      AND ativo = 1
      ORDER BY
        sequencia,
        idCheckListXTarefas)
    LOOP
      v_ordenacao := v_ordenacao + 1;
      ADD_ORCAMENTO_ITEM_TAREF_GRAVA (
        p_estabelecimentoAtivo,
        0,
        p_idAtividadePrevOrcamento,
        a.idCheckListXTarefas,
        v_ordenacao,
        a.conteudoSugestao,
        /* Retornos */
        v_auxNumber);
    END LOOP;
  END IF;
END ADD_ORCAMENTO_ITEM_TAREF_INSER;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_PREV_GRAVA (
  p_estabelecimentoAtivo     IN NUMBER,
  p_idAtividadePrevOrcamento IN NUMBER,
  p_idItemOrcamento          IN NUMBER,
  p_sequencia                IN NUMBER,
  p_atividadeServico         IN NUMBER,
  p_descricao                IN VARCHAR2,
  p_tecnico                  IN NUMBER,
  p_faturarAtividade         IN CHAR,
  p_checklist                IN NUMBER,
  p_etapaAtividade           IN NUMBER,
  p_statusAtividadeServico   IN CHAR,
  p_dataInicio               IN DATE,
  p_dataTermino              IN DATE,
  p_quantidade               IN NUMBER,
  p_precoUnitario            IN NUMBER,
  p_observacoes              IN VARCHAR2,
  p_gravarTarefas            IN NUMBER,
  p_gravarAtividadeRealizada IN NUMBER,
  p_idAtividadeRealOrcamento IN NUMBER,
  p_atReal_dataInicio        IN DATE,
  p_atReal_dataTermino       IN DATE,
  p_atReal_quantidade        IN NUMBER,
  /* Retornos */
  r_idAtividadePrevOrcamento OUT NUMBER,
  r_idAtividadeRealOrcamento OUT NUMBER)
IS
BEGIN
  r_idAtividadePrevOrcamento := p_idAtividadePrevOrcamento;
  IF r_idAtividadePrevOrcamento = 0 THEN
    r_idAtividadePrevOrcamento := FUNC_ADD_BUSCA_PROXIMO_ID ('MOORCAMENTOXATIVIDADEPREV', 'idAtividadePrevOrcamento', 14, p_estabelecimentoAtivo, NULL);
  END IF;
  r_idAtividadeRealOrcamento := p_idAtividadeRealOrcamento;
  MERGE INTO MOORCAMENTOXATIVIDADEPREV a USING (
    SELECT
      r_idAtividadePrevOrcamento idAtividadePrevOrcamento,
      p_idItemOrcamento          idItemOrcamento,
      p_sequencia                sequencia,
      p_atividadeServico         atividadeServico,
      p_descricao                descricao,
      p_tecnico                  tecnico,
      p_faturarAtividade         faturarAtividade,
      p_checklist                checklist,
      p_etapaAtividade           etapaAtividade,
      p_statusAtividadeServico   statusAtividadeServico,
      p_dataInicio               dataInicio,
      p_dataTermino              dataTermino,
      p_quantidade               quantidade,
      p_precoUnitario            precoUnitario,
      p_observacoes              observacoes
    FROM DUAL) b
  ON (a.idAtividadePrevOrcamento = b.idAtividadePrevOrcamento)
  WHEN MATCHED THEN UPDATE SET
    a.idItemOrcamento        = b.idItemOrcamento,
    a.sequencia              = b.sequencia,
    a.atividadeServico       = b.atividadeServico,
    a.descricao              = b.descricao,
    a.tecnico                = b.tecnico,
    a.faturarAtividade       = b.faturarAtividade,
    a.checklist              = b.checklist,
    a.etapaAtividade         = b.etapaAtividade,
    a.statusAtividadeServico = b.statusAtividadeServico,
    a.dataInicio             = b.dataInicio,
    a.dataTermino            = b.dataTermino,
    a.quantidade             = b.quantidade,
    a.precoUnitario          = b.precoUnitario,
    a.observacoes            = b.observacoes
  WHEN NOT MATCHED THEN INSERT (
    idAtividadePrevOrcamento,
    idItemOrcamento,
    sequencia,
    atividadeServico,
    descricao,
    tecnico,
    faturarAtividade,
    checklist,
    etapaAtividade,
    statusAtividadeServico,
    dataInicio,
    dataTermino,
    quantidade,
    precoUnitario,
    observacoes)
  VALUES (
    b.idAtividadePrevOrcamento,
    b.idItemOrcamento,
    b.sequencia,
    b.atividadeServico,
    b.descricao,
    b.tecnico,
    b.faturarAtividade,
    b.checklist,
    b.etapaAtividade,
    b.statusAtividadeServico,
    b.dataInicio,
    b.dataTermino,
    b.quantidade,
    b.precoUnitario,
    b.observacoes);
  IF p_gravarTarefas = 1 THEN
    ADD_ORCAMENTO_ITEM_TAREF_INSER (
      p_estabelecimentoAtivo,
      r_idAtividadePrevOrcamento,
      p_checklist);
  END IF;
  IF p_gravarAtividadeRealizada = 1 THEN
    ADD_ORCAMENTO_ITEM_REAL_GRAVA (
      p_estabelecimentoAtivo,
      p_idAtividadeRealOrcamento,
      r_idAtividadePrevOrcamento,
      1,
      p_atividadeServico,
      p_descricao,
      p_tecnico,
      p_statusAtividadeServico,
      p_atReal_dataInicio,
      p_atReal_dataTermino,
      p_atReal_quantidade,
      p_observacoes,
      /* Retornos */
      r_idAtividadeRealOrcamento);
  END IF;
  IF NOT (p_statusAtividadeServico IN ('A','I','P')) THEN
    UPDATE MOORCAMENTOXATIVIDADEPREV prev
    SET prev.tecnico = CASE WHEN prev.tecnico = 0 THEN p_tecnico ELSE prev.tecnico END,
      prev.statusAtividadeServico = 'P',
      prev.dataInicio = CASE WHEN prev.dataInicio IS NULL THEN SYSDATE ELSE prev.dataInicio END,
      prev.dataTermino = CASE WHEN prev.dataTermino IS NULL THEN SYSDATE ELSE prev.dataTermino END
    WHERE prev.idItemOrcamento = p_idItemOrcamento
    AND prev.statusAtividadeServico = 'A'
    AND prev.sequencia =
      ( SELECT MIN (prev2.sequencia)
        FROM MOORCAMENTOXATIVIDADEPREV prev2
        WHERE prev2.idItemOrcamento = prev.idItemOrcamento
        AND prev2.statusAtividadeServico IN ('A','I','P'));
  END IF;
  UPDATE MOORCAMENTOXITENS a
  SET a.statusAtividadeServico =
    CASE
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'I')
      THEN 'I'
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'P')
      THEN
        CASE
          WHEN
            EXISTS (
              SELECT 1
              FROM MOORCAMENTOXATIVIDADEPREV prev
              WHERE prev.idItemOrcamento = a.idItemOrcamento
              AND prev.statusAtividadeServico = 'E')
          THEN 'I'
          ELSE 'P'
        END
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'A')
      THEN 'A'
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'C')
      THEN 'C'
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'E')
      THEN 'E'
      ELSE 'A'
    END
  WHERE a.idItemOrcamento = p_idItemOrcamento
  AND a.statusAtividadeServico <>
    CASE
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'I')
      THEN 'I'
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'P')
      THEN
        CASE
          WHEN
            EXISTS (
              SELECT 1
              FROM MOORCAMENTOXATIVIDADEPREV prev
              WHERE prev.idItemOrcamento = a.idItemOrcamento
              AND prev.statusAtividadeServico = 'E')
          THEN 'I'
          ELSE 'P'
        END
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'A')
      THEN 'A'
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'C')
      THEN 'C'
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = a.idItemOrcamento
        AND prev.statusAtividadeServico = 'E')
      THEN 'E'
      ELSE 'A'
    END;
END ADD_ORCAMENTO_ITEM_PREV_GRAVA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_PREV_INSERE (
  p_usuarioLogado           IN NUMBER,
  p_estabelecimentoAtivo    IN NUMBER,
  p_idItemOrcamento         IN NUMBER,
  p_atividadeServicoOs      IN NUMBER)    
IS
  v_sequenciaAtividade      NUMBER;
  v_tecnico                 NUMBER;
  v_ativServ_validoPrevisto NUMBER;
  v_checklist               NUMBER;
  v_auxNumber               NUMBER;  
BEGIN
  v_sequenciaAtividade := 0;
  SELECT COALESCE (MAX (tecnico), 0)
  INTO v_tecnico
  FROM CATECNICOS
  WHERE tecnico = p_usuarioLogado
  AND ativo = 1;
  SELECT COALESCE (MAX (validoPrevisto), 0)
  INTO v_ativServ_validoPrevisto
  FROM PAATIVIDADESSERVICO
  WHERE atividadeServico = p_atividadeServicoOs;
  FOR a IN (
    SELECT
      atividadeServicoPrevista,
      tecnico,
      faturarAtividade,
      etapaAtividade,
      observacoes
    FROM PAATIVIDADEOSXPREVISTA
    WHERE atividadeServicoOs = p_atividadeServicoOs
    AND ativo = 1
    AND sugestao = 1
    ORDER BY
      atividadeServicoOs,
      ordenacao,
      id)
  LOOP
    v_sequenciaAtividade := v_sequenciaAtividade + 1;  
    SELECT COALESCE (MAX (c.checklist),0)
    INTO v_checklist
    FROM (
    SELECT
      b.checklist,
      ROW_NUMBER() OVER (
        ORDER BY
          b.ordenacao,
          b.id) ordenacao
    FROM PAATIVIDADESERVXCHECKLIST b
    WHERE b.atividadeServico = a.atividadeServicoPrevista
    AND b.ativo = 1) c
    WHERE c.ordenacao = 1;
    ADD_ORCAMENTO_ITEM_PREV_GRAVA (
      p_estabelecimentoAtivo,
      0,
      p_idItemOrcamento,
      v_sequenciaAtividade,
      a.atividadeServicoPrevista,
      ' ',
      CASE WHEN v_sequenciaAtividade = 1 AND a.tecnico = 0 THEN v_tecnico ELSE a.tecnico END,
      a.faturarAtividade,
      v_checklist,
      a.etapaAtividade,
      CASE WHEN v_sequenciaAtividade = 1 THEN CASE WHEN CASE WHEN a.tecnico = 0 THEN v_tecnico ELSE a.tecnico END = p_usuarioLogado THEN 'I' ELSE 'P' END ELSE 'A' END,
      CASE WHEN v_sequenciaAtividade = 1 THEN SYSDATE ELSE NULL END,
      CASE WHEN v_sequenciaAtividade = 1 THEN SYSDATE ELSE NULL END,
      0,
      0,
      a.observacoes,
      1,
      CASE WHEN v_sequenciaAtividade = 1 AND CASE WHEN a.tecnico = 0 THEN v_tecnico ELSE a.tecnico END = p_usuarioLogado THEN 1 ELSE 0 END,
      0,
      CASE WHEN v_sequenciaAtividade = 1 AND CASE WHEN a.tecnico = 0 THEN v_tecnico ELSE a.tecnico END = p_usuarioLogado THEN SYSDATE ELSE NULL END,
      NULL,
      0,
      /* Retornos */
      v_auxNumber,
      v_auxNumber);
  END LOOP;
  IF v_sequenciaAtividade = 0 AND v_ativServ_validoPrevisto = 1 THEN
    SELECT COALESCE (MAX (c.checklist),0)
    INTO v_checklist
    FROM (
    SELECT
      b.checklist,
      ROW_NUMBER() OVER (
        ORDER BY
          b.ordenacao,
          b.id) ordenacao
    FROM PAATIVIDADESERVXCHECKLIST b
    WHERE b.atividadeServico = p_atividadeServicoOs
    AND b.ativo = 1) c
    WHERE c.ordenacao = 1;
    ADD_ORCAMENTO_ITEM_PREV_GRAVA (
      p_estabelecimentoAtivo,
      0,
      p_idItemOrcamento,
      1,
      p_atividadeServicoOs,
      ' ',
      v_tecnico,
      'N',
      v_checklist,
      0,
      'P',
      SYSDATE,
      SYSDATE,
      0,
      0,
      ' ',
      1,
      0,
      0,
      NULL,
      NULL,
      0,
      /* Retornos */
      v_auxNumber,
      v_auxNumber);
  END IF;
END ADD_ORCAMENTO_ITEM_PREV_INSERE;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_PREV_CANC (
  p_idItemOrcamento IN NUMBER)    
IS
BEGIN
  FOR a IN (
    SELECT idAtividadePrevOrcamento
    FROM MOORCAMENTOXATIVIDADEPREV
    WHERE idItemOrcamento = p_idItemOrcamento
    AND statusAtividadeServico IN ('A','I','P'))
  LOOP
    UPDATE MOORCAMENTOXATIVIDADEPREV b
    SET b.statusAtividadeServico = 'C'
    WHERE b.idAtividadePrevOrcamento = a.idAtividadePrevOrcamento;
    UPDATE MOORCAMENTOXATIVIDADEREAL b
    SET b.statusAtividadeServico = 'C'
    WHERE b.idAtividadePrevOrcamento = a.idAtividadePrevOrcamento
    AND b.statusAtividadeServico IN ('A','I','P');
  END LOOP;
  UPDATE MOORCAMENTOXITENS
  SET statusAtividadeServico = 'C'
  WHERE idItemOrcamento = p_idItemOrcamento
  AND statusAtividadeServico <> 'C';
END ADD_ORCAMENTO_ITEM_PREV_CANC;

/

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.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;
    FOR b IN (
      SELECT
        id,
        idItemContrato,
        quantidade
      FROM MOCONTRATOXORCAMENTO
      WHERE idItemOrcamento = p_item_idItemOrcamento)
    LOOP
      UPDATE MOCONTRATOXITENS c
      SET c.quantidadeSaldo = c.quantidadeSaldo + b.quantidade
      WHERE c.idItemContrato = b.idItemContrato;
      DELETE MOCONTRATOXORCAMENTO c
      WHERE c.id = b.id;
    END LOOP;
    -- 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 MOORCAMENTOXTAREFAS b
      WHERE b.idAtividadePrevOrcamento > 0
      AND EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV c
        WHERE c.idAtividadePrevOrcamento = b.idAtividadePrevOrcamento
        AND c.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_CAB_ETAPA_TROCA (
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_378_calcularVolumes   IN NUMBER,
  p_orcamento                    IN NUMBER,
  p_usuario                      IN NUMBER,
  p_novaEtapaOrcamento           IN NUMBER,
  p_justificativaCancelamento    IN VARCHAR,
  p_cancelandoOrcamento          IN NUMBER,
  p_colaboradorRespRecebimento   IN NUMBER,
  /* Retornos */
  r_cab_etapaOrcamento           OUT NUMBER,
  r_etOrc_descricao              OUT VARCHAR,
  r_etOrc_situacaoOrcamento      OUT NUMBER,
  r_etOrc_financeiro             OUT CHAR,
  r_etOrc_habilitaImprimirManual OUT NUMBER)
IS
  v_auxNumber  NUMBER;
  v_auxVarchar VARCHAR2 (32000);
BEGIN
  SELECT
    descricao,
    situacaoOrcamento,
    financeiro,
    habilitaImprimirManual
  INTO
    r_etOrc_descricao,
    r_etOrc_situacaoOrcamento,
    r_etOrc_financeiro,
    r_etOrc_habilitaImprimirManual
  FROM PAETAPASORCAMENTO
  WHERE etapaOrcamento = p_novaEtapaOrcamento;
  SELECT etapaOrcamento
  INTO r_cab_etapaOrcamento
  FROM MOORCAMENTOS
  WHERE orcamento = p_orcamento;
  IF r_cab_etapaOrcamento <> p_novaEtapaOrcamento THEN
    IF p_cancelandoOrcamento = 1
      OR r_etOrc_situacaoOrcamento = 90
    THEN
      IF NOT (p_justificativaCancelamento IS NULL)
        AND p_justificativaCancelamento <> ' '
      THEN
        ADD_ORCAMENTO_INFO_CRIA (
          p_estabelecimentoAtivo,
          p_orcamento,
          0,
          0,
          0,
          0,
          p_justificativaCancelamento);
      END IF;
      FOR a IN (
        SELECT idItemOrcamento
        FROM MOORCAMENTOXITENS
        WHERE orcamento = p_orcamento
        AND cancelado = 0)
      LOOP
        ADD_ORCAMENTO_ITEM_EXCLUI (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_person_190_modeloFrete,
          p_config_378_calcularVolumes,
          0,
          a.idItemOrcamento,
          'C',
          1,
          v_auxVarchar,
          v_auxNumber);
      END LOOP;
      FOR a IN (
        SELECT idPagamentoOrcamento
        FROM MOORCAMENTOXPAGAMENTOS
        WHERE orcamento = p_orcamento)
      LOOP
        ADD_ORCAMENTO_PAG_EXCLUI_CORR (a.idPagamentoOrcamento);
        UPDATE MOORCAMENTOXPAGAMENTOS b
        SET b.saldoEfetivar = 0
        WHERE b.idPagamentoOrcamento = a.idPagamentoOrcamento;
      END LOOP;
    ELSIF r_etOrc_situacaoOrcamento <= 30 THEN
      FOR a IN (
        SELECT b.entrega
        FROM MOORCAMENTOXITENS a
        JOIN MOENTREGAS b
        ON b.idItemOrcamento = a.idItemOrcamento
        WHERE a.orcamento = p_orcamento
        AND a.cancelado = 0
        AND b.situacaoEntrega <= 4)
      LOOP
        ADD_ENTREGA_EXCLUI (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          a.entrega,
          0,
          'ADD_ORCAMENTO_CAB_ETAPA_TROCA');
      END LOOP;
    END IF;
    UPDATE MOORCAMENTOS
    SET etapaOrcamento = p_novaEtapaOrcamento
    WHERE orcamento = p_orcamento;
    r_cab_etapaOrcamento := p_novaEtapaOrcamento;    
    ADD_ORCAMENTO_CAB_ETAPA_CRIA (
      p_usuarioLogado,
      p_estabelecimentoAtivo,
      p_orcamento,
      p_usuario,
      p_novaEtapaOrcamento,
      ' ');
  END IF;
  ADD_ORCAMENTO_CAB_RESERVA_GRAV (
    p_orcamento,
    p_estabelecimentoAtivo);
  IF NOT (r_etOrc_situacaoOrcamento IN(11,90))
    AND p_cancelandoOrcamento = 0
  THEN
    FOR a IN (
      SELECT itemTransf.documentoTransferencia
      FROM MODOCUMENTOTRANSFXITENS itemTransf
      JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
      ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
      JOIN MODOCTRANSFXORCAMENTOITEM transfXDoc
      ON transfXDoc.idItemDocTransferencia = itemTransf.idItemDocTransferencia
      JOIN MOORCAMENTOXITENS itemDoc
      ON itemDoc.idItemOrcamento = transfXDoc.idItemOrcamento
      WHERE itemDoc.orcamento = p_orcamento
      AND itemTransf.documentoTransferencia > 0
      AND transfXDoc.entradaSaidaOriginal = 'E'
      AND (cabTransf.colaboradorResponsavelRetirada = 0
        OR cabTransf.colaboradorResponsavelRecebim = 0)
      GROUP BY itemTransf.documentoTransferencia)
    LOOP
      ADD_DOCTRANSF_CAB_ENCERRA_REC (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        a.documentoTransferencia,
        p_colaboradorRespRecebimento);
    END LOOP;
  END IF;
END ADD_ORCAMENTO_CAB_ETAPA_TROCA;

/

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_config_413_obs_add_marca     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, 'F' Fatura Contrato, 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_atividadeProjeto        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_projeto                  VARCHAR2 (60);
  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_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.projeto,
    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_projeto,
    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_cab_projeto,
        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_config_413_obs_add_marca,
        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_atividadeProjeto,
        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
      SELECT COALESCE (MAX (sequencia),0) + 1
      INTO v_item_sequencia
      FROM MOORCAMENTOXITENS
      WHERE orcamento = p_item_orcamento;
      v_cab_ultimoVendedorItem := p_item_vendedor;
    END IF;
    IF v_item_cancelado = 0 THEN
      IF p_manterFinanceiro_Retotalizar <> 2 THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume + TRUNC(CASE WHEN p_item_controleQuantidade = 1 AND p_item_loteMultiplo <> 0 THEN p_item_quantidade / p_item_loteMultiplo ELSE p_item_quantidadeConvertida END,0);
        END IF;
        v_cab_pesoLiquido := v_cab_pesoLiquido + p_item_pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto + p_item_pesoBruto;
      END IF;
      v_cab_quantidade := v_cab_quantidade + p_item_quantidadeConvertida;
      IF v_prod_tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorServicos := v_cab_valorServicos + v_item_valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos + p_item_valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorProdutos := v_cab_valorProdutos + v_item_valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos + p_item_valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem + p_item_valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem + p_item_valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem + p_item_valorAdicFreteMarItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem + p_item_valorDespesasAduanItem;
      v_cab_valorFreteGeral := v_cab_valorFreteGeral + v_item_valorFreteGeral;
      v_cab_valorSeguroGeral := v_cab_valorSeguroGeral + p_item_valorSeguroGeral;
      v_cab_valorDescontoGeral := v_cab_valorDescontoGeral + v_item_valorDescontoGeral;
      v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral + p_item_valorOutrasDespesasGer;
      v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral + p_item_valorAdicFreteMarGeral;
      v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral + p_item_valorDespesasAduanGeral;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento + v_item_valorBasePagamento;
      IF p_item_usarPrecoAVista = 1
        AND v_item_geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo + v_item_valorProdutoServico - v_item_valorDescontoTotal + v_item_valorOutrasDespesasTot;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento + v_item_valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento + v_item_valorOutrasDespPagament;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento + v_item_valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal + v_item_valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal + v_item_valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal + v_item_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_item_valorOutrasDespesasTot;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal + v_item_valorAdicFreteMarTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal + v_item_valorDespesasAduanTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem + v_item_valorLiquidoItem;
    ELSE
      v_item_quantidadeSaldo := 0;
    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 = p_item_orcamento;
    IF p_item_idItemOrcamento > 0 THEN
      DELETE MOORCAMENTOXCOMPOSICOESPR compDoc
      WHERE compDoc.idItemOrcamento = p_item_idItemOrcamento
      AND EXISTS(
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.produto = comp.produto
        WHERE comp.composicaoPreco = compDoc.composicaoPreco
        AND gradProd.gradeProduto <> p_item_gradeProduto);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      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_413_obs_add_marca,
      ' ',
      0,
      'O',
      p_item_idItemOrcamento,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    MERGE INTO MOORCAMENTOXITENS a USING (
      SELECT
        r_item_idItemOrcamento         idItemOrcamento,
        p_item_orcamento               orcamento,
        v_item_sequencia               sequencia,
        v_item_cancelado               cancelado,
        p_item_pedidoCompraFornecedor  pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo sequenciaPedidoCompraFornec,
        p_item_ambiente                ambiente,
        p_item_ambienteObservacoes     ambienteObservacoes,
        p_item_modeloDocumento         modeloDocumento,
        p_item_estabelecimentoOriginal estabelecimentoOriginal,
        p_item_vendedor                vendedor,
        p_item_gradeProduto            gradeProduto,
        p_item_atividadeServico        atividadeServico,
        p_item_statusAtividadeServico  statusAtividadeServico,
        p_item_idFormulaTinta          idFormulaTinta,
        p_item_personalizacao          personalizacao,
        p_item_idLoteEstoque           idLoteEstoque,
        p_item_vinculoItemDocumento    vinculoItemDocumento,
        p_item_operacaoFiscal          operacaoFiscal,
        v_item_movimentaEstoque        movimentaEstoque,
        v_item_geraFinanceiro          geraFinanceiro,
        p_item_localEstoque            localEstoque,
        p_item_pessoaParticipante      pessoaParticipante,
        p_item_dataEntrega             dataEntrega,
        p_item_controleQuantidade      controleQuantidade,
        p_item_unidadeMedidaConversao  unidadeMedidaConversao,
        p_item_conversorQuantidade     conversorQuantidade,
        p_item_loteMinimo              loteMinimo,
        p_item_loteMultiplo            loteMultiplo,
        p_item_altura                  altura,
        p_item_largura                 largura,
        p_item_comprimento             comprimento,
        p_item_pecas                   pecas,
        p_item_quantidade              quantidade,
        p_item_quantidadeConvertida    quantidadeConvertida,
        v_item_quantidadeSaldo         quantidadeSaldo,
        p_item_controleEntrega         controleEntrega,
        p_item_pesoLiquido             pesoLiquido,
        p_item_pesoBruto               pesoBruto,
        p_item_tipoPreco               tipoPreco,
        p_item_tabelaPreco             tabelaPreco,
        p_item_precoSugestaoAPrazo     precoSugestaoAPrazo,
        p_item_precoSugestaoAVista     precoSugestaoAVista,
        p_item_precoDesconto           precoDesconto,
        p_item_precoMinimo             precoMinimo,
        p_item_usarPrecoAVista         usarPrecoAVista,
        p_item_precoUnitarioBruto      precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos acrescimoUnitarioComposicao,
        v_item_precoUnitario           precoUnitario,
        v_item_precoUnitarioConvertido precoUnitarioConvertido,
        v_item_valorProdutoServicoBrut valorProdutoServicoBruto,
        v_item_valorProdutoServico     valorProdutoServico,
        p_item_percDescontoItem        percDescontoItem,
        p_item_valorDescontoItem       valorDescontoItem,
        p_item_percAcrescimoItem       percAcrescimoItem,
        p_item_valorAcrescimoItem      valorAcrescimoItem,
        p_item_valorFreteItem          valorFreteItem,
        p_item_valorSeguroItem         valorSeguroItem,
        p_item_valorAdicFreteMarItem   valorAdicFreteMarinhaMerItem,
        p_item_valorDespesasAduanItem  valorDespesasAduaneirasItem,
        v_item_valorFreteGeral         valorFreteGeral,
        p_item_valorSeguroGeral        valorSeguroGeral,
        v_item_valorDescontoGeral      valorDescontoGeral,
        p_item_valorOutrasDespesasGer  valorOutrasDespesasGeral,
        p_item_valorAdicFreteMarGeral  valorAdicFreteMarinhaMerGeral,
        p_item_valorDespesasAduanGeral valorDespesasAduaneirasGeral,
        v_item_valorBasePagamento      valorBasePagamento,
        v_item_valorDescontoPagamento  valorDescontoPagamento,
        v_item_valorOutrasDespPagament valorOutrasDespesasPagamento,
        v_item_valorJurosPagamento     valorJurosPagamento,
        v_item_valorFreteTotal         valorFreteTotal,
        v_item_valorSeguroTotal        valorSeguroTotal,
        v_item_valorDescontoTotal      valorDescontoTotal,
        v_item_valorOutrasDespesasTot  valorOutrasDespesasTotal,
        v_item_valorAdicFreteMarTotal  valorAdicFreteMarinhaMerTotal,
        v_item_valorDespesasAduanTotal valorDespesasAduaneirasTotal,
        v_item_cfop                    cfop,
        v_item_indicadorISSQN          indicadorISSQN,
        v_item_aliquotaISSQN           aliquotaISSQN,
        v_item_retidoISSQN             retidoISSQN,
        v_item_tributadoForaMunicipio  tributadoForaMunicipio,
        v_item_incentivoFiscal         incentivoFiscal,
        v_item_listaServicos           listaServicos,
        v_item_cnae                    cnae,
        v_item_idServicoMunicipio      idServicoMunicipio,
        v_item_numeroProcessoAdministr numeroProcessoAdministrativo,
        v_item_baseISSQN               baseISSQN,
        v_item_valorISSQN              valorISSQN,
        v_item_retencaoIRRF            retencaoIRRF,
        v_item_baseRetIRRF             baseRetIRRF,
        v_item_valorRetIRRF            valorRetIRRF,
        v_item_retencaoINSS            retencaoINSS,
        v_item_baseRetINSS             baseRetINSS,
        v_item_valorRetINSS            valorRetINSS,
        v_item_retencaoPIS             retencaoPIS,
        v_item_baseRetPIS              baseRetPIS,
        v_item_valorRetPIS             valorRetPIS,
        v_item_retencaoCOFINS          retencaoCOFINS,
        v_item_baseRetCOFINS           baseRetCOFINS,
        v_item_valorRetCOFINS          valorRetCOFINS,
        v_item_retencaoCSLL            retencaoCSLL,
        v_item_baseRetCSLL             baseRetCSLL,
        v_item_valorRetCSLL            valorRetCSLL,
        v_item_retencaoOutros          retencaoOutros,
        v_item_baseRetOutros           baseRetOutros,
        v_item_valorRetOutros          valorRetOutros,
        v_item_aliquotaII              aliquotaII,
        v_item_baseII                  baseII,
        v_item_valorII                 valorII,
        v_item_aliquotaIOF             aliquotaIOF,
        v_item_baseIOF                 baseIOF,
        v_item_valorIOF                valorIOF,
        v_item_codigoEnquadramentoIPI  codigoEnquadramentoIPI,
        v_item_stIPI                   stIPI,
        v_item_aliquotaIPI             aliquotaIPI,
        v_item_valorAliquotaIPI        valorAliquotaIPI,
        v_item_baseIPI                 baseIPI,
        v_item_valorIPI                valorIPI,
        v_item_stPIS                   stPIS,
        v_item_aliquotaPIS             aliquotaPIS,
        v_item_valorAliquotaPIS        valorAliquotaPIS,
        v_item_basePIS                 basePIS,
        v_item_valorPIS                valorPIS,
        v_item_aliquotaPISST           aliquotaPISST,
        v_item_valorAliquotaPISST      valorAliquotaPISST,
        v_item_basePISST               basePISST,
        v_item_valorPISST              valorPISST,
        v_item_stCOFINS                stCOFINS,
        v_item_aliquotaCOFINS          aliquotaCOFINS,
        v_item_valorAliquotaCOFINS     valorAliquotaCOFINS,
        v_item_baseCOFINS              baseCOFINS,
        v_item_valorCOFINS             valorCOFINS,
        v_item_aliquotaCOFINSST        aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST   valorAliquotaCOFINSST,
        v_item_baseCOFINSST            baseCOFINSST,
        v_item_valorCOFINSST           valorCOFINSST,
        v_item_stSimplesNacional       stSimplesNacional,
        v_item_creditoSimplesNacional  creditoSimplesNacional,
        v_item_baseCreditoSimplesNac   baseCreditoSimplesNacional,
        v_item_valorCreditoSimplesNac  valorCreditoSimplesNacional,
        v_item_stICMS                  stICMS,
        v_item_modalBaseCalcICMS       modalidadeBaseCalcICMS,
        v_item_reducaoBaseICMS         reducaoBaseICMS,
        v_item_aliquotaICMS            aliquotaICMS,
        v_item_diferimentoICMS         diferimentoICMS,
        v_item_motivoDesoneracaoICMS   motivoDesoneracaoICMS,
        v_item_idBeneficio             idBeneficio,
        v_item_baseICMS                baseICMS,
        v_item_valorICMSOperacao       valorICMSOperacao,
        v_item_valorICMSDiferido       valorICMSDiferido,
        v_item_valorICMS               valorICMS,
        v_item_valorICMSDesoneracao    valorICMSDesoneracao,
        v_item_modalBaseCalcICMSST     modalidadeBaseCalcICMSST,
        v_item_margemValorAdicionadoST margemValorAdicionadoST,
        v_item_reducaoBaseST           reducaoBaseST,
        v_item_aliquotaICMSST          aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin aliquotaSTSuportConsFinal,
        v_item_baseICMSST              baseICMSST,
        v_item_valorICMSST             valorICMSST,
        v_item_baseICMSSTAnteriormente baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment valorICMSSTAnteriormente,
        v_item_valorICMSProprioSubstit valorICMSProprioSubstituto,
        v_item_reducaoBaseICMSEfetivo  reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo     aliquotaICMSEfetivo,
        v_item_baseICMSEfetivo         baseICMSEfetivo,
        v_item_valorICMSEfetivo        valorICMSEfetivo,
        v_item_aliquotaICMSUFDestinat  aliquotaICMSUFDestinatario,
        v_item_aliquotaICMSInterestad  aliquotaICMSInterestadual,
        v_item_partilhaICMSInterestad  partilhaICMSInterestadual,
        v_item_baseICMSUFDestinatario  baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente     baseICMSUFRemetente,
        v_item_valorICMSUFRemetente    valorICMSUFRemetente,
        v_item_aliquotaFCP             aliquotaFCP,
        v_item_baseFCP                 baseFCP,
        v_item_valorFCP                valorFCP,
        v_item_aliquotaFCPST           aliquotaFCPST,
        v_item_baseFCPST               baseFCPST,
        v_item_valorFCPST              valorFCPST,
        v_item_aliquotaFCPSTAnteriorm  aliquotaFCPSTAnteriormente,
        v_item_baseFCPSTAnteriormente  baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente valorFCPSTAnteriormente,
        v_item_aliquotaFCPUFDestinat   aliquotaFCPUFDestinatario,
        v_item_baseFCPUFDestinatario   baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario  valorFCPUFDestinatario,
        v_item_aliquotaEstImpFederais  aliquotaEstimadaImpFederais,
        v_item_aliquotaEstImpEstaduais aliquotaEstimadaImpEstaduais,
        v_item_aliquotaEstImpMunicipai aliquotaEstimadaImpMunicipais,
        v_item_baseEstimadaImpostos    baseEstimadaImpostos,
        v_item_valorEstImpFederais     valorEstimadoImpFederais,
        v_item_valorEstImpEstaduais    valorEstimadoImpEstaduais,
        v_item_valorEstImpMunicipais   valorEstimadoImpMunicipais,
        v_item_valorLiquidoItem        valorLiquidoItem,
        p_item_observacoesDigitadas    observacoesDigitadas,
        v_observacoes                  observacoes
      FROM DUAL) b
    ON (a.idItemOrcamento = b.idItemOrcamento)
    WHEN MATCHED THEN UPDATE SET
      a.orcamento                     = b.orcamento,
      a.sequencia                     = b.sequencia,
      a.cancelado                     = b.cancelado,
      a.pedidoCompraFornecedor        = b.pedidoCompraFornecedor,
      a.sequenciaPedidoCompraFornec   = b.sequenciaPedidoCompraFornec,
      a.ambiente                      = b.ambiente,
      a.ambienteObservacoes           = b.ambienteObservacoes,
      a.vendedor                      = b.vendedor,
      a.modeloDocumento               = b.modeloDocumento,
      a.estabelecimentoOriginal       = b.estabelecimentoOriginal,
      a.gradeProduto                  = b.gradeProduto,
      a.atividadeServico              = b.atividadeServico,
      a.statusAtividadeServico        = b.statusAtividadeServico,
      a.idFormulaTinta                = b.idFormulaTinta,
      a.personalizacao                = b.personalizacao,
      a.idLoteEstoque                 = b.idLoteEstoque,
      a.vinculoItemDocumento          = b.vinculoItemDocumento,
      a.operacaoFiscal                = b.operacaoFiscal,
      a.movimentaEstoque              = b.movimentaEstoque,
      a.geraFinanceiro                = b.geraFinanceiro,
      a.localEstoque                  = b.localEstoque,
      a.pessoaParticipante            = b.pessoaParticipante,
      a.dataEntrega                   = b.dataEntrega,
      a.controleQuantidade            = b.controleQuantidade,
      a.unidadeMedidaConversao        = b.unidadeMedidaConversao,
      a.conversorQuantidade           = b.conversorQuantidade,
      a.loteMinimo                    = b.loteMinimo,
      a.loteMultiplo                  = b.loteMultiplo,
      a.altura                        = b.altura,
      a.largura                       = b.largura,
      a.comprimento                   = b.comprimento,
      a.pecas                         = b.pecas,
      a.quantidade                    = b.quantidade,
      a.quantidadeConvertida          = b.quantidadeConvertida,
      a.quantidadeSaldo               = b.quantidadeSaldo,
      a.controleEntrega               = b.controleEntrega,
      a.pesoLiquido                   = b.pesoLiquido,
      a.pesoBruto                     = b.pesoBruto,
      a.tipoPreco                     = b.tipoPreco,
      a.tabelaPreco                   = b.tabelaPreco,
      a.precoSugestaoAPrazo           = b.precoSugestaoAPrazo,
      a.precoSugestaoAVista           = b.precoSugestaoAVista,
      a.precoDesconto                 = b.precoDesconto,
      a.precoMinimo                   = b.precoMinimo,
      a.usarPrecoAVista               = b.usarPrecoAVista,
      a.precoUnitarioBruto            = b.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao   = b.acrescimoUnitarioComposicao,
      a.precoUnitario                 = b.precoUnitario,
      a.precoUnitarioConvertido       = b.precounitarioConvertido,
      a.valorProdutoServicoBruto      = b.valorProdutoServicoBruto,
      a.valorProdutoServico           = b.valorProdutoServico,
      a.percDescontoItem              = b.percDescontoItem,
      a.valorDescontoItem             = b.valorDescontoItem,
      a.percAcrescimoItem             = b.percAcrescimoItem,
      a.valorAcrescimoItem            = b.valorAcrescimoItem,
      a.valorFreteItem                = b.valorFreteItem,
      a.valorSeguroItem               = b.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem  = b.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem   = b.valorDespesasAduaneirasItem,
      a.valorFreteGeral               = b.valorFreteGeral,
      a.valorSeguroGeral              = b.valorSeguroGeral,
      a.valorDescontoGeral            = b.valorDescontoGeral,
      a.valorOutrasDespesasGeral      = b.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral = b.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral  = b.valorDespesasAduaneirasGeral,
      a.valorBasePagamento            = b.valorBasePagamento,
      a.valorDescontoPagamento        = b.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento  = b.valorOutrasDespesasPagamento,
      a.valorJurosPagamento           = b.valorJurosPagamento,
      a.valorFreteTotal               = b.valorFreteTotal,
      a.valorSeguroTotal              = b.valorSeguroTotal,
      a.valorDescontoTotal            = b.valorDescontoTotal,
      a.valorOutrasDespesasTotal      = b.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal = b.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal  = b.valorDespesasAduaneirasTotal,
      a.cfop                          = b.cfop,
      a.indicadorISSQN                = b.indicadorISSQN,
      a.aliquotaISSQN                 = b.aliquotaISSQN,
      a.baseISSQN                     = b.baseISSQN,
      a.valorISSQN                    = b.valorISSQN,
      a.retidoISSQN                   = b.retidoISSQN,
      a.tributadoForaMunicipio        = b.tributadoForaMunicipio,
      a.incentivoFiscal               = b.incentivoFiscal,
      a.listaServicos                 = b.listaServicos,
      a.cnae                          = b.cnae,
      a.idServicoMunicipio            = b.idServicoMunicipio,
      a.numeroProcessoAdministrativo  = b.numeroProcessoAdministrativo,
      a.retencaoIRRF                  = b.retencaoIRRF,
      a.baseRetIRRF                   = b.baseRetIRRF,
      a.valorRetIRRF                  = b.valorRetIRRF,
      a.retencaoINSS                  = b.retencaoINSS,
      a.baseRetINSS                   = b.baseRetINSS,
      a.valorRetINSS                  = b.valorRetINSS,
      a.retencaoPIS                   = b.retencaoPIS,
      a.baseRetPIS                    = b.baseRetPIS,
      a.valorRetPIS                   = b.valorRetPIS,
      a.retencaoCOFINS                = b.retencaoCOFINS,
      a.baseRetCOFINS                 = b.baseRetCOFINS,
      a.valorRetCOFINS                = b.valorRetCOFINS,
      a.retencaoCSLL                  = b.retencaoCSLL,
      a.baseRetCSLL                   = b.baseRetCSLL,
      a.valorRetCSLL                  = b.valorRetCSLL,
      a.retencaoOutros                = b.retencaoOutros,
      a.baseRetOutros                 = b.baseRetOutros,
      a.valorRetOutros                = b.valorRetOutros,
      a.aliquotaII                    = b.aliquotaII,
      a.baseII                        = b.baseII,
      a.valorII                       = b.valorII,
      a.aliquotaIOF                   = b.aliquotaIOF,
      a.baseIOF                       = b.baseIOF,
      a.valorIOF                      = b.valorIOF,
      a.codigoEnquadramentoIPI        = b.codigoEnquadramentoIPI,
      a.stIPI                         = b.stIPI,
      a.aliquotaIPI                   = b.aliquotaIPI,
      a.valorAliquotaIPI              = b.valorAliquotaIPI,
      a.baseIPI                       = b.baseIPI,
      a.valorIPI                      = b.valorIPI,
      a.stPIS                         = b.stPIS,
      a.aliquotaPIS                   = b.aliquotaPIS,
      a.valorAliquotaPIS              = b.valorAliquotaPIS,
      a.basePIS                       = b.basePIS,
      a.valorPIS                      = b.valorPIS,
      a.aliquotaPISST                 = b.aliquotaPISST,
      a.valorAliquotaPISST            = b.valorAliquotaPISST,
      a.basePISST                     = b.basePISST,
      a.valorPISST                    = b.valorPISST,
      a.stCOFINS                      = b.stCOFINS,
      a.aliquotaCOFINS                = b.aliquotaCOFINS,
      a.valorAliquotaCOFINS           = b.valorAliquotaCOFINS,
      a.baseCOFINS                    = b.baseCOFINS,
      a.valorCOFINS                   = b.valorCOFINS,
      a.aliquotaCOFINSST              = b.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST         = b.valorAliquotaCOFINSST,
      a.baseCOFINSST                  = b.baseCOFINSST,
      a.valorCOFINSST                 = b.valorCOFINSST,
      a.stSimplesNacional             = b.stSimplesNacional,
      a.creditoSimplesNacional        = b.creditoSimplesNacional,
      a.baseCreditoSimplesNacional    = b.baseCreditoSimplesNacional,
      a.valorCreditoSimplesNacional   = b.valorCreditoSimplesNacional,
      a.stICMS                        = b.stICMS,
      a.modalidadeBaseCalcICMS        = b.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS               = b.reducaoBaseICMS,
      a.aliquotaICMS                  = b.aliquotaICMS,
      a.diferimentoICMS               = b.diferimentoICMS,
      a.motivoDesoneracaoICMS         = b.motivoDesoneracaoICMS,
      a.idBeneficio                   = b.idBeneficio,
      a.baseICMS                      = b.baseICMS,
      a.valorICMSoperacao             = b.valorICMSoperacao,
      a.valorICMSdiferido             = b.valorICMSdiferido,
      a.valorICMS                     = b.valorICMS,
      a.valorICMSdesoneracao          = b.valorICMSdesoneracao,
      a.modalidadeBaseCalcICMSST      = b.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST       = b.margemValorAdicionadoST,
      a.reducaoBaseST                 = b.reducaoBaseST,
      a.aliquotaICMSST                = b.aliquotaICMSST,
      a.aliquotaSTSuportConsFinal     = b.aliquotaSTSuportConsFinal,
      a.baseICMSST                    = b.baseICMSST,
      a.valorICMSST                   = b.valorICMSST,
      a.baseICMSSTAnteriormente       = b.baseICMSSTAnteriormente,
      a.valorICMSSTAnteriormente      = b.valorICMSSTAnteriormente,
      a.valorICMSProprioSubstituto    = b.valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo        = b.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo           = b.aliquotaICMSEfetivo,
      a.baseICMSEfetivo               = b.baseICMSEfetivo,
      a.valorICMSEfetivo              = b.valorICMSEfetivo,
      a.aliquotaICMSUFDestinatario    = b.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual     = b.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual     = b.partilhaICMSInterestadual,
      a.baseICMSUFDestinatario        = b.baseICMSUFDestinatario,
      a.valorICMSUFDestinatario       = b.valorICMSUFDestinatario,
      a.baseICMSUFRemetente           = b.baseICMSUFRemetente,
      a.valorICMSUFRemetente          = b.valorICMSUFRemetente,
      a.aliquotaFCP                   = b.aliquotaFCP,
      a.baseFCP                       = b.baseFCP,
      a.valorFCP                      = b.valorFCP,
      a.aliquotaFCPST                 = b.aliquotaFCPST,
      a.baseFCPST                     = b.baseFCPST,
      a.valorFCPST                    = b.valorFCPST,
      a.aliquotaFCPSTAnteriormente    = b.aliquotaFCPSTAnteriormente,
      a.baseFCPSTAnteriormente        = b.baseFCPSTAnteriormente,
      a.valorFCPSTAnteriormente       = b.valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario     = b.aliquotaFCPUFDestinatario,
      a.baseFCPUFDestinatario         = b.baseFCPUFDestinatario,
      a.valorFCPUFDestinatario        = b.valorFCPUFDestinatario,
      a.aliquotaestimadaimpfederais   = b.aliquotaestimadaimpfederais,
      a.aliquotaestimadaimpestaduais  = b.aliquotaestimadaimpestaduais,
      a.aliquotaestimadaimpmunicipais = b.aliquotaestimadaimpmunicipais,
      a.baseestimadaimpostos          = b.baseestimadaimpostos,
      a.valorestimadoimpfederais      = b.valorestimadoimpfederais,
      a.valorEstimadoImpEstaduais     = b.valorEstimadoImpEstaduais,
      a.valorEstimadoImpMunicipais    = b.valorEstimadoImpMunicipais,
      a.valorLiquidoItem              = b.valorLiquidoItem,
      a.observacoesDigitadas          = b.observacoesDigitadas,
      a.observacoes                   = b.observacoes
    WHEN NOT MATCHED THEN INSERT (
      idItemOrcamento,
      orcamento,
      sequencia,
      cancelado,
      pedidoCompraFornecedor,
      sequenciaPedidoCompraFornec,
      ambiente,
      ambienteObservacoes,
      modeloDocumento,
      estabelecimentoOriginal,
      vendedor,
      gradeProduto,
      atividadeServico,
      statusAtividadeServico,
      idFormulaTinta,
      personalizacao,
      idLoteEstoque,
      vinculoItemDocumento,
      operacaoFiscal,
      movimentaEstoque,
      geraFinanceiro,
      localEstoque,
      pessoaParticipante,
      dataEntrega,
      controleQuantidade,
      unidadeMedidaConversao,
      conversorQuantidade,
      loteMinimo,
      loteMultiplo,
      altura,
      largura,
      comprimento,
      pecas,
      quantidade,
      quantidadeConvertida,
      quantidadeSaldo,
      controleEntrega,
      pesoLiquido,
      pesoBruto,
      tipoPreco,
      tabelaPreco,
      precoSugestaoAPrazo,
      precoSugestaoAVista,
      precoDesconto,
      precoMinimo,
      usarPrecoAVista,
      precoUnitarioBruto,
      acrescimoUnitarioComposicao,
      precoUnitario,
      precoUnitarioConvertido,
      valorProdutoServicoBruto,
      valorProdutoServico,
      percDescontoItem,
      valorDescontoItem,
      percAcrescimoItem,
      valorAcrescimoItem,
      valorFreteItem,
      valorSeguroItem,
      valorAdicFreteMarinhaMerItem,
      valorDespesasAduaneirasItem,
      valorFreteGeral,
      valorSeguroGeral,
      valorDescontoGeral,
      valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral,
      valorDespesasAduaneirasGeral,
      valorBasePagamento,
      valorDescontoPagamento,
      valorOutrasDespesasPagamento,
      valorJurosPagamento,
      valorFreteTotal,
      valorSeguroTotal,
      valorDescontoTotal,
      valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal,
      valorDespesasAduaneirasTotal,
      cfop,
      indicadorISSQN,
      aliquotaISSQN,
      retidoISSQN,
      tributadoForaMunicipio,
      incentivoFiscal,
      listaServicos,
      cnae,
      idServicoMunicipio,
      numeroProcessoAdministrativo,
      baseISSQN,
      valorISSQN,
      retencaoIRRF,
      baseRetIRRF,
      valorRetIRRF,
      retencaoINSS,
      baseRetINSS,
      valorRetINSS,
      retencaoPIS,
      baseRetPIS,
      valorRetPIS,
      retencaoCOFINS,
      baseRetCOFINS,
      valorRetCOFINS,
      retencaoCSLL,
      baseRetCSLL,
      valorRetCSLL,
      retencaoOutros,
      baseRetOutros,
      valorRetOutros,
      aliquotaII,
      baseII,
      valorII,
      aliquotaIOF,
      baseIOF,
      valorIOF,
      codigoEnquadramentoIPI,
      stIPI,
      aliquotaIPI,
      valorAliquotaIPI,
      baseIPI,
      valorIPI,
      stPIS,
      aliquotaPIS,
      valorAliquotaPIS,
      basePIS,
      valorPIS,
      aliquotaPISST,
      valorAliquotaPISST,
      basePISST,
      valorPISST,
      stCOFINS,
      aliquotaCOFINS,
      valorAliquotaCOFINS,
      baseCOFINS,
      valorCOFINS,
      aliquotaCOFINSST,
      valorAliquotaCOFINSST,
      baseCOFINSST,
      valorCOFINSST,
      stSimplesNacional,
      creditoSimplesNacional,
      baseCreditoSimplesNacional,
      valorCreditoSimplesNacional,
      stICMS,
      modalidadeBaseCalcICMS,
      reducaoBaseICMS,
      aliquotaICMS,
      diferimentoICMS,
      motivoDesoneracaoICMS,
      idBeneficio,
      baseICMS,
      valorICMSOperacao,
      valorICMSDiferido,
      valorICMS,
      valorICMSDesoneracao,
      modalidadeBaseCalcICMSST,
      margemValorAdicionadoST,
      reducaoBaseST,
      aliquotaICMSST,
      aliquotaSTSuportConsFinal,
      baseICMSST,
      valorICMSST,
      baseICMSSTAnteriormente,
      valorICMSSTAnteriormente,
      valorICMSProprioSubstituto,
      reducaoBaseICMSEfetivo,
      aliquotaICMSEfetivo,
      baseICMSEfetivo,
      valorICMSEfetivo,
      aliquotaICMSUFDestinatario,
      aliquotaICMSInterestadual,
      partilhaICMSInterestadual,
      baseICMSUFDestinatario,
      valorICMSUFDestinatario,
      baseICMSUFRemetente,
      valorICMSUFRemetente,
      aliquotaFCP,
      baseFCP,
      valorFCP,
      aliquotaFCPST,
      baseFCPST,
      valorFCPST,
      aliquotaFCPSTAnteriormente,
      baseFCPSTAnteriormente,
      valorFCPSTAnteriormente,
      aliquotaFCPUFDestinatario,
      baseFCPUFDestinatario,
      valorFCPUFDestinatario,
      aliquotaEstimadaImpFederais,
      aliquotaEstimadaImpEstaduais,
      aliquotaEstimadaImpMunicipais,
      baseEstimadaImpostos,
      valorEstimadoImpFederais,
      valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais,
      valorLiquidoItem,
      observacoesDigitadas,
      observacoes)
    VALUES (
      b.idItemOrcamento,
      b.orcamento,
      b.sequencia,
      b.cancelado,
      b.pedidoCompraFornecedor,
      b.sequenciaPedidoCompraFornec,
      b.ambiente,
      b.ambienteObservacoes,
      b.modeloDocumento,
      b.estabelecimentoOriginal,
      b.vendedor,
      b.gradeProduto,
      b.atividadeServico,
      b.statusAtividadeServico,
      b.idFormulaTinta,
      b.personalizacao,
      b.idLoteEstoque,
      b.vinculoItemDocumento,
      b.operacaoFiscal,
      b.movimentaEstoque,
      b.geraFinanceiro,
      b.localEstoque,
      b.pessoaParticipante,
      b.dataEntrega,
      b.controleQuantidade,
      b.unidadeMedidaConversao,
      b.conversorQuantidade,
      b.loteMinimo,
      b.loteMultiplo,
      b.altura,
      b.largura,
      b.comprimento,
      b.pecas,
      b.quantidade,
      b.quantidadeConvertida,
      b.quantidadeSaldo,
      b.controleEntrega,
      b.pesoLiquido,
      b.pesoBruto,
      b.tipoPreco,
      b.tabelaPreco,
      b.precoSugestaoAPrazo,
      b.precoSugestaoAVista,
      b.precoDesconto,
      b.precoMinimo,
      b.usarPrecoAVista,
      b.precoUnitarioBruto,
      b.acrescimoUnitarioComposicao,
      b.precoUnitario,
      b.precoUnitarioConvertido,
      b.valorProdutoServicoBruto,
      b.valorProdutoServico,
      b.percDescontoItem,
      b.valorDescontoItem,
      b.percAcrescimoItem,
      b.valorAcrescimoItem,
      b.valorFreteItem,
      b.valorSeguroItem,
      b.valorAdicFreteMarinhaMerItem,
      b.valorDespesasAduaneirasItem,
      b.valorFreteGeral,
      b.valorSeguroGeral,
      b.valorDescontoGeral,
      b.valorOutrasDespesasGeral,
      b.valorAdicFreteMarinhaMerGeral,
      b.valorDespesasAduaneirasGeral,
      b.valorBasePagamento,
      b.valorDescontoPagamento,
      b.valorOutrasDespesasPagamento,
      b.valorJurosPagamento,
      b.valorFreteTotal,
      b.valorSeguroTotal,
      b.valorDescontoTotal,
      b.valorOutrasDespesasTotal,
      b.valorAdicFreteMarinhaMerTotal,
      b.valorDespesasAduaneirasTotal,
      b.cfop,
      b.indicadorISSQN,
      b.aliquotaISSQN,
      b.retidoISSQN,
      b.tributadoForaMunicipio,
      b.incentivoFiscal,
      b.listaServicos,
      b.cnae,
      b.idServicoMunicipio,
      b.numeroProcessoAdministrativo,
      b.baseISSQN,
      b.valorISSQN,
      b.retencaoIRRF,
      b.baseRetIRRF,
      b.valorRetIRRF,
      b.retencaoINSS,
      b.baseRetINSS,
      b.valorRetINSS,
      b.retencaoPIS,
      b.baseRetPIS,
      b.valorRetPIS,
      b.retencaoCOFINS,
      b.baseRetCOFINS,
      b.valorRetCOFINS,
      b.retencaoCSLL,
      b.baseRetCSLL,
      b.valorRetCSLL,
      b.retencaoOutros,
      b.baseRetOutros,
      b.valorRetOutros,
      b.aliquotaII,
      b.baseII,
      b.valorII,
      b.aliquotaIOF,
      b.baseIOF,
      b.valorIOF,
      b.codigoEnquadramentoIPI,
      b.stIPI,
      b.aliquotaIPI,
      b.valorAliquotaIPI,
      b.baseIPI,
      b.valorIPI,
      b.stPIS,
      b.aliquotaPIS,
      b.valorAliquotaPIS,
      b.basePIS,
      b.valorPIS,
      b.aliquotaPISST,
      b.valorAliquotaPISST,
      b.basePISST,
      b.valorPISST,
      b.stCOFINS,
      b.aliquotaCOFINS,
      b.valorAliquotaCOFINS,
      b.baseCOFINS,
      b.valorCOFINS,
      b.aliquotaCOFINSST,
      b.valorAliquotaCOFINSST,
      b.baseCOFINSST,
      b.valorCOFINSST,
      b.stSimplesNacional,
      b.creditoSimplesNacional,
      b.baseCreditoSimplesNacional,
      b.valorCreditoSimplesNacional,
      b.stICMS,
      b.modalidadeBaseCalcICMS,
      b.reducaoBaseICMS,
      b.aliquotaICMS,
      b.diferimentoICMS,
      b.motivoDesoneracaoICMS,
      b.idBeneficio,
      b.baseICMS,
      b.valorICMSOperacao,
      b.valorICMSDiferido,
      b.valorICMS,
      b.valorICMSDesoneracao,
      b.modalidadeBaseCalcICMSST,
      b.margemValorAdicionadoST,
      b.reducaoBaseST,
      b.aliquotaICMSST,
      b.aliquotaSTSuportConsFinal,
      b.baseICMSST,
      b.valorICMSST,
      b.baseICMSSTAnteriormente,
      b.valorICMSSTAnteriormente,
      b.valorICMSProprioSubstituto,
      b.reducaoBaseICMSEfetivo,
      b.aliquotaICMSEfetivo,
      b.baseICMSEfetivo,
      b.valorICMSEfetivo,
      b.aliquotaICMSUFDestinatario,
      b.aliquotaICMSInterestadual,
      b.partilhaICMSInterestadual,
      b.baseICMSUFDestinatario,
      b.valorICMSUFDestinatario,
      b.baseICMSUFRemetente,
      b.valorICMSUFRemetente,
      b.aliquotaFCP,
      b.baseFCP,
      b.valorFCP,
      b.aliquotaFCPST,
      b.baseFCPST,
      b.valorFCPST,
      b.aliquotaFCPSTAnteriormente,
      b.baseFCPSTAnteriormente,
      b.valorFCPSTAnteriormente,
      b.aliquotaFCPUFDestinatario,
      b.baseFCPUFDestinatario,
      b.valorFCPUFDestinatario,
      b.aliquotaEstimadaImpFederais,
      b.aliquotaEstimadaImpEstaduais,
      b.aliquotaEstimadaImpMunicipais,
      b.baseEstimadaImpostos,
      b.valorEstimadoImpFederais,
      b.valorEstimadoImpEstaduais,
      b.valorEstimadoImpMunicipais,
      b.valorLiquidoItem,
      b.observacoesDigitadas,
      b.observacoes);
    IF p_item_idItemOrcamento <= 0
      AND v_item_cancelado = 0
      AND p_item_atividadeServico > 0
    THEN
      SELECT habilitaAtividadePrevista
      INTO v_ativServ_habilitaAtivPrev
      FROM PAATIVIDADESSERVICO
      WHERE atividadeServico = p_item_atividadeServico;
      IF v_ativServ_habilitaAtivPrev = 1 THEN
        ADD_ORCAMENTO_ITEM_PREV_INSERE (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          r_item_idItemOrcamento,
          p_item_atividadeServico);
      END IF;
    END IF;
    v_atualizarObservacoes := 0;
    IF p_idItemReferenciado > 0 THEN
      IF p_tipoDocumentoReferenciado = 'C' THEN
        UPDATE MOPAINELCOMPRAXGRADE
        SET idItemOrcamento = r_item_idItemOrcamento
        WHERE idGradePainelCompra = p_idItemReferenciado;
      ELSIF p_tipoDocumentoReferenciado = 'F' THEN
        ADD_ORCAMENTO_ITEM_REF_CONTR (
          p_estabelecimentoAtivo,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      ELSIF p_tipoDocumentoReferenciado = 'L' THEN
        ADD_ORCAMENTO_ITEM_LISTA_GRAVA (
          p_estabelecimentoAtivo,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      ELSIF p_tipoDocumentoReferenciado = 'O' THEN
        ADD_ORCAMENTO_ITEM_REF_ORCAMEN (
          p_estabelecimentoAtivo,
          r_item_idItemOrcamento,
          p_item_quantidade,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'T' THEN
        ADD_ORCAMENTO_ITEM_TRANS_GRAVA (
          p_estabelecimentoAtivo,
          v_cab_entradaSaida,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      END IF;
    END IF;
    IF p_tempComp_nomeTempComposicao <> ' '
      AND (p_tipoDocumentoReferenciado <> 'O'
        OR p_idItemReferenciado <= 0)
    THEN
      ADD_ORCAMENTO_ITEM_COMP_TEMP (
        p_sessaoClient,
        p_estabelecimentoAtivo,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        r_item_idItemOrcamento,
        v_atualizarObservacoes,
        v_atualizarObservacoes);
    END IF;
    v_idEnderecoEstoque := 0;
    IF p_item_idEnderecoEstoque > 0 THEN
      ADD_ORCAMENTO_ITEM_ENDER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemOrcamento,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_quantidade,
        ' ',
        v_idEnderecoEstoque);
    END IF;
    IF p_item_idNumeroSerie > 0 THEN
      ADD_ORCAMENTO_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemOrcamento,
        v_idEnderecoEstoque,
        p_item_gradeProduto,
        p_item_idNumeroSerie,
        0,
        v_auxNumber);
      v_atualizarObservacoes := 1;
    END IF;
    IF p_item_atividadeProjeto > 0 THEN
      ADD_ORCAMENTO_ITEM_PROJ_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemOrcamento,
        p_item_atividadeProjeto,
        v_auxNumber);
    END IF;
    IF v_atualizarObservacoes = 1 THEN
      v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
        p_sessaoClient,
        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_413_obs_add_marca,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        'O',
        r_item_idItemOrcamento,
        p_item_gradeProduto,
        p_item_idFormulaTinta,
        p_item_personalizacao,
        p_item_idLoteEstoque,
        p_item_controleQuantidade,
        p_item_loteMultiplo,
        p_item_altura,
        p_item_largura,
        p_item_comprimento,
        p_item_quantidade,
        p_item_observacoesDigitadas);
      UPDATE MOORCAMENTOXITENS
      SET observacoes = v_observacoes
      WHERE idItemOrcamento = r_item_idItemOrcamento;
    END IF;
    IF v_etOrc_situacaoOrcamento > 40 THEN
      ADD_ORCAMENTO_ITEM_RES_ITEM (
        r_item_idItemOrcamento,
        p_estabelecimentoAtivo,
        ' ',
        v_auxVarchar);
    END IF;
    r_buffer_idItemOrcamento := CASE WHEN (r_buffer_idItemOrcamento IS NULL OR r_buffer_idItemOrcamento = '' OR r_buffer_idItemOrcamento = ' ') THEN '' ELSE RTRIM (r_buffer_idItemOrcamento) || ';' END || TO_CHAR (LPAD(r_item_idItemOrcamento,14,'0'));
    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;
  END IF;
END ADD_ORCAMENTO_ITEM_GRAVA;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_REF_DFE_GRAD (
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_config_230_etapaPedComprParc IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_cab_idDocumentoFiscal        IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_documentoFiscal          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_sequencia               IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  p_gradeDistribuicaoDFe         IN NUMBER,
  p_atualizarObservacoes         IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes         OUT NUMBER)
IS
  v_novaEtapaOrcamento NUMBER;
  v_quantidadeSaldo    NUMBER;
  v_auxNumber          NUMBER;
  v_auxChar            CHAR (1);
  v_auxVarchar         VARCHAR2 (32000);
BEGIN
  FOR a IN (
    SELECT
      a.idItemOrcamento,
      a.quantidadeSaldo,
      a.quantidadeBaixar,
      a.zerarSaldo,
      b.orcamento
    FROM MODISTRIBUICAODFEXORCAM a
    JOIN MOORCAMENTOXITENS b
    ON b.idItemOrcamento = a.idItemOrcamento
    WHERE a.gradeDistribuicaoDFe = p_gradeDistribuicaoDFe
    AND a.quantidadeBaixar > 0
    ORDER BY a.sequencia)
  LOOP
    UPDATE MODISTRIBUICAODFEXGRADE
    SET idItemDocFiscal = p_item_idItemDocFiscal
    WHERE gradeDistribuicaoDFe = p_gradeDistribuicaoDFe;
    ADD_DOC_FISC_ITEM_REF_ORCAMEN (
      p_usuarioLogado,
      p_estabelecimentoAtivo,
      p_config_227_manterPessoaOrcam,
      p_cab_idDocumentoFiscal,
      p_cab_tipoDocumento,
      p_cab_documentoFiscal,
      p_cab_estabelecimento,
      p_cab_pessoa,
      p_item_idItemDocFiscal,
      p_item_sequencia,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_unidadeMedidaConversao,
      p_item_quantidadeConvertida,
      p_item_valorLiquidoItem,
      a.idItemOrcamento,
      CASE WHEN a.zerarSaldo = 1 THEN a.quantidadeSaldo ELSE a.quantidadeBaixar END,
      r_atualizarObservacoes,
      r_atualizarObservacoes);  
    SELECT COALESCE (SUM(b.quantidadeSaldo),0)
    INTO v_quantidadeSaldo
    FROM MOORCAMENTOXITENS b
    WHERE b.orcamento = a.orcamento
    AND b.cancelado = 0;
    IF v_quantidadeSaldo <= 0 THEN
      SELECT COALESCE(MAX(etapaOrcamento),0)
      INTO v_novaEtapaOrcamento
      FROM PAETAPASORCAMENTO
      WHERE etapaOrcamento > 0
      AND ativo = 1
      AND situacaoOrcamento = 80;      
      ADD_ORCAMENTO_CAB_ETAPA_TROCA (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        p_person_190_modeloFrete,
        p_config_378_calcularVolumes,
        a.orcamento,
        p_usuarioLogado,
        v_novaEtapaOrcamento,
        ' ',
        0,
        0,
        v_auxNumber,
        v_auxVarchar,
        v_auxNumber,
        v_auxChar,
        v_auxNumber);
    ELSE
      v_novaEtapaOrcamento := p_config_230_etapaPedComprParc;
    END IF;  
    IF v_novaEtapaOrcamento <> 0 THEN
      ADD_ORCAMENTO_CAB_ETAPA_TROCA (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        p_person_190_modeloFrete,
        p_config_378_calcularVolumes,
        a.orcamento,
        p_usuarioLogado,
        v_novaEtapaOrcamento,
        ' ',
        0,
        0,
        v_auxNumber,
        v_auxVarchar,
        v_auxNumber,
        v_auxChar,
        v_auxNumber);
    END IF;
  END LOOP;
END ADD_DOC_FISC_ITEM_REF_DFE_GRAD;

/

create or replace PROCEDURE ADD_DOC_FISC_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_227_manterPessoaOrcam IN NUMBER,
  p_config_230_etapaPedComprParc IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     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, -- B = Balanço, D = Documento Fiscal, G = Grade DF-e, O = Orçamento, P, Pré-Documento, T = Transferência
  p_idItemReferenciado           IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_tempComp_nomeTempComposicao  IN VARCHAR2,
  p_tempComp_sequencia           IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_idDocumentoFiscal       IN NUMBER,
  p_item_pedidoCompraFornecedor  IN VARCHAR2,
  p_item_sequenciaPedidoCompraFo IN NUMBER,
  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_quantidadeExtemporanea  IN NUMBER,
  p_item_acrescimoUnitarioExtemp IN NUMBER,
  p_item_valorAcrescimoExtempIte IN NUMBER,
  p_item_valorDescontoCustoOpIte IN NUMBER,
  p_item_valorAcrescimoCustoOpIt 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_valorAcrescimoExtempGer IN NUMBER,
  p_item_valorDescontoCustoOpGer IN NUMBER,
  p_item_valorAcrescimoCustoOpGe IN NUMBER,
  p_item_valorDescontoPagamento  IN NUMBER,
  p_item_valorOutrasDespPagament IN NUMBER,
  p_item_valorJurosPagamento     IN NUMBER,
  p_item_percentualDevolucao     IN NUMBER,
  p_item_valorIPIDevolucao       IN NUMBER,
  p_item_operacaoFiscal          IN NUMBER,
  p_item_movimentaEstoque        IN NUMBER,
  p_item_movimentaEstoqueFiscal  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_stICMSEscrituracao      IN CHAR,
  p_item_reducaoBaseICMSEscritur IN NUMBER,
  p_item_aliquotaICMSEscrituraca IN NUMBER,
  p_item_diferimentoICMSEscritur IN NUMBER,
  p_item_margemValorAdicSTEscrit IN NUMBER,
  p_item_reducaoBaseSTEscriturac IN NUMBER,
  p_item_aliquotaICMSSTEscritura IN NUMBER,
  p_item_somarICMSST             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_baseICMSEscrituracao    IN NUMBER,
  p_item_valorICMSEscrituracao   IN NUMBER,
  p_item_valorICMSDesonEscritura IN NUMBER,
  p_item_baseICMSSTEscrituracao  IN NUMBER,
  p_item_valorICMSSTEscrituracao 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_idItemDocFiscal       IN VARCHAR2,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER,
  r_item_idItemDocFiscal         OUT NUMBER,
  r_buffer_idItemDocFiscal       OUT VARCHAR2,
  r_valorInserido                OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_finalidadeNota           CHAR (1);
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_nfFornecedor             NUMBER;
  v_cab_documentoFiscal          NUMBER;
  v_cab_estabelecimento          NUMBER;
  v_cab_dataEmissao              DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_vendaConsumidor          NUMBER;
  v_cab_enderecoEntregaPessoa    NUMBER;
  v_cab_municipioFatoGerador     NUMBER;
  v_cab_localDestinoOperacao     CHAR (1);
  v_cab_indicadorConsumidorFinal CHAR (1);
  v_cab_projeto                  VARCHAR2 (60);
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  v_cab_situacaoDocumentoFiscal  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_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota 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_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_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_item_sequencia               NUMBER;
  v_item_cancelado               NUMBER;
  v_item_quantidadeDevolvidaRet  NUMBER;
  v_item_precoUnitario           NUMBER;
  v_item_precoUnitarioConvertido NUMBER;
  v_item_valorProdutoServicoBrut NUMBER;
  v_item_valorProdutoServico     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_movimentaEstoqueFiscal  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_stICMSEscrituracao      CHAR (2);
  v_item_reducaoBaseICMSEscritur NUMBER;
  v_item_aliquotaICMSEscrituraca NUMBER;
  v_item_diferimentoICMSEscritur NUMBER;
  v_item_margemValorAdicSTEscrit NUMBER;
  v_item_reducaoBaseSTEscriturac NUMBER;
  v_item_aliquotaICMSSTEscritura NUMBER;
  v_item_somarICMSST             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_baseICMSEscrituracao    NUMBER;
  v_item_valorICMSEscrituracao   NUMBER;
  v_item_valorICMSDesonEscritura NUMBER;
  v_item_baseICMSSTEscrituracao  NUMBER;
  v_item_valorICMSSTEscrituracao 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_item_valorDescontoCustoOpTot NUMBER;
  v_item_valorAcrescimoCustoOpTo NUMBER;
  v_item_precoCustoOperacao      NUMBER;
  v_item_valorCustoOperacao      NUMBER;
  v_item_precoCMV                NUMBER;
  v_item_valorCMV                NUMBER;
  v_item_valorAcrescimoExtempSub NUMBER;
  v_item_valorAcrescimoExtempTot 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_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_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  r_item_idItemDocFiscal := p_item_idItemDocFiscal;
  r_buffer_idItemDocFiscal := p_buffer_idItemDocFiscal;
  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.devolucaoAnulacaoRetorno,
    cab.finalidadeNota,
    cab.atualizaCustoMedio,
    cab.nfFornecedor,
    cab.documentoFiscal,
    cab.estabelecimento,
    cab.dataEmissao,
    cab.pessoa,
    cab.vendaConsumidor,
    cab.enderecoEntregaPessoa,
    cab.municipioFatoGerador,
    cab.localDestinoOperacao,
    cab.indicadorConsumidorFinal,
    cab.projeto,
    cab.modalidadeFrete,
    cab.tipoPagamentoFrete,
    cab.situacaoDocumentoFiscal,
    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,
    cab.valorDescontoCustoOpItem,
    cab.valorDescontoCustoOpGeral,
    cab.valorDescontoCustoOpTotal,
    cab.valorAcrescimoCustoOpItem,
    cab.valorAcrescimoCustoOpGeral,
    cab.valorAcrescimoCustoOpTotal,
    cab.valorCustoOperacao,
    cab.valorCMV,
    cab.quantidadeExtemporanea,
    cab.valorAcrescimoExtempSubtotal,
    cab.valorAcrescimoExtempItem,
    cab.valorAcrescimoExtempGeral,
    cab.valorAcrescimoExtempTotal,
    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
  INTO
    v_cab_origemDocumento,
    v_cab_tipoDocumento,
    v_cab_entradaSaida,
    v_cab_devolucaoAnulacaoRetorno,
    v_cab_finalidadeNota,
    v_cab_atualizaCustoMedio,
    v_cab_nfFornecedor,
    v_cab_documentoFiscal,
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_pessoa,
    v_cab_vendaConsumidor,
    v_cab_enderecoEntregaPessoa,
    v_cab_municipioFatoGerador,
    v_cab_localDestinoOperacao,
    v_cab_indicadorConsumidorFinal,
    v_cab_projeto,
    v_cab_modalidadeFrete,
    v_cab_tipoPagamentoFrete,
    v_cab_situacaoDocumentoFiscal,
    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_cab_valorDescontoCustoOpItem,
    v_cab_valorDescontoCustoOpGera,
    v_cab_valorDescontoCustoOpTota,
    v_cab_valorAcrescimoCustoOpIte,
    v_cab_valorAcrescimoCustoOpGer,
    v_cab_valorAcrescimoCustoOpTot,
    v_cab_valorCustoOperacao,
    v_cab_valorCMV,
    v_cab_quantidadeExtemporanea,
    v_cab_valorAcrescimoExtempSubt,
    v_cab_valorAcrescimoExtempItem,
    v_cab_valorAcrescimoExtempGera,
    v_cab_valorAcrescimoExtempTota,
    v_est_grupoFiscal,
    v_pessEst_regimeTributario,
    v_munEndEst_uf,
    v_pess_indicadorInscricaoEstad,
    v_endPess_enderecoPessoa,
    v_munEndPess_uf,
    v_munEndEntr_uf
  FROM MODOCUMENTOSFISCAIS 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
  WHERE cab.idDocumentoFiscal = p_item_idDocumentoFiscal;
  v_ini_cab_valorFreteItem := v_cab_valorFreteItem;
  v_ini_cab_valorFreteGeral := v_cab_valorFreteGeral;
  SELECT
    diminuiDescontoPrUnit,
    somaAcrescimosPrUnit,
    somaFreteSeguroPrUnit
  INTO
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit
  FROM PAMODELOSDOCUMENTO
  WHERE modeloDocumento = p_item_modeloDocumento;
  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_valorFreteTotal          := 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_item_quantidadeDevolvidaRet  := 0;
  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_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_movimentaEstoqueFiscal  := p_item_movimentaEstoqueFiscal;
  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_stICMSEscrituracao      := p_item_stICMSEscrituracao;
  v_item_reducaoBaseICMSEscritur := p_item_reducaoBaseICMSEscritur;
  v_item_aliquotaICMSEscrituraca := p_item_aliquotaICMSEscrituraca;
  v_item_diferimentoICMSEscritur := p_item_diferimentoICMSEscritur;
  v_item_margemValorAdicSTEscrit := p_item_margemValorAdicSTEscrit;
  v_item_reducaoBaseSTEscriturac := p_item_reducaoBaseSTEscriturac;
  v_item_aliquotaICMSSTEscritura := p_item_aliquotaICMSSTEscritura;
  v_item_somarICMSST             := p_item_somarICMSST;
  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_baseICMSEscrituracao    := p_item_baseICMSEscrituracao;
  v_item_valorICMSEscrituracao   := p_item_valorICMSEscrituracao;
  v_item_valorICMSDesonEscritura := p_item_valorICMSDesonEscritura;
  v_item_baseICMSSTEscrituracao  := p_item_baseICMSSTEscrituracao;
  v_item_valorICMSSTEscrituracao := p_item_valorICMSSTEscrituracao;
  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;
  IF p_manterFinanceiro_Retotalizar = 0 THEN
    SELECT COALESCE (MAX(1), 0)
    INTO v_cab_promocaoExiste
    FROM MODOCFISCALXPROMOCOES
    WHERE idDocumentoFiscal = p_item_idDocumentoFiscal;
  END IF;
  IF p_item_idItemDocFiscal > 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.quantidadeDevolvidaRetornada,
        a.pesoLiquido,
        a.pesoBruto,
        a.valorProdutoServicoBruto,
        a.valorProdutoServico,
        a.valorDescontoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.quantidadeExtemporanea,
        a.valorAcrescimoExtempSubtotal,
        a.valorAcrescimoExtempItem,
        a.valorDescontoCustoOpItem,
        a.valorAcrescimoCustoOpItem,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorAcrescimoExtempGeral,
        a.valorDescontoCustoOpGeral,
        a.valorAcrescimoCustoOpGeral,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.valorFreteTotal,
        a.valorSeguroTotal,
        a.valorDescontoTotal,
        a.valorOutrasDespesasTotal,
        a.valorAdicFreteMarinhaMerTotal,
        a.valorDespesasAduaneirasTotal,
        a.valorAcrescimoExtempTotal,
        a.valorDescontoCustoOpTotal,
        a.valorAcrescimoCustoOpTotal,
        a.operacaoFiscal,
        a.movimentaEstoque,
        a.movimentaEstoqueFiscal,
        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.stICMSEscrituracao,
        a.reducaoBaseICMSEscrituracao,
        a.aliquotaICMSEscrituracao,
        a.diferimentoICMSEscrituracao,
        a.margemValorAdicSTEscrituracao,
        a.reducaoBaseSTEscrituracao,
        a.aliquotaICMSSTEscrituracao,
        a.somarICMSST,
        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.baseICMSEscrituracao,
        a.valorICMSEscrituracao,
        a.valorICMSDesonEscrituracao,
        a.baseICMSSTEscrituracao,
        a.valorICMSSTEscrituracao,
        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,
        a.valorCustoOperacao,
        a.valorCMV,
        prod.tipoProduto
      FROM MODOCFISCALXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      WHERE a.idItemDocFiscal = p_item_idItemDocFiscal)
    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_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_item_quantidadeDevolvidaRet := a.quantidadeDevolvidaRetornada;
      IF p_buscarAliquotas_CalcularImp ='T'
      THEN
        v_item_movimentaEstoque        := a.movimentaEstoque;
        v_item_movimentaEstoqueFiscal  := a.movimentaEstoqueFiscal;
        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_stICMSEscrituracao      := a.stICMSEscrituracao;
        v_item_reducaoBaseICMSEscritur := a.reducaoBaseICMSEscrituracao;
        v_item_aliquotaICMSEscrituraca := a.aliquotaICMSEscrituracao;
        v_item_diferimentoICMSEscritur := a.diferimentoICMSEscrituracao;
        v_item_margemValorAdicSTEscrit := a.margemValorAdicSTEscrituracao;
        v_item_reducaoBaseSTEscriturac := a.reducaoBaseSTEscrituracao;
        v_item_aliquotaICMSSTEscritura := a.aliquotaICMSSTEscrituracao;
        v_item_somarICMSST             := a.somarICMSST;
        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_baseICMSEscrituracao    := a.baseICMSEscrituracao;
        v_item_valorICMSEscrituracao   := a.valorICMSEscrituracao;
        v_item_valorICMSDesonEscritura := a.valorICMSDesonEscrituracao;
        v_item_baseICMSSTEscrituracao  := a.baseICMSSTEscrituracao;
        v_item_valorICMSSTEscrituracao := a.valorICMSSTEscrituracao;
        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 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 <> p_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;
        v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
        v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
        v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
        v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
        v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
        v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
        v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
        v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
        v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
        v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
        v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
        v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
        v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      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,
    p_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);
  v_item_valorAcrescimoExtempSub := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
    p_item_quantidade,
    v_item_precoUnitario,
    p_item_quantidadeExtemporanea,
    p_item_acrescimoUnitarioExtemp);
  v_item_valorAcrescimoExtempTot := FUNC_ADD_CALC_EXTEMP_TOTAL(
    v_item_valorAcrescimoExtempSub,
    p_item_valorAcrescimoExtempIte,
    p_item_valorAcrescimoExtempGer);
  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,
        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 = CASE WHEN v_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
      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,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_estabelecimento,
        NULL, -- p_cab_dataPrecoInicial
        TRUNC(SYSDATE), -- p_cab_dataPrecoFinal
        v_cab_pessoa,
        v_cab_projeto,
        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_DOC_FISC_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_227_manterPessoaOrcam,
        p_config_230_etapaPedComprParc,
        p_config_362_calcCustoPorGrade,
        p_config_378_calcularVolumes,
        p_config_413_obs_add_marca,
        p_manterFinanceiro_Retotalizar,
        'S', -- p_buscarAliquotas_CalcularImp
        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_calcularImpostos,
        0, -- p_item_idItemDocFiscal
        p_item_idDocumentoFiscal,
        p_item_pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo,
        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
        CASE
          WHEN p_item_quantidade = 0
          THEN 0
          ELSE ROUND(p_item_quantidadeExtemporanea * a.quantidade / p_item_quantidade, 2)
        END, -- p_item_quantidadeExtemporanea
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_acrescimoUnitarioExtemp
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_acrescimoUnitarioExtemp
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoExtempIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpIt
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpIt
        p_item_observacoesDigitadas,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorFreteGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_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_valorAcrescimoExtempGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpGe
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpGe
        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
        p_item_percentualDevolucao,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorIPIDevolucao
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorIPIDevolucao,
        v_combo_operacaoFiscal,
        p_item_movimentaEstoque,
        p_item_movimentaEstoqueFiscal,
        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
        '  ', -- p_item_stICMSEscrituracao
        0, -- p_item_reducaoBaseICMSEscritur
        0, -- p_item_aliquotaICMSEscrituraca
        0, -- p_item_diferimentoICMSEscritur
        0, -- p_item_margemValorAdicSTEscrit
        0, -- p_item_reducaoBaseSTEscriturac
        0, -- p_item_aliquotaICMSSTEscritura
        0, -- p_item_somarICMSST
        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_baseICMSEscrituracao
        0, -- p_item_valorICMSEscrituracao
        0, -- p_item_valorICMSDesonEscritura
        0, -- p_item_baseICMSSTEscrituracao
        0, -- p_item_valorICMSSTEscrituracao
        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_idItemDocFiscal,
        /* Retornos */
        r_calcularImpostos,
        v_auxNumber, -- r_item_idItemDocFiscal
        r_buffer_idItemDocFiscal,
        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_DOC_FISC_ITEM_COMBO_RESID (
        p_item_idDocumentoFiscal,
        v_item_valorProdutoServico,
        p_item_valorDescontoItem,
        p_item_valorAcrescimoItem,
        v_modDoc_diminuiDescontoPrUnit,
        v_modDoc_somaAcrescimosPrUnit,
        r_buffer_idItemDocFiscal,
        r_valorInserido);
      r_calcularImpostos := 1;
    END IF;
  ELSE
    IF r_item_idItemDocFiscal <= 0 THEN
      r_item_idItemDocFiscal := FUNC_ADD_BUSCA_PROXIMO_ID ('MODOCFISCALXITENS', 'idItemDocFiscal', 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
          OR p_item_valorAcrescimoExtempGer <> 0
          OR p_item_valorDescontoCustoOpGer <> 0
          OR p_item_valorAcrescimoCustoOpGe <> 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_DOC_FISC_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          p_item_idDocumentoFiscal,
          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 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,
        p_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,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_finalidadeNota,
        v_cab_estabelecimento,
        v_cab_nfFornecedor,
        SYSDATE, -- p_cab_dataEmissao
        v_cab_pessoa,
        v_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,
        p_item_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
        1, -- 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_item_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_item_stICMSEscrituracao,
        v_item_reducaoBaseICMSEscritur,
        v_item_aliquotaICMSEscrituraca,
        v_item_diferimentoICMSEscritur,
        v_item_margemValorAdicSTEscrit,
        v_item_reducaoBaseSTEscriturac,
        v_item_aliquotaICMSSTEscritura,
        v_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,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_estabelecimento,
        v_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
        p_item_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
        1, -- p_calcularICMSEscrituracao
        v_item_stICMSEscrituracao,
        v_item_reducaoBaseICMSEscritur,
        v_item_aliquotaICMSEscrituraca,
        v_item_diferimentoICMSEscritur,
        0, -- p_baseICMSEscrituracao
        0, -- p_valorICMSEscrituracao
        0, -- p_valorICMSDesonEscrituracao
        1, -- p_calcularICMSSTEscrituracao
        v_item_margemValorAdicSTEscrit,
        v_item_reducaoBaseSTEscriturac,
        v_item_aliquotaICMSSTEscritura,
        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_item_baseICMSEscrituracao,
        v_item_valorICMSEscrituracao,
        v_item_valorICMSDesonEscritura,
        v_item_baseICMSSTEscrituracao,
        v_item_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,
      v_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,
      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,
      v_item_valorICMSSTEscrituracao,
      v_item_somarICMSST,
      v_item_valorAcrescimoExtempTot,
      v_modDoc_geraFinanceiro);
    v_item_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
      v_cab_nfFornecedor,
      v_cab_tipoPagamentoFrete,
      v_item_valorProdutoServico,
      v_item_valorFreteTotal,
      v_item_valorSeguroTotal,
      v_item_valorDescontoTotal,
      v_item_valorOutrasDespesasTot,
      p_item_valorIPIDevolucao,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      v_item_valorICMSST,
      v_item_valorICMSSTEscrituracao,
      v_item_somarICMSST
      );

    ADD_CALCULA_CUSTO_CMV (
      v_cab_atualizaCustoMedio,
      v_cab_estabelecimento,
      v_cab_nfFornecedor,
      p_item_modeloDocumento,
      p_item_quantidade,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      p_item_valorIPIDevolucao,
      v_item_valorPIS,
      v_item_valorPISST,
      v_item_valorCOFINS,
      v_item_valorCOFINSST,
      v_item_valorCreditoSimplesNac,
      v_item_valorICMS,
      v_item_valorICMSST,
      v_item_valorICMSSTEscrituracao,
      v_item_valorLiquidoItem,
      p_item_valorDescontoCustoOpIte,
      p_item_valorDescontoCustoOpGer,
      p_item_valorAcrescimoCustoOpIt,
      p_item_valorAcrescimoCustoOpGe,
      v_item_valorAcrescimoExtempTot,
      v_item_valorDescontoCustoOpTot,
      v_item_valorAcrescimoCustoOpTo,
      v_item_precoCustoOperacao,
      v_item_valorCustoOperacao,
      v_item_precoCMV,
      v_item_valorCMV);
    IF v_inserindoItem = 1 THEN
      SELECT COALESCE (MAX (sequencia),0) + 1
      INTO v_item_sequencia
      FROM MODOCFISCALXITENS
      WHERE idDocumentoFiscal = p_item_idDocumentoFiscal;
      v_cab_ultimoVendedorItem := p_item_vendedor;
    END IF;
    IF v_item_cancelado = 0 THEN
      IF p_manterFinanceiro_Retotalizar <> 2 THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume + TRUNC(CASE WHEN p_item_controleQuantidade = 1 AND p_item_loteMultiplo <> 0 THEN p_item_quantidade / p_item_loteMultiplo ELSE p_item_quantidadeConvertida END,0);
        END IF;
        v_cab_pesoLiquido := v_cab_pesoLiquido + p_item_pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto + p_item_pesoBruto;
      END IF;
      v_cab_quantidade := v_cab_quantidade + p_item_quantidadeConvertida;
      IF v_prod_tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorServicos := v_cab_valorServicos + v_item_valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos + p_item_valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorProdutos := v_cab_valorProdutos + v_item_valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos + p_item_valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem + p_item_valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem + p_item_valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem + p_item_valorAdicFreteMarItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem + p_item_valorDespesasAduanItem;
      v_cab_valorFreteGeral := v_cab_valorFreteGeral + p_item_valorFreteGeral;
      v_cab_valorSeguroGeral := v_cab_valorSeguroGeral + p_item_valorSeguroGeral;
      v_cab_valorDescontoGeral := v_cab_valorDescontoGeral + v_item_valorDescontoGeral;
      v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral + p_item_valorOutrasDespesasGer;
      v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral + p_item_valorAdicFreteMarGeral;
      v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral + p_item_valorDespesasAduanGeral;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento + v_item_valorBasePagamento;
      IF p_item_usarPrecoAVista = 1
        AND v_item_geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo + v_item_valorProdutoServico - v_item_valorDescontoTotal + v_item_valorOutrasDespesasTot;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento + v_item_valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento + v_item_valorOutrasDespPagament;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento + v_item_valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal + v_item_valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal + v_item_valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal + v_item_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_item_valorOutrasDespesasTot;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal + v_item_valorAdicFreteMarTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal + v_item_valorDespesasAduanTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem + v_item_valorLiquidoItem;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem + p_item_valorDescontoCustoOpIte;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera + p_item_valorDescontoCustoOpGer;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota + v_item_valorDescontoCustoOpTot;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte + p_item_valorAcrescimoCustoOpIt;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer + p_item_valorAcrescimoCustoOpGe;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot + v_item_valorAcrescimoCustoOpTo;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao + v_item_valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV + v_item_valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea + p_item_quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt + v_item_valorAcrescimoExtempSub;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem + p_item_valorAcrescimoExtempIte;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera + p_item_valorAcrescimoExtempGer;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota + v_item_valorAcrescimoExtempTot;
    END IF;
    UPDATE MODOCUMENTOSFISCAIS SET
      modalidadeFrete               = v_cab_modalidadeFrete,
      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,
      valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
      valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
      valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
      valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
      valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
      valorCustoOperacao            = v_cab_valorCustoOperacao,
      valorCMV                      = v_cab_valorCMV,
      quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
      valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
      valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
      valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
    WHERE idDocumentoFiscal = p_item_idDocumentoFiscal;
    IF p_item_idItemDocFiscal > 0 THEN
      DELETE MODOCFISCALXCOMPOSICOESPR compDoc
      WHERE compDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND EXISTS(
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.produto = comp.produto
        WHERE comp.composicaoPreco = compDoc.composicaoPreco
        AND gradProd.gradeProduto <> p_item_gradeProduto);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      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_413_obs_add_marca,
      ' ',
      0,
      'D',
      p_item_idItemDocFiscal,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    MERGE INTO MODOCFISCALXITENS a USING (
      SELECT
        r_item_idItemDocFiscal         idItemDocFiscal,
        p_item_idDocumentoFiscal       idDocumentoFiscal,
        v_item_sequencia               sequencia,
        v_item_cancelado               cancelado,
        p_item_pedidoCompraFornecedor  pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo sequenciaPedidoCompraFornec,
        p_item_modeloDocumento         modeloDocumento,
        p_item_estabelecimentoOriginal estabelecimentoOriginal,
        p_item_vendedor                vendedor,
        p_item_gradeProduto            gradeProduto,
        p_item_idFormulaTinta          idFormulaTinta,
        p_item_personalizacao          personalizacao,
        p_item_idLoteEstoque           idLoteEstoque,
        p_item_operacaoFiscal          operacaoFiscal,
        v_item_movimentaEstoque        movimentaEstoque,
        v_item_movimentaEstoqueFiscal  movimentaEstoqueFiscal,
        v_item_geraFinanceiro          geraFinanceiro,
        p_item_localEstoque            localEstoque,
        p_item_pessoaParticipante      pessoaParticipante,
        p_item_controleQuantidade      controleQuantidade,
        p_item_unidadeMedidaConversao  unidadeMedidaConversao,
        p_item_conversorQuantidade     conversorQuantidade,
        p_item_loteMinimo              loteMinimo,
        p_item_loteMultiplo            loteMultiplo,
        p_item_altura                  altura,
        p_item_largura                 largura,
        p_item_comprimento             comprimento,
        p_item_pecas                   pecas,
        p_item_quantidade              quantidade,
        p_item_quantidadeConvertida    quantidadeConvertida,
        v_item_quantidadeDevolvidaRet  quantidadeDevolvidaRetornada,
        p_item_percentualDevolucao     percentualDevolucao,
        p_item_pesoLiquido             pesoLiquido,
        p_item_pesoBruto               pesoBruto,
        p_item_tipoPreco               tipoPreco,
        p_item_tabelaPreco             tabelaPreco,
        p_item_precoSugestaoAPrazo     precoSugestaoAPrazo,
        p_item_precoSugestaoAVista     precoSugestaoAVista,
        p_item_precoDesconto           precoDesconto,
        p_item_precoMinimo             precoMinimo,
        p_item_usarPrecoAVista         usarPrecoAVista,
        p_item_precoUnitarioBruto      precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos acrescimoUnitarioComposicao,
        v_item_precoUnitario           precoUnitario,
        v_item_precoUnitarioConvertido precoUnitarioConvertido,
        v_item_valorProdutoServicoBrut valorProdutoServicoBruto,
        v_item_valorProdutoServico     valorProdutoServico,
        p_item_percDescontoItem        percDescontoItem,
        p_item_valorDescontoItem       valorDescontoItem,
        p_item_percAcrescimoItem       percAcrescimoItem,
        p_item_valorAcrescimoItem      valorAcrescimoItem,
        p_item_valorFreteItem          valorFreteItem,
        p_item_valorSeguroItem         valorSeguroItem,
        p_item_valorAdicFreteMarItem   valorAdicFreteMarinhaMerItem,
        p_item_valorDespesasAduanItem  valorDespesasAduaneirasItem,
        p_item_valorFreteGeral         valorFreteGeral,
        p_item_valorSeguroGeral        valorSeguroGeral,
        v_item_valorDescontoGeral      valorDescontoGeral,
        p_item_valorOutrasDespesasGer  valorOutrasDespesasGeral,
        p_item_valorAdicFreteMarGeral  valorAdicFreteMarinhaMerGeral,
        p_item_valorDespesasAduanGeral valorDespesasAduaneirasGeral,
        v_item_valorBasePagamento      valorBasePagamento,
        v_item_valorDescontoPagamento  valorDescontoPagamento,
        v_item_valorOutrasDespPagament valorOutrasDespesasPagamento,
        v_item_valorJurosPagamento     valorJurosPagamento,
        v_item_valorFreteTotal         valorFreteTotal,
        v_item_valorSeguroTotal        valorSeguroTotal,
        v_item_valorDescontoTotal      valorDescontoTotal,
        v_item_valorOutrasDespesasTot  valorOutrasDespesasTotal,
        v_item_valorAdicFreteMarTotal  valorAdicFreteMarinhaMerTotal,
        v_item_valorDespesasAduanTotal valorDespesasAduaneirasTotal,
        v_item_cfop                    cfop,
        v_item_indicadorISSQN          indicadorISSQN,
        v_item_aliquotaISSQN           aliquotaISSQN,
        v_item_retidoISSQN             retidoISSQN,
        v_item_tributadoForaMunicipio  tributadoForaMunicipio,
        v_item_incentivoFiscal         incentivoFiscal,
        v_item_listaServicos           listaServicos,
        v_item_cnae                    cnae,
        v_item_idServicoMunicipio      idServicoMunicipio,
        v_item_numeroProcessoAdministr numeroProcessoAdministrativo,
        v_item_baseISSQN               baseISSQN,
        v_item_valorISSQN              valorISSQN,
        v_item_retencaoIRRF            retencaoIRRF,
        v_item_baseRetIRRF             baseRetIRRF,
        v_item_valorRetIRRF            valorRetIRRF,
        v_item_retencaoINSS            retencaoINSS,
        v_item_baseRetINSS             baseRetINSS,
        v_item_valorRetINSS            valorRetINSS,
        v_item_retencaoPIS             retencaoPIS,
        v_item_baseRetPIS              baseRetPIS,
        v_item_valorRetPIS             valorRetPIS,
        v_item_retencaoCOFINS          retencaoCOFINS,
        v_item_baseRetCOFINS           baseRetCOFINS,
        v_item_valorRetCOFINS          valorRetCOFINS,
        v_item_retencaoCSLL            retencaoCSLL,
        v_item_baseRetCSLL             baseRetCSLL,
        v_item_valorRetCSLL            valorRetCSLL,
        v_item_retencaoOutros          retencaoOutros,
        v_item_baseRetOutros           baseRetOutros,
        v_item_valorRetOutros          valorRetOutros,
        v_item_aliquotaII              aliquotaII,
        v_item_baseII                  baseII,
        v_item_valorII                 valorII,
        v_item_aliquotaIOF             aliquotaIOF,
        v_item_baseIOF                 baseIOF,
        v_item_valorIOF                valorIOF,
        v_item_codigoEnquadramentoIPI  codigoEnquadramentoIPI,
        v_item_stIPI                   stIPI,
        v_item_aliquotaIPI             aliquotaIPI,
        v_item_valorAliquotaIPI        valorAliquotaIPI,
        v_item_baseIPI                 baseIPI,
        v_item_valorIPI                valorIPI,
        p_item_valorIPIDevolucao       valorIPIDevolucao,
        v_item_stPIS                   stPIS,
        v_item_aliquotaPIS             aliquotaPIS,
        v_item_valorAliquotaPIS        valorAliquotaPIS,
        v_item_basePIS                 basePIS,
        v_item_valorPIS                valorPIS,
        v_item_aliquotaPISST           aliquotaPISST,
        v_item_valorAliquotaPISST      valorAliquotaPISST,
        v_item_basePISST               basePISST,
        v_item_valorPISST              valorPISST,
        v_item_stCOFINS                stCOFINS,
        v_item_aliquotaCOFINS          aliquotaCOFINS,
        v_item_valorAliquotaCOFINS     valorAliquotaCOFINS,
        v_item_baseCOFINS              baseCOFINS,
        v_item_valorCOFINS             valorCOFINS,
        v_item_aliquotaCOFINSST        aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST   valorAliquotaCOFINSST,
        v_item_baseCOFINSST            baseCOFINSST,
        v_item_valorCOFINSST           valorCOFINSST,
        v_item_stSimplesNacional       stSimplesNacional,
        v_item_creditoSimplesNacional  creditoSimplesNacional,
        v_item_baseCreditoSimplesNac   baseCreditoSimplesNacional,
        v_item_valorCreditoSimplesNac  valorCreditoSimplesNacional,
        v_item_stICMS                  stICMS,
        v_item_modalBaseCalcICMS       modalidadeBaseCalcICMS,
        v_item_reducaoBaseICMS         reducaoBaseICMS,
        v_item_aliquotaICMS            aliquotaICMS,
        v_item_diferimentoICMS         diferimentoICMS,
        v_item_motivoDesoneracaoICMS   motivoDesoneracaoICMS,
        v_item_idBeneficio             idBeneficio,
        v_item_baseICMS                baseICMS,
        v_item_valorICMSOperacao       valorICMSOperacao,
        v_item_valorICMSDiferido       valorICMSDiferido,
        v_item_valorICMS               valorICMS,
        v_item_valorICMSDesoneracao    valorICMSDesoneracao,
        v_item_modalBaseCalcICMSST     modalidadeBaseCalcICMSST,
        v_item_margemValorAdicionadoST margemValorAdicionadoST,
        v_item_reducaoBaseST           reducaoBaseST,
        v_item_aliquotaICMSST          aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin aliquotaSTSuportConsFinal,
        v_item_baseICMSST              baseICMSST,
        v_item_valorICMSST             valorICMSST,
        v_item_baseICMSSTAnteriormente baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment valorICMSSTAnteriormente,
        v_item_valorICMSProprioSubstit valorICMSProprioSubstituto,
        v_item_reducaoBaseICMSEfetivo  reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo     aliquotaICMSEfetivo,
        v_item_baseICMSEfetivo         baseICMSEfetivo,
        v_item_valorICMSEfetivo        valorICMSEfetivo,
        v_item_stICMSEscrituracao      stICMSEscrituracao,
        v_item_reducaoBaseICMSEscritur reducaoBaseICMSEscrituracao,
        v_item_aliquotaICMSEscrituraca aliquotaICMSEscrituracao,
        v_item_diferimentoICMSEscritur diferimentoICMSEscrituracao,
        v_item_baseICMSEscrituracao    baseICMSEscrituracao,
        v_item_valorICMSEscrituracao   valorICMSEscrituracao,
        v_item_valorICMSDesonEscritura valorICMSDesonEscrituracao,
        v_item_margemValorAdicSTEscrit margemValorAdicSTEscrituracao,
        v_item_reducaoBaseSTEscriturac reducaoBaseSTEscrituracao,
        v_item_aliquotaICMSSTEscritura aliquotaICMSSTEscrituracao,
        v_item_baseICMSSTEscrituracao  baseICMSSTEscrituracao,
        v_item_valorICMSSTEscrituracao valorICMSSTEscrituracao,
        v_item_somarICMSST             somarICMSST,
        v_item_aliquotaICMSUFDestinat  aliquotaICMSUFDestinatario,
        v_item_aliquotaICMSInterestad  aliquotaICMSInterestadual,
        v_item_partilhaICMSInterestad  partilhaICMSInterestadual,
        v_item_baseICMSUFDestinatario  baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente     baseICMSUFRemetente,
        v_item_valorICMSUFRemetente    valorICMSUFRemetente,
        v_item_aliquotaFCP             aliquotaFCP,
        v_item_baseFCP                 baseFCP,
        v_item_valorFCP                valorFCP,
        v_item_aliquotaFCPST           aliquotaFCPST,
        v_item_baseFCPST               baseFCPST,
        v_item_valorFCPST              valorFCPST,
        v_item_aliquotaFCPSTAnteriorm  aliquotaFCPSTAnteriormente,
        v_item_baseFCPSTAnteriormente  baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente valorFCPSTAnteriormente,
        v_item_aliquotaFCPUFDestinat   aliquotaFCPUFDestinatario,
        v_item_baseFCPUFDestinatario   baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario  valorFCPUFDestinatario,
        v_item_aliquotaEstImpFederais  aliquotaEstimadaImpFederais,
        v_item_aliquotaEstImpEstaduais aliquotaEstimadaImpEstaduais,
        v_item_aliquotaEstImpMunicipai aliquotaEstimadaImpMunicipais,
        v_item_baseEstimadaImpostos    baseEstimadaImpostos,
        v_item_valorEstImpFederais     valorEstimadoImpFederais,
        v_item_valorEstImpEstaduais    valorEstimadoImpEstaduais,
        v_item_valorEstImpMunicipais   valorEstimadoImpMunicipais,
        v_item_valorLiquidoItem        valorLiquidoItem,
        p_item_valorDescontoCustoOpIte valorDescontoCustoOpItem,
        p_item_valorDescontoCustoOpGer valorDescontoCustoOpGeral,
        v_item_valorDescontoCustoOpTot valorDescontoCustoOpTotal,
        p_item_valorAcrescimoCustoOpIt valorAcrescimoCustoOpItem,
        p_item_valorAcrescimoCustoOpGe valorAcrescimoCustoOpGeral,
        v_item_valorAcrescimoCustoOpTo valorAcrescimoCustoOpTotal,
        v_item_precoCustoOperacao      precoCustoOperacao,
        v_item_valorCustoOperacao      valorCustoOperacao,
        v_item_precoCMV                precoCMV,
        v_item_valorCMV                valorCMV,
        p_item_quantidadeExtemporanea  quantidadeExtemporanea,
        p_item_acrescimoUnitarioExtemp acrescimoUnitarioExtemporaneo,
        v_item_valorAcrescimoExtempSub valorAcrescimoExtempSubtotal,
        p_item_valorAcrescimoExtempIte valorAcrescimoExtempItem,
        p_item_valorAcrescimoExtempGer valorAcrescimoExtempGeral,
        v_item_valorAcrescimoExtempTot valorAcrescimoExtempTotal,
        p_item_observacoesDigitadas    observacoesDigitadas,
        v_observacoes                  observacoes
      FROM DUAL) b
    ON (a.idItemDocFiscal = b.idItemDocFiscal)
    WHEN MATCHED THEN UPDATE SET
      a.idDocumentoFiscal             = b.idDocumentoFiscal,
      a.sequencia                     = b.sequencia,
      a.cancelado                     = b.cancelado,
      a.pedidoCompraFornecedor        = b.pedidoCompraFornecedor,
      a.sequenciaPedidoCompraFornec   = b.sequenciaPedidoCompraFornec,
      a.vendedor                      = b.vendedor,
      a.modeloDocumento               = b.modeloDocumento,
      a.estabelecimentoOriginal       = b.estabelecimentoOriginal,
      a.gradeProduto                  = b.gradeProduto,
      a.idFormulaTinta                = b.idFormulaTinta,
      a.personalizacao                = b.personalizacao,
      a.idLoteEstoque                 = b.idLoteEstoque,
      a.operacaoFiscal                = b.operacaoFiscal,
      a.movimentaEstoque              = b.movimentaEstoque,
      a.movimentaEstoqueFiscal        = b.movimentaEstoqueFiscal,
      a.geraFinanceiro                = b.geraFinanceiro,
      a.localEstoque                  = b.localEstoque,
      a.pessoaParticipante            = b.pessoaParticipante,
      a.controleQuantidade            = b.controleQuantidade,
      a.unidadeMedidaConversao        = b.unidadeMedidaConversao,
      a.conversorQuantidade           = b.conversorQuantidade,
      a.loteMinimo                    = b.loteMinimo,
      a.loteMultiplo                  = b.loteMultiplo,
      a.altura                        = b.altura,
      a.largura                       = b.largura,
      a.comprimento                   = b.comprimento,
      a.pecas                         = b.pecas,
      a.quantidade                    = b.quantidade,
      a.quantidadeConvertida          = b.quantidadeConvertida,
      a.quantidadeDevolvidaRetornada  = b.quantidadeDevolvidaRetornada,
      a.percentualDevolucao           = b.percentualDevolucao,
      a.pesoLiquido                   = b.pesoLiquido,
      a.pesoBruto                     = b.pesoBruto,
      a.tipoPreco                     = b.tipoPreco,
      a.tabelaPreco                   = b.tabelaPreco,
      a.precoSugestaoAPrazo           = b.precoSugestaoAPrazo,
      a.precoSugestaoAVista           = b.precoSugestaoAVista,
      a.precoDesconto                 = b.precoDesconto,
      a.precoMinimo                   = b.precoMinimo,
      a.usarPrecoAVista               = b.usarPrecoAVista,
      a.precoUnitarioBruto            = b.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao   = b.acrescimoUnitarioComposicao,
      a.precoUnitario                 = b.precoUnitario,
      a.precoUnitarioConvertido       = b.precounitarioConvertido,
      a.valorProdutoServicoBruto      = b.valorProdutoServicoBruto,
      a.valorProdutoServico           = b.valorProdutoServico,
      a.percDescontoItem              = b.percDescontoItem,
      a.valorDescontoItem             = b.valorDescontoItem,
      a.percAcrescimoItem             = b.percAcrescimoItem,
      a.valorAcrescimoItem            = b.valorAcrescimoItem,
      a.valorFreteItem                = b.valorFreteItem,
      a.valorSeguroItem               = b.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem  = b.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem   = b.valorDespesasAduaneirasItem,
      a.valorFreteGeral               = b.valorFreteGeral,
      a.valorSeguroGeral              = b.valorSeguroGeral,
      a.valorDescontoGeral            = b.valorDescontoGeral,
      a.valorOutrasDespesasGeral      = b.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral = b.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral  = b.valorDespesasAduaneirasGeral,
      a.valorBasePagamento            = b.valorBasePagamento,
      a.valorDescontoPagamento        = b.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento  = b.valorOutrasDespesasPagamento,
      a.valorJurosPagamento           = b.valorJurosPagamento,
      a.valorFreteTotal               = b.valorFreteTotal,
      a.valorSeguroTotal              = b.valorSeguroTotal,
      a.valorDescontoTotal            = b.valorDescontoTotal,
      a.valorOutrasDespesasTotal      = b.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal = b.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal  = b.valorDespesasAduaneirasTotal,
      a.cfop                          = b.cfop,
      a.indicadorISSQN                = b.indicadorISSQN,
      a.aliquotaISSQN                 = b.aliquotaISSQN,
      a.retidoISSQN                   = b.retidoISSQN,
      a.tributadoForaMunicipio        = b.tributadoForaMunicipio,
      a.incentivoFiscal               = b.incentivoFiscal,
      a.listaServicos                 = b.listaServicos,
      a.cnae                          = b.cnae,
      a.idServicoMunicipio            = b.idServicoMunicipio,
      a.numeroProcessoAdministrativo  = b.numeroProcessoAdministrativo,
      a.baseISSQN                     = b.baseISSQN,
      a.valorISSQN                    = b.valorISSQN,
      a.retencaoIRRF                  = b.retencaoIRRF,
      a.baseRetIRRF                   = b.baseRetIRRF,
      a.valorRetIRRF                  = b.valorRetIRRF,
      a.retencaoINSS                  = b.retencaoINSS,
      a.baseRetINSS                   = b.baseRetINSS,
      a.valorRetINSS                  = b.valorRetINSS,
      a.retencaoPIS                   = b.retencaoPIS,
      a.baseRetPIS                    = b.baseRetPIS,
      a.valorRetPIS                   = b.valorRetPIS,
      a.retencaoCOFINS                = b.retencaoCOFINS,
      a.baseRetCOFINS                 = b.baseRetCOFINS,
      a.valorRetCOFINS                = b.valorRetCOFINS,
      a.retencaoCSLL                  = b.retencaoCSLL,
      a.baseRetCSLL                   = b.baseRetCSLL,
      a.valorRetCSLL                  = b.valorRetCSLL,
      a.retencaoOutros                = b.retencaoOutros,
      a.baseRetOutros                 = b.baseRetOutros,
      a.valorRetOutros                = b.valorRetOutros,
      a.aliquotaII                    = b.aliquotaII,
      a.baseII                        = b.baseII,
      a.valorII                       = b.valorII,
      a.aliquotaIOF                   = b.aliquotaIOF,
      a.baseIOF                       = b.baseIOF,
      a.valorIOF                      = b.valorIOF,
      a.codigoEnquadramentoIPI        = b.codigoEnquadramentoIPI,
      a.stIPI                         = b.stIPI,
      a.aliquotaIPI                   = b.aliquotaIPI,
      a.valorAliquotaIPI              = b.valorAliquotaIPI,
      a.baseIPI                       = b.baseIPI,
      a.valorIPI                      = b.valorIPI,
      a.valorIPIDevolucao             = b.valorIPIDevolucao,
      a.stPIS                         = b.stPIS,
      a.aliquotaPIS                   = b.aliquotaPIS,
      a.valorAliquotaPIS              = b.valorAliquotaPIS,
      a.basePIS                       = b.basePIS,
      a.valorPIS                      = b.valorPIS,
      a.aliquotaPISST                 = b.aliquotaPISST,
      a.valorAliquotaPISST            = b.valorAliquotaPISST,
      a.basePISST                     = b.basePISST,
      a.valorPISST                    = b.valorPISST,
      a.stCOFINS                      = b.stCOFINS,
      a.aliquotaCOFINS                = b.aliquotaCOFINS,
      a.valorAliquotaCOFINS           = b.valorAliquotaCOFINS,
      a.baseCOFINS                    = b.baseCOFINS,
      a.valorCOFINS                   = b.valorCOFINS,
      a.aliquotaCOFINSST              = b.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST         = b.valorAliquotaCOFINSST,
      a.baseCOFINSST                  = b.baseCOFINSST,
      a.valorCOFINSST                 = b.valorCOFINSST,
      a.stSimplesNacional             = b.stSimplesNacional,
      a.creditoSimplesNacional        = b.creditoSimplesNacional,
      a.baseCreditoSimplesNacional    = b.baseCreditoSimplesNacional,
      a.valorCreditoSimplesNacional   = b.valorCreditoSimplesNacional,
      a.stICMS                        = b.stICMS,
      a.modalidadeBaseCalcICMS        = b.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS               = b.reducaoBaseICMS,
      a.aliquotaICMS                  = b.aliquotaICMS,
      a.diferimentoICMS               = b.diferimentoICMS,
      a.motivoDesoneracaoICMS         = b.motivoDesoneracaoICMS,
      a.idBeneficio                   = b.idBeneficio,
      a.baseICMS                      = b.baseICMS,
      a.valorICMSoperacao             = b.valorICMSoperacao,
      a.valorICMSdiferido             = b.valorICMSdiferido,
      a.valorICMS                     = b.valorICMS,
      a.valorICMSdesoneracao          = b.valorICMSdesoneracao,
      a.modalidadeBaseCalcICMSST      = b.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST       = b.margemValorAdicionadoST,
      a.reducaoBaseST                 = b.reducaoBaseST,
      a.aliquotaICMSST                = b.aliquotaICMSST,
      a.aliquotaSTSuportConsFinal     = b.aliquotaSTSuportConsFinal,
      a.baseICMSST                    = b.baseICMSST,
      a.valorICMSST                   = b.valorICMSST,
      a.baseICMSSTAnteriormente       = b.baseICMSSTAnteriormente,
      a.valorICMSSTAnteriormente      = b.valorICMSSTAnteriormente,
      a.valorICMSProprioSubstituto    = b.valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo        = b.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo           = b.aliquotaICMSEfetivo,
      a.baseICMSEfetivo               = b.baseICMSEfetivo,
      a.valorICMSEfetivo              = b.valorICMSEfetivo,
      a.stICMSEscrituracao            = b.stICMSEscrituracao,
      a.reducaoBaseICMSEscrituracao   = b.reducaoBaseICMSEscrituracao,
      a.aliquotaICMSEscrituracao      = b.aliquotaICMSEscrituracao,
      a.diferimentoICMSEscrituracao   = b.diferimentoICMSEscrituracao,
      a.baseICMSEscrituracao          = b.baseICMSEscrituracao,
      a.valorICMSEscrituracao         = b.valorICMSEscrituracao,
      a.valorICMSDesonEscrituracao    = b.valorICMSDesonEscrituracao,
      a.margemValorAdicSTEscrituracao = b.margemValorAdicSTEscrituracao,
      a.reducaoBaseSTEscrituracao     = b.reducaoBaseSTEscrituracao,
      a.aliquotaICMSSTEscrituracao    = b.aliquotaICMSSTEscrituracao,
      a.baseICMSSTEscrituracao        = b.baseICMSSTEscrituracao,
      a.valorICMSSTEscrituracao       = b.valorICMSSTEscrituracao,
      a.somarICMSST                   = b.somarICMSST,
      a.aliquotaICMSUFDestinatario    = b.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual     = b.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual     = b.partilhaICMSInterestadual,
      a.baseICMSUFDestinatario        = b.baseICMSUFDestinatario,
      a.valorICMSUFDestinatario       = b.valorICMSUFDestinatario,
      a.baseICMSUFRemetente           = b.baseICMSUFRemetente,
      a.valorICMSUFRemetente          = b.valorICMSUFRemetente,
      a.aliquotaFCP                   = b.aliquotaFCP,
      a.baseFCP                       = b.baseFCP,
      a.valorFCP                      = b.valorFCP,
      a.aliquotaFCPST                 = b.aliquotaFCPST,
      a.baseFCPST                     = b.baseFCPST,
      a.valorFCPST                    = b.valorFCPST,
      a.aliquotaFCPSTAnteriormente    = b.aliquotaFCPSTAnteriormente,
      a.baseFCPSTAnteriormente        = b.baseFCPSTAnteriormente,
      a.valorFCPSTAnteriormente       = b.valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario     = b.aliquotaFCPUFDestinatario,
      a.baseFCPUFDestinatario         = b.baseFCPUFDestinatario,
      a.valorFCPUFDestinatario        = b.valorFCPUFDestinatario,
      a.aliquotaestimadaimpfederais   = b.aliquotaestimadaimpfederais,
      a.aliquotaestimadaimpestaduais  = b.aliquotaestimadaimpestaduais,
      a.aliquotaestimadaimpmunicipais = b.aliquotaestimadaimpmunicipais,
      a.baseestimadaimpostos          = b.baseestimadaimpostos,
      a.valorestimadoimpfederais      = b.valorestimadoimpfederais,
      a.valorEstimadoImpEstaduais     = b.valorEstimadoImpEstaduais,
      a.valorEstimadoImpMunicipais    = b.valorEstimadoImpMunicipais,
      a.valorLiquidoItem              = b.valorLiquidoItem,
      a.valorDescontoCustoOpItem      = b.valorDescontoCustoOpItem,
      a.valorDescontoCustoOpGeral     = b.valorDescontoCustoOpGeral,
      a.valorDescontoCustoOpTotal     = b.valorDescontoCustoOpTotal,
      a.valorAcrescimoCustoOpItem     = b.valorAcrescimoCustoOpItem,
      a.valorAcrescimoCustoOpGeral    = b.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoCustoOpTotal    = b.valorAcrescimoCustoOpTotal,
      a.precoCustoOperacao            = b.precoCustoOperacao,
      a.valorCustoOperacao            = b.valorCustoOperacao,
      a.precoCMV                      = b.precoCMV,
      a.valorCMV                      = b.valorCMV,
      a.quantidadeExtemporanea        = b.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo = b.acrescimoUnitarioExtemporaneo,
      a.valorAcrescimoExtempSubtotal  = b.valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem      = b.valorAcrescimoExtempItem,
      a.valorAcrescimoExtempGeral     = b.valorAcrescimoExtempGeral,
      a.valorAcrescimoExtempTotal     = b.valorAcrescimoExtempTotal,
      a.observacoesDigitadas          = b.observacoesDigitadas,
      a.observacoes                   = b.observacoes
    WHEN NOT MATCHED THEN INSERT (
      idItemDocFiscal,
      idDocumentoFiscal,
      sequencia,
      cancelado,
      pedidoCompraFornecedor,
      sequenciaPedidoCompraFornec,
      modeloDocumento,
      estabelecimentoOriginal,
      vendedor,
      gradeProduto,
      idFormulaTinta,
      personalizacao,
      idLoteEstoque,
      operacaoFiscal,
      movimentaEstoque,
      movimentaEstoqueFiscal,
      geraFinanceiro,
      localEstoque,
      pessoaParticipante,
      controleQuantidade,
      unidadeMedidaConversao,
      conversorQuantidade,
      loteMinimo,
      loteMultiplo,
      altura,
      largura,
      comprimento,
      pecas,
      quantidade,
      quantidadeConvertida,
      quantidadeDevolvidaRetornada,
      percentualDevolucao,
      pesoLiquido,
      pesoBruto,
      tipoPreco,
      tabelaPreco,
      precoSugestaoAPrazo,
      precoSugestaoAVista,
      precoDesconto,
      precoMinimo,
      usarPrecoAVista,
      precoUnitarioBruto,
      acrescimoUnitarioComposicao,
      precoUnitario,
      precoUnitarioConvertido,
      valorProdutoServicoBruto,
      valorProdutoServico,
      percDescontoItem,
      valorDescontoItem,
      percAcrescimoItem,
      valorAcrescimoItem,
      valorFreteItem,
      valorSeguroItem,
      valorAdicFreteMarinhaMerItem,
      valorDespesasAduaneirasItem,
      valorFreteGeral,
      valorSeguroGeral,
      valorDescontoGeral,
      valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral,
      valorDespesasAduaneirasGeral,
      valorBasePagamento,
      valorDescontoPagamento,
      valorOutrasDespesasPagamento,
      valorJurosPagamento,
      valorFreteTotal,
      valorSeguroTotal,
      valorDescontoTotal,
      valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal,
      valorDespesasAduaneirasTotal,
      cfop,
      indicadorISSQN,
      aliquotaISSQN,
      retidoISSQN,
      tributadoForaMunicipio,
      incentivoFiscal,
      listaServicos,
      cnae,
      idServicoMunicipio,
      numeroProcessoAdministrativo,
      baseISSQN,
      valorISSQN,
      retencaoIRRF,
      baseRetIRRF,
      valorRetIRRF,
      retencaoINSS,
      baseRetINSS,
      valorRetINSS,
      retencaoPIS,
      baseRetPIS,
      valorRetPIS,
      retencaoCOFINS,
      baseRetCOFINS,
      valorRetCOFINS,
      retencaoCSLL,
      baseRetCSLL,
      valorRetCSLL,
      retencaoOutros,
      baseRetOutros,
      valorRetOutros,
      aliquotaII,
      baseII,
      valorII,
      aliquotaIOF,
      baseIOF,
      valorIOF,
      codigoEnquadramentoIPI,
      stIPI,
      aliquotaIPI,
      valorAliquotaIPI,
      baseIPI,
      valorIPI,
      valorIPIDevolucao,
      stPIS,
      aliquotaPIS,
      valorAliquotaPIS,
      basePIS,
      valorPIS,
      aliquotaPISST,
      valorAliquotaPISST,
      basePISST,
      valorPISST,
      stCOFINS,
      aliquotaCOFINS,
      valorAliquotaCOFINS,
      baseCOFINS,
      valorCOFINS,
      aliquotaCOFINSST,
      valorAliquotaCOFINSST,
      baseCOFINSST,
      valorCOFINSST,
      stSimplesNacional,
      creditoSimplesNacional,
      baseCreditoSimplesNacional,
      valorCreditoSimplesNacional,
      stICMS,
      modalidadeBaseCalcICMS,
      reducaoBaseICMS,
      aliquotaICMS,
      diferimentoICMS,
      motivoDesoneracaoICMS,
      idBeneficio,
      baseICMS,
      valorICMSOperacao,
      valorICMSDiferido,
      valorICMS,
      valorICMSDesoneracao,
      modalidadeBaseCalcICMSST,
      margemValorAdicionadoST,
      reducaoBaseST,
      aliquotaICMSST,
      aliquotaSTSuportConsFinal,
      baseICMSST,
      valorICMSST,
      baseICMSSTAnteriormente,
      valorICMSSTAnteriormente,
      valorICMSProprioSubstituto,
      reducaoBaseICMSEfetivo,
      aliquotaICMSEfetivo,
      baseICMSEfetivo,
      valorICMSEfetivo,
      stICMSEscrituracao,
      reducaoBaseICMSEscrituracao,
      aliquotaICMSEscrituracao,
      diferimentoICMSEscrituracao,
      baseICMSEscrituracao,
      valorICMSEscrituracao,
      valorICMSDesonEscrituracao,
      margemValorAdicSTEscrituracao,
      reducaoBaseSTEscrituracao,
      aliquotaICMSSTEscrituracao,
      baseICMSSTEscrituracao,
      valorICMSSTEscrituracao,
      somarICMSST,
      aliquotaICMSUFDestinatario,
      aliquotaICMSInterestadual,
      partilhaICMSInterestadual,
      baseICMSUFDestinatario,
      valorICMSUFDestinatario,
      baseICMSUFRemetente,
      valorICMSUFRemetente,
      aliquotaFCP,
      baseFCP,
      valorFCP,
      aliquotaFCPST,
      baseFCPST,
      valorFCPST,
      aliquotaFCPSTAnteriormente,
      baseFCPSTAnteriormente,
      valorFCPSTAnteriormente,
      aliquotaFCPUFDestinatario,
      baseFCPUFDestinatario,
      valorFCPUFDestinatario,
      aliquotaEstimadaImpFederais,
      aliquotaEstimadaImpEstaduais,
      aliquotaEstimadaImpMunicipais,
      baseEstimadaImpostos,
      valorEstimadoImpFederais,
      valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais,
      valorLiquidoItem,
      valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral,
      valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpItem,
      valorAcrescimoCustoOpGeral,
      valorAcrescimoCustoOpTotal,
      precoCustoOperacao,
      valorCustoOperacao,
      precoCMV,
      valorCMV,
      quantidadeExtemporanea,
      acrescimoUnitarioExtemporaneo,
      valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral,
      valorAcrescimoExtempTotal,
      observacoesDigitadas,
      observacoes)
    VALUES (
      b.idItemDocFiscal,
      b.idDocumentoFiscal,
      b.sequencia,
      b.cancelado,
      b.pedidoCompraFornecedor,
      b.sequenciaPedidoCompraFornec,
      b.modeloDocumento,
      b.estabelecimentoOriginal,
      b.vendedor,
      b.gradeProduto,
      b.idFormulaTinta,
      b.personalizacao,
      b.idLoteEstoque,
      b.operacaoFiscal,
      b.movimentaEstoque,
      b.movimentaEstoqueFiscal,
      b.geraFinanceiro,
      b.localEstoque,
      b.pessoaParticipante,
      b.controleQuantidade,
      b.unidadeMedidaConversao,
      b.conversorQuantidade,
      b.loteMinimo,
      b.loteMultiplo,
      b.altura,
      b.largura,
      b.comprimento,
      b.pecas,
      b.quantidade,
      b.quantidadeConvertida,
      b.quantidadeDevolvidaRetornada,
      b.percentualDevolucao,
      b.pesoLiquido,
      b.pesoBruto,
      b.tipoPreco,
      b.tabelaPreco,
      b.precoSugestaoAPrazo,
      b.precoSugestaoAVista,
      b.precoDesconto,
      b.precoMinimo,
      b.usarPrecoAVista,
      b.precoUnitarioBruto,
      b.acrescimoUnitarioComposicao,
      b.precoUnitario,
      b.precoUnitarioConvertido,
      b.valorProdutoServicoBruto,
      b.valorProdutoServico,
      b.percDescontoItem,
      b.valorDescontoItem,
      b.percAcrescimoItem,
      b.valorAcrescimoItem,
      b.valorFreteItem,
      b.valorSeguroItem,
      b.valorAdicFreteMarinhaMerItem,
      b.valorDespesasAduaneirasItem,
      b.valorFreteGeral,
      b.valorSeguroGeral,
      b.valorDescontoGeral,
      b.valorOutrasDespesasGeral,
      b.valorAdicFreteMarinhaMerGeral,
      b.valorDespesasAduaneirasGeral,
      b.valorBasePagamento,
      b.valorDescontoPagamento,
      b.valorOutrasDespesasPagamento,
      b.valorJurosPagamento,
      b.valorFreteTotal,
      b.valorSeguroTotal,
      b.valorDescontoTotal,
      b.valorOutrasDespesasTotal,
      b.valorAdicFreteMarinhaMerTotal,
      b.valorDespesasAduaneirasTotal,
      b.cfop,
      b.indicadorISSQN,
      b.aliquotaISSQN,
      b.retidoISSQN,
      b.tributadoForaMunicipio,
      b.incentivoFiscal,
      b.listaServicos,
      b.cnae,
      b.idServicoMunicipio,
      b.numeroProcessoAdministrativo,
      b.baseISSQN,
      b.valorISSQN,
      b.retencaoIRRF,
      b.baseRetIRRF,
      b.valorRetIRRF,
      b.retencaoINSS,
      b.baseRetINSS,
      b.valorRetINSS,
      b.retencaoPIS,
      b.baseRetPIS,
      b.valorRetPIS,
      b.retencaoCOFINS,
      b.baseRetCOFINS,
      b.valorRetCOFINS,
      b.retencaoCSLL,
      b.baseRetCSLL,
      b.valorRetCSLL,
      b.retencaoOutros,
      b.baseRetOutros,
      b.valorRetOutros,
      b.aliquotaII,
      b.baseII,
      b.valorII,
      b.aliquotaIOF,
      b.baseIOF,
      b.valorIOF,
      b.codigoEnquadramentoIPI,
      b.stIPI,
      b.aliquotaIPI,
      b.valorAliquotaIPI,
      b.baseIPI,
      b.valorIPI,
      b.valorIPIDevolucao,
      b.stPIS,
      b.aliquotaPIS,
      b.valorAliquotaPIS,
      b.basePIS,
      b.valorPIS,
      b.aliquotaPISST,
      b.valorAliquotaPISST,
      b.basePISST,
      b.valorPISST,
      b.stCOFINS,
      b.aliquotaCOFINS,
      b.valorAliquotaCOFINS,
      b.baseCOFINS,
      b.valorCOFINS,
      b.aliquotaCOFINSST,
      b.valorAliquotaCOFINSST,
      b.baseCOFINSST,
      b.valorCOFINSST,
      b.stSimplesNacional,
      b.creditoSimplesNacional,
      b.baseCreditoSimplesNacional,
      b.valorCreditoSimplesNacional,
      b.stICMS,
      b.modalidadeBaseCalcICMS,
      b.reducaoBaseICMS,
      b.aliquotaICMS,
      b.diferimentoICMS,
      b.motivoDesoneracaoICMS,
      b.idBeneficio,
      b.baseICMS,
      b.valorICMSOperacao,
      b.valorICMSDiferido,
      b.valorICMS,
      b.valorICMSDesoneracao,
      b.modalidadeBaseCalcICMSST,
      b.margemValorAdicionadoST,
      b.reducaoBaseST,
      b.aliquotaICMSST,
      b.aliquotaSTSuportConsFinal,
      b.baseICMSST,
      b.valorICMSST,
      b.baseICMSSTAnteriormente,
      b.valorICMSSTAnteriormente,
      b.valorICMSProprioSubstituto,
      b.reducaoBaseICMSEfetivo,
      b.aliquotaICMSEfetivo,
      b.baseICMSEfetivo,
      b.valorICMSEfetivo,
      b.stICMSEscrituracao,
      b.reducaoBaseICMSEscrituracao,
      b.aliquotaICMSEscrituracao,
      b.diferimentoICMSEscrituracao,
      b.baseICMSEscrituracao,
      b.valorICMSEscrituracao,
      b.valorICMSDesonEscrituracao,
      b.margemValorAdicSTEscrituracao,
      b.reducaoBaseSTEscrituracao,
      b.aliquotaICMSSTEscrituracao,
      b.baseICMSSTEscrituracao,
      b.valorICMSSTEscrituracao,
      b.somarICMSST,
      b.aliquotaICMSUFDestinatario,
      b.aliquotaICMSInterestadual,
      b.partilhaICMSInterestadual,
      b.baseICMSUFDestinatario,
      b.valorICMSUFDestinatario,
      b.baseICMSUFRemetente,
      b.valorICMSUFRemetente,
      b.aliquotaFCP,
      b.baseFCP,
      b.valorFCP,
      b.aliquotaFCPST,
      b.baseFCPST,
      b.valorFCPST,
      b.aliquotaFCPSTAnteriormente,
      b.baseFCPSTAnteriormente,
      b.valorFCPSTAnteriormente,
      b.aliquotaFCPUFDestinatario,
      b.baseFCPUFDestinatario,
      b.valorFCPUFDestinatario,
      b.aliquotaEstimadaImpFederais,
      b.aliquotaEstimadaImpEstaduais,
      b.aliquotaEstimadaImpMunicipais,
      b.baseEstimadaImpostos,
      b.valorEstimadoImpFederais,
      b.valorEstimadoImpEstaduais,
      b.valorEstimadoImpMunicipais,
      b.valorLiquidoItem,
      b.valorDescontoCustoOpItem,
      b.valorDescontoCustoOpGeral,
      b.valorDescontoCustoOpTotal,
      b.valorAcrescimoCustoOpItem,
      b.valorAcrescimoCustoOpGeral,
      b.valorAcrescimoCustoOpTotal,
      b.precoCustoOperacao,
      b.valorCustoOperacao,
      b.precoCMV,
      b.valorCMV,
      b.quantidadeExtemporanea,
      b.acrescimoUnitarioExtemporaneo,
      b.valorAcrescimoExtempSubtotal,
      b.valorAcrescimoExtempItem,
      b.valorAcrescimoExtempGeral,
      b.valorAcrescimoExtempTotal,
      b.observacoesDigitadas,
      b.observacoes);
    v_atualizarObservacoes := 0;
    IF p_idItemReferenciado > 0 THEN
      IF p_tipoDocumentoReferenciado IN ('D','P') THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV(
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_devolucaoAnulacaoRetorno,
          'D',
          r_item_idItemDocFiscal,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          p_tipoDocumentoReferenciado,
          p_idItemReferenciado);
      END IF;
      IF p_tipoDocumentoReferenciado = 'B' THEN
        ADD_DOC_FISC_ITEM_BALANC_GRAVA (
          p_estabelecimentoAtivo,
          p_idItemReferenciado,
          r_item_idItemDocFiscal);
      ELSIF p_tipoDocumentoReferenciado = 'D' THEN
        ADD_DOC_FISC_ITEM_REF_DOC_FIS (
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'G' THEN
        ADD_DOC_FISC_ITEM_REF_DFE_GRAD (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_person_190_modeloFrete,
          p_config_227_manterPessoaOrcam,
          p_config_230_etapaPedComprParc,
          p_config_378_calcularVolumes,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'O' THEN
        ADD_DOC_FISC_ITEM_REF_ORCAMEN (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'P' THEN
        ADD_DOC_FISC_ITEM_REF_PRE_DOC (
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'T' THEN
        ADD_DOC_FISC_ITEM_TRANS_GRAVA (
          p_estabelecimentoAtivo,
          v_cab_entradaSaida,
          p_idItemReferenciado,
          r_item_idItemDocFiscal,
          p_quantidadeReferenciada);
      END IF;
    END IF;
    IF p_tempComp_nomeTempComposicao <> ' '
      AND (NOT (p_tipoDocumentoReferenciado IN ('D','O','P'))
        OR p_idItemReferenciado <= 0)
    THEN
      ADD_DOC_FISC_ITEM_COMP_TEMP (
        p_sessaoClient,
        p_estabelecimentoAtivo,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        r_item_idItemDocFiscal,
        v_atualizarObservacoes,
        v_atualizarObservacoes);
    END IF;
    v_idEnderecoEstoque := 0;
    IF p_item_idEnderecoEstoque > 0 THEN
      ADD_DOC_FISC_ITEM_ENDER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemDocFiscal,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_quantidade,
        ' ',
        v_idEnderecoEstoque);
    END IF;
    IF p_item_idNumeroSerie > 0 THEN
      ADD_DOC_FISC_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemDocFiscal,
        v_idEnderecoEstoque,
        p_item_gradeProduto,
        p_item_idNumeroSerie,
        0,
        v_auxNumber);
      v_atualizarObservacoes := 1;
    END IF;
    IF v_atualizarObservacoes = 1 THEN
      v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
        p_sessaoClient,
        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_413_obs_add_marca,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        'D',
        r_item_idItemDocFiscal,
        p_item_gradeProduto,
        p_item_idFormulaTinta,
        p_item_personalizacao,
        p_item_idLoteEstoque,
        p_item_controleQuantidade,
        p_item_loteMultiplo,
        p_item_altura,
        p_item_largura,
        p_item_comprimento,
        p_item_quantidade,
        p_item_observacoesDigitadas);
      UPDATE MODOCFISCALXITENS
      SET observacoes = v_observacoes
      WHERE idItemDocFiscal = r_item_idItemDocFiscal;
    END IF;
    IF v_cab_situacaoDocumentoFiscal > 20 THEN
      ADD_DOC_FISC_ITEM_EST_ATUALIZA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_item_idItemDocFiscal,
        p_estabelecimentoAtivo);
      ADD_DOC_FISC_ITEM_FIL_ATUALIZA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_item_idItemDocFiscal,
        p_estabelecimentoAtivo);
    END IF;
    r_buffer_idItemDocFiscal := CASE WHEN (r_buffer_idItemDocFiscal IS NULL OR r_buffer_idItemDocFiscal = '' OR r_buffer_idItemDocFiscal = ' ') THEN '' ELSE RTRIM (r_buffer_idItemDocFiscal) || ';' END || TO_CHAR (LPAD(r_item_idItemDocFiscal,14,'0'));
    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;
  END IF;
END ADD_DOC_FISC_ITEM_GRAVA;

/

-- FIM BETA 6 - 14/5/24

create or replace PROCEDURE ADD_GERA_TEMP_INVENTARIO (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_335_cmvGerencIgualFis IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_sessaoClient                 IN VARCHAR2,
  p_contadorSessaoFiscal         IN NUMBER,
  p_contadorSessaoGerencial      IN NUMBER,
  p_gerandoInventario            IN NUMBER,
  p_buscarPrecoUnitarioCMV       IN NUMBER,
  p_buscarPrecoUnitUltimaCompra  IN NUMBER,
  p_buscarPrecoCustoUltimaCompra IN NUMBER,
  p_buscarPrecoCustoUltimaFormac IN NUMBER,
  p_buscarICMS                   IN NUMBER,
  p_invEst_data                  IN DATE,
  p_invEst_motivoInventario      IN CHAR,
  p_inEstabelecimentos           IN VARCHAR2,
  p_produto                      IN NUMBER,
  p_prod_join                    IN VARCHAR2,
  p_prod_andWhere                IN VARCHAR2,
  p_filtroProduto                IN NUMBER,
  p_inventario_join              IN VARCHAR2,
  p_inventario_andWhere          IN VARCHAR2,
  p_movimentos_join              IN VARCHAR2,
  p_movimentos_andWhere          IN VARCHAR2,
  p_docFiscal_join               IN VARCHAR2,
  p_docFiscal_andWhere           IN VARCHAR2,
  p_docFiscalFilho_join          IN VARCHAR2,
  p_docFiscalFilho_andWhere      IN VARCHAR2,
  p_transfPendente_considerar    IN NUMBER,
  p_transfPendente_joinEntradas  IN VARCHAR2,
  p_transfPendente_andWhereEntra IN VARCHAR2,
  p_transfPendente_joinSaidas    IN VARCHAR2,
  p_transfPendente_andWhereSaida IN VARCHAR2)
IS
  v_prod_join     CLOB;
  v_prod_andWhere CLOB;
BEGIN
  v_prod_join := '
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto'
|| CASE
     WHEN p_prod_join IS NULL OR p_prod_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_prod_join)
   END
|| CASE
     WHEN p_produto <> 0 OR p_filtroProduto = 0
     THEN ''
     ELSE '
    JOIN PAFILTROSPRODUTO filtrProd
    ON filtrProd.filtroProduto = ' || TO_CHAR(p_filtroProduto)
   END;
  v_prod_andWhere := '
      AND gradProd.produto '
|| CASE
     WHEN  p_produto = 0
     THEN '> 0'
       || CASE
            WHEN p_prod_andWhere IS NULL OR p_prod_andWhere = ' '
            THEN '
    AND prod.controleEstoque IN (1,5,11,12,13)'
            ELSE '
    ' || RTRIM(p_prod_andWhere)
          END
       || CASE
            WHEN p_filtroProduto = 0
            THEN ''
            ELSE '
    AND filtrProd.filtrarVendedores              = 0
    AND filtrProd.filtrarLocaisEstoque           = 0
    AND filtrProd.filtrarPersonalizacoes         = 0
    AND (filtrProd.filtrarProdutos               = 0
      AND filtrProd.filtrarCategoriasProdutos    = 0
      AND filtrProd.filtrarSubcategoriasProdutos = 0
      AND filtrProd.filtrarMarcas                = 0
      AND filtrProd.filtrarCaracteristicasA      = 0
      AND filtrProd.filtrarCaracteristicasB      = 0
      AND filtrProd.filtrarCaracteristicasC      = 0
      AND filtrProd.filtrarCaracteristicasD      = 0
      AND filtrProd.filtrarCaracteristicasE      = 0
      AND filtrProd.filtrarCores                 = 0
      AND filtrProd.filtrarTamanhos              = 0
      AND filtrProd.filtrarNCMs                  = 0
      AND filtrProd.filtrarListasServicos        = 0
      OR filtrProd.filtrarProdutos               = 1
      AND EXISTS (
        SELECT 1
        FROM PAFILTROPRODUTOXPRODUTOS filtrProdX
        WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
        AND filtrProdX.produto = prod.produto
        AND filtrProdX.ativo = 1)
      OR (filtrProd.filtrarCategoriasProdutos     = 1
        OR filtrProd.filtrarSubcategoriasProdutos = 1
        OR filtrProd.filtrarMarcas                = 1
        OR filtrProd.filtrarCaracteristicasA      = 1
        OR filtrProd.filtrarCaracteristicasB      = 1
        OR filtrProd.filtrarCaracteristicasC      = 1
        OR filtrProd.filtrarCaracteristicasD      = 1
        OR filtrProd.filtrarCaracteristicasE      = 1
        OR filtrProd.filtrarCores                 = 1
        OR filtrProd.filtrarTamanhos              = 1
        OR filtrProd.filtrarNCMs                  = 1
        OR filtrProd.filtrarListasServicos        = 1)
      AND (filtrProd.filtrarCategoriasProdutos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCATEGPROD filtrProdX
          JOIN PASUBCATEGORIASPRODUTO subCatX
          ON subCatX.categoriaProduto = filtrProdX.categoriaProduto
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND subCatX.subcategoriaProduto = prod.subcategoriaProduto
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarSubcategoriasProdutos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXSUBCAPROD filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.subcategoriaProduto = prod.subcategoriaProduto
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarMarcas = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXMARCAS filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.marca = prod.marca
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarCaracteristicasA = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERA filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.caracteristicaA = prod.caracteristicaA
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarCaracteristicasB = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERB filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.caracteristicaB = prod.caracteristicaB
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarCaracteristicasC = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERC filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.caracteristicaC = prod.caracteristicaC
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarCaracteristicasD = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERD filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.caracteristicaD = prod.caracteristicaD
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarCaracteristicasE = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERE filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.caracteristicaE = prod.caracteristicaE
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarCores = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCORES filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.cor = gradProd.Cor
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarTamanhos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXTAMANHOS filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.tamanho = gradProd.tamanho
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarNCMs = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXNCMS filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.idNcm = prod.idNcm
          AND filtrProdX.ativo = 1))
      AND (filtrProd.filtrarListasServicos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXLISTASSE filtrProdX
          WHERE filtrProdX.filtroProduto = filtrProd.filtroProduto
          AND filtrProdX.listaServicos = prod.listaServicos
          AND filtrProdX.ativo = 1)))'
          END
     ELSE ' = ' || TO_CHAR(p_produto)
   END;
  IF p_contadorSessaoFiscal <> 0 THEN
    DELETE TEMPINVENTARIOESTXFISCAL
    WHERE sessaoClient = p_sessaoClient
    AND contadorSessao = p_contadorSessaoFiscal;
    EXECUTE IMMEDIATE 'INSERT INTO TEMPINVENTARIOESTXFISCAL (
  sessaoClient,
  contadorSessao,
  contador,
  estabelecimento,
  gradeProduto,
  indicadorPropriedadePosseItem,
  pessoaParticipante,
  quantidade,
  precoUnitarioCMV,
  stICMS,
  baseICMS,
  valorICMS)
WITH
DATAINVENTARIOSESTOQUE AS (
  SELECT
    a.inventarioEstoque,
    a.estabelecimento,
    TRUNC(a.data) data
  FROM (
    SELECT
      inventarioEstoque,
      estabelecimento,
      data,
      ROW_NUMBER() OVER (
        PARTITION BY estabelecimento
        ORDER BY
          estabelecimento ASC,
          data DESC,
          inventarioEstoque DESC
        ) ordenacao
    FROM MOINVENTARIOSESTOQUE
    WHERE motivoInventarioEstoque = ''01''
    AND data < TO_DATE (''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')'
|| CASE
     WHEN p_gerandoInventario = 0
     THEN ' + 1'
     ELSE ''
   END
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
    AND estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| ') a
  WHERE a.ordenacao = 1),
DATAINVENTARIOESTOQUEXFISC AS (
  SELECT
    a.inventarioEstoque,
    a.estabelecimento,
    a.produto,
    TRUNC(a.data) data
  FROM (
    SELECT
      invEst.inventarioEstoque,
      invEst.estabelecimento,
      gradProd.produto,
      invEst.data,
      ROW_NUMBER() OVER (
        PARTITION BY
          invEst.estabelecimento,
          gradProd.produto
        ORDER BY
          invEst.estabelecimento ASC,
          gradProd.produto ASC,
          invEst.data DESC,
          itemInv.inventarioEstoque DESC
        ) ordenacao
    FROM MOINVENTARIOESTOQUEXFISC itemInv
    JOIN MOINVENTARIOSESTOQUE invEst
    ON invEst.inventarioEstoque = itemInv.inventarioEstoque
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = itemInv.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_inventario_join IS NULL OR p_inventario_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_join)
   END
|| '
    WHERE invEst.motivoInventarioEstoque <> ''01''
    AND invEst.data < TO_DATE (''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')
    AND invEst.data >= COALESCE ((
      SELECT MAX (dataInv.data) + 1
      FROM DATAINVENTARIOSESTOQUE dataInv
      WHERE dataInv.estabelecimento = invEst.estabelecimento),
      TO_DATE (''01/01/1900'',''DD/MM/YYYY''))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
    AND invEst.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_inventario_andWhere IS NULL OR p_inventario_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_andWhere)
   END
|| ') a
  WHERE a.ordenacao = 1),
DATAESTOQUEINICIAL AS (
  SELECT
    a.estabelecimento,
    TRUNC(a.data) data,
    a.produto
  FROM (
    SELECT
      mov.estabelecimento,
      mov.data,
      gradProd.produto,
      ROW_NUMBER() OVER (
        PARTITION BY
          mov.estabelecimento,
          gradProd.produto
        ORDER BY
          mov.estabelecimento ASC,
          gradProd.produto ASC,
          mov.data DESC,
          mov.idEstoque DESC
        ) ordenacao
    FROM MOESTOQUES mov
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = mov.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_movimentos_join IS NULL OR p_movimentos_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM (p_movimentos_join)
   END
|| '
    WHERE mov.operacaoInternaEstoque = 1
    AND mov.data < TO_DATE (''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') + 1
    AND mov.data >= COALESCE ((
      SELECT MAX (dataInvFisc.data) + 1
      FROM DATAINVENTARIOESTOQUEXFISC dataInvFisc
      WHERE dataInvFisc.estabelecimento = mov.estabelecimento
      AND dataInvFisc.produto = gradProd.produto),
      COALESCE ((
        SELECT MAX (dataInv.data) + 1
        FROM DATAINVENTARIOSESTOQUE dataInv
        WHERE dataInv.estabelecimento = mov.estabelecimento),
        TO_DATE (''01/01/1900'', ''DD/MM/YYYY'')))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
    AND mov.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_movimentos_andWhere IS NULL OR p_movimentos_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_movimentos_andWhere)
   END
|| ') a
  WHERE a.ordenacao = 1)
SELECT
  ''' || CASE WHEN p_sessaoClient IS NULL OR p_sessaoClient = ' ' THEN ' ' ELSE RTRIM(p_sessaoClient) END || ''',
  ' || TO_CHAR(p_contadorSessaoFiscal) || ',
  ROW_NUMBER() OVER (
    ORDER BY
      a.estabelecimento,
      a.gradeProduto,
      a.indicadorPropriedadePosseItem,
      a.pessoaParticipante),
  a.estabelecimento,
  a.gradeProduto,
  a.indicadorPropriedadePosseItem,
  a.pessoaParticipante,
  SUM (a.quantidade),
  0 precoUnitarioCMV,
  ''00'' stICMS,
  0 baseICMS,
  0 valorICMS
FROM (
  SELECT DISTINCT
    itemInv.id,
    invEst.estabelecimento,
    itemInv.indicadorPropriedadePosseItem,
    itemInv.pessoaParticipante,
    itemInv.gradeProduto,
    itemInv.quantidade,
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MOINVENTARIOESTOQUEXFISC itemInv
  JOIN MOINVENTARIOSESTOQUE invEst
  ON invEst.inventarioEstoque = itemInv.inventarioEstoque
  JOIN DATAINVENTARIOSESTOQUE dataInv
  ON dataInv.inventarioEstoque = itemInv.inventarioEstoque
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = itemInv.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_inventario_join IS NULL OR p_inventario_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_join)
   END
|| '
  WHERE NOT (EXISTS (
    SELECT 1
    FROM DATAINVENTARIOESTOQUEXFISC dataInvFisc
    WHERE dataInvFisc.estabelecimento = invEst.estabelecimento
    AND dataInvFisc.produto = gradProd.produto))
  AND NOT (EXISTS (
    SELECT 1
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = invEst.estabelecimento
    AND dataEstInic.produto = gradProd.produto))'
|| v_prod_andWhere
|| CASE
     WHEN p_inventario_andWhere IS NULL OR p_inventario_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_andWhere)
   END
|| '
  UNION ALL
  SELECT DISTINCT
    itemInv.id,
    invEst.estabelecimento,
    itemInv.indicadorPropriedadePosseItem,
    itemInv.pessoaParticipante,
    itemInv.gradeProduto,
    itemInv.quantidade,
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MOINVENTARIOESTOQUEXFISC itemInv
  JOIN MOINVENTARIOSESTOQUE invEst
  ON invEst.inventarioEstoque = itemInv.inventarioEstoque
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = itemInv.gradeProduto
  JOIN DATAINVENTARIOESTOQUEXFISC dataInvFisc
  ON dataInvFisc.inventarioEstoque = itemInv.inventarioEstoque
  AND dataInvFisc.produto = gradProd.produto'
|| v_prod_join
|| CASE
     WHEN p_inventario_join IS NULL OR p_inventario_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_join)
   END
|| '
  WHERE NOT (EXISTS (
    SELECT 1
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = dataInvFisc.estabelecimento
    AND dataEstInic.produto = gradProd.produto))'
|| v_prod_andWhere
|| CASE
     WHEN p_inventario_andWhere IS NULL OR p_inventario_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_andWhere)
   END
|| '
  UNION ALL
  SELECT DISTINCT
    mov.idEstoque id,
    mov.estabelecimento,
    mov.indicadorPropriedadePosseItem,
    mov.pessoaParticipante,
    mov.gradeProduto,
    mov.quantidade * CASE WHEN mov.entradaSaida = ''S'' THEN -1 ELSE 1 END quantidade,
    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.operacaoInternaEstoque IN (1,900)
  AND mov.data < TO_DATE(''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') + 1
  AND mov.data >= COALESCE((
    SELECT MAX (dataEstInic.data)
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = mov.estabelecimento
    AND dataEstInic.produto = gradProd.produto),
    COALESCE((
      SELECT MAX (dataInvFisc.data) + 1
      FROM DATAINVENTARIOESTOQUEXFISC dataInvFisc
      WHERE dataInvFisc.estabelecimento = mov.estabelecimento
      AND dataInvFisc.produto = gradProd.produto),
      COALESCE((
        SELECT MAX (dataInv.data) + 1
        FROM DATAINVENTARIOSESTOQUE dataInv
        WHERE dataInv.estabelecimento = mov.estabelecimento),
        TO_DATE (''01/01/1900'',''DD/MM/YYYY''))))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
  AND mov.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_movimentos_andWhere IS NULL OR p_movimentos_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_movimentos_andWhere)
   END
|| '
  UNION ALL
  SELECT DISTINCT
    itemDoc.idItemDocFiscal id,
    cabDoc.estabelecimento,
    locEst.indicadorPropriedadePosseItem,
    itemDoc.pessoaParticipante,
    itemDoc.gradeProduto,
    itemDoc.quantidade * CASE WHEN cabDoc.entradaSaida = ''S'' THEN -1 ELSE 1 END quantidade,
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MODOCFISCALXITENS itemDoc
  JOIN MODOCUMENTOSFISCAIS cabDoc
  ON cabDoc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = itemDoc.gradeProduto
  JOIN PALOCAISESTOQUE locEst
  ON locEst.localEstoque = itemDoc.localEstoque'
|| v_prod_join
|| CASE
     WHEN p_docFiscal_join IS NULL OR p_docFiscal_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_docFiscal_join)
   END
|| '
  WHERE itemDoc.cancelado = 0
  AND itemDoc.movimentaEstoqueFiscal = 1
  AND cabDoc.situacaoDocumentoFiscal BETWEEN 21 AND 23
  AND cabDoc.dataEntradaSaida < TO_DATE (''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') + 1
  AND cabDoc.dataEntradaSaida >= COALESCE((
    SELECT MAX (dataEstInic.data)
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = cabDoc.estabelecimento
    AND dataEstInic.produto = gradProd.produto),
    COALESCE((
      SELECT MAX (dataInvFisc.data) + 1
      FROM DATAINVENTARIOESTOQUEXFISC dataInvFisc
      WHERE dataInvFisc.estabelecimento = cabDoc.estabelecimento
      AND dataInvFisc.produto = gradProd.produto),
      COALESCE((
        SELECT MAX (dataInv.data) + 1
        FROM DATAINVENTARIOSESTOQUE dataInv
        WHERE dataInv.estabelecimento = cabDoc.estabelecimento),
        TO_DATE (''01/01/1900'', ''DD/MM/YYYY''))))
  AND NOT(EXISTS(
    SELECT 1
    FROM MODOCFISCALXPRODUTOFILHO filhoDoc
    WHERE filhoDoc.idItemDocFiscal = itemDoc.idItemDocFiscal))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
  AND cabDoc.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_docFiscal_andWhere IS NULL OR p_docFiscal_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_docFiscal_andWhere)
   END
|| '
  UNION ALL
  SELECT DISTINCT
    filhoDoc.id,
    cabDoc.estabelecimento,
    locEst.indicadorPropriedadePosseItem,
    itemDoc.pessoaParticipante,
    filhoDoc.gradeProduto,
    filhoDoc.quantidade * CASE WHEN cabDoc.entradaSaida = ''S'' THEN -1 ELSE 1 END quantidade,
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MODOCFISCALXPRODUTOFILHO filhoDoc
  JOIN MODOCFISCALXITENS itemDoc
  ON itemDoc.idItemDocFiscal = filhoDoc.idItemDocFiscal
  JOIN MODOCUMENTOSFISCAIS cabDoc
  ON cabDoc.idDocumentoFiscal = itemDoc.idDocumentoFiscal
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = filhoDoc.gradeProduto
  JOIN PALOCAISESTOQUE locEst
  ON locEst.localEstoque = itemDoc.localEstoque'
|| v_prod_join
|| CASE
     WHEN p_inventario_join IS NULL OR p_inventario_join = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_join)
   END
|| '
  WHERE itemDoc.cancelado = 0
  AND itemDoc.movimentaEstoqueFiscal = 1
  AND cabDoc.situacaoDocumentoFiscal BETWEEN 21 AND 23
  AND cabDoc.dataEntradaSaida < TO_DATE (''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') + 1
  AND cabDoc.dataEntradaSaida >= COALESCE ((
    SELECT MAX (dataEstInic.data)
    FROM DATAESTOQUEINICIAL dataEstInic
    WHERE dataEstInic.estabelecimento = cabDoc.estabelecimento
    AND dataEstInic.produto = gradProd.produto),
    COALESCE ((
      SELECT MAX (dataInvFisc.data) + 1
      FROM DATAINVENTARIOESTOQUEXFISC dataInvFisc
      WHERE dataInvFisc.estabelecimento = cabDoc.estabelecimento
      AND dataInvFisc.produto = gradProd.produto),
      COALESCE ((
        SELECT MAX (dataInv.data) + 1
        FROM DATAINVENTARIOSESTOQUE dataInv
        WHERE dataInv.estabelecimento = cabDoc.estabelecimento),
        TO_DATE (''01/01/1900'', ''DD/MM/YYYY''))))'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
  AND cabDoc.estabelecimento IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_inventario_andWhere IS NULL OR p_inventario_andWhere = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_inventario_andWhere)
   END
|| ') a
GROUP BY
  a.gradeProduto,
  a.estabelecimento,
  a.indicadorPropriedadePosseItem,
  a.pessoaParticipante,
  a.produto,
  a.cor,
  a.tamanho';
    IF p_buscarPrecoUnitarioCMV = 1 THEN
      EXECUTE IMMEDIATE 'BEGIN
  FOR a IN (
    SELECT
      a.sessaoClient,
      a.contadorSessao,
      a.estabelecimento,
      a.indicadorPropriedadePosseItem,
      a.pessoaParticipante,
      '
      || CASE
           WHEN p_config_362_calcCustoPorGrade = 1
           THEN 'a.gradeProduto'
           ELSE 'a.produto'
          END
      || ',
      FUNC_ADD_BUSCA_PRECO_MEDIO_FIS(
        ' || TO_CHAR (p_config_209_filtrarGrupoEcon) || ', -- p_config_209_filtrarGrupoEcon
        ' || TO_CHAR (p_config_362_calcCustoPorGrade) || ', -- p_config_362_calcCustoPorGrade
        a.estabelecimento,
        TO_DATE (''' || TO_CHAR(p_invEst_data, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY''), -- p_dataFinal
        a.pessoaParticipante,
        a.produto,
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.cor' ELSE '0' END || ',
        ' || CASE WHEN p_config_362_calcCustoPorGrade = 1 THEN 'a.tamanho' ELSE ''' ''' END || ',
        a.indicadorPropriedadePosseItem,
        ' || TO_CHAR (p_gerandoInventario) || ' -- p_gerandoInventario
      ) precoUnitarioCMV
    FROM (
      SELECT
        a.sessaoClient,
        a.contadorSessao,
        a.indicadorPropriedadePosseItem,
        a.pessoaParticipante,
        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
|| CASE
     WHEN p_transfPendente_considerar = 0
     THEN ''
     ELSE '
  UNION ALL
  SELECT DISTINCT
    itemTransf.idItemDocTransferencia id,
    cabTransf.estabelecimentoEntrada estabelecimento,
    itemTransf.localEstoqueEntrada localEstoque,
    locEst.indicadorPropriedadePosseItem,
    itemTransf.pessoaParticipanteEntrada pessoaParticipante,
    itemTransf.gradeProduto,
    itemTransf.personalizacao,
    itemTransf.idLoteEstoque,
    0 idEnderecoEstoque,
    CASE WHEN prod.controlaNumeroSerie = 1 THEN COALESCE (numSerie.idNumeroSerie, 0) ELSE 0 END idNumeroSerie,
    itemTransf.quantidade,
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MODOCUMENTOTRANSFXITENS itemTransf
  JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
  ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = itemTransf.gradeProduto
  JOIN PALOCAISESTOQUE locEst
  ON locEst.localEstoque = itemTransf.localEstoqueEntrada
  LEFT JOIN MODOCTRANSFXNUMEROSSERIE numSerie
  ON numSerie.idItemDocTransferencia = itemTransf.idItemDocTransferencia
  AND numSerie.gradeProduto = itemTransf.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_transfPendente_joinEntradas IS NULL OR p_transfPendente_joinEntradas = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_transfPendente_joinEntradas)
   END
|| '
  WHERE itemTransf.cancelado = 0
  AND itemTransf.validoEntrada = 1
  AND cabTransf.tipoDocumentoEntrada > 100
  AND cabTransf.situacaoDocTransferencia IN (''A'',''E'')'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
  AND cabTransf.estabelecimentoEntrada IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_transfPendente_andWhereEntra IS NULL OR p_transfPendente_andWhereEntra = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_transfPendente_andWhereEntra)
   END
|| '
  UNION ALL
  SELECT DISTINCT
    itemTransf.idItemDocTransferencia id,
    cabTransf.estabelecimentoSaida estabelecimento,
    itemTransf.localEstoqueSaida localEstoque,
    locEst.indicadorPropriedadePosseItem,
    itemTransf.pessoaParticipanteSaida pessoaParticipante,
    itemTransf.gradeProduto,
    itemTransf.personalizacao,
    itemTransf.idLoteEstoque,
    0 idEnderecoEstoque,
    CASE WHEN prod.controlaNumeroSerie = 1 THEN COALESCE (numSerie.idNumeroSerie, 0) ELSE 0 END idNumeroSerie,
    (- itemTransf.quantidade) quantidade,
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho
  FROM MODOCUMENTOTRANSFXITENS itemTransf
  JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
  ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = itemTransf.gradeProduto
  JOIN PALOCAISESTOQUE locEst
  ON locEst.localEstoque = itemTransf.localEstoqueSaida
  LEFT JOIN MODOCTRANSFXNUMEROSSERIE numSerie
  ON numSerie.idItemDocTransferencia = itemTransf.idItemDocTransferencia
  AND numSerie.gradeProduto = itemTransf.gradeProduto'
|| v_prod_join
|| CASE
     WHEN p_transfPendente_joinSaidas IS NULL OR p_transfPendente_joinSaidas = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_transfPendente_joinSaidas)
   END
|| '
  WHERE itemTransf.cancelado = 0
  AND itemTransf.validoSaida = 1
  AND cabTransf.tipoDocumentoSaida > 100
  AND cabTransf.situacaoDocTransferencia IN (''A'',''E'')'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     ELSE '
  AND cabTransf.estabelecimentoSaida IN (' || TRIM(p_inEstabelecimentos) || ')'
   END
|| v_prod_andWhere
|| CASE
     WHEN p_transfPendente_andWhereSaida IS NULL OR p_transfPendente_andWhereSaida = ' '
     THEN ''
     ELSE '
    ' || RTRIM(p_transfPendente_andWhereSaida)
   END
   END
|| ') a
GROUP BY
  a.gradeProduto,
  a.estabelecimento,
  a.localEstoque,
  a.indicadorPropriedadePosseItem,
  a.pessoaParticipante,
  a.personalizacao,
  a.idLoteEstoque,
  a.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;

/

ALTER TABLE MOORCAMENTOXATIVIDADEPREV MODIFY checklist NUMERIC (14,0);
ALTER TABLE MOORCAMENTOXTAREFAS MODIFY idChecklistXTarefas NUMERIC (14,0);

-- TEMPTAREFAS
CREATE GLOBAL TEMPORARY TABLE TEMPTAREFAS
  (
    sessaoClient        VARCHAR (30) DEFAULT ' ' NOT NULL,
    contadorSessao      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    contadorTemp        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idTarefaOrcamento   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idCheckListXTarefas NUMERIC (14,0) DEFAULT 0 NOT NULL,
    conteudo            VARCHAR (256) DEFAULT ' ' NOT NULL,
    excluido            NUMERIC (1,0) DEFAULT 0 NOT NULL
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPTAREFAS_PK1 ON TEMPTAREFAS (sessaoClient, contadorSessao, contadorTemp);
CREATE INDEX TEMPTAREFAS_K2 ON TEMPTAREFAS (sessaoClient, contadorSessao, idCheckListXTarefas);

UPDATE SIVERSOESSISTEMA SET dataLiberacaoVersao = TO_DATE('15/05/2024','DD/MM/YYYY'), dataAtualizacaoVersao =  SYSDATE, observacoes = 'BETA 7' WHERE idVersaoSistema = 2024001002;

COMMIT;

-- FIM BETA 7 - 15/5/24

create or replace PROCEDURE ADD_DOC_FISC_ITEM_EXCLUI (
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_person_184_tipoEventoCancCon IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_95_etapaOrcamentoCanc IN NUMBER,
  p_config_96_etapaOrdemServCanc IN NUMBER,
  p_config_97_etapaPedCompraCanc IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_415_etapaFatContrCanc IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_cancelando_Excluindo         IN CHAR,
  p_cancelandoExcluindoDocumento IN NUMBER,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_atualizaUltimaCompra     NUMBER;
  v_cab_estabelecimento          NUMBER;
  v_cab_nfFornecedor             NUMBER;
  v_cab_documentoFiscal          NUMBER;
  v_cab_dataEntradaSaida         DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  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_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota NUMBER;
  v_cab_promocaoExiste           NUMBER;
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  FOR a IN (
    SELECT
      item.idDocumentoFiscal,
      item.gradeProduto,
      item.cancelado,
      item.usarPrecoAVista,
      item.geraFinanceiro,
      item.controleQuantidade,
      item.loteMultiplo,
      item.quantidade,
      item.quantidadeConvertida,
      item.pesoLiquido,
      item.pesoBruto,
      item.valorProdutoServicoBruto,
      item.valorProdutoServico,
      item.valorDescontoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      item.valorFreteGeral,
      item.valorSeguroGeral,
      item.valorDescontoGeral,
      item.valorOutrasDespesasGeral,
      item.valorAdicFreteMarinhaMerGeral,
      item.valorDespesasAduaneirasGeral,
      item.valorBasePagamento,
      item.valorDescontoPagamento,
      item.valorOutrasDespesasPagamento,
      item.valorJurosPagamento,
      item.valorFreteTotal,
      item.valorSeguroTotal,
      item.valorDescontoTotal,
      item.valorOutrasDespesasTotal,
      item.valorAdicFreteMarinhaMerTotal,
      item.valorDespesasAduaneirasTotal,
      item.valorLiquidoItem,
      item.valorDescontoCustoOpItem,
      item.valorDescontoCustoOpGeral,
      item.valorDescontoCustoOpTotal,
      item.valorAcrescimoCustoOpItem,
      item.valorAcrescimoCustoOpGeral,
      item.valorAcrescimoCustoOpTotal,
      item.valorCustoOperacao,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.valorAcrescimoExtempSubtotal,
      item.valorAcrescimoExtempItem,
      item.valorAcrescimoExtempGeral,
      item.valorAcrescimoExtempTotal,
      gradProd.produto,
      prod.tipoProduto
    FROM MODOCFISCALXITENS item
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE item.idItemDocFiscal = p_item_idItemDocFiscal)
  LOOP
    SELECT
      cab.origemDocumento,
      cab.tipoDocumento,
      cab.entradaSaida,
      cab.devolucaoAnulacaoRetorno,
      cab.atualizaCustoMedio,
      cab.atualizaUltimaCompra,
      cab.estabelecimento,
      cab.nfFornecedor,
      cab.documentoFiscal,
      cab.dataEntradaSaida,
      cab.pessoa,
      cab.modalidadeFrete,
      cab.tipoPagamentoFrete,
      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,
      cab.valorDescontoCustoOpItem,
      cab.valorDescontoCustoOpGeral,
      cab.valorDescontoCustoOpTotal,
      cab.valorAcrescimoCustoOpItem,
      cab.valorAcrescimoCustoOpGeral,
      cab.valorAcrescimoCustoOpTotal,
      cab.valorCustoOperacao,
      cab.valorCMV,
      cab.quantidadeExtemporanea,
      cab.valorAcrescimoExtempSubtotal,
      cab.valorAcrescimoExtempItem,
      cab.valorAcrescimoExtempGeral,
      cab.valorAcrescimoExtempTotal
    INTO
      v_cab_origemDocumento,
      v_cab_tipoDocumento,
      v_cab_entradaSaida,
      v_cab_devolucaoAnulacaoRetorno,
      v_cab_atualizaCustoMedio,
      v_cab_atualizaUltimaCompra,
      v_cab_estabelecimento,
      v_cab_nfFornecedor,
      v_cab_documentoFiscal,
      v_cab_dataEntradaSaida,
      v_cab_pessoa,
      v_cab_modalidadeFrete,
      v_cab_tipoPagamentoFrete,
      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_cab_valorDescontoCustoOpItem,
      v_cab_valorDescontoCustoOpGera,
      v_cab_valorDescontoCustoOpTota,
      v_cab_valorAcrescimoCustoOpIte,
      v_cab_valorAcrescimoCustoOpGer,
      v_cab_valorAcrescimoCustoOpTot,
      v_cab_valorCustoOperacao,
      v_cab_valorCMV,
      v_cab_quantidadeExtemporanea,
      v_cab_valorAcrescimoExtempSubt,
      v_cab_valorAcrescimoExtempItem,
      v_cab_valorAcrescimoExtempGera,
      v_cab_valorAcrescimoExtempTota
    FROM MODOCUMENTOSFISCAIS cab
    WHERE cab.idDocumentoFiscal = a.idDocumentoFiscal;
    IF p_cancelandoExcluindoDocumento = 0
      AND a.cancelado = 0
    THEN
      SELECT COALESCE (MAX(1), 0)
      INTO v_cab_promocaoExiste
      FROM MODOCFISCALXPROMOCOES
      WHERE idDocumentoFiscal = a.idDocumentoFiscal;
      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 NOT(p_person_190_modeloFrete IS NULL)
        AND p_person_190_modeloFrete <> ' '
        AND a.valorFreteTotal <> 0
        AND v_cab_valorFreteTotal - a.valorFreteTotal <= 0
      THEN
        v_cab_modalidadeFrete := '9';
      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;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      IF v_cab_valorDescontoGeral <> 0
        OR v_cab_valorOutrasDespesasGeral <> 0
        OR v_cab_valorPagamentoBruto <> 0
        OR v_cab_promocaoExiste = 1
      THEN
        ADD_DOC_FISC_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          a.idDocumentoFiscal,
          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;
      UPDATE MODOCUMENTOSFISCAIS SET
        modalidadeFrete               = v_cab_modalidadeFrete,
        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,
        valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
        valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
        valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
        valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
        valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
        valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
        valorCustoOperacao            = v_cab_valorCustoOperacao,
        valorCMV                      = v_cab_valorCMV,
        quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
        valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
        valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
        valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
        valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
      WHERE idDocumentoFiscal = a.idDocumentoFiscal;
    END IF;
    -- Cancela / Exclui Transferências vinculadas.
    FOR b IN (
      SELECT
        itemTransf.documentoTransferencia,
        docXTransf.entradaSaidaOriginal
      FROM MODOCTRANSFXDOCFISCAL docXTransf
      JOIN MODOCUMENTOTRANSFXITENS itemTransf
      ON itemTransf.idItemDocTransferencia = docXTransf.idItemDocTransferencia
      WHERE docXTransf.idItemDocFiscal = p_item_idItemDocFiscal
      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 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'
        AND docXTransf2.idItemDocFiscal <> docXTransf.idItemDocFiscal)
      GROUP BY
        itemTransf.documentoTransferencia,
        docXTransf.entradaSaidaOriginal)
    LOOP
      IF b.entradaSaidaOriginal = 'O' THEN
        ADD_DOCTRANSF_CAB_EXCLUI (b.documentoTransferencia);
      ELSIF p_cancelando_Excluindo = 'C' THEN
        ADD_DOCTRANSF_CAB_SIT_GRAVA (
          p_estabelecimentoAtivo,
          b.documentoTransferencia,
          'C',
          'Cancelamento Automático');
      END IF;
    END LOOP;
    IF v_cab_entradaSaida='E'
      AND v_cab_devolucaoAnulacaoRetorno = 0
      AND v_cab_atualizaUltimaCompra = 1
    THEN
      ADD_PRODUTO_CUSTO_DATA_EXCLUI (
        a.produto,
        v_cab_dataEntradaSaida);
    END IF;
    ADD_MOTIVO_DOC_FISC_ITE_EXCLUI (
      p_item_idItemDocFiscal,
      0,
      v_auxNumber);
    ADD_ESTOQUE_DOC_FISC_EXCLUI (
      p_item_idItemDocFiscal,
      '',
      v_auxVarchar);
    ADD_VALEDESCONTO_DOC_ITE_EXCL (
      p_item_idItemDocFiscal,
      '',
      v_auxVarchar);
    ADD_SEPARACAO_ITEM_DOC_EXCLUI (p_item_idItemDocFiscal);
    DELETE MODOCFISCALXPRODUTOFILHO
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    DELETE MODOCFISCALXPROMOCOES
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    DELETE MOINGRESSOS
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    DELETE CATABELAPRECOXFORMACOESPR
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    FOR b IN (
      SELECT
        entrega,
        idItemOrcamento,
        quantidade
      FROM MOENTREGAS
      WHERE idItemDocFiscalRemessa = p_item_idItemDocFiscal)
    LOOP
      ADD_ENTREGA_SITUACAO_TROCA (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        b.idItemOrcamento,
        b.entrega,
        b.quantidade,
        1, -- p_situacaoEntrega
        'ADD_DOC_FISC_ITEM_EXCLUI');
      ADD_ENTREGA_CRIA_PENDENTE (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        b.idItemOrcamento);
    END LOOP;
    FOR b IN (
      SELECT idConserto
      FROM MOCONSERTOS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      IF p_cancelando_Excluindo = 'C' THEN
        ADD_CONSERTO_CANCELA (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_person_184_tipoEventoCancCon,
          b.idConserto);
      ELSE
        ADD_CONSERTO_EXCLUI (b.idConserto);
      END IF;
    END LOOP;
    UPDATE MOCONSERTOS SET
      idItemDocFiscalDevolucao = 0,
      situacaoConserto = 'I'
    WHERE idItemDocFiscalDevolucao = p_item_idItemDocFiscal;
    FOR b IN (
      SELECT
        id,
        idItemOrcamento,
        quantidade
      FROM MODOCFISCALXORCAMENTOITEM
      WHERE idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      IF b.quantidade <> 0 THEN
        ADD_ORCAMENTO_ITEM_SALDO_VOLTA (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_person_184_tipoEventoCancCon,
          p_config_95_etapaOrcamentoCanc,
          p_config_96_etapaOrdemServCanc,
          p_config_97_etapaPedCompraCanc,
          p_config_415_etapaFatContrCanc,
          b.idItemOrcamento,
          b.quantidade);
      END IF;
      DELETE MODOCFISCALXORCAMENTOITEM c
      WHERE c.id = b.id;
    END LOOP;
    FOR b IN (
      SELECT
        docXDoc.id,
        docXDoc.idItemPreDocReferenciado,
        docXDoc.quantidade,
        itemPre.preDocumento,
        cabPre.statusPreDocumento
      FROM MODOCFISCALXPREDOCUM docXDoc
      JOIN MOPREDOCUMXITENS itemPre
      ON itemPre.idItemPreDocumento = docXDoc.idItemPreDocReferenciado
      JOIN MOPREDOCUMENTOS cabPre
      ON cabPre.predocumento = itemPre.preDocumento
      WHERE docXDoc.idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      IF v_cab_devolucaoAnulacaoRetorno = 1 THEN
        FOR c IN (
          SELECT
            c.entrega,
            c.idItemOrcamento,
            c.quantidade,
            c.situacaoEntrega
          FROM MOENTREGAS c
          WHERE c.idItemPreDocumentoRemessa = b.idItemPreDocReferenciado
          AND c.situacaoEntrega IN (6,7))
        LOOP
          ADD_ENTREGA_SITUACAO_TROCA (
            p_usuarioLogado,
            p_estabelecimentoAtivo,
            c.idItemOrcamento,
            c.entrega,
            c.quantidade,
            c.situacaoEntrega - 1,
            'ADD_DOC_FISC_ITEM_EXCLUI');
          ADD_ENTREGA_CRIA_PENDENTE (
            p_usuarioLogado,
            p_estabelecimentoAtivo,
            c.idItemOrcamento);
        END LOOP;
      END IF;
      IF b.quantidade <> 0 THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_devolucaoAnulacaoRetorno,
          'D',
          p_item_idItemDocFiscal,
          - b.quantidade,
          - a.quantidadeConvertida,
          'P',
          b.idItemPreDocReferenciado);
      END IF;
      IF v_cab_origemDocumento IN (10,13)
        AND b.statusPreDocumento = 'F'
      THEN
        UPDATE MOPREDOCUMENTOS c
        SET c.statusPreDocumento = 'A'
        WHERE c.preDocumento = b.preDocumento;
      END IF;
      DELETE MODOCFISCALXPREDOCUM c
      WHERE c.id = b.id;
    END LOOP;
    DELETE MOPREDOCUMXDOCFISCAL
    WHERE idItemDocFiscalReferenciado = p_item_idItemDocFiscal;
    FOR b IN (
      SELECT
        id,
        idItemDocFiscalReferenciado,
        quantidade
      FROM MODOCFISCALXDOCFISCAL a
      WHERE idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      IF v_cab_devolucaoAnulacaoRetorno = 1 THEN
        FOR c IN (
          SELECT
            c.entrega,
            c.idItemOrcamento,
            c.quantidade,
            c.situacaoEntrega
          FROM MOENTREGAS c
          WHERE c.idItemDocFiscalRemessa = b.idItemDocFiscalReferenciado
          AND c.situacaoEntrega IN (6,7))
        LOOP
          ADD_ENTREGA_SITUACAO_TROCA (
            p_usuarioLogado,
            p_estabelecimentoAtivo,
            c.idItemOrcamento,
            c.entrega,
            c.quantidade,
            c.situacaoEntrega - 1,
            'ADD_DOC_FISC_ITEM_EXCLUI');
          ADD_ENTREGA_CRIA_PENDENTE (
            p_usuarioLogado,
            p_estabelecimentoAtivo,
            c.idItemOrcamento);
        END LOOP;
      END IF;
      IF b.quantidade <> 0 THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_devolucaoAnulacaoRetorno,
          'D',
          p_item_idItemDocFiscal,
          - b.quantidade,
          - a.quantidadeConvertida,
          'D',
          b.idItemDocFiscalReferenciado);
      END IF;
      DELETE MODOCFISCALXDOCFISCAL c
      WHERE c.id = b.id;
    END LOOP;
    DELETE MODOCFISCALXDOCFISCAL
    WHERE idItemDocFiscalReferenciado = p_item_idItemDocFiscal;
    DELETE MODOCTRANSFXDOCFISCAL
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    DELETE MOBALANCOXDOCFISCAL
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    UPDATE MODISTRIBUICAODFEXGRADE
    SET idItemDocFiscal = 0
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    IF p_cancelando_Excluindo = 'C' THEN
      UPDATE MODOCFISCALXITENS
      SET cancelado = 1
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    ELSE
      DELETE MODOCFISCALXCOMPOSICOESPR
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXNUMEROSSERIE
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXNUMEROSSERIE b
      WHERE b.idEnderecoEstoqueDocFiscal > 0
      AND EXISTS (
        SELECT 1
        FROM MODOCFISCALXENDERECOESTOQ c
        WHERE c.idEnderecoEstoqueDocFiscal = b.idEnderecoEstoqueDocFiscal
        AND c.idItemDocFiscal = p_item_idItemDocFiscal);
      DELETE MODOCFISCALXENDERECOESTOQ
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXEMBALAGENSTIN
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXCENTROSCUSTOS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXPROJETOS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCTROCAXITENS
      WHERE idItemDocFiscalSaida = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXITENS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      IF p_cancelandoExcluindoDocumento = 0 THEN
        v_auxNumber := 0;
        FOR b IN (
          SELECT idItemDocFiscal
          FROM MODOCFISCALXITENS b
          WHERE b.idDocumentoFiscal = a.idDocumentoFiscal
          AND b.idItemDocFiscal <> p_item_idItemDocFiscal
          ORDER BY b.sequencia)
        LOOP
          v_auxNumber := v_auxNumber + 1;
          UPDATE MODOCFISCALXITENS c
          SET c.sequencia = v_auxNumber
          WHERE c.idItemDocFiscal = b.idItemDocFiscal;
        END LOOP;
      END IF;
    END IF;
  END LOOP;
END ADD_DOC_FISC_ITEM_EXCLUI;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_EXCLUI (
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_person_184_tipoEventoCancCon IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_95_etapaOrcamentoCanc IN NUMBER,
  p_config_96_etapaOrdemServCanc IN NUMBER,
  p_config_97_etapaPedCompraCanc IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_415_etapaFatContrCanc IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemPreDocumento      IN NUMBER,
  p_cancelando_Excluindo         IN CHAR,
  p_cancelandoExcluindoDocumento IN NUMBER,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_atualizaUltimaCompra     NUMBER;
  v_cab_estabelecimento          NUMBER;
  v_cab_documentoFiscal          NUMBER;
  v_cab_dataEntradaSaida         DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  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_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota NUMBER;
  v_cab_promocaoExiste           NUMBER;
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  FOR a IN (
    SELECT
      item.preDocumento,
      item.gradeProduto,
      item.cancelado,
      item.usarPrecoAVista,
      item.geraFinanceiro,
      item.controleQuantidade,
      item.loteMultiplo,
      item.quantidade,
      item.quantidadeConvertida,
      item.quantidadeDevolvidaRetornada,
      item.pesoLiquido,
      item.pesoBruto,
      item.valorProdutoServicoBruto,
      item.valorProdutoServico,
      item.valorDescontoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      item.valorFreteGeral,
      item.valorSeguroGeral,
      item.valorDescontoGeral,
      item.valorOutrasDespesasGeral,
      item.valorAdicFreteMarinhaMerGeral,
      item.valorDespesasAduaneirasGeral,
      item.valorBasePagamento,
      item.valorDescontoPagamento,
      item.valorOutrasDespesasPagamento,
      item.valorJurosPagamento,
      item.valorFreteTotal,
      item.valorSeguroTotal,
      item.valorDescontoTotal,
      item.valorOutrasDespesasTotal,
      item.valorAdicFreteMarinhaMerTotal,
      item.valorDespesasAduaneirasTotal,
      item.valorLiquidoItem,
      item.valorDescontoCustoOpItem,
      item.valorDescontoCustoOpGeral,
      item.valorDescontoCustoOpTotal,
      item.valorAcrescimoCustoOpItem,
      item.valorAcrescimoCustoOpGeral,
      item.valorAcrescimoCustoOpTotal,
      item.valorCustoOperacao,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.valorAcrescimoExtempSubtotal,
      item.valorAcrescimoExtempItem,
      item.valorAcrescimoExtempGeral,
      item.valorAcrescimoExtempTotal,
      gradProd.produto,
      prod.tipoProduto
    FROM MOPREDOCUMXITENS item
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE item.idItemPreDocumento = p_item_idItemPreDocumento)
  LOOP
    SELECT
      cab.origemDocumento,
      cab.tipoDocumento,
      cab.entradaSaida,
      cab.devolucaoAnulacaoRetorno,
      cab.atualizaCustoMedio,
      cab.atualizaUltimaCompra,
      cab.estabelecimento,
      cab.documentoFiscal,
      cab.dataEntradaSaida,
      cab.pessoa,
      cab.modalidadeFrete,
      cab.tipoPagamentoFrete,
      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,
      cab.valorDescontoCustoOpItem,
      cab.valorDescontoCustoOpGeral,
      cab.valorDescontoCustoOpTotal,
      cab.valorAcrescimoCustoOpItem,
      cab.valorAcrescimoCustoOpGeral,
      cab.valorAcrescimoCustoOpTotal,
      cab.valorCustoOperacao,
      cab.valorCMV,
      cab.quantidadeExtemporanea,
      cab.valorAcrescimoExtempSubtotal,
      cab.valorAcrescimoExtempItem,
      cab.valorAcrescimoExtempGeral,
      cab.valorAcrescimoExtempTotal
    INTO
      v_cab_origemDocumento,
      v_cab_tipoDocumento,
      v_cab_entradaSaida,
      v_cab_devolucaoAnulacaoRetorno,
      v_cab_atualizaCustoMedio,
      v_cab_atualizaUltimaCompra,
      v_cab_estabelecimento,
      v_cab_documentoFiscal,
      v_cab_dataEntradaSaida,
      v_cab_pessoa,
      v_cab_modalidadeFrete,
      v_cab_tipoPagamentoFrete,
      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_cab_valorDescontoCustoOpItem,
      v_cab_valorDescontoCustoOpGera,
      v_cab_valorDescontoCustoOpTota,
      v_cab_valorAcrescimoCustoOpIte,
      v_cab_valorAcrescimoCustoOpGer,
      v_cab_valorAcrescimoCustoOpTot,
      v_cab_valorCustoOperacao,
      v_cab_valorCMV,
      v_cab_quantidadeExtemporanea,
      v_cab_valorAcrescimoExtempSubt,
      v_cab_valorAcrescimoExtempItem,
      v_cab_valorAcrescimoExtempGera,
      v_cab_valorAcrescimoExtempTota
    FROM MOPREDOCUMENTOS cab
    WHERE cab.preDocumento = a.preDocumento;
    IF p_cancelandoExcluindoDocumento = 0
      AND a.cancelado = 0
    THEN
      SELECT COALESCE (MAX(1), 0)
      INTO v_cab_promocaoExiste
      FROM MOPREDOCUMXPROMOCOES
      WHERE preDocumento = a.preDocumento;
      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 NOT(p_person_190_modeloFrete IS NULL)
        AND p_person_190_modeloFrete <> ' '
        AND a.valorFreteTotal <> 0
        AND v_cab_valorFreteTotal - a.valorFreteTotal <= 0
      THEN
        v_cab_modalidadeFrete := '9';
      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;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      IF v_cab_valorDescontoGeral <> 0
        OR v_cab_valorOutrasDespesasGeral <> 0
        OR v_cab_valorPagamentoBruto <> 0
        OR v_cab_promocaoExiste = 1
      THEN
        ADD_PRE_DOC_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          a.preDocumento,
          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;
      UPDATE MOPREDOCUMENTOS SET
        modalidadeFrete               = v_cab_modalidadeFrete,
        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,
        valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
        valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
        valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
        valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
        valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
        valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
        valorCustoOperacao            = v_cab_valorCustoOperacao,
        valorCMV                      = v_cab_valorCMV,
        quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
        valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
        valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
        valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
        valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
      WHERE preDocumento = a.preDocumento;
    END IF;
    -- Cancela / Exclui Transferências vinculadas.
    FOR b IN (
      SELECT
        itemTransf.documentoTransferencia,
        docXTransf.entradaSaidaOriginal
      FROM MODOCTRANSFXPREDOCUM docXTransf
      JOIN MODOCUMENTOTRANSFXITENS itemTransf
      ON itemTransf.idItemDocTransferencia = docXTransf.idItemDocTransferencia
      WHERE docXTransf.idItemPreDocumento = p_item_idItemPreDocumento
      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 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 docXTransf2.idItemPreDocumento <> docXTransf.idItemPreDocumento)
      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 = 'C' THEN
        ADD_DOCTRANSF_CAB_SIT_GRAVA (
          p_estabelecimentoAtivo,
          b.documentoTransferencia,
          'C',
          'Cancelamento Automático');
      END IF;
    END LOOP;
    IF v_cab_entradaSaida='E'
      AND v_cab_devolucaoAnulacaoRetorno = 0
      AND v_cab_atualizaUltimaCompra = 1
    THEN
      ADD_PRODUTO_CUSTO_DATA_EXCLUI (
        a.produto,
        v_cab_dataEntradaSaida);
    END IF;
    ADD_MOTIVO_PRE_DOC_ITE_EXCLUI (
      p_item_idItemPreDocumento,
      0,
      v_auxNumber);
    ADD_ESTOQUE_PRE_DOC_EXCLUI (
      p_item_idItemPreDocumento,
      '',
      v_auxVarchar);
    ADD_VALEDESCONTO_PRE_ITE_EXCL (
      p_item_idItemPreDocumento,
      '',
      v_auxVarchar);
    ADD_SEPARACAO_ITEM_PRE_EXCLUI (p_item_idItemPreDocumento);
    DELETE MOPREDOCUMXPRODUTOFILHO
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    DELETE MOPREDOCUMXPROMOCOES
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    DELETE MOINGRESSOS
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    DELETE CATABELAPRECOXFORMACOESPR
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    FOR b IN (
      SELECT
        entrega,
        idItemOrcamento,
        quantidade
      FROM MOENTREGAS
      WHERE idItemPreDocumentoRemessa = p_item_idItemPreDocumento)
    LOOP
      ADD_ENTREGA_SITUACAO_TROCA (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        b.idItemOrcamento,
        b.entrega,
        b.quantidade,
        1, -- p_situacaoEntrega
        'ADD_PRE_DOC_ITEM_EXCLUI');
      ADD_ENTREGA_CRIA_PENDENTE (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        b.idItemOrcamento);
    END LOOP;
    FOR b IN (
      SELECT idConserto
      FROM MOCONSERTOS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      IF p_cancelando_Excluindo = 'C' THEN
        ADD_CONSERTO_CANCELA(
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_person_184_tipoEventoCancCon,
          b.idConserto);
      ELSE
        ADD_CONSERTO_EXCLUI(b.idConserto);
      END IF;
    END LOOP;
    UPDATE MOCONSERTOS SET
      idItemPreDocumentoDevolucao = 0,
      situacaoConserto = 'I'
    WHERE idItemPreDocumentoDevolucao = p_item_idItemPreDocumento;
    FOR b IN (
      SELECT
        id,
        idItemOrcamento,
        quantidade
      FROM MOPREDOCUMXORCAMENTOITEM
      WHERE idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      IF b.quantidade <> 0 THEN
        ADD_ORCAMENTO_ITEM_SALDO_VOLTA (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_person_184_tipoEventoCancCon,
          p_config_95_etapaOrcamentoCanc,
          p_config_96_etapaOrdemServCanc,
          p_config_97_etapaPedCompraCanc,
          p_config_415_etapaFatContrCanc,
          b.idItemOrcamento,
          b.quantidade);
      END IF;
      DELETE MOPREDOCUMXORCAMENTOITEM c
      WHERE c.id = b.id;
    END LOOP;
    FOR b IN (
      SELECT
        docXDoc.id,
        docXDoc.idItemPreDocReferenciado,
        docXDoc.quantidade,
        itemPre.preDocumento,
        cabPre.statusPreDocumento
      FROM MOPREDOCUMXPREDOCUM docXDoc
      JOIN MOPREDOCUMXITENS itemPre
      ON itemPre.idItemPreDocumento = docXDoc.idItemPreDocReferenciado
      JOIN MOPREDOCUMENTOS cabPre
      ON cabPre.predocumento = itemPre.preDocumento
      WHERE docXDoc.idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      IF v_cab_devolucaoAnulacaoRetorno = 1 THEN
        FOR c IN (
          SELECT
            c.entrega,
            c.idItemOrcamento,
            c.quantidade,
            c.situacaoEntrega
          FROM MOENTREGAS c
          WHERE c.idItemPreDocumentoRemessa = b.idItemPreDocReferenciado
          AND c.situacaoEntrega IN (6,7))
        LOOP
          ADD_ENTREGA_SITUACAO_TROCA (
            p_usuarioLogado,
            p_estabelecimentoAtivo,
            c.idItemOrcamento,
            c.entrega,
            c.quantidade,
            c.situacaoEntrega - 1,
            'ADD_PRE_DOC_ITEM_EXCLUI');
          ADD_ENTREGA_CRIA_PENDENTE (
            p_usuarioLogado,
            p_estabelecimentoAtivo,
            c.idItemOrcamento);
        END LOOP;
      END IF;
      IF b.quantidade <> 0 THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_devolucaoAnulacaoRetorno,
          'P',
          p_item_idItemPreDocumento,
          - b.quantidade,
          - a.quantidadeConvertida,
          'P',
          b.idItemPreDocReferenciado);
      END IF;
      IF b.statusPreDocumento = 'F' THEN
        UPDATE MOPREDOCUMENTOS c
        SET c.statusPreDocumento = 'A'
        WHERE c.preDocumento = b.preDocumento;
      END IF;
      DELETE MOPREDOCUMXPREDOCUM c
      WHERE c.id = b.id;
    END LOOP;
    DELETE MOPREDOCUMXPREDOCUM
    WHERE idItemPreDocReferenciado = p_item_idItemPreDocumento;
    FOR b IN (
      SELECT
        id,
        idItemDocFiscalReferenciado,
        quantidade
      FROM MOPREDOCUMXDOCFISCAL
      WHERE idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      IF v_cab_devolucaoAnulacaoRetorno = 1 THEN
        FOR c IN (
          SELECT
            c.entrega,
            c.idItemOrcamento,
            c.quantidade,
            c.situacaoEntrega
          FROM MOENTREGAS c
          WHERE c.idItemDocFiscalRemessa = b.idItemDocFiscalReferenciado
          AND c.situacaoEntrega IN (6,7))
        LOOP
          ADD_ENTREGA_SITUACAO_TROCA (
            p_usuarioLogado,
            p_estabelecimentoAtivo,
            c.idItemOrcamento,
            c.entrega,
            c.quantidade,
            c.situacaoEntrega - 1,
            'ADD_PRE_DOC_ITEM_EXCLUI');
          ADD_ENTREGA_CRIA_PENDENTE (
            p_usuarioLogado,
            p_estabelecimentoAtivo,
            c.idItemOrcamento);
        END LOOP;
      END IF;
      IF b.quantidade <> 0 THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_devolucaoAnulacaoRetorno,
          'P',
          p_item_idItemPreDocumento,
          - b.quantidade,
          - a.quantidadeConvertida,
          'D',
          b.idItemDocFiscalReferenciado);
      END IF;
      DELETE MOPREDOCUMXDOCFISCAL c
      WHERE c.id = b.id;
    END LOOP;
    DELETE MODOCFISCALXPREDOCUM
    WHERE idItemPreDocReferenciado = p_item_idItemPreDocumento;
    DELETE MODOCTRANSFXPREDOCUM
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    IF p_cancelando_Excluindo = 'C' THEN
      UPDATE MOPREDOCUMXITENS
      SET cancelado = 1
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    ELSE
      DELETE MOPREDOCUMXCOMPOSICOESPR
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXNUMEROSSERIE
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXNUMEROSSERIE b
      WHERE b.idEnderecoEstoquePreDocumento > 0
      AND EXISTS (
        SELECT 1
        FROM MOPREDOCUMXENDERECOESTOQ c
        WHERE c.idEnderecoEstoquePreDocumento = b.idEnderecoEstoquePreDocumento
        AND c.idItemPreDocumento = p_item_idItemPreDocumento);
      DELETE MOPREDOCUMXENDERECOESTOQ
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXEMBALAGENSTIN
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXCENTROSCUSTOS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXPROJETOS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MODOCTROCAXITENS
      WHERE idItemPreDocumentoSaida = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXITENS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      IF p_cancelandoExcluindoDocumento = 0 THEN
        v_auxNumber := 0;
        FOR b IN (
          SELECT idItemPreDocumento
          FROM MOPREDOCUMXITENS b
          WHERE b.preDocumento = a.preDocumento
          AND b.idItemPreDocumento <> p_item_idItemPreDocumento
          ORDER BY b.sequencia)
        LOOP
          v_auxNumber := v_auxNumber + 1;
          UPDATE MOPREDOCUMXITENS c
          SET c.sequencia = v_auxNumber
          WHERE c.idItemPreDocumento = b.idItemPreDocumento;
        END LOOP;
      END IF;
    END IF;
  END LOOP;
END ADD_PRE_DOC_ITEM_EXCLUI;

/

UPDATE SIVERSOESSISTEMA SET dataLiberacaoVersao = TO_DATE('16/05/2024','DD/MM/YYYY'), dataAtualizacaoVersao =  SYSDATE, observacoes = 'BETA 8' WHERE idVersaoSistema = 2024001002;

-- FIM BETA 8 - 16/5/24

INSERT INTO SIMOTIVOSBLOQUEIODOCUMENT (motivoBloqueioDocumento, descricao, ativo, observacoes) values (40,'Divergência entre Transferência e Orçamento / O.S.',1,' ');

COMMIT;

-- MOMOTBLOQXDOCTRANSFXITENS
CREATE TABLE MOMOTBLOQXDOCTRANSFXITENS
  (
    id                        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idMotivoBloqueioDocumento NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idItemDocTransferencia    NUMERIC (14,0) DEFAULT 0 NOT NULL
  );
ALTER TABLE MOMOTBLOQXDOCTRANSFXITENS ADD CONSTRAINT MOMOTBLOQXDOCTRANSFXITENS_PK1 PRIMARY KEY (id);
CREATE UNIQUE INDEX MOMOTBLOQXDOCTRANSFXITENS_K2 ON MOMOTBLOQXDOCTRANSFXITENS (idMotivoBloqueioDocumento, idItemDocTransferencia);
CREATE INDEX MOMOTBLOQXDOCTRANSFXITENS_K3 ON MOMOTBLOQXDOCTRANSFXITENS (idMotivoBloqueioDocumento);
CREATE INDEX MOMOTBLOQXDOCTRANSFXITENS_K4 ON MOMOTBLOQXDOCTRANSFXITENS (idItemDocTransferencia);
ALTER TABLE MOMOTBLOQXDOCTRANSFXITENS ADD CONSTRAINT MOMOTBLOQXDOCTRANSFXITENS_FK1 FOREIGN KEY (idMotivoBloqueioDocumento) REFERENCES MOMOTIVOSBLOQUEIOS (idMotivoBloqueioDocumento);
ALTER TABLE MOMOTBLOQXDOCTRANSFXITENS ADD CONSTRAINT MOMOTBLOQXDOCTRANSFXITENS_FK2 FOREIGN KEY (idItemDocTransferencia) REFERENCES MODOCUMENTOTRANSFXITENS (idItemDocTransferencia);

INSERT INTO MOMOTBLOQXDOCTRANSFXITENS (id, idMotivoBloqueioDocumento, idItemDocTransferencia) VALUES (0, 0, 0);

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MOMOTBLOQXDOCTRANSFXITENS', 'Motivos Bloqueios X Documentos Transferência X Itens', 1, 50576, 'MO', 'id', 'N', 14, ' ', 1, ' ', 0, 100003, ' ', ' ', 1, 1, ' '); 

COMMIT;

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

/

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

/

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

/

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

/

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

/

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

/

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

/

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

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_REF_DOC_FIS (
  p_estabelecimentoAtivo         IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_cab_preDocumento             IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_documentoFiscal          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_item_idItemPreDocumento      IN NUMBER,
  p_item_sequencia               IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  p_idItemDocFiscalReferenciado  IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_atualizarObservacoes         IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes         OUT NUMBER)
IS
  v_id                           NUMBER;
  v_idDocumentoFiscalReferenciad NUMBER;
  v_sequenciaReferenciado        NUMBER;
  v_orc_pessoa                   NUMBER;
  v_auxAlpha                     VARCHAR (3200);
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  ADD_PRE_DOC_ITEM_N_SER_DOC_FIS (
    p_estabelecimentoAtivo,
    p_idItemDocFiscalReferenciado,
    p_item_idItemPreDocumento,
    CASE WHEN p_quantidadeReferenciada > 0 THEN 1 ELSE 0 END,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  ADD_PRE_DOC_ITEM_CUSTO_DOC_FIS (
    p_estabelecimentoAtivo,
    p_idItemDocFiscalReferenciado,
    p_item_idItemPreDocumento);
  ADD_PRE_DOC_ITEM_COMP_DOC_FIS (
    p_estabelecimentoAtivo,
    p_idItemDocFiscalReferenciado,
    p_item_idItemPreDocumento,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  IF p_quantidadeReferenciada = 0 THEN
    v_orc_pessoa := 0;
    IF p_config_227_manterPessoaOrcam = 1 THEN
      SELECT COALESCE(MAX(orc.pessoa),0)
      INTO v_orc_pessoa
      FROM MOPREDOCUMXITENS itemDoc
      JOIN MOPREDOCUMXORCAMENTOITEM docXOrc
      ON docXOrc.idItemPreDocumento = itemDoc.idItemPreDocumento
      JOIN MOORCAMENTOXITENS itemOrc
      ON itemOrc.idItemOrcamento = docXOrc.idItemOrcamento
      JOIN MOORCAMENTOS orc
      ON orc.orcamento = itemOrc.orcamento
      WHERE itemDoc.preDocumento = p_cab_preDocumento
      AND docXOrc.quantidade <> 0;
    END IF;
    ADD_PRE_DOC_ITEM_MOT_DOC_FIS (
      p_estabelecimentoAtivo,
      p_config_227_manterPessoaOrcam,
      p_cab_preDocumento,
      p_cab_tipoDocumento,
      p_cab_documentoFiscal,
      p_cab_estabelecimento,
      p_cab_pessoa,
      v_orc_pessoa,
      p_item_idItemPreDocumento,
      p_item_sequencia,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_unidadeMedidaConversao,
      p_item_quantidadeConvertida,
      p_item_valorLiquidoItem,
      p_idItemDocFiscalReferenciado);
  ELSE
    SELECT
      idDocumentoFiscal,
      sequencia
    INTO
      v_idDocumentoFiscalReferenciad,
      v_sequenciaReferenciado
    FROM MODOCFISCALXITENS
    WHERE idItemDocFiscal = p_idItemDocFiscalReferenciado;
    ADD_PRE_DOC_ITEM_BLOEST_DOC (
      p_estabelecimentoAtivo,
      v_idDocumentoFiscalReferenciad,
      v_sequenciaReferenciado,
      p_cab_preDocumento,
      p_item_sequencia);
    SELECT COALESCE (MAX (id),0)
    INTO v_id
    FROM MOPREDOCUMXDOCFISCAL
    WHERE idItemPreDocumento = p_item_idItemPreDocumento
    AND idItemDocFiscalReferenciado = p_idItemDocFiscalReferenciado;
    IF v_id > 0 THEN
      IF p_quantidadeReferenciada <> 0 THEN
        UPDATE MOPREDOCUMXDOCFISCAL SET
          quantidade = quantidade + p_quantidadeReferenciada
        WHERE id = v_id;
      END IF;
    ELSE
      v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MOPREDOCUMXDOCFISCAL', 'id', 14, p_estabelecimentoAtivo, NULL);
      INSERT INTO MOPREDOCUMXDOCFISCAL (
        id,
        idItemPreDocumento,
        idItemDocFiscalReferenciado,
        quantidade)
      VALUES (
        v_id,
        p_item_idItemPreDocumento,
        p_idItemDocFiscalReferenciado,
        p_quantidadeReferenciada);
    END IF;
  END IF;
END ADD_PRE_DOC_ITEM_REF_DOC_FIS;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_REF_ORCAMEN (
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_cab_preDocumento             IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_documentoFiscal          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_item_idItemPreDocumento      IN NUMBER,
  p_item_sequencia               IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  p_idItemOrcamento              IN NUMBER,
  p_quantidadeBaixar             IN NUMBER,
  p_atualizarObservacoes         IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes         OUT NUMBER)
IS
  v_id                    NUMBER;
  v_orcamentoReferenciado NUMBER;
  v_sequenciaReferenciado NUMBER;
  v_orc_pessoa            NUMBER;
  v_auxAlpha              VARCHAR (3200);
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  ADD_PRE_DOC_ITEM_N_SER_ORCAMEN (
    p_estabelecimentoAtivo,
    p_idItemOrcamento,
    p_item_idItemPreDocumento,
    CASE WHEN p_quantidadeBaixar > 0 THEN 1 ELSE 0 END,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  ADD_PRE_DOC_ITEM_CUSTO_ORCAMEN (
    p_estabelecimentoAtivo,
    p_idItemOrcamento,
    p_item_idItemPreDocumento);
  ADD_PRE_DOC_ITEM_COMP_ORCAMEN (
    p_estabelecimentoAtivo,
    p_idItemOrcamento,
    p_item_idItemPreDocumento,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  SELECT COALESCE (MAX (id),0)
  INTO v_id
  FROM MOPREDOCUMXORCAMENTOITEM
  WHERE idItemPreDocumento = p_item_idItemPreDocumento
  AND idItemOrcamento = p_idItemOrcamento;
  IF v_id > 0 THEN
    IF p_quantidadeBaixar <> 0 THEN
      UPDATE MOPREDOCUMXORCAMENTOITEM SET
        quantidade = quantidade + p_quantidadeBaixar
      WHERE id = v_id;
    END IF;
  ELSE
    v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MOPREDOCUMXORCAMENTOITEM', 'id', 14, p_estabelecimentoAtivo, NULL);
    INSERT INTO MOPREDOCUMXORCAMENTOITEM (
      id,
      idItemPreDocumento,
      idItemOrcamento,
      quantidade,
      efetivacao)
    VALUES (
      v_id,
      p_item_idItemPreDocumento,
      p_idItemOrcamento,
      p_quantidadeBaixar,
      1);
  END IF;
  IF p_quantidadeBaixar <> 0 THEN
    SELECT
      orcamento,
      sequencia
    INTO
      v_orcamentoReferenciado,
      v_sequenciaReferenciado
    FROM MOORCAMENTOXITENS
    WHERE idItemOrcamento = p_idItemOrcamento;
    ADD_PRE_DOC_ITEM_BLOEST_ORC (
      p_estabelecimentoAtivo,
      v_orcamentoReferenciado,
      v_sequenciaReferenciado,
      p_cab_preDocumento,
      p_item_sequencia);
    v_orc_pessoa := 0;
    IF p_config_227_manterPessoaOrcam = 1 THEN
      SELECT COALESCE(MAX(orc.pessoa),0)
      INTO v_orc_pessoa
      FROM MOPREDOCUMXITENS itemDoc
      JOIN MOPREDOCUMXORCAMENTOITEM docXOrc
      ON docXOrc.idItemPreDocumento = itemDoc.idItemPreDocumento
      JOIN MOORCAMENTOXITENS itemOrc
      ON itemOrc.idItemOrcamento = docXOrc.idItemOrcamento
      JOIN MOORCAMENTOS orc
      ON orc.orcamento = itemOrc.orcamento
      WHERE itemDoc.preDocumento = p_cab_preDocumento
      AND docXOrc.quantidade <> 0;
    END IF;
    ADD_PRE_DOC_ITEM_MOT_ORCAMEN (
      p_estabelecimentoAtivo,
      p_config_227_manterPessoaOrcam,
      p_cab_preDocumento,
      p_cab_tipoDocumento,
      p_cab_documentoFiscal,
      p_cab_estabelecimento,
      p_cab_pessoa,
      v_orc_pessoa,
      p_item_idItemPreDocumento,
      p_item_sequencia,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_unidadeMedidaConversao,
      p_item_quantidadeConvertida,
      p_item_valorLiquidoItem,
      p_idItemOrcamento);
    UPDATE MOORCAMENTOXITENS
    SET quantidadeSaldo = quantidadeSaldo - p_quantidadeBaixar
    WHERE idItemOrcamento = p_idItemOrcamento;
    UPDATE MOCONSERTOS cons
    SET cons.situacaoConserto = 'R'
    WHERE cons.documentoTransferenciaFornec > 0
    AND cons.situacaoConserto = 'E'
    AND EXISTS (
      SELECT 1 FROM MODOCUMENTOTRANSFXITENS itemTransf
      JOIN MODOCTRANSFXORCAMENTOITEM transfXDoc
      ON transfXDoc.idItemDocTransferencia = itemTransf.idItemDocTransferencia
      WHERE itemTransf.documentoTransferencia = cons.documentoTransferenciaFornec
      AND transfXDoc.entradaSaidaOriginal = 'E'
      AND transfXDoc.idItemOrcamento = p_idItemOrcamento);
    ADD_ENTREGA_CRIA_PENDENTE (
      p_usuarioLogado,
      p_estabelecimentoAtivo,
      p_idItemOrcamento);
    ADD_ORCAMENTO_ITEM_RES_ITEM (
      p_idItemOrcamento,
      p_estabelecimentoAtivo,
      '',
      v_auxAlpha);
  END IF;
END ADD_PRE_DOC_ITEM_REF_ORCAMEN;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_REF_PRE_DOC (
  p_estabelecimentoAtivo         IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_cab_preDocumento             IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_documentoFiscal          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_item_idItemPreDocumento      IN NUMBER,
  p_item_sequencia               IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  p_idItemPreDocumentoReferenc   IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_atualizarObservacoes         IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes         OUT NUMBER)
IS
  v_id                       NUMBER;
  v_preDocumentoReferenciado NUMBER;
  v_sequenciaReferenciado    NUMBER;
  v_orc_pessoa               NUMBER;
  v_auxAlpha                 VARCHAR (3200);
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  ADD_PRE_DOC_ITEM_N_SER_PRE_DOC (
    p_estabelecimentoAtivo,
    p_idItemPreDocumentoReferenc,
    p_item_idItemPreDocumento,
    CASE WHEN p_quantidadeReferenciada > 0 THEN 1 ELSE 0 END,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  ADD_PRE_DOC_ITEM_CUSTO_PRE_DOC (
    p_estabelecimentoAtivo,
    p_idItemPreDocumentoReferenc,
    p_item_idItemPreDocumento);
  ADD_PRE_DOC_ITEM_COMP_PRE_DOC (
    p_estabelecimentoAtivo,
    p_idItemPreDocumentoReferenc,
    p_item_idItemPreDocumento,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  IF p_quantidadeReferenciada = 0 THEN
    v_orc_pessoa := 0;
    IF p_config_227_manterPessoaOrcam = 1 THEN
      SELECT COALESCE(MAX(orc.pessoa),0)
      INTO v_orc_pessoa
      FROM MOPREDOCUMXITENS itemDoc
      JOIN MOPREDOCUMXORCAMENTOITEM docXOrc
      ON docXOrc.idItemPreDocumento = itemDoc.idItemPreDocumento
      JOIN MOORCAMENTOXITENS itemOrc
      ON itemOrc.idItemOrcamento = docXOrc.idItemOrcamento
      JOIN MOORCAMENTOS orc
      ON orc.orcamento = itemOrc.orcamento
      WHERE itemDoc.preDocumento = p_cab_preDocumento
      AND docXOrc.quantidade <> 0;
    END IF;
    ADD_PRE_DOC_ITEM_MOT_PRE_DOC (
      p_estabelecimentoAtivo,
      p_config_227_manterPessoaOrcam,
      p_cab_preDocumento,
      p_cab_tipoDocumento,
      p_cab_documentoFiscal,
      p_cab_estabelecimento,
      p_cab_pessoa,
      v_orc_pessoa,
      p_item_idItemPreDocumento,
      p_item_sequencia,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_unidadeMedidaConversao,
      p_item_quantidadeConvertida,
      p_item_valorLiquidoItem,
      p_idItemPreDocumentoReferenc);
  ELSE
    SELECT
      preDocumento,
      sequencia
    INTO
      v_preDocumentoReferenciado,
      v_sequenciaReferenciado
    FROM MOPREDOCUMXITENS
    WHERE idItemPreDocumento = p_idItemPreDocumentoReferenc;
    ADD_PRE_DOC_ITEM_BLOEST_PRE (
      p_estabelecimentoAtivo,
      v_preDocumentoReferenciado,
      v_sequenciaReferenciado,
      p_cab_preDocumento,
      p_item_sequencia);
    SELECT COALESCE (MAX (id),0)
    INTO v_id
    FROM MOPREDOCUMXPREDOCUM
    WHERE idItemPreDocumento = p_item_idItemPreDocumento
    AND idItemPreDocReferenciado = p_idItemPreDocumentoReferenc;
    IF v_id > 0 THEN
      IF p_quantidadeReferenciada <> 0 THEN
        UPDATE MOPREDOCUMXPREDOCUM SET
          quantidade = quantidade + p_quantidadeReferenciada
        WHERE id = v_id;
      END IF;
    ELSE
      v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MOPREDOCUMXPREDOCUM', 'id', 14, p_estabelecimentoAtivo, NULL);
      INSERT INTO MOPREDOCUMXPREDOCUM (
        id,
        idItemPreDocumento,
        idItemPreDocReferenciado,
        quantidade)
      VALUES (
        v_id,
        p_item_idItemPreDocumento,
        p_idItemPreDocumentoReferenc,
        p_quantidadeReferenciada);
    END IF;
  END IF;
END ADD_PRE_DOC_ITEM_REF_PRE_DOC;

/

create or replace PROCEDURE ADD_PRE_DOC_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_227_manterPessoaOrcam IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     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, -- D = Documento Fiscal, O = Orçamento, P, Pré-Documento, T = Transferência
  p_idItemReferenciado           IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_tempComp_nomeTempComposicao  IN VARCHAR2,
  p_tempComp_sequencia           IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemPreDocumento      IN NUMBER,
  p_item_preDocumento            IN NUMBER,
  p_item_pedidoCompraFornecedor  IN VARCHAR2,
  p_item_sequenciaPedidoCompraFo IN NUMBER,
  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_quantidadeExtemporanea  IN NUMBER,
  p_item_acrescimoUnitarioExtemp IN NUMBER,
  p_item_valorAcrescimoExtempIte IN NUMBER,
  p_item_valorDescontoCustoOpIte IN NUMBER,
  p_item_valorAcrescimoCustoOpIt 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_valorAcrescimoExtempGer IN NUMBER,
  p_item_valorDescontoCustoOpGer IN NUMBER,
  p_item_valorAcrescimoCustoOpGe IN NUMBER,
  p_item_valorDescontoPagamento  IN NUMBER,
  p_item_valorOutrasDespPagament IN NUMBER,
  p_item_valorJurosPagamento     IN NUMBER,
  p_item_percentualDevolucao     IN NUMBER,
  p_item_valorIPIDevolucao       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_idItemPreDocumento    IN VARCHAR2,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER,
  r_item_idItemPreDocumento      OUT NUMBER,
  r_buffer_idItemPreDocumento    OUT VARCHAR2,
  r_valorInserido                OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_finalidadeNota           CHAR (1);
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_documentoFiscal          NUMBER;
  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_projeto                  VARCHAR2 (60);
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  v_cab_statusPreDocumento       CHAR (1);
  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_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota 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_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_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_item_sequencia               NUMBER;
  v_item_cancelado               NUMBER;
  v_item_quantidadeDevolvidaRet  NUMBER;
  v_item_precoUnitario           NUMBER;
  v_item_precoUnitarioConvertido NUMBER;
  v_item_valorProdutoServicoBrut NUMBER;
  v_item_valorProdutoServico     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_item_valorDescontoCustoOpTot NUMBER;
  v_item_valorAcrescimoCustoOpTo NUMBER;
  v_item_precoCustoOperacao      NUMBER;
  v_item_valorCustoOperacao      NUMBER;
  v_item_precoCMV                NUMBER;
  v_item_valorCMV                NUMBER;
  v_item_valorAcrescimoExtempSub NUMBER;
  v_item_valorAcrescimoExtempTot 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_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_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  r_item_idItemPreDocumento := p_item_idItemPreDocumento;
  r_buffer_idItemPreDocumento := p_buffer_idItemPreDocumento;
  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.devolucaoAnulacaoRetorno,
    cab.finalidadeNota,
    cab.atualizaCustoMedio,
    cab.documentoFiscal,
    cab.estabelecimento,
    cab.dataEmissao,
    cab.pessoa,
    cab.enderecoEntregaPessoa,
    cab.municipioFatoGerador,
    cab.localDestinoOperacao,
    cab.indicadorConsumidorFinal,
    cab.projeto,
    cab.modalidadeFrete,
    cab.tipoPagamentoFrete,
    cab.statusPreDocumento,
    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,
    cab.valorDescontoCustoOpItem,
    cab.valorDescontoCustoOpGeral,
    cab.valorDescontoCustoOpTotal,
    cab.valorAcrescimoCustoOpItem,
    cab.valorAcrescimoCustoOpGeral,
    cab.valorAcrescimoCustoOpTotal,
    cab.valorCustoOperacao,
    cab.valorCMV,
    cab.quantidadeExtemporanea,
    cab.valorAcrescimoExtempSubtotal,
    cab.valorAcrescimoExtempItem,
    cab.valorAcrescimoExtempGeral,
    cab.valorAcrescimoExtempTotal,
    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
  INTO
    v_cab_origemDocumento,
    v_cab_tipoDocumento,
    v_cab_entradaSaida,
    v_cab_devolucaoAnulacaoRetorno,
    v_cab_finalidadeNota,
    v_cab_atualizaCustoMedio,
    v_cab_documentoFiscal,
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_pessoa,
    v_cab_enderecoEntregaPessoa,
    v_cab_municipioFatoGerador,
    v_cab_localDestinoOperacao,
    v_cab_indicadorConsumidorFinal,
    v_cab_projeto,
    v_cab_modalidadeFrete,
    v_cab_tipoPagamentoFrete,
    v_cab_statusPreDocumento,
    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_cab_valorDescontoCustoOpItem,
    v_cab_valorDescontoCustoOpGera,
    v_cab_valorDescontoCustoOpTota,
    v_cab_valorAcrescimoCustoOpIte,
    v_cab_valorAcrescimoCustoOpGer,
    v_cab_valorAcrescimoCustoOpTot,
    v_cab_valorCustoOperacao,
    v_cab_valorCMV,
    v_cab_quantidadeExtemporanea,
    v_cab_valorAcrescimoExtempSubt,
    v_cab_valorAcrescimoExtempItem,
    v_cab_valorAcrescimoExtempGera,
    v_cab_valorAcrescimoExtempTota,
    v_est_grupoFiscal,
    v_pessEst_regimeTributario,
    v_munEndEst_uf,
    v_pess_indicadorInscricaoEstad,
    v_endPess_enderecoPessoa,
    v_munEndPess_uf,
    v_munEndEntr_uf
  FROM MOPREDOCUMENTOS 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
  WHERE cab.preDocumento = p_item_preDocumento;
  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_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_item_quantidadeDevolvidaRet  := 0;
  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_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;
  IF p_manterFinanceiro_Retotalizar = 0 THEN
    SELECT COALESCE (MAX(1), 0)
    INTO v_cab_promocaoExiste
    FROM MOPREDOCUMXPROMOCOES
    WHERE preDocumento = p_item_preDocumento;
  END IF;
  IF p_item_idItemPreDocumento > 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.quantidadeDevolvidaRetornada,
        a.pesoLiquido,
        a.pesoBruto,
        a.valorProdutoServicoBruto,
        a.valorProdutoServico,
        a.valorDescontoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.quantidadeExtemporanea,
        a.valorAcrescimoExtempSubtotal,
        a.valorAcrescimoExtempItem,
        a.valorDescontoCustoOpItem,
        a.valorAcrescimoCustoOpItem,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorAcrescimoExtempGeral,
        a.valorDescontoCustoOpGeral,
        a.valorAcrescimoCustoOpGeral,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.valorFreteTotal,
        a.valorSeguroTotal,
        a.valorDescontoTotal,
        a.valorOutrasDespesasTotal,
        a.valorAdicFreteMarinhaMerTotal,
        a.valorDespesasAduaneirasTotal,
        a.valorAcrescimoExtempTotal,
        a.valorDescontoCustoOpTotal,
        a.valorAcrescimoCustoOpTotal,
        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,
        a.valorCustoOperacao,
        a.valorCMV,
        prod.tipoProduto
      FROM MOPREDOCUMXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      WHERE a.idItemPreDocumento = p_item_idItemPreDocumento)
    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_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_item_quantidadeDevolvidaRet := a.quantidadeDevolvidaRetornada;
      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 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 <> p_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;
        v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
        v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
        v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
        v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
        v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
        v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
        v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
        v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
        v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
        v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
        v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
        v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
        v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      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,
    p_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);
  v_item_valorAcrescimoExtempSub := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
    p_item_quantidade,
    v_item_precoUnitario,
    p_item_quantidadeExtemporanea,
    p_item_acrescimoUnitarioExtemp);
  v_item_valorAcrescimoExtempTot := FUNC_ADD_CALC_EXTEMP_TOTAL(
    v_item_valorAcrescimoExtempSub,
    p_item_valorAcrescimoExtempIte,
    p_item_valorAcrescimoExtempGer);
  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 = CASE WHEN v_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
      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 / ((v_combo_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 / ((v_combo_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,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_estabelecimento,
        NULL, -- p_cab_dataPrecoInicial
        TRUNC(SYSDATE), -- p_cab_dataPrecoFinal
        v_cab_pessoa,
        v_cab_projeto,
        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_PRE_DOC_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_227_manterPessoaOrcam,
        p_config_362_calcCustoPorGrade,
        p_config_378_calcularVolumes,
        p_config_413_obs_add_marca,
        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, -- D = Documento Fiscal, G = Grade DF-e, O = Orçamento, 'P', Pré-Documento, T = Transferência
        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_calcularImpostos,
        0, -- p_item_idItemPreDocumento
        p_item_preDocumento,
        p_item_pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo,
        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
        CASE
          WHEN p_item_quantidade = 0
          THEN 0
          ELSE ROUND(p_item_quantidadeExtemporanea * a.quantidade / p_item_quantidade, 2)
        END, -- p_item_quantidadeExtemporanea
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_acrescimoUnitarioExtemp
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_acrescimoUnitarioExtemp
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoExtempIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpIt
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpIt
        p_item_observacoesDigitadas,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorFreteGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_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_valorAcrescimoExtempGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpGe
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpGe
        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
        p_item_percentualDevolucao,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorIPIDevolucao
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorIPIDevolucao,
        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_idItemPreDocumento,
        /* Retornos */
        r_calcularImpostos,
        v_auxNumber, -- idItemPreDocumento
        r_buffer_idItemPreDocumento,
        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_PRE_DOC_ITEM_COMBO_RESIDUO (
        p_item_preDocumento,
        v_item_valorProdutoServico,
        p_item_valorDescontoItem,
        p_item_valorAcrescimoItem,
        v_modDoc_diminuiDescontoPrUnit,
        v_modDoc_somaAcrescimosPrUnit,
        r_buffer_idItemPreDocumento,
        r_valorInserido);
      r_calcularImpostos := 1;
    END IF;
  ELSE
    IF r_item_idItemPreDocumento <= 0 THEN
      r_item_idItemPreDocumento := FUNC_ADD_BUSCA_PROXIMO_ID ('MOPREDOCUMXITENS', 'idItemPreDocumento', 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
          OR p_item_valorAcrescimoExtempGer <> 0
          OR p_item_valorDescontoCustoOpGer <> 0
          OR p_item_valorAcrescimoCustoOpGe <> 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_PRE_DOC_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          p_item_preDocumento,
          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 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,
        p_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,
        v_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,
        v_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
        p_item_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,
      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
      v_item_valorAcrescimoExtempTot,
      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,
      p_item_valorIPIDevolucao,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      v_item_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0 -- p_item_somarICMSST
      );
    ADD_CALCULA_CUSTO_CMV (
      v_cab_atualizaCustoMedio,
      v_cab_estabelecimento,
      0, -- p_cab_nfFornecedor
      p_item_modeloDocumento,
      p_item_quantidade,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      p_item_valorIPIDevolucao,
      v_item_valorPIS,
      v_item_valorPISST,
      v_item_valorCOFINS,
      v_item_valorCOFINSST,
      v_item_valorCreditoSimplesNac,
      v_item_valorICMS,
      v_item_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      v_item_valorLiquidoItem,
      p_item_valorDescontoCustoOpIte,
      p_item_valorDescontoCustoOpGer,
      p_item_valorAcrescimoCustoOpIt,
      p_item_valorAcrescimoCustoOpGe,
      v_item_valorAcrescimoExtempTot,
      v_item_valorDescontoCustoOpTot,
      v_item_valorAcrescimoCustoOpTo,
      v_item_precoCustoOperacao,
      v_item_valorCustoOperacao,
      v_item_precoCMV,
      v_item_valorCMV);
    IF v_inserindoItem = 1 THEN
      SELECT COALESCE (MAX (sequencia),0) + 1
      INTO v_item_sequencia
      FROM MOPREDOCUMXITENS
      WHERE preDocumento = p_item_preDocumento;
      v_cab_ultimoVendedorItem := p_item_vendedor;
    END IF;
    IF v_item_cancelado = 0 THEN
      IF p_manterFinanceiro_Retotalizar <> 2 THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume + TRUNC(CASE WHEN p_item_controleQuantidade = 1 AND p_item_loteMultiplo <> 0 THEN p_item_quantidade / p_item_loteMultiplo ELSE p_item_quantidadeConvertida END,0);
        END IF;
        v_cab_pesoLiquido := v_cab_pesoLiquido + p_item_pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto + p_item_pesoBruto;
      END IF;
      v_cab_quantidade := v_cab_quantidade + p_item_quantidadeConvertida;
      IF v_prod_tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorServicos := v_cab_valorServicos + v_item_valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos + p_item_valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorProdutos := v_cab_valorProdutos + v_item_valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos + p_item_valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem + p_item_valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem + p_item_valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem + p_item_valorAdicFreteMarItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem + p_item_valorDespesasAduanItem;
      v_cab_valorFreteGeral := v_cab_valorFreteGeral + p_item_valorFreteGeral;
      v_cab_valorSeguroGeral := v_cab_valorSeguroGeral + p_item_valorSeguroGeral;
      v_cab_valorDescontoGeral := v_cab_valorDescontoGeral + v_item_valorDescontoGeral;
      v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral + p_item_valorOutrasDespesasGer;
      v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral + p_item_valorAdicFreteMarGeral;
      v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral + p_item_valorDespesasAduanGeral;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento + v_item_valorBasePagamento;
      IF p_item_usarPrecoAVista = 1
        AND v_item_geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo + v_item_valorProdutoServico - v_item_valorDescontoTotal + v_item_valorOutrasDespesasTot;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento + v_item_valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento + v_item_valorOutrasDespPagament;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento + v_item_valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal + v_item_valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal + v_item_valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal + v_item_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_item_valorOutrasDespesasTot;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal + v_item_valorAdicFreteMarTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal + v_item_valorDespesasAduanTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem + v_item_valorLiquidoItem;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem + p_item_valorDescontoCustoOpIte;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera + p_item_valorDescontoCustoOpGer;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota + v_item_valorDescontoCustoOpTot;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte + p_item_valorAcrescimoCustoOpIt;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer + p_item_valorAcrescimoCustoOpGe;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot + v_item_valorAcrescimoCustoOpTo;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao + v_item_valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV + v_item_valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea + p_item_quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt + v_item_valorAcrescimoExtempSub;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem + p_item_valorAcrescimoExtempIte;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera + p_item_valorAcrescimoExtempGer;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota + v_item_valorAcrescimoExtempTot;
    END IF;
    UPDATE MOPREDOCUMENTOS SET
      modalidadeFrete               = v_cab_modalidadeFrete,
      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,
      valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
      valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
      valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
      valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
      valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
      valorCustoOperacao            = v_cab_valorCustoOperacao,
      valorCMV                      = v_cab_valorCMV,
      quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
      valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
      valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
      valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
    WHERE preDocumento = p_item_preDocumento;
    IF p_item_idItemPreDocumento > 0 THEN
      DELETE MOPREDOCUMXCOMPOSICOESPR compDoc
      WHERE compDoc.idItemPreDocumento = p_item_idItemPreDocumento
      AND EXISTS(
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.produto = comp.produto
        WHERE comp.composicaoPreco = compDoc.composicaoPreco
        AND gradProd.gradeProduto <> p_item_gradeProduto);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      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_413_obs_add_marca,
      ' ',
      0,
      'P',
      p_item_idItemPreDocumento,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    MERGE INTO MOPREDOCUMXITENS a USING (
      SELECT
        r_item_idItemPreDocumento      idItemPreDocumento,
        p_item_preDocumento            preDocumento,
        v_item_sequencia               sequencia,
        v_item_cancelado               cancelado,
        p_item_pedidoCompraFornecedor  pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo sequenciaPedidoCompraFornec,
        p_item_modeloDocumento         modeloDocumento,
        p_item_estabelecimentoOriginal estabelecimentoOriginal,
        p_item_vendedor                vendedor,
        p_item_gradeProduto            gradeProduto,
        p_item_idFormulaTinta          idFormulaTinta,
        p_item_personalizacao          personalizacao,
        p_item_idLoteEstoque           idLoteEstoque,
        p_item_operacaoFiscal          operacaoFiscal,
        v_item_movimentaEstoque        movimentaEstoque,
        v_item_geraFinanceiro          geraFinanceiro,
        p_item_localEstoque            localEstoque,
        p_item_pessoaParticipante      pessoaParticipante,
        p_item_controleQuantidade      controleQuantidade,
        p_item_unidadeMedidaConversao  unidadeMedidaConversao,
        p_item_conversorQuantidade     conversorQuantidade,
        p_item_loteMinimo              loteMinimo,
        p_item_loteMultiplo            loteMultiplo,
        p_item_altura                  altura,
        p_item_largura                 largura,
        p_item_comprimento             comprimento,
        p_item_pecas                   pecas,
        p_item_quantidade              quantidade,
        p_item_quantidadeConvertida    quantidadeConvertida,
        v_item_quantidadeDevolvidaRet  quantidadeDevolvidaRetornada,
        p_item_percentualDevolucao     percentualDevolucao,
        p_item_pesoLiquido             pesoLiquido,
        p_item_pesoBruto               pesoBruto,
        p_item_tipoPreco               tipoPreco,
        p_item_tabelaPreco             tabelaPreco,
        p_item_precoSugestaoAPrazo     precoSugestaoAPrazo,
        p_item_precoSugestaoAVista     precoSugestaoAVista,
        p_item_precoDesconto           precoDesconto,
        p_item_precoMinimo             precoMinimo,
        p_item_usarPrecoAVista         usarPrecoAVista,
        p_item_precoUnitarioBruto      precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos acrescimoUnitarioComposicao,
        v_item_precoUnitario           precoUnitario,
        v_item_precoUnitarioConvertido precoUnitarioConvertido,
        v_item_valorProdutoServicoBrut valorProdutoServicoBruto,
        v_item_valorProdutoServico     valorProdutoServico,
        p_item_percDescontoItem        percDescontoItem,
        p_item_valorDescontoItem       valorDescontoItem,
        p_item_percAcrescimoItem       percAcrescimoItem,
        p_item_valorAcrescimoItem      valorAcrescimoItem,
        p_item_valorFreteItem          valorFreteItem,
        p_item_valorSeguroItem         valorSeguroItem,
        p_item_valorAdicFreteMarItem   valorAdicFreteMarinhaMerItem,
        p_item_valorDespesasAduanItem  valorDespesasAduaneirasItem,
        p_item_valorFreteGeral         valorFreteGeral,
        p_item_valorSeguroGeral        valorSeguroGeral,
        v_item_valorDescontoGeral      valorDescontoGeral,
        p_item_valorOutrasDespesasGer  valorOutrasDespesasGeral,
        p_item_valorAdicFreteMarGeral  valorAdicFreteMarinhaMerGeral,
        p_item_valorDespesasAduanGeral valorDespesasAduaneirasGeral,
        v_item_valorBasePagamento      valorBasePagamento,
        v_item_valorDescontoPagamento  valorDescontoPagamento,
        v_item_valorOutrasDespPagament valorOutrasDespesasPagamento,
        v_item_valorJurosPagamento     valorJurosPagamento,
        v_item_valorFreteTotal         valorFreteTotal,
        v_item_valorSeguroTotal        valorSeguroTotal,
        v_item_valorDescontoTotal      valorDescontoTotal,
        v_item_valorOutrasDespesasTot  valorOutrasDespesasTotal,
        v_item_valorAdicFreteMarTotal  valorAdicFreteMarinhaMerTotal,
        v_item_valorDespesasAduanTotal valorDespesasAduaneirasTotal,
        v_item_cfop                    cfop,
        v_item_indicadorISSQN          indicadorISSQN,
        v_item_aliquotaISSQN           aliquotaISSQN,
        v_item_retidoISSQN             retidoISSQN,
        v_item_tributadoForaMunicipio  tributadoForaMunicipio,
        v_item_incentivoFiscal         incentivoFiscal,
        v_item_listaServicos           listaServicos,
        v_item_cnae                    cnae,
        v_item_idServicoMunicipio      idServicoMunicipio,
        v_item_numeroProcessoAdministr numeroProcessoAdministrativo,
        v_item_baseISSQN               baseISSQN,
        v_item_valorISSQN              valorISSQN,
        v_item_retencaoIRRF            retencaoIRRF,
        v_item_baseRetIRRF             baseRetIRRF,
        v_item_valorRetIRRF            valorRetIRRF,
        v_item_retencaoINSS            retencaoINSS,
        v_item_baseRetINSS             baseRetINSS,
        v_item_valorRetINSS            valorRetINSS,
        v_item_retencaoPIS             retencaoPIS,
        v_item_baseRetPIS              baseRetPIS,
        v_item_valorRetPIS             valorRetPIS,
        v_item_retencaoCOFINS          retencaoCOFINS,
        v_item_baseRetCOFINS           baseRetCOFINS,
        v_item_valorRetCOFINS          valorRetCOFINS,
        v_item_retencaoCSLL            retencaoCSLL,
        v_item_baseRetCSLL             baseRetCSLL,
        v_item_valorRetCSLL            valorRetCSLL,
        v_item_retencaoOutros          retencaoOutros,
        v_item_baseRetOutros           baseRetOutros,
        v_item_valorRetOutros          valorRetOutros,
        v_item_aliquotaII              aliquotaII,
        v_item_baseII                  baseII,
        v_item_valorII                 valorII,
        v_item_aliquotaIOF             aliquotaIOF,
        v_item_baseIOF                 baseIOF,
        v_item_valorIOF                valorIOF,
        v_item_codigoEnquadramentoIPI  codigoEnquadramentoIPI,
        v_item_stIPI                   stIPI,
        v_item_aliquotaIPI             aliquotaIPI,
        v_item_valorAliquotaIPI        valorAliquotaIPI,
        v_item_baseIPI                 baseIPI,
        v_item_valorIPI                valorIPI,
        p_item_valorIPIDevolucao       valorIPIDevolucao,
        v_item_stPIS                   stPIS,
        v_item_aliquotaPIS             aliquotaPIS,
        v_item_valorAliquotaPIS        valorAliquotaPIS,
        v_item_basePIS                 basePIS,
        v_item_valorPIS                valorPIS,
        v_item_aliquotaPISST           aliquotaPISST,
        v_item_valorAliquotaPISST      valorAliquotaPISST,
        v_item_basePISST               basePISST,
        v_item_valorPISST              valorPISST,
        v_item_stCOFINS                stCOFINS,
        v_item_aliquotaCOFINS          aliquotaCOFINS,
        v_item_valorAliquotaCOFINS     valorAliquotaCOFINS,
        v_item_baseCOFINS              baseCOFINS,
        v_item_valorCOFINS             valorCOFINS,
        v_item_aliquotaCOFINSST        aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST   valorAliquotaCOFINSST,
        v_item_baseCOFINSST            baseCOFINSST,
        v_item_valorCOFINSST           valorCOFINSST,
        v_item_stSimplesNacional       stSimplesNacional,
        v_item_creditoSimplesNacional  creditoSimplesNacional,
        v_item_baseCreditoSimplesNac   baseCreditoSimplesNacional,
        v_item_valorCreditoSimplesNac  valorCreditoSimplesNacional,
        v_item_stICMS                  stICMS,
        v_item_modalBaseCalcICMS       modalidadeBaseCalcICMS,
        v_item_reducaoBaseICMS         reducaoBaseICMS,
        v_item_aliquotaICMS            aliquotaICMS,
        v_item_diferimentoICMS         diferimentoICMS,
        v_item_motivoDesoneracaoICMS   motivoDesoneracaoICMS,
        v_item_idBeneficio             idBeneficio,
        v_item_baseICMS                baseICMS,
        v_item_valorICMSOperacao       valorICMSOperacao,
        v_item_valorICMSDiferido       valorICMSDiferido,
        v_item_valorICMS               valorICMS,
        v_item_valorICMSDesoneracao    valorICMSDesoneracao,
        v_item_modalBaseCalcICMSST     modalidadeBaseCalcICMSST,
        v_item_margemValorAdicionadoST margemValorAdicionadoST,
        v_item_reducaoBaseST           reducaoBaseST,
        v_item_aliquotaICMSST          aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin aliquotaSTSuportConsFinal,
        v_item_baseICMSST              baseICMSST,
        v_item_valorICMSST             valorICMSST,
        v_item_baseICMSSTAnteriormente baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment valorICMSSTAnteriormente,
        v_item_valorICMSProprioSubstit valorICMSProprioSubstituto,
        v_item_reducaoBaseICMSEfetivo  reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo     aliquotaICMSEfetivo,
        v_item_baseICMSEfetivo         baseICMSEfetivo,
        v_item_valorICMSEfetivo        valorICMSEfetivo,
        v_item_aliquotaICMSUFDestinat  aliquotaICMSUFDestinatario,
        v_item_aliquotaICMSInterestad  aliquotaICMSInterestadual,
        v_item_partilhaICMSInterestad  partilhaICMSInterestadual,
        v_item_baseICMSUFDestinatario  baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente     baseICMSUFRemetente,
        v_item_valorICMSUFRemetente    valorICMSUFRemetente,
        v_item_aliquotaFCP             aliquotaFCP,
        v_item_baseFCP                 baseFCP,
        v_item_valorFCP                valorFCP,
        v_item_aliquotaFCPST           aliquotaFCPST,
        v_item_baseFCPST               baseFCPST,
        v_item_valorFCPST              valorFCPST,
        v_item_aliquotaFCPSTAnteriorm  aliquotaFCPSTAnteriormente,
        v_item_baseFCPSTAnteriormente  baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente valorFCPSTAnteriormente,
        v_item_aliquotaFCPUFDestinat   aliquotaFCPUFDestinatario,
        v_item_baseFCPUFDestinatario   baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario  valorFCPUFDestinatario,
        v_item_aliquotaEstImpFederais  aliquotaEstimadaImpFederais,
        v_item_aliquotaEstImpEstaduais aliquotaEstimadaImpEstaduais,
        v_item_aliquotaEstImpMunicipai aliquotaEstimadaImpMunicipais,
        v_item_baseEstimadaImpostos    baseEstimadaImpostos,
        v_item_valorEstImpFederais     valorEstimadoImpFederais,
        v_item_valorEstImpEstaduais    valorEstimadoImpEstaduais,
        v_item_valorEstImpMunicipais   valorEstimadoImpMunicipais,
        v_item_valorLiquidoItem        valorLiquidoItem,
        p_item_valorDescontoCustoOpIte valorDescontoCustoOpItem,
        p_item_valorDescontoCustoOpGer valorDescontoCustoOpGeral,
        v_item_valorDescontoCustoOpTot valorDescontoCustoOpTotal,
        p_item_valorAcrescimoCustoOpIt valorAcrescimoCustoOpItem,
        p_item_valorAcrescimoCustoOpGe valorAcrescimoCustoOpGeral,
        v_item_valorAcrescimoCustoOpTo valorAcrescimoCustoOpTotal,
        v_item_precoCustoOperacao      precoCustoOperacao,
        v_item_valorCustoOperacao      valorCustoOperacao,
        v_item_precoCMV                precoCMV,
        v_item_valorCMV                valorCMV,
        p_item_quantidadeExtemporanea  quantidadeExtemporanea,
        p_item_acrescimoUnitarioExtemp acrescimoUnitarioExtemporaneo,
        v_item_valorAcrescimoExtempSub valorAcrescimoExtempSubtotal,
        p_item_valorAcrescimoExtempIte valorAcrescimoExtempItem,
        p_item_valorAcrescimoExtempGer valorAcrescimoExtempGeral,
        v_item_valorAcrescimoExtempTot valorAcrescimoExtempTotal,
        p_item_observacoesDigitadas    observacoesDigitadas,
        v_observacoes                  observacoes
      FROM DUAL) b
    ON (a.idItemPreDocumento = b.idItemPreDocumento)
    WHEN MATCHED THEN UPDATE SET
      a.preDocumento                  = b.preDocumento,
      a.sequencia                     = b.sequencia,
      a.cancelado                     = b.cancelado,
      a.pedidoCompraFornecedor        = b.pedidoCompraFornecedor,
      a.sequenciaPedidoCompraFornec   = b.sequenciaPedidoCompraFornec,
      a.vendedor                      = b.vendedor,
      a.modeloDocumento               = b.modeloDocumento,
      a.estabelecimentoOriginal       = b.estabelecimentoOriginal,
      a.gradeProduto                  = b.gradeProduto,
      a.idFormulaTinta                = b.idFormulaTinta,
      a.personalizacao                = b.personalizacao,
      a.idLoteEstoque                 = b.idLoteEstoque,
      a.operacaoFiscal                = b.operacaoFiscal,
      a.movimentaEstoque              = b.movimentaEstoque,
      a.geraFinanceiro                = b.geraFinanceiro,
      a.localEstoque                  = b.localEstoque,
      a.pessoaParticipante            = b.pessoaParticipante,
      a.controleQuantidade            = b.controleQuantidade,
      a.unidadeMedidaConversao        = b.unidadeMedidaConversao,
      a.conversorQuantidade           = b.conversorQuantidade,
      a.loteMinimo                    = b.loteMinimo,
      a.loteMultiplo                  = b.loteMultiplo,
      a.altura                        = b.altura,
      a.largura                       = b.largura,
      a.comprimento                   = b.comprimento,
      a.pecas                         = b.pecas,
      a.quantidade                    = b.quantidade,
      a.quantidadeConvertida          = b.quantidadeConvertida,
      a.quantidadeDevolvidaRetornada  = b.quantidadeDevolvidaRetornada,
      a.percentualDevolucao           = b.percentualDevolucao,
      a.pesoLiquido                   = b.pesoLiquido,
      a.pesoBruto                     = b.pesoBruto,
      a.tipoPreco                     = b.tipoPreco,
      a.tabelaPreco                   = b.tabelaPreco,
      a.precoSugestaoAPrazo           = b.precoSugestaoAPrazo,
      a.precoSugestaoAVista           = b.precoSugestaoAVista,
      a.precoDesconto                 = b.precoDesconto,
      a.precoMinimo                   = b.precoMinimo,
      a.usarPrecoAVista               = b.usarPrecoAVista,
      a.precoUnitarioBruto            = b.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao   = b.acrescimoUnitarioComposicao,
      a.precoUnitario                 = b.precoUnitario,
      a.precoUnitarioConvertido       = b.precounitarioConvertido,
      a.valorProdutoServicoBruto      = b.valorProdutoServicoBruto,
      a.valorProdutoServico           = b.valorProdutoServico,
      a.percDescontoItem              = b.percDescontoItem,
      a.valorDescontoItem             = b.valorDescontoItem,
      a.percAcrescimoItem             = b.percAcrescimoItem,
      a.valorAcrescimoItem            = b.valorAcrescimoItem,
      a.valorFreteItem                = b.valorFreteItem,
      a.valorSeguroItem               = b.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem  = b.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem   = b.valorDespesasAduaneirasItem,
      a.valorFreteGeral               = b.valorFreteGeral,
      a.valorSeguroGeral              = b.valorSeguroGeral,
      a.valorDescontoGeral            = b.valorDescontoGeral,
      a.valorOutrasDespesasGeral      = b.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral = b.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral  = b.valorDespesasAduaneirasGeral,
      a.valorBasePagamento            = b.valorBasePagamento,
      a.valorDescontoPagamento        = b.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento  = b.valorOutrasDespesasPagamento,
      a.valorJurosPagamento           = b.valorJurosPagamento,
      a.valorFreteTotal               = b.valorFreteTotal,
      a.valorSeguroTotal              = b.valorSeguroTotal,
      a.valorDescontoTotal            = b.valorDescontoTotal,
      a.valorOutrasDespesasTotal      = b.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal = b.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal  = b.valorDespesasAduaneirasTotal,
      a.cfop                          = b.cfop,
      a.indicadorISSQN                = b.indicadorISSQN,
      a.aliquotaISSQN                 = b.aliquotaISSQN,
      a.retidoISSQN                   = b.retidoISSQN,
      a.tributadoForaMunicipio        = b.tributadoForaMunicipio,
      a.incentivoFiscal               = b.incentivoFiscal,
      a.listaServicos                 = b.listaServicos,
      a.cnae                          = b.cnae,
      a.idServicoMunicipio            = b.idServicoMunicipio,
      a.numeroProcessoAdministrativo  = b.numeroProcessoAdministrativo,
      a.baseISSQN                     = b.baseISSQN,
      a.valorISSQN                    = b.valorISSQN,
      a.retencaoIRRF                  = b.retencaoIRRF,
      a.baseRetIRRF                   = b.baseRetIRRF,
      a.valorRetIRRF                  = b.valorRetIRRF,
      a.retencaoINSS                  = b.retencaoINSS,
      a.baseRetINSS                   = b.baseRetINSS,
      a.valorRetINSS                  = b.valorRetINSS,
      a.retencaoPIS                   = b.retencaoPIS,
      a.baseRetPIS                    = b.baseRetPIS,
      a.valorRetPIS                   = b.valorRetPIS,
      a.retencaoCOFINS                = b.retencaoCOFINS,
      a.baseRetCOFINS                 = b.baseRetCOFINS,
      a.valorRetCOFINS                = b.valorRetCOFINS,
      a.retencaoCSLL                  = b.retencaoCSLL,
      a.baseRetCSLL                   = b.baseRetCSLL,
      a.valorRetCSLL                  = b.valorRetCSLL,
      a.retencaoOutros                = b.retencaoOutros,
      a.baseRetOutros                 = b.baseRetOutros,
      a.valorRetOutros                = b.valorRetOutros,
      a.aliquotaII                    = b.aliquotaII,
      a.baseII                        = b.baseII,
      a.valorII                       = b.valorII,
      a.aliquotaIOF                   = b.aliquotaIOF,
      a.baseIOF                       = b.baseIOF,
      a.valorIOF                      = b.valorIOF,
      a.codigoEnquadramentoIPI        = b.codigoEnquadramentoIPI,
      a.stIPI                         = b.stIPI,
      a.aliquotaIPI                   = b.aliquotaIPI,
      a.valorAliquotaIPI              = b.valorAliquotaIPI,
      a.baseIPI                       = b.baseIPI,
      a.valorIPI                      = b.valorIPI,
      a.valorIPIDevolucao             = b.valorIPIDevolucao,
      a.stPIS                         = b.stPIS,
      a.aliquotaPIS                   = b.aliquotaPIS,
      a.valorAliquotaPIS              = b.valorAliquotaPIS,
      a.basePIS                       = b.basePIS,
      a.valorPIS                      = b.valorPIS,
      a.aliquotaPISST                 = b.aliquotaPISST,
      a.valorAliquotaPISST            = b.valorAliquotaPISST,
      a.basePISST                     = b.basePISST,
      a.valorPISST                    = b.valorPISST,
      a.stCOFINS                      = b.stCOFINS,
      a.aliquotaCOFINS                = b.aliquotaCOFINS,
      a.valorAliquotaCOFINS           = b.valorAliquotaCOFINS,
      a.baseCOFINS                    = b.baseCOFINS,
      a.valorCOFINS                   = b.valorCOFINS,
      a.aliquotaCOFINSST              = b.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST         = b.valorAliquotaCOFINSST,
      a.baseCOFINSST                  = b.baseCOFINSST,
      a.valorCOFINSST                 = b.valorCOFINSST,
      a.stSimplesNacional             = b.stSimplesNacional,
      a.creditoSimplesNacional        = b.creditoSimplesNacional,
      a.baseCreditoSimplesNacional    = b.baseCreditoSimplesNacional,
      a.valorCreditoSimplesNacional   = b.valorCreditoSimplesNacional,
      a.stICMS                        = b.stICMS,
      a.modalidadeBaseCalcICMS        = b.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS               = b.reducaoBaseICMS,
      a.aliquotaICMS                  = b.aliquotaICMS,
      a.diferimentoICMS               = b.diferimentoICMS,
      a.motivoDesoneracaoICMS         = b.motivoDesoneracaoICMS,
      a.idBeneficio                   = b.idBeneficio,
      a.baseICMS                      = b.baseICMS,
      a.valorICMSoperacao             = b.valorICMSoperacao,
      a.valorICMSdiferido             = b.valorICMSdiferido,
      a.valorICMS                     = b.valorICMS,
      a.valorICMSdesoneracao          = b.valorICMSdesoneracao,
      a.modalidadeBaseCalcICMSST      = b.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST       = b.margemValorAdicionadoST,
      a.reducaoBaseST                 = b.reducaoBaseST,
      a.aliquotaICMSST                = b.aliquotaICMSST,
      a.aliquotaSTSuportConsFinal     = b.aliquotaSTSuportConsFinal,
      a.baseICMSST                    = b.baseICMSST,
      a.valorICMSST                   = b.valorICMSST,
      a.baseICMSSTAnteriormente       = b.baseICMSSTAnteriormente,
      a.valorICMSSTAnteriormente      = b.valorICMSSTAnteriormente,
      a.valorICMSProprioSubstituto    = b.valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo        = b.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo           = b.aliquotaICMSEfetivo,
      a.baseICMSEfetivo               = b.baseICMSEfetivo,
      a.valorICMSEfetivo              = b.valorICMSEfetivo,
      a.aliquotaICMSUFDestinatario    = b.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual     = b.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual     = b.partilhaICMSInterestadual,
      a.baseICMSUFDestinatario        = b.baseICMSUFDestinatario,
      a.valorICMSUFDestinatario       = b.valorICMSUFDestinatario,
      a.baseICMSUFRemetente           = b.baseICMSUFRemetente,
      a.valorICMSUFRemetente          = b.valorICMSUFRemetente,
      a.aliquotaFCP                   = b.aliquotaFCP,
      a.baseFCP                       = b.baseFCP,
      a.valorFCP                      = b.valorFCP,
      a.aliquotaFCPST                 = b.aliquotaFCPST,
      a.baseFCPST                     = b.baseFCPST,
      a.valorFCPST                    = b.valorFCPST,
      a.aliquotaFCPSTAnteriormente    = b.aliquotaFCPSTAnteriormente,
      a.baseFCPSTAnteriormente        = b.baseFCPSTAnteriormente,
      a.valorFCPSTAnteriormente       = b.valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario     = b.aliquotaFCPUFDestinatario,
      a.baseFCPUFDestinatario         = b.baseFCPUFDestinatario,
      a.valorFCPUFDestinatario        = b.valorFCPUFDestinatario,
      a.aliquotaestimadaimpfederais   = b.aliquotaestimadaimpfederais,
      a.aliquotaestimadaimpestaduais  = b.aliquotaestimadaimpestaduais,
      a.aliquotaestimadaimpmunicipais = b.aliquotaestimadaimpmunicipais,
      a.baseestimadaimpostos          = b.baseestimadaimpostos,
      a.valorestimadoimpfederais      = b.valorestimadoimpfederais,
      a.valorEstimadoImpEstaduais     = b.valorEstimadoImpEstaduais,
      a.valorEstimadoImpMunicipais    = b.valorEstimadoImpMunicipais,
      a.valorLiquidoItem              = b.valorLiquidoItem,
      a.valorDescontoCustoOpItem      = b.valorDescontoCustoOpItem,
      a.valorDescontoCustoOpGeral     = b.valorDescontoCustoOpGeral,
      a.valorDescontoCustoOpTotal     = b.valorDescontoCustoOpTotal,
      a.valorAcrescimoCustoOpItem     = b.valorAcrescimoCustoOpItem,
      a.valorAcrescimoCustoOpGeral    = b.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoCustoOpTotal    = b.valorAcrescimoCustoOpTotal,
      a.precoCustoOperacao            = b.precoCustoOperacao,
      a.valorCustoOperacao            = b.valorCustoOperacao,
      a.precoCMV                      = b.precoCMV,
      a.valorCMV                      = b.valorCMV,
      a.quantidadeExtemporanea        = b.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo = b.acrescimoUnitarioExtemporaneo,
      a.valorAcrescimoExtempSubtotal  = b.valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem      = b.valorAcrescimoExtempItem,
      a.valorAcrescimoExtempGeral     = b.valorAcrescimoExtempGeral,
      a.valorAcrescimoExtempTotal     = b.valorAcrescimoExtempTotal,
      a.observacoesDigitadas          = b.observacoesDigitadas,
      a.observacoes                   = b.observacoes
    WHEN NOT MATCHED THEN INSERT (
      idItemPreDocumento,
      preDocumento,
      sequencia,
      cancelado,
      pedidoCompraFornecedor,
      sequenciaPedidoCompraFornec,
      modeloDocumento,
      estabelecimentoOriginal,
      vendedor,
      gradeProduto,
      idFormulaTinta,
      personalizacao,
      idLoteEstoque,
      operacaoFiscal,
      movimentaEstoque,
      geraFinanceiro,
      localEstoque,
      pessoaParticipante,
      controleQuantidade,
      unidadeMedidaConversao,
      conversorQuantidade,
      loteMinimo,
      loteMultiplo,
      altura,
      largura,
      comprimento,
      pecas,
      quantidade,
      quantidadeConvertida,
      quantidadeDevolvidaRetornada,
      percentualDevolucao,
      pesoLiquido,
      pesoBruto,
      tipoPreco,
      tabelaPreco,
      precoSugestaoAPrazo,
      precoSugestaoAVista,
      precoDesconto,
      precoMinimo,
      usarPrecoAVista,
      precoUnitarioBruto,
      acrescimoUnitarioComposicao,
      precoUnitario,
      precoUnitarioConvertido,
      valorProdutoServicoBruto,
      valorProdutoServico,
      percDescontoItem,
      valorDescontoItem,
      percAcrescimoItem,
      valorAcrescimoItem,
      valorFreteItem,
      valorSeguroItem,
      valorAdicFreteMarinhaMerItem,
      valorDespesasAduaneirasItem,
      valorFreteGeral,
      valorSeguroGeral,
      valorDescontoGeral,
      valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral,
      valorDespesasAduaneirasGeral,
      valorBasePagamento,
      valorDescontoPagamento,
      valorOutrasDespesasPagamento,
      valorJurosPagamento,
      valorFreteTotal,
      valorSeguroTotal,
      valorDescontoTotal,
      valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal,
      valorDespesasAduaneirasTotal,
      cfop,
      indicadorISSQN,
      aliquotaISSQN,
      retidoISSQN,
      tributadoForaMunicipio,
      incentivoFiscal,
      listaServicos,
      cnae,
      idServicoMunicipio,
      numeroProcessoAdministrativo,
      baseISSQN,
      valorISSQN,
      retencaoIRRF,
      baseRetIRRF,
      valorRetIRRF,
      retencaoINSS,
      baseRetINSS,
      valorRetINSS,
      retencaoPIS,
      baseRetPIS,
      valorRetPIS,
      retencaoCOFINS,
      baseRetCOFINS,
      valorRetCOFINS,
      retencaoCSLL,
      baseRetCSLL,
      valorRetCSLL,
      retencaoOutros,
      baseRetOutros,
      valorRetOutros,
      aliquotaII,
      baseII,
      valorII,
      aliquotaIOF,
      baseIOF,
      valorIOF,
      codigoEnquadramentoIPI,
      stIPI,
      aliquotaIPI,
      valorAliquotaIPI,
      baseIPI,
      valorIPI,
      valorIPIDevolucao,
      stPIS,
      aliquotaPIS,
      valorAliquotaPIS,
      basePIS,
      valorPIS,
      aliquotaPISST,
      valorAliquotaPISST,
      basePISST,
      valorPISST,
      stCOFINS,
      aliquotaCOFINS,
      valorAliquotaCOFINS,
      baseCOFINS,
      valorCOFINS,
      aliquotaCOFINSST,
      valorAliquotaCOFINSST,
      baseCOFINSST,
      valorCOFINSST,
      stSimplesNacional,
      creditoSimplesNacional,
      baseCreditoSimplesNacional,
      valorCreditoSimplesNacional,
      stICMS,
      modalidadeBaseCalcICMS,
      reducaoBaseICMS,
      aliquotaICMS,
      diferimentoICMS,
      motivoDesoneracaoICMS,
      idBeneficio,
      baseICMS,
      valorICMSOperacao,
      valorICMSDiferido,
      valorICMS,
      valorICMSDesoneracao,
      modalidadeBaseCalcICMSST,
      margemValorAdicionadoST,
      reducaoBaseST,
      aliquotaICMSST,
      aliquotaSTSuportConsFinal,
      baseICMSST,
      valorICMSST,
      baseICMSSTAnteriormente,
      valorICMSSTAnteriormente,
      valorICMSProprioSubstituto,
      reducaoBaseICMSEfetivo,
      aliquotaICMSEfetivo,
      baseICMSEfetivo,
      valorICMSEfetivo,
      aliquotaICMSUFDestinatario,
      aliquotaICMSInterestadual,
      partilhaICMSInterestadual,
      baseICMSUFDestinatario,
      valorICMSUFDestinatario,
      baseICMSUFRemetente,
      valorICMSUFRemetente,
      aliquotaFCP,
      baseFCP,
      valorFCP,
      aliquotaFCPST,
      baseFCPST,
      valorFCPST,
      aliquotaFCPSTAnteriormente,
      baseFCPSTAnteriormente,
      valorFCPSTAnteriormente,
      aliquotaFCPUFDestinatario,
      baseFCPUFDestinatario,
      valorFCPUFDestinatario,
      aliquotaEstimadaImpFederais,
      aliquotaEstimadaImpEstaduais,
      aliquotaEstimadaImpMunicipais,
      baseEstimadaImpostos,
      valorEstimadoImpFederais,
      valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais,
      valorLiquidoItem,
      valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral,
      valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpItem,
      valorAcrescimoCustoOpGeral,
      valorAcrescimoCustoOpTotal,
      precoCustoOperacao,
      valorCustoOperacao,
      precoCMV,
      valorCMV,
      quantidadeExtemporanea,
      acrescimoUnitarioExtemporaneo,
      valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral,
      valorAcrescimoExtempTotal,
      observacoesDigitadas,
      observacoes)
    VALUES (
      b.idItemPreDocumento,
      b.preDocumento,
      b.sequencia,
      b.cancelado,
      b.pedidoCompraFornecedor,
      b.sequenciaPedidoCompraFornec,
      b.modeloDocumento,
      b.estabelecimentoOriginal,
      b.vendedor,
      b.gradeProduto,
      b.idFormulaTinta,
      b.personalizacao,
      b.idLoteEstoque,
      b.operacaoFiscal,
      b.movimentaEstoque,
      b.geraFinanceiro,
      b.localEstoque,
      b.pessoaParticipante,
      b.controleQuantidade,
      b.unidadeMedidaConversao,
      b.conversorQuantidade,
      b.loteMinimo,
      b.loteMultiplo,
      b.altura,
      b.largura,
      b.comprimento,
      b.pecas,
      b.quantidade,
      b.quantidadeConvertida,
      b.quantidadeDevolvidaRetornada,
      b.percentualDevolucao,
      b.pesoLiquido,
      b.pesoBruto,
      b.tipoPreco,
      b.tabelaPreco,
      b.precoSugestaoAPrazo,
      b.precoSugestaoAVista,
      b.precoDesconto,
      b.precoMinimo,
      b.usarPrecoAVista,
      b.precoUnitarioBruto,
      b.acrescimoUnitarioComposicao,
      b.precoUnitario,
      b.precoUnitarioConvertido,
      b.valorProdutoServicoBruto,
      b.valorProdutoServico,
      b.percDescontoItem,
      b.valorDescontoItem,
      b.percAcrescimoItem,
      b.valorAcrescimoItem,
      b.valorFreteItem,
      b.valorSeguroItem,
      b.valorAdicFreteMarinhaMerItem,
      b.valorDespesasAduaneirasItem,
      b.valorFreteGeral,
      b.valorSeguroGeral,
      b.valorDescontoGeral,
      b.valorOutrasDespesasGeral,
      b.valorAdicFreteMarinhaMerGeral,
      b.valorDespesasAduaneirasGeral,
      b.valorBasePagamento,
      b.valorDescontoPagamento,
      b.valorOutrasDespesasPagamento,
      b.valorJurosPagamento,
      b.valorFreteTotal,
      b.valorSeguroTotal,
      b.valorDescontoTotal,
      b.valorOutrasDespesasTotal,
      b.valorAdicFreteMarinhaMerTotal,
      b.valorDespesasAduaneirasTotal,
      b.cfop,
      b.indicadorISSQN,
      b.aliquotaISSQN,
      b.retidoISSQN,
      b.tributadoForaMunicipio,
      b.incentivoFiscal,
      b.listaServicos,
      b.cnae,
      b.idServicoMunicipio,
      b.numeroProcessoAdministrativo,
      b.baseISSQN,
      b.valorISSQN,
      b.retencaoIRRF,
      b.baseRetIRRF,
      b.valorRetIRRF,
      b.retencaoINSS,
      b.baseRetINSS,
      b.valorRetINSS,
      b.retencaoPIS,
      b.baseRetPIS,
      b.valorRetPIS,
      b.retencaoCOFINS,
      b.baseRetCOFINS,
      b.valorRetCOFINS,
      b.retencaoCSLL,
      b.baseRetCSLL,
      b.valorRetCSLL,
      b.retencaoOutros,
      b.baseRetOutros,
      b.valorRetOutros,
      b.aliquotaII,
      b.baseII,
      b.valorII,
      b.aliquotaIOF,
      b.baseIOF,
      b.valorIOF,
      b.codigoEnquadramentoIPI,
      b.stIPI,
      b.aliquotaIPI,
      b.valorAliquotaIPI,
      b.baseIPI,
      b.valorIPI,
      b.valorIPIDevolucao,
      b.stPIS,
      b.aliquotaPIS,
      b.valorAliquotaPIS,
      b.basePIS,
      b.valorPIS,
      b.aliquotaPISST,
      b.valorAliquotaPISST,
      b.basePISST,
      b.valorPISST,
      b.stCOFINS,
      b.aliquotaCOFINS,
      b.valorAliquotaCOFINS,
      b.baseCOFINS,
      b.valorCOFINS,
      b.aliquotaCOFINSST,
      b.valorAliquotaCOFINSST,
      b.baseCOFINSST,
      b.valorCOFINSST,
      b.stSimplesNacional,
      b.creditoSimplesNacional,
      b.baseCreditoSimplesNacional,
      b.valorCreditoSimplesNacional,
      b.stICMS,
      b.modalidadeBaseCalcICMS,
      b.reducaoBaseICMS,
      b.aliquotaICMS,
      b.diferimentoICMS,
      b.motivoDesoneracaoICMS,
      b.idBeneficio,
      b.baseICMS,
      b.valorICMSOperacao,
      b.valorICMSDiferido,
      b.valorICMS,
      b.valorICMSDesoneracao,
      b.modalidadeBaseCalcICMSST,
      b.margemValorAdicionadoST,
      b.reducaoBaseST,
      b.aliquotaICMSST,
      b.aliquotaSTSuportConsFinal,
      b.baseICMSST,
      b.valorICMSST,
      b.baseICMSSTAnteriormente,
      b.valorICMSSTAnteriormente,
      b.valorICMSProprioSubstituto,
      b.reducaoBaseICMSEfetivo,
      b.aliquotaICMSEfetivo,
      b.baseICMSEfetivo,
      b.valorICMSEfetivo,
      b.aliquotaICMSUFDestinatario,
      b.aliquotaICMSInterestadual,
      b.partilhaICMSInterestadual,
      b.baseICMSUFDestinatario,
      b.valorICMSUFDestinatario,
      b.baseICMSUFRemetente,
      b.valorICMSUFRemetente,
      b.aliquotaFCP,
      b.baseFCP,
      b.valorFCP,
      b.aliquotaFCPST,
      b.baseFCPST,
      b.valorFCPST,
      b.aliquotaFCPSTAnteriormente,
      b.baseFCPSTAnteriormente,
      b.valorFCPSTAnteriormente,
      b.aliquotaFCPUFDestinatario,
      b.baseFCPUFDestinatario,
      b.valorFCPUFDestinatario,
      b.aliquotaEstimadaImpFederais,
      b.aliquotaEstimadaImpEstaduais,
      b.aliquotaEstimadaImpMunicipais,
      b.baseEstimadaImpostos,
      b.valorEstimadoImpFederais,
      b.valorEstimadoImpEstaduais,
      b.valorEstimadoImpMunicipais,
      b.valorLiquidoItem,
      b.valorDescontoCustoOpItem,
      b.valorDescontoCustoOpGeral,
      b.valorDescontoCustoOpTotal,
      b.valorAcrescimoCustoOpItem,
      b.valorAcrescimoCustoOpGeral,
      b.valorAcrescimoCustoOpTotal,
      b.precoCustoOperacao,
      b.valorCustoOperacao,
      b.precoCMV,
      b.valorCMV,
      b.quantidadeExtemporanea,
      b.acrescimoUnitarioExtemporaneo,
      b.valorAcrescimoExtempSubtotal,
      b.valorAcrescimoExtempItem,
      b.valorAcrescimoExtempGeral,
      b.valorAcrescimoExtempTotal,
      b.observacoesDigitadas,
      b.observacoes);
    v_atualizarObservacoes := 0;
    IF p_idItemReferenciado > 0 THEN
      IF p_tipoDocumentoReferenciado IN ('D','P') THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV(
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_devolucaoAnulacaoRetorno,
          'P',
          r_item_idItemPreDocumento,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          p_tipoDocumentoReferenciado,
          p_idItemReferenciado);
      END IF;
      IF p_tipoDocumentoReferenciado = 'D' THEN
        ADD_PRE_DOC_ITEM_REF_DOC_FIS (
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_preDocumento,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemPreDocumento,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'O' THEN
        ADD_PRE_DOC_ITEM_REF_ORCAMEN (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_preDocumento,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemPreDocumento,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'P' THEN
        ADD_PRE_DOC_ITEM_REF_PRE_DOC (
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_preDocumento,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemPreDocumento,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'T' THEN
        ADD_PRE_DOC_ITEM_TRANS_GRAVA (
          p_estabelecimentoAtivo,
          v_cab_entradaSaida,
          p_idItemReferenciado,
          r_item_idItemPreDocumento,
          p_quantidadeReferenciada);
      END IF;
    END IF;
    IF p_tempComp_nomeTempComposicao <> ' '
      AND (NOT (p_tipoDocumentoReferenciado IN ('D','O','P'))
        OR p_idItemReferenciado <= 0)
    THEN
      ADD_PRE_DOC_ITEM_COMP_TEMP (
        p_sessaoClient,
        p_estabelecimentoAtivo,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        r_item_idItemPreDocumento,
        v_atualizarObservacoes,
        v_atualizarObservacoes);
    END IF;
    v_idEnderecoEstoque := 0;
    IF p_item_idEnderecoEstoque > 0 THEN
      ADD_PRE_DOC_ITEM_ENDER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemPreDocumento,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_quantidade,
        ' ',
        v_idEnderecoEstoque);
    END IF;
    IF p_item_idNumeroSerie > 0 THEN
      ADD_PRE_DOC_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemPreDocumento,
        v_idEnderecoEstoque,
        p_item_gradeProduto,
        p_item_idNumeroSerie,
        0,
        v_auxNumber);
      v_atualizarObservacoes := 1;
    END IF;
    IF v_atualizarObservacoes = 1 THEN
      v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
        p_sessaoClient,
        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_413_obs_add_marca,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        'P',
        r_item_idItemPreDocumento,
        p_item_gradeProduto,
        p_item_idFormulaTinta,
        p_item_personalizacao,
        p_item_idLoteEstoque,
        p_item_controleQuantidade,
        p_item_loteMultiplo,
        p_item_altura,
        p_item_largura,
        p_item_comprimento,
        p_item_quantidade,
        p_item_observacoesDigitadas);
      UPDATE MOPREDOCUMXITENS
      SET observacoes = v_observacoes
      WHERE idItemPreDocumento = r_item_idItemPreDocumento;
    END IF;
    IF v_cab_statusPreDocumento = 'A' THEN
      ADD_PRE_DOC_ITEM_EST_ATUALIZA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_item_idItemPreDocumento,
        p_estabelecimentoAtivo);
      ADD_PRE_DOC_ITEM_FIL_ATUALIZA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_item_idItemPreDocumento,
        p_estabelecimentoAtivo);
    END IF;
    r_buffer_idItemPreDocumento := CASE WHEN (r_buffer_idItemPreDocumento IS NULL OR r_buffer_idItemPreDocumento = '' OR r_buffer_idItemPreDocumento = ' ') THEN '' ELSE RTRIM (r_buffer_idItemPreDocumento) || ';' END || TO_CHAR (LPAD(r_item_idItemPreDocumento,14,'0'));
    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;
  END IF;
END ADD_PRE_DOC_ITEM_GRAVA;

/

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

/

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

/

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

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_REF_DOC_FIS (
  p_estabelecimentoAtivo         IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_cab_idDocumentoFiscal        IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_documentoFiscal          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_sequencia               IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  p_idItemDocFiscalReferenciado  IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_atualizarObservacoes         IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes         OUT NUMBER)
IS
  v_id                           NUMBER;
  v_idDocumentoFiscalReferenciad NUMBER;
  v_sequenciaReferenciado        NUMBER;
  v_orc_pessoa                   NUMBER;
  v_auxAlpha                     VARCHAR (3200);
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  ADD_DOC_FISC_ITEM_N_SER_PRE (
    p_estabelecimentoAtivo,
    p_idItemDocFiscalReferenciado,
    p_item_idItemDocFiscal,
    CASE WHEN p_quantidadeReferenciada > 0 THEN 1 ELSE 0 END,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  ADD_DOC_FISC_ITEM_CUSTO_DOC (
    p_estabelecimentoAtivo,
    p_idItemDocFiscalReferenciado,
    p_item_idItemDocFiscal);
  ADD_DOC_FISC_ITEM_COMP_DOC_FIS (
    p_estabelecimentoAtivo,
    p_idItemDocFiscalReferenciado,
    p_item_idItemDocFiscal,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  IF p_quantidadeReferenciada = 0 THEN
    v_orc_pessoa := 0;
    IF p_config_227_manterPessoaOrcam = 1 THEN
      SELECT COALESCE(MAX(orc.pessoa),0)
      INTO v_orc_pessoa
      FROM MODOCFISCALXITENS itemDoc
      JOIN MODOCFISCALXORCAMENTOITEM docXOrc
      ON docXOrc.idItemDocFiscal = itemDoc.idItemDocFiscal
      JOIN MOORCAMENTOXITENS itemOrc
      ON itemOrc.idItemOrcamento = docXOrc.idItemOrcamento
      JOIN MOORCAMENTOS orc
      ON orc.orcamento = itemOrc.orcamento
      WHERE itemDoc.idDocumentoFiscal = p_cab_idDocumentoFiscal
      AND docXOrc.quantidade <> 0;
    END IF;
    ADD_DOC_FISC_ITEM_MOT_DOC_FIS (
      p_estabelecimentoAtivo,
      p_config_227_manterPessoaOrcam,
      p_cab_idDocumentoFiscal,
      p_cab_tipoDocumento,
      p_cab_documentoFiscal,
      p_cab_estabelecimento,
      p_cab_pessoa,
      v_orc_pessoa,
      p_item_idItemDocFiscal,
      p_item_sequencia,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_unidadeMedidaConversao,
      p_item_quantidadeConvertida,
      p_item_valorLiquidoItem,
      p_idItemDocFiscalReferenciado);
  ELSE
    SELECT
      idDocumentoFiscal,
      sequencia
    INTO
      v_idDocumentoFiscalReferenciad,
      v_sequenciaReferenciado
    FROM MODOCFISCALXITENS
    WHERE idItemDocFiscal = p_idItemDocFiscalReferenciado;
    ADD_DOC_FISC_ITEM_BLOEST_DOC (
      p_estabelecimentoAtivo,
      v_idDocumentoFiscalReferenciad,
      v_sequenciaReferenciado,
      p_cab_idDocumentoFiscal,
      p_item_sequencia);
    SELECT COALESCE (MAX (id),0)
    INTO v_id
    FROM MODOCFISCALXDOCFISCAL
    WHERE idItemDocFiscal = p_item_idItemDocFiscal
    AND idItemDocFiscalReferenciado = p_idItemDocFiscalReferenciado;
    IF v_id > 0 THEN
      IF p_quantidadeReferenciada <> 0 THEN
        UPDATE MODOCFISCALXDOCFISCAL SET
          quantidade = quantidade + p_quantidadeReferenciada
        WHERE id = v_id;
      END IF;
    ELSE
      v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MODOCFISCALXDOCFISCAL', 'id', 14, p_estabelecimentoAtivo, NULL);
      INSERT INTO MODOCFISCALXDOCFISCAL (
        id,
        idItemDocFiscal,
        idItemDocFiscalReferenciado,
        quantidade)
      VALUES (
        v_id,
        p_item_idItemDocFiscal,
        p_idItemDocFiscalReferenciado,
        p_quantidadeReferenciada);
    END IF;
  END IF;
END ADD_DOC_FISC_ITEM_REF_DOC_FIS;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_REF_ORCAMEN (
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_cab_idDocumentoFiscal        IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_documentoFiscal          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_sequencia               IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  p_idItemOrcamento              IN NUMBER,
  p_quantidadeBaixar             IN NUMBER,
  p_atualizarObservacoes         IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes         OUT NUMBER)
IS
  v_id                    NUMBER;
  v_orcamentoReferenciado NUMBER;
  v_sequenciaReferenciado NUMBER;
  v_orc_pessoa            NUMBER;
  v_auxAlpha              VARCHAR (3200);
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  ADD_DOC_FISC_ITEM_N_SER_ORCAM (
    p_estabelecimentoAtivo,
    p_idItemOrcamento,
    p_item_idItemDocFiscal,
    CASE WHEN p_quantidadeBaixar > 0 THEN 1 ELSE 0 END,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  ADD_DOC_FISC_ITEM_CUSTO_ORCAM (
    p_estabelecimentoAtivo,
    p_idItemOrcamento,
    p_item_idItemDocFiscal);
  ADD_DOC_FISC_ITEM_COMP_ORCAMEN (
    p_estabelecimentoAtivo,
    p_idItemOrcamento,
    p_item_idItemDocFiscal,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  SELECT COALESCE (MAX (id),0)
  INTO v_id
  FROM MODOCFISCALXORCAMENTOITEM
  WHERE idItemDocFiscal = p_item_idItemDocFiscal
  AND idItemOrcamento = p_idItemOrcamento;
  IF v_id > 0 THEN
    IF p_quantidadeBaixar <> 0 THEN
      UPDATE MODOCFISCALXORCAMENTOITEM SET
        quantidade = quantidade + p_quantidadeBaixar
      WHERE id = v_id;
    END IF;
  ELSE
    v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MODOCFISCALXORCAMENTOITEM', 'id', 14, p_estabelecimentoAtivo, NULL);
    INSERT INTO MODOCFISCALXORCAMENTOITEM (
      id,
      idItemDocFiscal,
      idItemOrcamento,
      quantidade,
      efetivacao)
    VALUES (
      v_id,
      p_item_idItemDocFiscal,
      p_idItemOrcamento,
      p_quantidadeBaixar,
      1);
  END IF;
  IF p_quantidadeBaixar <> 0 THEN
    SELECT
      orcamento,
      sequencia
    INTO
      v_orcamentoReferenciado,
      v_sequenciaReferenciado
    FROM MOORCAMENTOXITENS
    WHERE idItemOrcamento = p_idItemOrcamento;
    ADD_DOC_FISC_ITEM_BLOEST_ORC (
      p_estabelecimentoAtivo,
      v_orcamentoReferenciado,
      v_sequenciaReferenciado,
      p_cab_idDocumentoFiscal,
      p_item_sequencia);
    v_orc_pessoa := 0;
    IF p_config_227_manterPessoaOrcam = 1 THEN
      SELECT COALESCE(MAX(orc.pessoa),0)
      INTO v_orc_pessoa
      FROM MODOCFISCALXITENS itemDoc
      JOIN MODOCFISCALXORCAMENTOITEM docXOrc
      ON docXOrc.idItemDocFiscal = itemDoc.idItemDocFiscal
      JOIN MOORCAMENTOXITENS itemOrc
      ON itemOrc.idItemOrcamento = docXOrc.idItemOrcamento
      JOIN MOORCAMENTOS orc
      ON orc.orcamento = itemOrc.orcamento
      WHERE itemDoc.idDocumentoFiscal = p_cab_idDocumentoFiscal
      AND docXOrc.quantidade <> 0;
    END IF;
    ADD_DOC_FISC_ITEM_MOT_ORCAMEN (
      p_estabelecimentoAtivo,
      p_config_227_manterPessoaOrcam,
      p_cab_idDocumentoFiscal,
      p_cab_tipoDocumento,
      p_cab_documentoFiscal,
      p_cab_estabelecimento,
      p_cab_pessoa,
      v_orc_pessoa,
      p_item_idItemDocFiscal,
      p_item_sequencia,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_unidadeMedidaConversao,
      p_item_quantidadeConvertida,
      p_item_valorLiquidoItem,
      p_idItemOrcamento);
    UPDATE MOORCAMENTOXITENS
    SET quantidadeSaldo = quantidadeSaldo - p_quantidadeBaixar
    WHERE idItemOrcamento = p_idItemOrcamento;
    UPDATE MOCONSERTOS cons
    SET cons.situacaoConserto = 'R'
    WHERE cons.documentoTransferenciaFornec > 0
    AND cons.situacaoConserto = 'E'
    AND EXISTS (
      SELECT 1 FROM MODOCUMENTOTRANSFXITENS itemTransf
      JOIN MODOCTRANSFXORCAMENTOITEM transfXDoc
      ON transfXDoc.idItemDocTransferencia = itemTransf.idItemDocTransferencia
      WHERE itemTransf.documentoTransferencia = cons.documentoTransferenciaFornec
      AND transfXDoc.entradaSaidaOriginal = 'E'
      AND transfXDoc.idItemOrcamento = p_idItemOrcamento);
    ADD_ENTREGA_CRIA_PENDENTE (
      p_usuarioLogado,
      p_estabelecimentoAtivo,
      p_idItemOrcamento);
    ADD_ORCAMENTO_ITEM_RES_ITEM (
      p_idItemOrcamento,
      p_estabelecimentoAtivo,
      '',
      v_auxAlpha);
  END IF;
END ADD_DOC_FISC_ITEM_REF_ORCAMEN;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_REF_PRE_DOC (
  p_estabelecimentoAtivo         IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_cab_idDocumentoFiscal        IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_documentoFiscal          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_sequencia               IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  p_idItemPreDocumentoReferenc   IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_atualizarObservacoes         IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes         OUT NUMBER)
IS
  v_id                       NUMBER;
  v_preDocumentoReferenciado NUMBER;
  v_sequenciaReferenciado    NUMBER;
  v_orc_pessoa               NUMBER;
  v_auxAlpha                 VARCHAR (3200);
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  ADD_DOC_FISC_ITEM_N_SER_PRE (
    p_estabelecimentoAtivo,
    p_idItemPreDocumentoReferenc,
    p_item_idItemDocFiscal,
    CASE WHEN p_quantidadeReferenciada > 0 THEN 1 ELSE 0 END,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  ADD_DOC_FISC_ITEM_CUSTO_PRE (
    p_estabelecimentoAtivo,
    p_idItemPreDocumentoReferenc,
    p_item_idItemDocFiscal);
  ADD_DOC_FISC_ITEM_COMP_PRE_DOC (
    p_estabelecimentoAtivo,
    p_idItemPreDocumentoReferenc,
    p_item_idItemDocFiscal,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  IF p_quantidadeReferenciada = 0 THEN
    v_orc_pessoa := 0;
    IF p_config_227_manterPessoaOrcam = 1 THEN
      SELECT COALESCE(MAX(orc.pessoa),0)
      INTO v_orc_pessoa
      FROM MODOCFISCALXITENS itemDoc
      JOIN MODOCFISCALXORCAMENTOITEM docXOrc
      ON docXOrc.idItemDocFiscal = itemDoc.idItemDocFiscal
      JOIN MOORCAMENTOXITENS itemOrc
      ON itemOrc.idItemOrcamento = docXOrc.idItemOrcamento
      JOIN MOORCAMENTOS orc
      ON orc.orcamento = itemOrc.orcamento
      WHERE itemDoc.idDocumentoFiscal = p_cab_idDocumentoFiscal
      AND docXOrc.quantidade <> 0;
    END IF;
    ADD_DOC_FISC_ITEM_MOT_PRE_DOC (
      p_estabelecimentoAtivo,
      p_config_227_manterPessoaOrcam,
      p_cab_idDocumentoFiscal,
      p_cab_tipoDocumento,
      p_cab_documentoFiscal,
      p_cab_estabelecimento,
      p_cab_pessoa,
      v_orc_pessoa,
      p_item_idItemDocFiscal,
      p_item_sequencia,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_unidadeMedidaConversao,
      p_item_quantidadeConvertida,
      p_item_valorLiquidoItem,
      p_idItemPreDocumentoReferenc);
  ELSE
    SELECT
      preDocumento,
      sequencia
    INTO
      v_preDocumentoReferenciado,
      v_sequenciaReferenciado
    FROM MOPREDOCUMXITENS
    WHERE idItemPreDocumento = p_idItemPreDocumentoReferenc;
    ADD_DOC_FISC_ITEM_BLOEST_PRE (
      p_estabelecimentoAtivo,
      v_preDocumentoReferenciado,
      v_sequenciaReferenciado,
      p_cab_idDocumentoFiscal,
      p_item_sequencia);
    SELECT COALESCE (MAX (id),0)
    INTO v_id
    FROM MODOCFISCALXPREDOCUM
    WHERE idItemDocFiscal = p_item_idItemDocFiscal
    AND idItemPreDocReferenciado = p_idItemPreDocumentoReferenc;
    IF v_id > 0 THEN
      IF p_quantidadeReferenciada <> 0 THEN
        UPDATE MODOCFISCALXPREDOCUM SET
          quantidade = quantidade + p_quantidadeReferenciada
        WHERE id = v_id;
      END IF;
    ELSE
      v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MODOCFISCALXPREDOCUM', 'id', 14, p_estabelecimentoAtivo, NULL);
      INSERT INTO MODOCFISCALXPREDOCUM (
        id,
        idItemDocFiscal,
        idItemPreDocReferenciado,
        quantidade)
      VALUES (
        v_id,
        p_item_idItemDocFiscal,
        p_idItemPreDocumentoReferenc,
        p_quantidadeReferenciada);
    END IF;
  END IF;
END ADD_DOC_FISC_ITEM_REF_PRE_DOC;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_REF_DFE_GRAD (
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_config_230_etapaPedComprParc IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_cab_idDocumentoFiscal        IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_documentoFiscal          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_sequencia               IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  p_gradeDistribuicaoDFe         IN NUMBER,
  p_atualizarObservacoes         IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes         OUT NUMBER)
IS
  v_novaEtapaOrcamento NUMBER;
  v_quantidadeSaldo    NUMBER;
  v_auxNumber          NUMBER;
  v_auxChar            CHAR (1);
  v_auxVarchar         VARCHAR2 (32000);
BEGIN
  FOR a IN (
    SELECT
      a.idItemOrcamento,
      a.quantidadeSaldo,
      a.quantidadeBaixar,
      a.zerarSaldo,
      b.orcamento
    FROM MODISTRIBUICAODFEXORCAM a
    JOIN MOORCAMENTOXITENS b
    ON b.idItemOrcamento = a.idItemOrcamento
    WHERE a.gradeDistribuicaoDFe = p_gradeDistribuicaoDFe
    AND a.quantidadeBaixar > 0
    ORDER BY a.sequencia)
  LOOP
    UPDATE MODISTRIBUICAODFEXGRADE
    SET idItemDocFiscal = p_item_idItemDocFiscal
    WHERE gradeDistribuicaoDFe = p_gradeDistribuicaoDFe;
    ADD_DOC_FISC_ITEM_REF_ORCAMEN (
      p_usuarioLogado,
      p_estabelecimentoAtivo,
      p_config_227_manterPessoaOrcam,
      p_cab_idDocumentoFiscal,
      p_cab_tipoDocumento,
      p_cab_documentoFiscal,
      p_cab_estabelecimento,
      p_cab_pessoa,
      p_item_idItemDocFiscal,
      p_item_sequencia,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_unidadeMedidaConversao,
      p_item_quantidadeConvertida,
      p_item_valorLiquidoItem,
      a.idItemOrcamento,
      CASE WHEN a.zerarSaldo = 1 THEN a.quantidadeSaldo ELSE a.quantidadeBaixar END,
      r_atualizarObservacoes,
      r_atualizarObservacoes);  
    SELECT COALESCE (SUM(b.quantidadeSaldo),0)
    INTO v_quantidadeSaldo
    FROM MOORCAMENTOXITENS b
    WHERE b.orcamento = a.orcamento
    AND b.cancelado = 0;
    IF v_quantidadeSaldo <= 0 THEN
      SELECT COALESCE(MAX(etapaOrcamento),0)
      INTO v_novaEtapaOrcamento
      FROM PAETAPASORCAMENTO
      WHERE etapaOrcamento > 0
      AND ativo = 1
      AND situacaoOrcamento = 80;      
      ADD_ORCAMENTO_CAB_ETAPA_TROCA (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        p_person_190_modeloFrete,
        p_config_378_calcularVolumes,
        a.orcamento,
        p_usuarioLogado,
        v_novaEtapaOrcamento,
        ' ',
        0,
        0,
        v_auxNumber,
        v_auxVarchar,
        v_auxNumber,
        v_auxChar,
        v_auxNumber);
    ELSE
      v_novaEtapaOrcamento := p_config_230_etapaPedComprParc;
    END IF;  
    IF v_novaEtapaOrcamento <> 0 THEN
      ADD_ORCAMENTO_CAB_ETAPA_TROCA (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        p_person_190_modeloFrete,
        p_config_378_calcularVolumes,
        a.orcamento,
        p_usuarioLogado,
        v_novaEtapaOrcamento,
        ' ',
        0,
        0,
        v_auxNumber,
        v_auxVarchar,
        v_auxNumber,
        v_auxChar,
        v_auxNumber);
    END IF;
  END LOOP;
END ADD_DOC_FISC_ITEM_REF_DFE_GRAD;

/

create or replace PROCEDURE ADD_DOC_FISC_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_227_manterPessoaOrcam IN NUMBER,
  p_config_230_etapaPedComprParc IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     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, -- B = Balanço, D = Documento Fiscal, G = Grade DF-e, O = Orçamento, P, Pré-Documento, T = Transferência
  p_idItemReferenciado           IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_tempComp_nomeTempComposicao  IN VARCHAR2,
  p_tempComp_sequencia           IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_idDocumentoFiscal       IN NUMBER,
  p_item_pedidoCompraFornecedor  IN VARCHAR2,
  p_item_sequenciaPedidoCompraFo IN NUMBER,
  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_quantidadeExtemporanea  IN NUMBER,
  p_item_acrescimoUnitarioExtemp IN NUMBER,
  p_item_valorAcrescimoExtempIte IN NUMBER,
  p_item_valorDescontoCustoOpIte IN NUMBER,
  p_item_valorAcrescimoCustoOpIt 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_valorAcrescimoExtempGer IN NUMBER,
  p_item_valorDescontoCustoOpGer IN NUMBER,
  p_item_valorAcrescimoCustoOpGe IN NUMBER,
  p_item_valorDescontoPagamento  IN NUMBER,
  p_item_valorOutrasDespPagament IN NUMBER,
  p_item_valorJurosPagamento     IN NUMBER,
  p_item_percentualDevolucao     IN NUMBER,
  p_item_valorIPIDevolucao       IN NUMBER,
  p_item_operacaoFiscal          IN NUMBER,
  p_item_movimentaEstoque        IN NUMBER,
  p_item_movimentaEstoqueFiscal  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_stICMSEscrituracao      IN CHAR,
  p_item_reducaoBaseICMSEscritur IN NUMBER,
  p_item_aliquotaICMSEscrituraca IN NUMBER,
  p_item_diferimentoICMSEscritur IN NUMBER,
  p_item_margemValorAdicSTEscrit IN NUMBER,
  p_item_reducaoBaseSTEscriturac IN NUMBER,
  p_item_aliquotaICMSSTEscritura IN NUMBER,
  p_item_somarICMSST             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_baseICMSEscrituracao    IN NUMBER,
  p_item_valorICMSEscrituracao   IN NUMBER,
  p_item_valorICMSDesonEscritura IN NUMBER,
  p_item_baseICMSSTEscrituracao  IN NUMBER,
  p_item_valorICMSSTEscrituracao 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_idItemDocFiscal       IN VARCHAR2,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER,
  r_item_idItemDocFiscal         OUT NUMBER,
  r_buffer_idItemDocFiscal       OUT VARCHAR2,
  r_valorInserido                OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_finalidadeNota           CHAR (1);
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_nfFornecedor             NUMBER;
  v_cab_documentoFiscal          NUMBER;
  v_cab_estabelecimento          NUMBER;
  v_cab_dataEmissao              DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_vendaConsumidor          NUMBER;
  v_cab_enderecoEntregaPessoa    NUMBER;
  v_cab_municipioFatoGerador     NUMBER;
  v_cab_localDestinoOperacao     CHAR (1);
  v_cab_indicadorConsumidorFinal CHAR (1);
  v_cab_projeto                  VARCHAR2 (60);
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  v_cab_situacaoDocumentoFiscal  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_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota 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_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_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_item_sequencia               NUMBER;
  v_item_cancelado               NUMBER;
  v_item_quantidadeDevolvidaRet  NUMBER;
  v_item_precoUnitario           NUMBER;
  v_item_precoUnitarioConvertido NUMBER;
  v_item_valorProdutoServicoBrut NUMBER;
  v_item_valorProdutoServico     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_movimentaEstoqueFiscal  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_stICMSEscrituracao      CHAR (2);
  v_item_reducaoBaseICMSEscritur NUMBER;
  v_item_aliquotaICMSEscrituraca NUMBER;
  v_item_diferimentoICMSEscritur NUMBER;
  v_item_margemValorAdicSTEscrit NUMBER;
  v_item_reducaoBaseSTEscriturac NUMBER;
  v_item_aliquotaICMSSTEscritura NUMBER;
  v_item_somarICMSST             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_baseICMSEscrituracao    NUMBER;
  v_item_valorICMSEscrituracao   NUMBER;
  v_item_valorICMSDesonEscritura NUMBER;
  v_item_baseICMSSTEscrituracao  NUMBER;
  v_item_valorICMSSTEscrituracao 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_item_valorDescontoCustoOpTot NUMBER;
  v_item_valorAcrescimoCustoOpTo NUMBER;
  v_item_precoCustoOperacao      NUMBER;
  v_item_valorCustoOperacao      NUMBER;
  v_item_precoCMV                NUMBER;
  v_item_valorCMV                NUMBER;
  v_item_valorAcrescimoExtempSub NUMBER;
  v_item_valorAcrescimoExtempTot 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_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_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  r_item_idItemDocFiscal := p_item_idItemDocFiscal;
  r_buffer_idItemDocFiscal := p_buffer_idItemDocFiscal;
  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.devolucaoAnulacaoRetorno,
    cab.finalidadeNota,
    cab.atualizaCustoMedio,
    cab.nfFornecedor,
    cab.documentoFiscal,
    cab.estabelecimento,
    cab.dataEmissao,
    cab.pessoa,
    cab.vendaConsumidor,
    cab.enderecoEntregaPessoa,
    cab.municipioFatoGerador,
    cab.localDestinoOperacao,
    cab.indicadorConsumidorFinal,
    cab.projeto,
    cab.modalidadeFrete,
    cab.tipoPagamentoFrete,
    cab.situacaoDocumentoFiscal,
    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,
    cab.valorDescontoCustoOpItem,
    cab.valorDescontoCustoOpGeral,
    cab.valorDescontoCustoOpTotal,
    cab.valorAcrescimoCustoOpItem,
    cab.valorAcrescimoCustoOpGeral,
    cab.valorAcrescimoCustoOpTotal,
    cab.valorCustoOperacao,
    cab.valorCMV,
    cab.quantidadeExtemporanea,
    cab.valorAcrescimoExtempSubtotal,
    cab.valorAcrescimoExtempItem,
    cab.valorAcrescimoExtempGeral,
    cab.valorAcrescimoExtempTotal,
    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
  INTO
    v_cab_origemDocumento,
    v_cab_tipoDocumento,
    v_cab_entradaSaida,
    v_cab_devolucaoAnulacaoRetorno,
    v_cab_finalidadeNota,
    v_cab_atualizaCustoMedio,
    v_cab_nfFornecedor,
    v_cab_documentoFiscal,
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_pessoa,
    v_cab_vendaConsumidor,
    v_cab_enderecoEntregaPessoa,
    v_cab_municipioFatoGerador,
    v_cab_localDestinoOperacao,
    v_cab_indicadorConsumidorFinal,
    v_cab_projeto,
    v_cab_modalidadeFrete,
    v_cab_tipoPagamentoFrete,
    v_cab_situacaoDocumentoFiscal,
    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_cab_valorDescontoCustoOpItem,
    v_cab_valorDescontoCustoOpGera,
    v_cab_valorDescontoCustoOpTota,
    v_cab_valorAcrescimoCustoOpIte,
    v_cab_valorAcrescimoCustoOpGer,
    v_cab_valorAcrescimoCustoOpTot,
    v_cab_valorCustoOperacao,
    v_cab_valorCMV,
    v_cab_quantidadeExtemporanea,
    v_cab_valorAcrescimoExtempSubt,
    v_cab_valorAcrescimoExtempItem,
    v_cab_valorAcrescimoExtempGera,
    v_cab_valorAcrescimoExtempTota,
    v_est_grupoFiscal,
    v_pessEst_regimeTributario,
    v_munEndEst_uf,
    v_pess_indicadorInscricaoEstad,
    v_endPess_enderecoPessoa,
    v_munEndPess_uf,
    v_munEndEntr_uf
  FROM MODOCUMENTOSFISCAIS 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
  WHERE cab.idDocumentoFiscal = p_item_idDocumentoFiscal;
  v_ini_cab_valorFreteItem := v_cab_valorFreteItem;
  v_ini_cab_valorFreteGeral := v_cab_valorFreteGeral;
  SELECT
    diminuiDescontoPrUnit,
    somaAcrescimosPrUnit,
    somaFreteSeguroPrUnit
  INTO
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit
  FROM PAMODELOSDOCUMENTO
  WHERE modeloDocumento = p_item_modeloDocumento;
  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_valorFreteTotal          := 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_item_quantidadeDevolvidaRet  := 0;
  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_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_movimentaEstoqueFiscal  := p_item_movimentaEstoqueFiscal;
  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_stICMSEscrituracao      := p_item_stICMSEscrituracao;
  v_item_reducaoBaseICMSEscritur := p_item_reducaoBaseICMSEscritur;
  v_item_aliquotaICMSEscrituraca := p_item_aliquotaICMSEscrituraca;
  v_item_diferimentoICMSEscritur := p_item_diferimentoICMSEscritur;
  v_item_margemValorAdicSTEscrit := p_item_margemValorAdicSTEscrit;
  v_item_reducaoBaseSTEscriturac := p_item_reducaoBaseSTEscriturac;
  v_item_aliquotaICMSSTEscritura := p_item_aliquotaICMSSTEscritura;
  v_item_somarICMSST             := p_item_somarICMSST;
  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_baseICMSEscrituracao    := p_item_baseICMSEscrituracao;
  v_item_valorICMSEscrituracao   := p_item_valorICMSEscrituracao;
  v_item_valorICMSDesonEscritura := p_item_valorICMSDesonEscritura;
  v_item_baseICMSSTEscrituracao  := p_item_baseICMSSTEscrituracao;
  v_item_valorICMSSTEscrituracao := p_item_valorICMSSTEscrituracao;
  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;
  IF p_manterFinanceiro_Retotalizar = 0 THEN
    SELECT COALESCE (MAX(1), 0)
    INTO v_cab_promocaoExiste
    FROM MODOCFISCALXPROMOCOES
    WHERE idDocumentoFiscal = p_item_idDocumentoFiscal;
  END IF;
  IF p_item_idItemDocFiscal > 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.quantidadeDevolvidaRetornada,
        a.pesoLiquido,
        a.pesoBruto,
        a.valorProdutoServicoBruto,
        a.valorProdutoServico,
        a.valorDescontoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.quantidadeExtemporanea,
        a.valorAcrescimoExtempSubtotal,
        a.valorAcrescimoExtempItem,
        a.valorDescontoCustoOpItem,
        a.valorAcrescimoCustoOpItem,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorAcrescimoExtempGeral,
        a.valorDescontoCustoOpGeral,
        a.valorAcrescimoCustoOpGeral,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.valorFreteTotal,
        a.valorSeguroTotal,
        a.valorDescontoTotal,
        a.valorOutrasDespesasTotal,
        a.valorAdicFreteMarinhaMerTotal,
        a.valorDespesasAduaneirasTotal,
        a.valorAcrescimoExtempTotal,
        a.valorDescontoCustoOpTotal,
        a.valorAcrescimoCustoOpTotal,
        a.operacaoFiscal,
        a.movimentaEstoque,
        a.movimentaEstoqueFiscal,
        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.stICMSEscrituracao,
        a.reducaoBaseICMSEscrituracao,
        a.aliquotaICMSEscrituracao,
        a.diferimentoICMSEscrituracao,
        a.margemValorAdicSTEscrituracao,
        a.reducaoBaseSTEscrituracao,
        a.aliquotaICMSSTEscrituracao,
        a.somarICMSST,
        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.baseICMSEscrituracao,
        a.valorICMSEscrituracao,
        a.valorICMSDesonEscrituracao,
        a.baseICMSSTEscrituracao,
        a.valorICMSSTEscrituracao,
        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,
        a.valorCustoOperacao,
        a.valorCMV,
        prod.tipoProduto
      FROM MODOCFISCALXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      WHERE a.idItemDocFiscal = p_item_idItemDocFiscal)
    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_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_item_quantidadeDevolvidaRet := a.quantidadeDevolvidaRetornada;
      IF p_buscarAliquotas_CalcularImp ='T'
      THEN
        v_item_movimentaEstoque        := a.movimentaEstoque;
        v_item_movimentaEstoqueFiscal  := a.movimentaEstoqueFiscal;
        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_stICMSEscrituracao      := a.stICMSEscrituracao;
        v_item_reducaoBaseICMSEscritur := a.reducaoBaseICMSEscrituracao;
        v_item_aliquotaICMSEscrituraca := a.aliquotaICMSEscrituracao;
        v_item_diferimentoICMSEscritur := a.diferimentoICMSEscrituracao;
        v_item_margemValorAdicSTEscrit := a.margemValorAdicSTEscrituracao;
        v_item_reducaoBaseSTEscriturac := a.reducaoBaseSTEscrituracao;
        v_item_aliquotaICMSSTEscritura := a.aliquotaICMSSTEscrituracao;
        v_item_somarICMSST             := a.somarICMSST;
        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_baseICMSEscrituracao    := a.baseICMSEscrituracao;
        v_item_valorICMSEscrituracao   := a.valorICMSEscrituracao;
        v_item_valorICMSDesonEscritura := a.valorICMSDesonEscrituracao;
        v_item_baseICMSSTEscrituracao  := a.baseICMSSTEscrituracao;
        v_item_valorICMSSTEscrituracao := a.valorICMSSTEscrituracao;
        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 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 <> p_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;
        v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
        v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
        v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
        v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
        v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
        v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
        v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
        v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
        v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
        v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
        v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
        v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
        v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      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,
    p_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);
  v_item_valorAcrescimoExtempSub := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
    p_item_quantidade,
    v_item_precoUnitario,
    p_item_quantidadeExtemporanea,
    p_item_acrescimoUnitarioExtemp);
  v_item_valorAcrescimoExtempTot := FUNC_ADD_CALC_EXTEMP_TOTAL(
    v_item_valorAcrescimoExtempSub,
    p_item_valorAcrescimoExtempIte,
    p_item_valorAcrescimoExtempGer);
  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,
        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 = CASE WHEN v_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
      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 / ((v_combo_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 / ((v_combo_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,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_estabelecimento,
        NULL, -- p_cab_dataPrecoInicial
        TRUNC(SYSDATE), -- p_cab_dataPrecoFinal
        v_cab_pessoa,
        v_cab_projeto,
        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_DOC_FISC_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_227_manterPessoaOrcam,
        p_config_230_etapaPedComprParc,
        p_config_362_calcCustoPorGrade,
        p_config_378_calcularVolumes,
        p_config_413_obs_add_marca,
        p_manterFinanceiro_Retotalizar,
        'S', -- p_buscarAliquotas_CalcularImp
        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_calcularImpostos,
        0, -- p_item_idItemDocFiscal
        p_item_idDocumentoFiscal,
        p_item_pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo,
        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
        CASE
          WHEN p_item_quantidade = 0
          THEN 0
          ELSE ROUND(p_item_quantidadeExtemporanea * a.quantidade / p_item_quantidade, 2)
        END, -- p_item_quantidadeExtemporanea
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_acrescimoUnitarioExtemp
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_acrescimoUnitarioExtemp
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoExtempIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpIt
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpIt
        p_item_observacoesDigitadas,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorFreteGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_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_valorAcrescimoExtempGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpGe
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpGe
        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
        p_item_percentualDevolucao,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorIPIDevolucao
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorIPIDevolucao,
        v_combo_operacaoFiscal,
        p_item_movimentaEstoque,
        p_item_movimentaEstoqueFiscal,
        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
        '  ', -- p_item_stICMSEscrituracao
        0, -- p_item_reducaoBaseICMSEscritur
        0, -- p_item_aliquotaICMSEscrituraca
        0, -- p_item_diferimentoICMSEscritur
        0, -- p_item_margemValorAdicSTEscrit
        0, -- p_item_reducaoBaseSTEscriturac
        0, -- p_item_aliquotaICMSSTEscritura
        0, -- p_item_somarICMSST
        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_baseICMSEscrituracao
        0, -- p_item_valorICMSEscrituracao
        0, -- p_item_valorICMSDesonEscritura
        0, -- p_item_baseICMSSTEscrituracao
        0, -- p_item_valorICMSSTEscrituracao
        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_idItemDocFiscal,
        /* Retornos */
        r_calcularImpostos,
        v_auxNumber, -- r_item_idItemDocFiscal
        r_buffer_idItemDocFiscal,
        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_DOC_FISC_ITEM_COMBO_RESID (
        p_item_idDocumentoFiscal,
        v_item_valorProdutoServico,
        p_item_valorDescontoItem,
        p_item_valorAcrescimoItem,
        v_modDoc_diminuiDescontoPrUnit,
        v_modDoc_somaAcrescimosPrUnit,
        r_buffer_idItemDocFiscal,
        r_valorInserido);
      r_calcularImpostos := 1;
    END IF;
  ELSE
    IF r_item_idItemDocFiscal <= 0 THEN
      r_item_idItemDocFiscal := FUNC_ADD_BUSCA_PROXIMO_ID ('MODOCFISCALXITENS', 'idItemDocFiscal', 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
          OR p_item_valorAcrescimoExtempGer <> 0
          OR p_item_valorDescontoCustoOpGer <> 0
          OR p_item_valorAcrescimoCustoOpGe <> 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_DOC_FISC_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          p_item_idDocumentoFiscal,
          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 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,
        p_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,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_finalidadeNota,
        v_cab_estabelecimento,
        v_cab_nfFornecedor,
        SYSDATE, -- p_cab_dataEmissao
        v_cab_pessoa,
        v_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,
        p_item_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
        1, -- 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_item_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_item_stICMSEscrituracao,
        v_item_reducaoBaseICMSEscritur,
        v_item_aliquotaICMSEscrituraca,
        v_item_diferimentoICMSEscritur,
        v_item_margemValorAdicSTEscrit,
        v_item_reducaoBaseSTEscriturac,
        v_item_aliquotaICMSSTEscritura,
        v_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,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_estabelecimento,
        v_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
        p_item_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
        1, -- p_calcularICMSEscrituracao
        v_item_stICMSEscrituracao,
        v_item_reducaoBaseICMSEscritur,
        v_item_aliquotaICMSEscrituraca,
        v_item_diferimentoICMSEscritur,
        0, -- p_baseICMSEscrituracao
        0, -- p_valorICMSEscrituracao
        0, -- p_valorICMSDesonEscrituracao
        1, -- p_calcularICMSSTEscrituracao
        v_item_margemValorAdicSTEscrit,
        v_item_reducaoBaseSTEscriturac,
        v_item_aliquotaICMSSTEscritura,
        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_item_baseICMSEscrituracao,
        v_item_valorICMSEscrituracao,
        v_item_valorICMSDesonEscritura,
        v_item_baseICMSSTEscrituracao,
        v_item_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,
      v_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,
      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,
      v_item_valorICMSSTEscrituracao,
      v_item_somarICMSST,
      v_item_valorAcrescimoExtempTot,
      v_modDoc_geraFinanceiro);
    v_item_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
      v_cab_nfFornecedor,
      v_cab_tipoPagamentoFrete,
      v_item_valorProdutoServico,
      v_item_valorFreteTotal,
      v_item_valorSeguroTotal,
      v_item_valorDescontoTotal,
      v_item_valorOutrasDespesasTot,
      p_item_valorIPIDevolucao,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      v_item_valorICMSST,
      v_item_valorICMSSTEscrituracao,
      v_item_somarICMSST
      );

    ADD_CALCULA_CUSTO_CMV (
      v_cab_atualizaCustoMedio,
      v_cab_estabelecimento,
      v_cab_nfFornecedor,
      p_item_modeloDocumento,
      p_item_quantidade,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      p_item_valorIPIDevolucao,
      v_item_valorPIS,
      v_item_valorPISST,
      v_item_valorCOFINS,
      v_item_valorCOFINSST,
      v_item_valorCreditoSimplesNac,
      v_item_valorICMS,
      v_item_valorICMSST,
      v_item_valorICMSSTEscrituracao,
      v_item_valorLiquidoItem,
      p_item_valorDescontoCustoOpIte,
      p_item_valorDescontoCustoOpGer,
      p_item_valorAcrescimoCustoOpIt,
      p_item_valorAcrescimoCustoOpGe,
      v_item_valorAcrescimoExtempTot,
      v_item_valorDescontoCustoOpTot,
      v_item_valorAcrescimoCustoOpTo,
      v_item_precoCustoOperacao,
      v_item_valorCustoOperacao,
      v_item_precoCMV,
      v_item_valorCMV);
    IF v_inserindoItem = 1 THEN
      SELECT COALESCE (MAX (sequencia),0) + 1
      INTO v_item_sequencia
      FROM MODOCFISCALXITENS
      WHERE idDocumentoFiscal = p_item_idDocumentoFiscal;
      v_cab_ultimoVendedorItem := p_item_vendedor;
    END IF;
    IF v_item_cancelado = 0 THEN
      IF p_manterFinanceiro_Retotalizar <> 2 THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume + TRUNC(CASE WHEN p_item_controleQuantidade = 1 AND p_item_loteMultiplo <> 0 THEN p_item_quantidade / p_item_loteMultiplo ELSE p_item_quantidadeConvertida END,0);
        END IF;
        v_cab_pesoLiquido := v_cab_pesoLiquido + p_item_pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto + p_item_pesoBruto;
      END IF;
      v_cab_quantidade := v_cab_quantidade + p_item_quantidadeConvertida;
      IF v_prod_tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorServicos := v_cab_valorServicos + v_item_valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos + p_item_valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorProdutos := v_cab_valorProdutos + v_item_valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos + p_item_valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem + p_item_valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem + p_item_valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem + p_item_valorAdicFreteMarItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem + p_item_valorDespesasAduanItem;
      v_cab_valorFreteGeral := v_cab_valorFreteGeral + p_item_valorFreteGeral;
      v_cab_valorSeguroGeral := v_cab_valorSeguroGeral + p_item_valorSeguroGeral;
      v_cab_valorDescontoGeral := v_cab_valorDescontoGeral + v_item_valorDescontoGeral;
      v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral + p_item_valorOutrasDespesasGer;
      v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral + p_item_valorAdicFreteMarGeral;
      v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral + p_item_valorDespesasAduanGeral;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento + v_item_valorBasePagamento;
      IF p_item_usarPrecoAVista = 1
        AND v_item_geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo + v_item_valorProdutoServico - v_item_valorDescontoTotal + v_item_valorOutrasDespesasTot;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento + v_item_valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento + v_item_valorOutrasDespPagament;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento + v_item_valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal + v_item_valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal + v_item_valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal + v_item_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_item_valorOutrasDespesasTot;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal + v_item_valorAdicFreteMarTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal + v_item_valorDespesasAduanTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem + v_item_valorLiquidoItem;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem + p_item_valorDescontoCustoOpIte;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera + p_item_valorDescontoCustoOpGer;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota + v_item_valorDescontoCustoOpTot;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte + p_item_valorAcrescimoCustoOpIt;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer + p_item_valorAcrescimoCustoOpGe;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot + v_item_valorAcrescimoCustoOpTo;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao + v_item_valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV + v_item_valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea + p_item_quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt + v_item_valorAcrescimoExtempSub;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem + p_item_valorAcrescimoExtempIte;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera + p_item_valorAcrescimoExtempGer;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota + v_item_valorAcrescimoExtempTot;
    END IF;
    UPDATE MODOCUMENTOSFISCAIS SET
      modalidadeFrete               = v_cab_modalidadeFrete,
      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,
      valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
      valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
      valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
      valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
      valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
      valorCustoOperacao            = v_cab_valorCustoOperacao,
      valorCMV                      = v_cab_valorCMV,
      quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
      valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
      valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
      valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
    WHERE idDocumentoFiscal = p_item_idDocumentoFiscal;
    IF p_item_idItemDocFiscal > 0 THEN
      DELETE MODOCFISCALXCOMPOSICOESPR compDoc
      WHERE compDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND EXISTS(
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.produto = comp.produto
        WHERE comp.composicaoPreco = compDoc.composicaoPreco
        AND gradProd.gradeProduto <> p_item_gradeProduto);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      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_413_obs_add_marca,
      ' ',
      0,
      'D',
      p_item_idItemDocFiscal,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    MERGE INTO MODOCFISCALXITENS a USING (
      SELECT
        r_item_idItemDocFiscal         idItemDocFiscal,
        p_item_idDocumentoFiscal       idDocumentoFiscal,
        v_item_sequencia               sequencia,
        v_item_cancelado               cancelado,
        p_item_pedidoCompraFornecedor  pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo sequenciaPedidoCompraFornec,
        p_item_modeloDocumento         modeloDocumento,
        p_item_estabelecimentoOriginal estabelecimentoOriginal,
        p_item_vendedor                vendedor,
        p_item_gradeProduto            gradeProduto,
        p_item_idFormulaTinta          idFormulaTinta,
        p_item_personalizacao          personalizacao,
        p_item_idLoteEstoque           idLoteEstoque,
        p_item_operacaoFiscal          operacaoFiscal,
        v_item_movimentaEstoque        movimentaEstoque,
        v_item_movimentaEstoqueFiscal  movimentaEstoqueFiscal,
        v_item_geraFinanceiro          geraFinanceiro,
        p_item_localEstoque            localEstoque,
        p_item_pessoaParticipante      pessoaParticipante,
        p_item_controleQuantidade      controleQuantidade,
        p_item_unidadeMedidaConversao  unidadeMedidaConversao,
        p_item_conversorQuantidade     conversorQuantidade,
        p_item_loteMinimo              loteMinimo,
        p_item_loteMultiplo            loteMultiplo,
        p_item_altura                  altura,
        p_item_largura                 largura,
        p_item_comprimento             comprimento,
        p_item_pecas                   pecas,
        p_item_quantidade              quantidade,
        p_item_quantidadeConvertida    quantidadeConvertida,
        v_item_quantidadeDevolvidaRet  quantidadeDevolvidaRetornada,
        p_item_percentualDevolucao     percentualDevolucao,
        p_item_pesoLiquido             pesoLiquido,
        p_item_pesoBruto               pesoBruto,
        p_item_tipoPreco               tipoPreco,
        p_item_tabelaPreco             tabelaPreco,
        p_item_precoSugestaoAPrazo     precoSugestaoAPrazo,
        p_item_precoSugestaoAVista     precoSugestaoAVista,
        p_item_precoDesconto           precoDesconto,
        p_item_precoMinimo             precoMinimo,
        p_item_usarPrecoAVista         usarPrecoAVista,
        p_item_precoUnitarioBruto      precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos acrescimoUnitarioComposicao,
        v_item_precoUnitario           precoUnitario,
        v_item_precoUnitarioConvertido precoUnitarioConvertido,
        v_item_valorProdutoServicoBrut valorProdutoServicoBruto,
        v_item_valorProdutoServico     valorProdutoServico,
        p_item_percDescontoItem        percDescontoItem,
        p_item_valorDescontoItem       valorDescontoItem,
        p_item_percAcrescimoItem       percAcrescimoItem,
        p_item_valorAcrescimoItem      valorAcrescimoItem,
        p_item_valorFreteItem          valorFreteItem,
        p_item_valorSeguroItem         valorSeguroItem,
        p_item_valorAdicFreteMarItem   valorAdicFreteMarinhaMerItem,
        p_item_valorDespesasAduanItem  valorDespesasAduaneirasItem,
        p_item_valorFreteGeral         valorFreteGeral,
        p_item_valorSeguroGeral        valorSeguroGeral,
        v_item_valorDescontoGeral      valorDescontoGeral,
        p_item_valorOutrasDespesasGer  valorOutrasDespesasGeral,
        p_item_valorAdicFreteMarGeral  valorAdicFreteMarinhaMerGeral,
        p_item_valorDespesasAduanGeral valorDespesasAduaneirasGeral,
        v_item_valorBasePagamento      valorBasePagamento,
        v_item_valorDescontoPagamento  valorDescontoPagamento,
        v_item_valorOutrasDespPagament valorOutrasDespesasPagamento,
        v_item_valorJurosPagamento     valorJurosPagamento,
        v_item_valorFreteTotal         valorFreteTotal,
        v_item_valorSeguroTotal        valorSeguroTotal,
        v_item_valorDescontoTotal      valorDescontoTotal,
        v_item_valorOutrasDespesasTot  valorOutrasDespesasTotal,
        v_item_valorAdicFreteMarTotal  valorAdicFreteMarinhaMerTotal,
        v_item_valorDespesasAduanTotal valorDespesasAduaneirasTotal,
        v_item_cfop                    cfop,
        v_item_indicadorISSQN          indicadorISSQN,
        v_item_aliquotaISSQN           aliquotaISSQN,
        v_item_retidoISSQN             retidoISSQN,
        v_item_tributadoForaMunicipio  tributadoForaMunicipio,
        v_item_incentivoFiscal         incentivoFiscal,
        v_item_listaServicos           listaServicos,
        v_item_cnae                    cnae,
        v_item_idServicoMunicipio      idServicoMunicipio,
        v_item_numeroProcessoAdministr numeroProcessoAdministrativo,
        v_item_baseISSQN               baseISSQN,
        v_item_valorISSQN              valorISSQN,
        v_item_retencaoIRRF            retencaoIRRF,
        v_item_baseRetIRRF             baseRetIRRF,
        v_item_valorRetIRRF            valorRetIRRF,
        v_item_retencaoINSS            retencaoINSS,
        v_item_baseRetINSS             baseRetINSS,
        v_item_valorRetINSS            valorRetINSS,
        v_item_retencaoPIS             retencaoPIS,
        v_item_baseRetPIS              baseRetPIS,
        v_item_valorRetPIS             valorRetPIS,
        v_item_retencaoCOFINS          retencaoCOFINS,
        v_item_baseRetCOFINS           baseRetCOFINS,
        v_item_valorRetCOFINS          valorRetCOFINS,
        v_item_retencaoCSLL            retencaoCSLL,
        v_item_baseRetCSLL             baseRetCSLL,
        v_item_valorRetCSLL            valorRetCSLL,
        v_item_retencaoOutros          retencaoOutros,
        v_item_baseRetOutros           baseRetOutros,
        v_item_valorRetOutros          valorRetOutros,
        v_item_aliquotaII              aliquotaII,
        v_item_baseII                  baseII,
        v_item_valorII                 valorII,
        v_item_aliquotaIOF             aliquotaIOF,
        v_item_baseIOF                 baseIOF,
        v_item_valorIOF                valorIOF,
        v_item_codigoEnquadramentoIPI  codigoEnquadramentoIPI,
        v_item_stIPI                   stIPI,
        v_item_aliquotaIPI             aliquotaIPI,
        v_item_valorAliquotaIPI        valorAliquotaIPI,
        v_item_baseIPI                 baseIPI,
        v_item_valorIPI                valorIPI,
        p_item_valorIPIDevolucao       valorIPIDevolucao,
        v_item_stPIS                   stPIS,
        v_item_aliquotaPIS             aliquotaPIS,
        v_item_valorAliquotaPIS        valorAliquotaPIS,
        v_item_basePIS                 basePIS,
        v_item_valorPIS                valorPIS,
        v_item_aliquotaPISST           aliquotaPISST,
        v_item_valorAliquotaPISST      valorAliquotaPISST,
        v_item_basePISST               basePISST,
        v_item_valorPISST              valorPISST,
        v_item_stCOFINS                stCOFINS,
        v_item_aliquotaCOFINS          aliquotaCOFINS,
        v_item_valorAliquotaCOFINS     valorAliquotaCOFINS,
        v_item_baseCOFINS              baseCOFINS,
        v_item_valorCOFINS             valorCOFINS,
        v_item_aliquotaCOFINSST        aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST   valorAliquotaCOFINSST,
        v_item_baseCOFINSST            baseCOFINSST,
        v_item_valorCOFINSST           valorCOFINSST,
        v_item_stSimplesNacional       stSimplesNacional,
        v_item_creditoSimplesNacional  creditoSimplesNacional,
        v_item_baseCreditoSimplesNac   baseCreditoSimplesNacional,
        v_item_valorCreditoSimplesNac  valorCreditoSimplesNacional,
        v_item_stICMS                  stICMS,
        v_item_modalBaseCalcICMS       modalidadeBaseCalcICMS,
        v_item_reducaoBaseICMS         reducaoBaseICMS,
        v_item_aliquotaICMS            aliquotaICMS,
        v_item_diferimentoICMS         diferimentoICMS,
        v_item_motivoDesoneracaoICMS   motivoDesoneracaoICMS,
        v_item_idBeneficio             idBeneficio,
        v_item_baseICMS                baseICMS,
        v_item_valorICMSOperacao       valorICMSOperacao,
        v_item_valorICMSDiferido       valorICMSDiferido,
        v_item_valorICMS               valorICMS,
        v_item_valorICMSDesoneracao    valorICMSDesoneracao,
        v_item_modalBaseCalcICMSST     modalidadeBaseCalcICMSST,
        v_item_margemValorAdicionadoST margemValorAdicionadoST,
        v_item_reducaoBaseST           reducaoBaseST,
        v_item_aliquotaICMSST          aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin aliquotaSTSuportConsFinal,
        v_item_baseICMSST              baseICMSST,
        v_item_valorICMSST             valorICMSST,
        v_item_baseICMSSTAnteriormente baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment valorICMSSTAnteriormente,
        v_item_valorICMSProprioSubstit valorICMSProprioSubstituto,
        v_item_reducaoBaseICMSEfetivo  reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo     aliquotaICMSEfetivo,
        v_item_baseICMSEfetivo         baseICMSEfetivo,
        v_item_valorICMSEfetivo        valorICMSEfetivo,
        v_item_stICMSEscrituracao      stICMSEscrituracao,
        v_item_reducaoBaseICMSEscritur reducaoBaseICMSEscrituracao,
        v_item_aliquotaICMSEscrituraca aliquotaICMSEscrituracao,
        v_item_diferimentoICMSEscritur diferimentoICMSEscrituracao,
        v_item_baseICMSEscrituracao    baseICMSEscrituracao,
        v_item_valorICMSEscrituracao   valorICMSEscrituracao,
        v_item_valorICMSDesonEscritura valorICMSDesonEscrituracao,
        v_item_margemValorAdicSTEscrit margemValorAdicSTEscrituracao,
        v_item_reducaoBaseSTEscriturac reducaoBaseSTEscrituracao,
        v_item_aliquotaICMSSTEscritura aliquotaICMSSTEscrituracao,
        v_item_baseICMSSTEscrituracao  baseICMSSTEscrituracao,
        v_item_valorICMSSTEscrituracao valorICMSSTEscrituracao,
        v_item_somarICMSST             somarICMSST,
        v_item_aliquotaICMSUFDestinat  aliquotaICMSUFDestinatario,
        v_item_aliquotaICMSInterestad  aliquotaICMSInterestadual,
        v_item_partilhaICMSInterestad  partilhaICMSInterestadual,
        v_item_baseICMSUFDestinatario  baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente     baseICMSUFRemetente,
        v_item_valorICMSUFRemetente    valorICMSUFRemetente,
        v_item_aliquotaFCP             aliquotaFCP,
        v_item_baseFCP                 baseFCP,
        v_item_valorFCP                valorFCP,
        v_item_aliquotaFCPST           aliquotaFCPST,
        v_item_baseFCPST               baseFCPST,
        v_item_valorFCPST              valorFCPST,
        v_item_aliquotaFCPSTAnteriorm  aliquotaFCPSTAnteriormente,
        v_item_baseFCPSTAnteriormente  baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente valorFCPSTAnteriormente,
        v_item_aliquotaFCPUFDestinat   aliquotaFCPUFDestinatario,
        v_item_baseFCPUFDestinatario   baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario  valorFCPUFDestinatario,
        v_item_aliquotaEstImpFederais  aliquotaEstimadaImpFederais,
        v_item_aliquotaEstImpEstaduais aliquotaEstimadaImpEstaduais,
        v_item_aliquotaEstImpMunicipai aliquotaEstimadaImpMunicipais,
        v_item_baseEstimadaImpostos    baseEstimadaImpostos,
        v_item_valorEstImpFederais     valorEstimadoImpFederais,
        v_item_valorEstImpEstaduais    valorEstimadoImpEstaduais,
        v_item_valorEstImpMunicipais   valorEstimadoImpMunicipais,
        v_item_valorLiquidoItem        valorLiquidoItem,
        p_item_valorDescontoCustoOpIte valorDescontoCustoOpItem,
        p_item_valorDescontoCustoOpGer valorDescontoCustoOpGeral,
        v_item_valorDescontoCustoOpTot valorDescontoCustoOpTotal,
        p_item_valorAcrescimoCustoOpIt valorAcrescimoCustoOpItem,
        p_item_valorAcrescimoCustoOpGe valorAcrescimoCustoOpGeral,
        v_item_valorAcrescimoCustoOpTo valorAcrescimoCustoOpTotal,
        v_item_precoCustoOperacao      precoCustoOperacao,
        v_item_valorCustoOperacao      valorCustoOperacao,
        v_item_precoCMV                precoCMV,
        v_item_valorCMV                valorCMV,
        p_item_quantidadeExtemporanea  quantidadeExtemporanea,
        p_item_acrescimoUnitarioExtemp acrescimoUnitarioExtemporaneo,
        v_item_valorAcrescimoExtempSub valorAcrescimoExtempSubtotal,
        p_item_valorAcrescimoExtempIte valorAcrescimoExtempItem,
        p_item_valorAcrescimoExtempGer valorAcrescimoExtempGeral,
        v_item_valorAcrescimoExtempTot valorAcrescimoExtempTotal,
        p_item_observacoesDigitadas    observacoesDigitadas,
        v_observacoes                  observacoes
      FROM DUAL) b
    ON (a.idItemDocFiscal = b.idItemDocFiscal)
    WHEN MATCHED THEN UPDATE SET
      a.idDocumentoFiscal             = b.idDocumentoFiscal,
      a.sequencia                     = b.sequencia,
      a.cancelado                     = b.cancelado,
      a.pedidoCompraFornecedor        = b.pedidoCompraFornecedor,
      a.sequenciaPedidoCompraFornec   = b.sequenciaPedidoCompraFornec,
      a.vendedor                      = b.vendedor,
      a.modeloDocumento               = b.modeloDocumento,
      a.estabelecimentoOriginal       = b.estabelecimentoOriginal,
      a.gradeProduto                  = b.gradeProduto,
      a.idFormulaTinta                = b.idFormulaTinta,
      a.personalizacao                = b.personalizacao,
      a.idLoteEstoque                 = b.idLoteEstoque,
      a.operacaoFiscal                = b.operacaoFiscal,
      a.movimentaEstoque              = b.movimentaEstoque,
      a.movimentaEstoqueFiscal        = b.movimentaEstoqueFiscal,
      a.geraFinanceiro                = b.geraFinanceiro,
      a.localEstoque                  = b.localEstoque,
      a.pessoaParticipante            = b.pessoaParticipante,
      a.controleQuantidade            = b.controleQuantidade,
      a.unidadeMedidaConversao        = b.unidadeMedidaConversao,
      a.conversorQuantidade           = b.conversorQuantidade,
      a.loteMinimo                    = b.loteMinimo,
      a.loteMultiplo                  = b.loteMultiplo,
      a.altura                        = b.altura,
      a.largura                       = b.largura,
      a.comprimento                   = b.comprimento,
      a.pecas                         = b.pecas,
      a.quantidade                    = b.quantidade,
      a.quantidadeConvertida          = b.quantidadeConvertida,
      a.quantidadeDevolvidaRetornada  = b.quantidadeDevolvidaRetornada,
      a.percentualDevolucao           = b.percentualDevolucao,
      a.pesoLiquido                   = b.pesoLiquido,
      a.pesoBruto                     = b.pesoBruto,
      a.tipoPreco                     = b.tipoPreco,
      a.tabelaPreco                   = b.tabelaPreco,
      a.precoSugestaoAPrazo           = b.precoSugestaoAPrazo,
      a.precoSugestaoAVista           = b.precoSugestaoAVista,
      a.precoDesconto                 = b.precoDesconto,
      a.precoMinimo                   = b.precoMinimo,
      a.usarPrecoAVista               = b.usarPrecoAVista,
      a.precoUnitarioBruto            = b.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao   = b.acrescimoUnitarioComposicao,
      a.precoUnitario                 = b.precoUnitario,
      a.precoUnitarioConvertido       = b.precounitarioConvertido,
      a.valorProdutoServicoBruto      = b.valorProdutoServicoBruto,
      a.valorProdutoServico           = b.valorProdutoServico,
      a.percDescontoItem              = b.percDescontoItem,
      a.valorDescontoItem             = b.valorDescontoItem,
      a.percAcrescimoItem             = b.percAcrescimoItem,
      a.valorAcrescimoItem            = b.valorAcrescimoItem,
      a.valorFreteItem                = b.valorFreteItem,
      a.valorSeguroItem               = b.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem  = b.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem   = b.valorDespesasAduaneirasItem,
      a.valorFreteGeral               = b.valorFreteGeral,
      a.valorSeguroGeral              = b.valorSeguroGeral,
      a.valorDescontoGeral            = b.valorDescontoGeral,
      a.valorOutrasDespesasGeral      = b.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral = b.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral  = b.valorDespesasAduaneirasGeral,
      a.valorBasePagamento            = b.valorBasePagamento,
      a.valorDescontoPagamento        = b.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento  = b.valorOutrasDespesasPagamento,
      a.valorJurosPagamento           = b.valorJurosPagamento,
      a.valorFreteTotal               = b.valorFreteTotal,
      a.valorSeguroTotal              = b.valorSeguroTotal,
      a.valorDescontoTotal            = b.valorDescontoTotal,
      a.valorOutrasDespesasTotal      = b.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal = b.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal  = b.valorDespesasAduaneirasTotal,
      a.cfop                          = b.cfop,
      a.indicadorISSQN                = b.indicadorISSQN,
      a.aliquotaISSQN                 = b.aliquotaISSQN,
      a.retidoISSQN                   = b.retidoISSQN,
      a.tributadoForaMunicipio        = b.tributadoForaMunicipio,
      a.incentivoFiscal               = b.incentivoFiscal,
      a.listaServicos                 = b.listaServicos,
      a.cnae                          = b.cnae,
      a.idServicoMunicipio            = b.idServicoMunicipio,
      a.numeroProcessoAdministrativo  = b.numeroProcessoAdministrativo,
      a.baseISSQN                     = b.baseISSQN,
      a.valorISSQN                    = b.valorISSQN,
      a.retencaoIRRF                  = b.retencaoIRRF,
      a.baseRetIRRF                   = b.baseRetIRRF,
      a.valorRetIRRF                  = b.valorRetIRRF,
      a.retencaoINSS                  = b.retencaoINSS,
      a.baseRetINSS                   = b.baseRetINSS,
      a.valorRetINSS                  = b.valorRetINSS,
      a.retencaoPIS                   = b.retencaoPIS,
      a.baseRetPIS                    = b.baseRetPIS,
      a.valorRetPIS                   = b.valorRetPIS,
      a.retencaoCOFINS                = b.retencaoCOFINS,
      a.baseRetCOFINS                 = b.baseRetCOFINS,
      a.valorRetCOFINS                = b.valorRetCOFINS,
      a.retencaoCSLL                  = b.retencaoCSLL,
      a.baseRetCSLL                   = b.baseRetCSLL,
      a.valorRetCSLL                  = b.valorRetCSLL,
      a.retencaoOutros                = b.retencaoOutros,
      a.baseRetOutros                 = b.baseRetOutros,
      a.valorRetOutros                = b.valorRetOutros,
      a.aliquotaII                    = b.aliquotaII,
      a.baseII                        = b.baseII,
      a.valorII                       = b.valorII,
      a.aliquotaIOF                   = b.aliquotaIOF,
      a.baseIOF                       = b.baseIOF,
      a.valorIOF                      = b.valorIOF,
      a.codigoEnquadramentoIPI        = b.codigoEnquadramentoIPI,
      a.stIPI                         = b.stIPI,
      a.aliquotaIPI                   = b.aliquotaIPI,
      a.valorAliquotaIPI              = b.valorAliquotaIPI,
      a.baseIPI                       = b.baseIPI,
      a.valorIPI                      = b.valorIPI,
      a.valorIPIDevolucao             = b.valorIPIDevolucao,
      a.stPIS                         = b.stPIS,
      a.aliquotaPIS                   = b.aliquotaPIS,
      a.valorAliquotaPIS              = b.valorAliquotaPIS,
      a.basePIS                       = b.basePIS,
      a.valorPIS                      = b.valorPIS,
      a.aliquotaPISST                 = b.aliquotaPISST,
      a.valorAliquotaPISST            = b.valorAliquotaPISST,
      a.basePISST                     = b.basePISST,
      a.valorPISST                    = b.valorPISST,
      a.stCOFINS                      = b.stCOFINS,
      a.aliquotaCOFINS                = b.aliquotaCOFINS,
      a.valorAliquotaCOFINS           = b.valorAliquotaCOFINS,
      a.baseCOFINS                    = b.baseCOFINS,
      a.valorCOFINS                   = b.valorCOFINS,
      a.aliquotaCOFINSST              = b.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST         = b.valorAliquotaCOFINSST,
      a.baseCOFINSST                  = b.baseCOFINSST,
      a.valorCOFINSST                 = b.valorCOFINSST,
      a.stSimplesNacional             = b.stSimplesNacional,
      a.creditoSimplesNacional        = b.creditoSimplesNacional,
      a.baseCreditoSimplesNacional    = b.baseCreditoSimplesNacional,
      a.valorCreditoSimplesNacional   = b.valorCreditoSimplesNacional,
      a.stICMS                        = b.stICMS,
      a.modalidadeBaseCalcICMS        = b.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS               = b.reducaoBaseICMS,
      a.aliquotaICMS                  = b.aliquotaICMS,
      a.diferimentoICMS               = b.diferimentoICMS,
      a.motivoDesoneracaoICMS         = b.motivoDesoneracaoICMS,
      a.idBeneficio                   = b.idBeneficio,
      a.baseICMS                      = b.baseICMS,
      a.valorICMSoperacao             = b.valorICMSoperacao,
      a.valorICMSdiferido             = b.valorICMSdiferido,
      a.valorICMS                     = b.valorICMS,
      a.valorICMSdesoneracao          = b.valorICMSdesoneracao,
      a.modalidadeBaseCalcICMSST      = b.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST       = b.margemValorAdicionadoST,
      a.reducaoBaseST                 = b.reducaoBaseST,
      a.aliquotaICMSST                = b.aliquotaICMSST,
      a.aliquotaSTSuportConsFinal     = b.aliquotaSTSuportConsFinal,
      a.baseICMSST                    = b.baseICMSST,
      a.valorICMSST                   = b.valorICMSST,
      a.baseICMSSTAnteriormente       = b.baseICMSSTAnteriormente,
      a.valorICMSSTAnteriormente      = b.valorICMSSTAnteriormente,
      a.valorICMSProprioSubstituto    = b.valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo        = b.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo           = b.aliquotaICMSEfetivo,
      a.baseICMSEfetivo               = b.baseICMSEfetivo,
      a.valorICMSEfetivo              = b.valorICMSEfetivo,
      a.stICMSEscrituracao            = b.stICMSEscrituracao,
      a.reducaoBaseICMSEscrituracao   = b.reducaoBaseICMSEscrituracao,
      a.aliquotaICMSEscrituracao      = b.aliquotaICMSEscrituracao,
      a.diferimentoICMSEscrituracao   = b.diferimentoICMSEscrituracao,
      a.baseICMSEscrituracao          = b.baseICMSEscrituracao,
      a.valorICMSEscrituracao         = b.valorICMSEscrituracao,
      a.valorICMSDesonEscrituracao    = b.valorICMSDesonEscrituracao,
      a.margemValorAdicSTEscrituracao = b.margemValorAdicSTEscrituracao,
      a.reducaoBaseSTEscrituracao     = b.reducaoBaseSTEscrituracao,
      a.aliquotaICMSSTEscrituracao    = b.aliquotaICMSSTEscrituracao,
      a.baseICMSSTEscrituracao        = b.baseICMSSTEscrituracao,
      a.valorICMSSTEscrituracao       = b.valorICMSSTEscrituracao,
      a.somarICMSST                   = b.somarICMSST,
      a.aliquotaICMSUFDestinatario    = b.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual     = b.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual     = b.partilhaICMSInterestadual,
      a.baseICMSUFDestinatario        = b.baseICMSUFDestinatario,
      a.valorICMSUFDestinatario       = b.valorICMSUFDestinatario,
      a.baseICMSUFRemetente           = b.baseICMSUFRemetente,
      a.valorICMSUFRemetente          = b.valorICMSUFRemetente,
      a.aliquotaFCP                   = b.aliquotaFCP,
      a.baseFCP                       = b.baseFCP,
      a.valorFCP                      = b.valorFCP,
      a.aliquotaFCPST                 = b.aliquotaFCPST,
      a.baseFCPST                     = b.baseFCPST,
      a.valorFCPST                    = b.valorFCPST,
      a.aliquotaFCPSTAnteriormente    = b.aliquotaFCPSTAnteriormente,
      a.baseFCPSTAnteriormente        = b.baseFCPSTAnteriormente,
      a.valorFCPSTAnteriormente       = b.valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario     = b.aliquotaFCPUFDestinatario,
      a.baseFCPUFDestinatario         = b.baseFCPUFDestinatario,
      a.valorFCPUFDestinatario        = b.valorFCPUFDestinatario,
      a.aliquotaestimadaimpfederais   = b.aliquotaestimadaimpfederais,
      a.aliquotaestimadaimpestaduais  = b.aliquotaestimadaimpestaduais,
      a.aliquotaestimadaimpmunicipais = b.aliquotaestimadaimpmunicipais,
      a.baseestimadaimpostos          = b.baseestimadaimpostos,
      a.valorestimadoimpfederais      = b.valorestimadoimpfederais,
      a.valorEstimadoImpEstaduais     = b.valorEstimadoImpEstaduais,
      a.valorEstimadoImpMunicipais    = b.valorEstimadoImpMunicipais,
      a.valorLiquidoItem              = b.valorLiquidoItem,
      a.valorDescontoCustoOpItem      = b.valorDescontoCustoOpItem,
      a.valorDescontoCustoOpGeral     = b.valorDescontoCustoOpGeral,
      a.valorDescontoCustoOpTotal     = b.valorDescontoCustoOpTotal,
      a.valorAcrescimoCustoOpItem     = b.valorAcrescimoCustoOpItem,
      a.valorAcrescimoCustoOpGeral    = b.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoCustoOpTotal    = b.valorAcrescimoCustoOpTotal,
      a.precoCustoOperacao            = b.precoCustoOperacao,
      a.valorCustoOperacao            = b.valorCustoOperacao,
      a.precoCMV                      = b.precoCMV,
      a.valorCMV                      = b.valorCMV,
      a.quantidadeExtemporanea        = b.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo = b.acrescimoUnitarioExtemporaneo,
      a.valorAcrescimoExtempSubtotal  = b.valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem      = b.valorAcrescimoExtempItem,
      a.valorAcrescimoExtempGeral     = b.valorAcrescimoExtempGeral,
      a.valorAcrescimoExtempTotal     = b.valorAcrescimoExtempTotal,
      a.observacoesDigitadas          = b.observacoesDigitadas,
      a.observacoes                   = b.observacoes
    WHEN NOT MATCHED THEN INSERT (
      idItemDocFiscal,
      idDocumentoFiscal,
      sequencia,
      cancelado,
      pedidoCompraFornecedor,
      sequenciaPedidoCompraFornec,
      modeloDocumento,
      estabelecimentoOriginal,
      vendedor,
      gradeProduto,
      idFormulaTinta,
      personalizacao,
      idLoteEstoque,
      operacaoFiscal,
      movimentaEstoque,
      movimentaEstoqueFiscal,
      geraFinanceiro,
      localEstoque,
      pessoaParticipante,
      controleQuantidade,
      unidadeMedidaConversao,
      conversorQuantidade,
      loteMinimo,
      loteMultiplo,
      altura,
      largura,
      comprimento,
      pecas,
      quantidade,
      quantidadeConvertida,
      quantidadeDevolvidaRetornada,
      percentualDevolucao,
      pesoLiquido,
      pesoBruto,
      tipoPreco,
      tabelaPreco,
      precoSugestaoAPrazo,
      precoSugestaoAVista,
      precoDesconto,
      precoMinimo,
      usarPrecoAVista,
      precoUnitarioBruto,
      acrescimoUnitarioComposicao,
      precoUnitario,
      precoUnitarioConvertido,
      valorProdutoServicoBruto,
      valorProdutoServico,
      percDescontoItem,
      valorDescontoItem,
      percAcrescimoItem,
      valorAcrescimoItem,
      valorFreteItem,
      valorSeguroItem,
      valorAdicFreteMarinhaMerItem,
      valorDespesasAduaneirasItem,
      valorFreteGeral,
      valorSeguroGeral,
      valorDescontoGeral,
      valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral,
      valorDespesasAduaneirasGeral,
      valorBasePagamento,
      valorDescontoPagamento,
      valorOutrasDespesasPagamento,
      valorJurosPagamento,
      valorFreteTotal,
      valorSeguroTotal,
      valorDescontoTotal,
      valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal,
      valorDespesasAduaneirasTotal,
      cfop,
      indicadorISSQN,
      aliquotaISSQN,
      retidoISSQN,
      tributadoForaMunicipio,
      incentivoFiscal,
      listaServicos,
      cnae,
      idServicoMunicipio,
      numeroProcessoAdministrativo,
      baseISSQN,
      valorISSQN,
      retencaoIRRF,
      baseRetIRRF,
      valorRetIRRF,
      retencaoINSS,
      baseRetINSS,
      valorRetINSS,
      retencaoPIS,
      baseRetPIS,
      valorRetPIS,
      retencaoCOFINS,
      baseRetCOFINS,
      valorRetCOFINS,
      retencaoCSLL,
      baseRetCSLL,
      valorRetCSLL,
      retencaoOutros,
      baseRetOutros,
      valorRetOutros,
      aliquotaII,
      baseII,
      valorII,
      aliquotaIOF,
      baseIOF,
      valorIOF,
      codigoEnquadramentoIPI,
      stIPI,
      aliquotaIPI,
      valorAliquotaIPI,
      baseIPI,
      valorIPI,
      valorIPIDevolucao,
      stPIS,
      aliquotaPIS,
      valorAliquotaPIS,
      basePIS,
      valorPIS,
      aliquotaPISST,
      valorAliquotaPISST,
      basePISST,
      valorPISST,
      stCOFINS,
      aliquotaCOFINS,
      valorAliquotaCOFINS,
      baseCOFINS,
      valorCOFINS,
      aliquotaCOFINSST,
      valorAliquotaCOFINSST,
      baseCOFINSST,
      valorCOFINSST,
      stSimplesNacional,
      creditoSimplesNacional,
      baseCreditoSimplesNacional,
      valorCreditoSimplesNacional,
      stICMS,
      modalidadeBaseCalcICMS,
      reducaoBaseICMS,
      aliquotaICMS,
      diferimentoICMS,
      motivoDesoneracaoICMS,
      idBeneficio,
      baseICMS,
      valorICMSOperacao,
      valorICMSDiferido,
      valorICMS,
      valorICMSDesoneracao,
      modalidadeBaseCalcICMSST,
      margemValorAdicionadoST,
      reducaoBaseST,
      aliquotaICMSST,
      aliquotaSTSuportConsFinal,
      baseICMSST,
      valorICMSST,
      baseICMSSTAnteriormente,
      valorICMSSTAnteriormente,
      valorICMSProprioSubstituto,
      reducaoBaseICMSEfetivo,
      aliquotaICMSEfetivo,
      baseICMSEfetivo,
      valorICMSEfetivo,
      stICMSEscrituracao,
      reducaoBaseICMSEscrituracao,
      aliquotaICMSEscrituracao,
      diferimentoICMSEscrituracao,
      baseICMSEscrituracao,
      valorICMSEscrituracao,
      valorICMSDesonEscrituracao,
      margemValorAdicSTEscrituracao,
      reducaoBaseSTEscrituracao,
      aliquotaICMSSTEscrituracao,
      baseICMSSTEscrituracao,
      valorICMSSTEscrituracao,
      somarICMSST,
      aliquotaICMSUFDestinatario,
      aliquotaICMSInterestadual,
      partilhaICMSInterestadual,
      baseICMSUFDestinatario,
      valorICMSUFDestinatario,
      baseICMSUFRemetente,
      valorICMSUFRemetente,
      aliquotaFCP,
      baseFCP,
      valorFCP,
      aliquotaFCPST,
      baseFCPST,
      valorFCPST,
      aliquotaFCPSTAnteriormente,
      baseFCPSTAnteriormente,
      valorFCPSTAnteriormente,
      aliquotaFCPUFDestinatario,
      baseFCPUFDestinatario,
      valorFCPUFDestinatario,
      aliquotaEstimadaImpFederais,
      aliquotaEstimadaImpEstaduais,
      aliquotaEstimadaImpMunicipais,
      baseEstimadaImpostos,
      valorEstimadoImpFederais,
      valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais,
      valorLiquidoItem,
      valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral,
      valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpItem,
      valorAcrescimoCustoOpGeral,
      valorAcrescimoCustoOpTotal,
      precoCustoOperacao,
      valorCustoOperacao,
      precoCMV,
      valorCMV,
      quantidadeExtemporanea,
      acrescimoUnitarioExtemporaneo,
      valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral,
      valorAcrescimoExtempTotal,
      observacoesDigitadas,
      observacoes)
    VALUES (
      b.idItemDocFiscal,
      b.idDocumentoFiscal,
      b.sequencia,
      b.cancelado,
      b.pedidoCompraFornecedor,
      b.sequenciaPedidoCompraFornec,
      b.modeloDocumento,
      b.estabelecimentoOriginal,
      b.vendedor,
      b.gradeProduto,
      b.idFormulaTinta,
      b.personalizacao,
      b.idLoteEstoque,
      b.operacaoFiscal,
      b.movimentaEstoque,
      b.movimentaEstoqueFiscal,
      b.geraFinanceiro,
      b.localEstoque,
      b.pessoaParticipante,
      b.controleQuantidade,
      b.unidadeMedidaConversao,
      b.conversorQuantidade,
      b.loteMinimo,
      b.loteMultiplo,
      b.altura,
      b.largura,
      b.comprimento,
      b.pecas,
      b.quantidade,
      b.quantidadeConvertida,
      b.quantidadeDevolvidaRetornada,
      b.percentualDevolucao,
      b.pesoLiquido,
      b.pesoBruto,
      b.tipoPreco,
      b.tabelaPreco,
      b.precoSugestaoAPrazo,
      b.precoSugestaoAVista,
      b.precoDesconto,
      b.precoMinimo,
      b.usarPrecoAVista,
      b.precoUnitarioBruto,
      b.acrescimoUnitarioComposicao,
      b.precoUnitario,
      b.precoUnitarioConvertido,
      b.valorProdutoServicoBruto,
      b.valorProdutoServico,
      b.percDescontoItem,
      b.valorDescontoItem,
      b.percAcrescimoItem,
      b.valorAcrescimoItem,
      b.valorFreteItem,
      b.valorSeguroItem,
      b.valorAdicFreteMarinhaMerItem,
      b.valorDespesasAduaneirasItem,
      b.valorFreteGeral,
      b.valorSeguroGeral,
      b.valorDescontoGeral,
      b.valorOutrasDespesasGeral,
      b.valorAdicFreteMarinhaMerGeral,
      b.valorDespesasAduaneirasGeral,
      b.valorBasePagamento,
      b.valorDescontoPagamento,
      b.valorOutrasDespesasPagamento,
      b.valorJurosPagamento,
      b.valorFreteTotal,
      b.valorSeguroTotal,
      b.valorDescontoTotal,
      b.valorOutrasDespesasTotal,
      b.valorAdicFreteMarinhaMerTotal,
      b.valorDespesasAduaneirasTotal,
      b.cfop,
      b.indicadorISSQN,
      b.aliquotaISSQN,
      b.retidoISSQN,
      b.tributadoForaMunicipio,
      b.incentivoFiscal,
      b.listaServicos,
      b.cnae,
      b.idServicoMunicipio,
      b.numeroProcessoAdministrativo,
      b.baseISSQN,
      b.valorISSQN,
      b.retencaoIRRF,
      b.baseRetIRRF,
      b.valorRetIRRF,
      b.retencaoINSS,
      b.baseRetINSS,
      b.valorRetINSS,
      b.retencaoPIS,
      b.baseRetPIS,
      b.valorRetPIS,
      b.retencaoCOFINS,
      b.baseRetCOFINS,
      b.valorRetCOFINS,
      b.retencaoCSLL,
      b.baseRetCSLL,
      b.valorRetCSLL,
      b.retencaoOutros,
      b.baseRetOutros,
      b.valorRetOutros,
      b.aliquotaII,
      b.baseII,
      b.valorII,
      b.aliquotaIOF,
      b.baseIOF,
      b.valorIOF,
      b.codigoEnquadramentoIPI,
      b.stIPI,
      b.aliquotaIPI,
      b.valorAliquotaIPI,
      b.baseIPI,
      b.valorIPI,
      b.valorIPIDevolucao,
      b.stPIS,
      b.aliquotaPIS,
      b.valorAliquotaPIS,
      b.basePIS,
      b.valorPIS,
      b.aliquotaPISST,
      b.valorAliquotaPISST,
      b.basePISST,
      b.valorPISST,
      b.stCOFINS,
      b.aliquotaCOFINS,
      b.valorAliquotaCOFINS,
      b.baseCOFINS,
      b.valorCOFINS,
      b.aliquotaCOFINSST,
      b.valorAliquotaCOFINSST,
      b.baseCOFINSST,
      b.valorCOFINSST,
      b.stSimplesNacional,
      b.creditoSimplesNacional,
      b.baseCreditoSimplesNacional,
      b.valorCreditoSimplesNacional,
      b.stICMS,
      b.modalidadeBaseCalcICMS,
      b.reducaoBaseICMS,
      b.aliquotaICMS,
      b.diferimentoICMS,
      b.motivoDesoneracaoICMS,
      b.idBeneficio,
      b.baseICMS,
      b.valorICMSOperacao,
      b.valorICMSDiferido,
      b.valorICMS,
      b.valorICMSDesoneracao,
      b.modalidadeBaseCalcICMSST,
      b.margemValorAdicionadoST,
      b.reducaoBaseST,
      b.aliquotaICMSST,
      b.aliquotaSTSuportConsFinal,
      b.baseICMSST,
      b.valorICMSST,
      b.baseICMSSTAnteriormente,
      b.valorICMSSTAnteriormente,
      b.valorICMSProprioSubstituto,
      b.reducaoBaseICMSEfetivo,
      b.aliquotaICMSEfetivo,
      b.baseICMSEfetivo,
      b.valorICMSEfetivo,
      b.stICMSEscrituracao,
      b.reducaoBaseICMSEscrituracao,
      b.aliquotaICMSEscrituracao,
      b.diferimentoICMSEscrituracao,
      b.baseICMSEscrituracao,
      b.valorICMSEscrituracao,
      b.valorICMSDesonEscrituracao,
      b.margemValorAdicSTEscrituracao,
      b.reducaoBaseSTEscrituracao,
      b.aliquotaICMSSTEscrituracao,
      b.baseICMSSTEscrituracao,
      b.valorICMSSTEscrituracao,
      b.somarICMSST,
      b.aliquotaICMSUFDestinatario,
      b.aliquotaICMSInterestadual,
      b.partilhaICMSInterestadual,
      b.baseICMSUFDestinatario,
      b.valorICMSUFDestinatario,
      b.baseICMSUFRemetente,
      b.valorICMSUFRemetente,
      b.aliquotaFCP,
      b.baseFCP,
      b.valorFCP,
      b.aliquotaFCPST,
      b.baseFCPST,
      b.valorFCPST,
      b.aliquotaFCPSTAnteriormente,
      b.baseFCPSTAnteriormente,
      b.valorFCPSTAnteriormente,
      b.aliquotaFCPUFDestinatario,
      b.baseFCPUFDestinatario,
      b.valorFCPUFDestinatario,
      b.aliquotaEstimadaImpFederais,
      b.aliquotaEstimadaImpEstaduais,
      b.aliquotaEstimadaImpMunicipais,
      b.baseEstimadaImpostos,
      b.valorEstimadoImpFederais,
      b.valorEstimadoImpEstaduais,
      b.valorEstimadoImpMunicipais,
      b.valorLiquidoItem,
      b.valorDescontoCustoOpItem,
      b.valorDescontoCustoOpGeral,
      b.valorDescontoCustoOpTotal,
      b.valorAcrescimoCustoOpItem,
      b.valorAcrescimoCustoOpGeral,
      b.valorAcrescimoCustoOpTotal,
      b.precoCustoOperacao,
      b.valorCustoOperacao,
      b.precoCMV,
      b.valorCMV,
      b.quantidadeExtemporanea,
      b.acrescimoUnitarioExtemporaneo,
      b.valorAcrescimoExtempSubtotal,
      b.valorAcrescimoExtempItem,
      b.valorAcrescimoExtempGeral,
      b.valorAcrescimoExtempTotal,
      b.observacoesDigitadas,
      b.observacoes);
    v_atualizarObservacoes := 0;
    IF p_idItemReferenciado > 0 THEN
      IF p_tipoDocumentoReferenciado IN ('D','P') THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV(
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_devolucaoAnulacaoRetorno,
          'D',
          r_item_idItemDocFiscal,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          p_tipoDocumentoReferenciado,
          p_idItemReferenciado);
      END IF;
      IF p_tipoDocumentoReferenciado = 'B' THEN
        ADD_DOC_FISC_ITEM_BALANC_GRAVA (
          p_estabelecimentoAtivo,
          p_idItemReferenciado,
          r_item_idItemDocFiscal);
      ELSIF p_tipoDocumentoReferenciado = 'D' THEN
        ADD_DOC_FISC_ITEM_REF_DOC_FIS (
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'G' THEN
        ADD_DOC_FISC_ITEM_REF_DFE_GRAD (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_person_190_modeloFrete,
          p_config_227_manterPessoaOrcam,
          p_config_230_etapaPedComprParc,
          p_config_378_calcularVolumes,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'O' THEN
        ADD_DOC_FISC_ITEM_REF_ORCAMEN (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'P' THEN
        ADD_DOC_FISC_ITEM_REF_PRE_DOC (
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'T' THEN
        ADD_DOC_FISC_ITEM_TRANS_GRAVA (
          p_estabelecimentoAtivo,
          v_cab_entradaSaida,
          p_idItemReferenciado,
          r_item_idItemDocFiscal,
          p_quantidadeReferenciada);
      END IF;
    END IF;
    IF p_tempComp_nomeTempComposicao <> ' '
      AND (NOT (p_tipoDocumentoReferenciado IN ('D','O','P'))
        OR p_idItemReferenciado <= 0)
    THEN
      ADD_DOC_FISC_ITEM_COMP_TEMP (
        p_sessaoClient,
        p_estabelecimentoAtivo,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        r_item_idItemDocFiscal,
        v_atualizarObservacoes,
        v_atualizarObservacoes);
    END IF;
    v_idEnderecoEstoque := 0;
    IF p_item_idEnderecoEstoque > 0 THEN
      ADD_DOC_FISC_ITEM_ENDER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemDocFiscal,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_quantidade,
        ' ',
        v_idEnderecoEstoque);
    END IF;
    IF p_item_idNumeroSerie > 0 THEN
      ADD_DOC_FISC_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemDocFiscal,
        v_idEnderecoEstoque,
        p_item_gradeProduto,
        p_item_idNumeroSerie,
        0,
        v_auxNumber);
      v_atualizarObservacoes := 1;
    END IF;
    IF v_atualizarObservacoes = 1 THEN
      v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
        p_sessaoClient,
        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_413_obs_add_marca,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        'D',
        r_item_idItemDocFiscal,
        p_item_gradeProduto,
        p_item_idFormulaTinta,
        p_item_personalizacao,
        p_item_idLoteEstoque,
        p_item_controleQuantidade,
        p_item_loteMultiplo,
        p_item_altura,
        p_item_largura,
        p_item_comprimento,
        p_item_quantidade,
        p_item_observacoesDigitadas);
      UPDATE MODOCFISCALXITENS
      SET observacoes = v_observacoes
      WHERE idItemDocFiscal = r_item_idItemDocFiscal;
    END IF;
    IF v_cab_situacaoDocumentoFiscal > 20 THEN
      ADD_DOC_FISC_ITEM_EST_ATUALIZA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_item_idItemDocFiscal,
        p_estabelecimentoAtivo);
      ADD_DOC_FISC_ITEM_FIL_ATUALIZA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_item_idItemDocFiscal,
        p_estabelecimentoAtivo);
    END IF;
    r_buffer_idItemDocFiscal := CASE WHEN (r_buffer_idItemDocFiscal IS NULL OR r_buffer_idItemDocFiscal = '' OR r_buffer_idItemDocFiscal = ' ') THEN '' ELSE RTRIM (r_buffer_idItemDocFiscal) || ';' END || TO_CHAR (LPAD(r_item_idItemDocFiscal,14,'0'));
    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;
  END IF;
END ADD_DOC_FISC_ITEM_GRAVA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_PREV_INSERE (
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_munEndEst_uf                 IN CHAR,
  p_munEndPess_uf                 IN CHAR,
  p_item_idItemOrcamento         IN NUMBER,
  p_item_atividadeServico        IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_tipoPreco               IN CHAR,
  p_item_tabelaPreco             IN VARCHAR,
  p_item_precoUnitario           IN NUMBER,
  /* Retornos */
  r_inseriuAtividadePrevista     OUT NUMBER)
IS
  v_sequenciaAtividade      NUMBER;
  v_tecnico                 NUMBER;
  v_checklist               NUMBER;
  v_auxNumber               NUMBER;
BEGIN
  r_inseriuAtividadePrevista := 0;
  v_sequenciaAtividade := 0;
  SELECT COALESCE (MAX (tecnico), 0)
  INTO v_tecnico
  FROM CATECNICOS
  WHERE tecnico = p_usuarioLogado
  AND ativo = 1;
  FOR a IN (
    SELECT
      a.atividadeServicoPrevista,
      a.tecnico,
      a.faturarAtividade,
      a.etapaAtividade,
      a.observacoes,
      COALESCE ((
        SELECT MAX (b.checklist)
        FROM (
          SELECT
            b.atividadeServico,
            b.checklist,
            ROW_NUMBER() OVER (
              PARTITION BY b.atividadeServico
              ORDER BY
                b.atividadeServico,
                b.ordenacao,
                b.id) ordenacao
          FROM PAATIVIDADESERVXCHECKLIST b
          WHERE b.ativo = 1) b
        WHERE b.atividadeServico = a.atividadeServicoPrevista
        AND b.ordenacao = 1), 0) checklist,
      CASE ativ.gradeProduto
        WHEN 0
        THEN 0
        WHEN p_item_gradeProduto
        THEN p_item_precoUnitario
        ELSE FUNC_ADD_BUSCA_PRECO (
          p_config_64_casasDecSaidas,
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_perfilUsuarioLogado,
          p_usuarioLogado,
          p_cab_estabelecimento,
          SYSDATE, -- p_cab_dataPrecoFinal
          p_cab_pessoa,
          p_munEndEst_uf,
          p_munEndPess_uf,
          p_item_vendedor,
          0, -- p_item_idFormulaTinta
          0, -- p_item_personalizacao
          gradProd.produto,
          gradProd.cor,
          gradProd.tamanho,
          prod.controleEstoque,
          p_item_tipoPreco,
          p_item_tabelaPreco)
      END precoUnitario
    FROM PAATIVIDADEOSXPREVISTA a
    JOIN PAATIVIDADESSERVICO ativ
    ON ativ.atividadeServico = a.atividadeServicoPrevista
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = ativ.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE a.atividadeServicoOs = p_item_atividadeServico
    AND a.ativo = 1
    AND a.sugestao = 1
    ORDER BY
      a.atividadeServicoOs,
      a.ordenacao,
      a.id)
  LOOP
    r_inseriuAtividadePrevista := 1;
    v_sequenciaAtividade := v_sequenciaAtividade + 1;  
    ADD_ORCAMENTO_ITEM_PREV_GRAVA (
      p_estabelecimentoAtivo,
      0,
      p_item_idItemOrcamento,
      v_sequenciaAtividade,
      a.atividadeServicoPrevista,
      ' ',
      CASE WHEN v_sequenciaAtividade = 1 AND a.tecnico = 0 THEN v_tecnico ELSE a.tecnico END,
      a.faturarAtividade,
      a.checklist,
      a.etapaAtividade,
      CASE WHEN v_sequenciaAtividade = 1 THEN CASE WHEN CASE WHEN a.tecnico = 0 THEN v_tecnico ELSE a.tecnico END = p_usuarioLogado THEN 'I' ELSE 'P' END ELSE 'A' END,
      CASE WHEN v_sequenciaAtividade = 1 THEN SYSDATE ELSE NULL END,
      CASE WHEN v_sequenciaAtividade = 1 THEN SYSDATE ELSE NULL END,
      0,
      a.precoUnitario,
      a.observacoes,
      1,
      CASE WHEN v_sequenciaAtividade = 1 AND CASE WHEN a.tecnico = 0 THEN v_tecnico ELSE a.tecnico END = p_usuarioLogado THEN 1 ELSE 0 END,
      0,
      CASE WHEN v_sequenciaAtividade = 1 AND CASE WHEN a.tecnico = 0 THEN v_tecnico ELSE a.tecnico END = p_usuarioLogado THEN SYSDATE ELSE NULL END,
      NULL,
      0,
      /* Retornos */
      v_auxNumber,
      v_auxNumber);
  END LOOP;
  IF r_inseriuAtividadePrevista = 0 THEN
    SELECT COALESCE (MAX (validoPrevisto), 0)
    INTO v_auxNumber
    FROM PAATIVIDADESSERVICO
    WHERE atividadeServico = p_item_atividadeServico;
    IF v_auxNumber = 1 THEN
      SELECT COALESCE (MAX (c.checklist),0)
      INTO v_checklist
      FROM (
        SELECT
          b.checklist,
          ROW_NUMBER() OVER (
            ORDER BY
              b.ordenacao,
              b.id) ordenacao
        FROM PAATIVIDADESERVXCHECKLIST b
        WHERE b.atividadeServico = p_item_atividadeServico
        AND b.ativo = 1) c
      WHERE c.ordenacao = 1;
      r_inseriuAtividadePrevista := 1;
      ADD_ORCAMENTO_ITEM_PREV_GRAVA (
        p_estabelecimentoAtivo,
        0,
        p_item_idItemOrcamento,
        1,
        p_item_atividadeServico,
        ' ',
        v_tecnico,
        'N',
        v_checklist,
        0,
        'P',
        SYSDATE,
        SYSDATE,
        0,
        p_item_precoUnitario,
        ' ',
        1,
        0,
        0,
        NULL,
        NULL,
        0,
        /* Retornos */
        v_auxNumber,
        v_auxNumber);
    END IF;
  END IF;
END ADD_ORCAMENTO_ITEM_PREV_INSERE;

/

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_config_413_obs_add_marca     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, 'F' Fatura Contrato, 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_atividadeProjeto        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_item_idItemOrcamento       IN VARCHAR2,
  /* Retornos */
  r_mensagemAviso                OUT VARCHAR,
  r_calcularImpostos             OUT NUMBER,
  r_item_idItemOrcamento         OUT NUMBER,
  r_buffer_item_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_projeto                  VARCHAR2 (60);
  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_pesoLiquido             NUMBER;
  v_prod_pesoBruto               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_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_ativ_numero                  NUMBER;
  v_ativ_quantidade              NUMBER;
  v_ativ_precoUnitarioMenor      NUMBER;
  v_ativ_precoUnitario           NUMBER;
  v_ativ_valorTotalItem          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_item_idItemOrcamento := p_buffer_item_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.projeto,
    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_projeto,
    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.pesoLiquido,
    prod.pesoBruto,
    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_pesoLiquido,
    v_prod_pesoBruto,
    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 / ((v_combo_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 / ((v_combo_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_cab_projeto,
        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_config_413_obs_add_marca,
        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_atividadeProjeto,
        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_item_idItemOrcamento,
        r_mensagemAviso,
        r_calcularImpostos,
        v_auxNumber, -- idItemOrcamento
        r_buffer_item_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_item_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
      SELECT COALESCE (MAX (sequencia),0) + 1
      INTO v_item_sequencia
      FROM MOORCAMENTOXITENS
      WHERE orcamento = p_item_orcamento;
      v_cab_ultimoVendedorItem := p_item_vendedor;
    END IF;
    IF v_item_cancelado = 0 THEN
      IF p_manterFinanceiro_Retotalizar <> 2 THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume + TRUNC(CASE WHEN p_item_controleQuantidade = 1 AND p_item_loteMultiplo <> 0 THEN p_item_quantidade / p_item_loteMultiplo ELSE p_item_quantidadeConvertida END,0);
        END IF;
        v_cab_pesoLiquido := v_cab_pesoLiquido + p_item_pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto + p_item_pesoBruto;
      END IF;
      v_cab_quantidade := v_cab_quantidade + p_item_quantidadeConvertida;
      IF v_prod_tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorServicos := v_cab_valorServicos + v_item_valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos + p_item_valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorProdutos := v_cab_valorProdutos + v_item_valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos + p_item_valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem + p_item_valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem + p_item_valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem + p_item_valorAdicFreteMarItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem + p_item_valorDespesasAduanItem;
      v_cab_valorFreteGeral := v_cab_valorFreteGeral + v_item_valorFreteGeral;
      v_cab_valorSeguroGeral := v_cab_valorSeguroGeral + p_item_valorSeguroGeral;
      v_cab_valorDescontoGeral := v_cab_valorDescontoGeral + v_item_valorDescontoGeral;
      v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral + p_item_valorOutrasDespesasGer;
      v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral + p_item_valorAdicFreteMarGeral;
      v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral + p_item_valorDespesasAduanGeral;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento + v_item_valorBasePagamento;
      IF p_item_usarPrecoAVista = 1
        AND v_item_geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo + v_item_valorProdutoServico - v_item_valorDescontoTotal + v_item_valorOutrasDespesasTot;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento + v_item_valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento + v_item_valorOutrasDespPagament;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento + v_item_valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal + v_item_valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal + v_item_valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal + v_item_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_item_valorOutrasDespesasTot;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal + v_item_valorAdicFreteMarTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal + v_item_valorDespesasAduanTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem + v_item_valorLiquidoItem;
    ELSE
      v_item_quantidadeSaldo := 0;
    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 = p_item_orcamento;
    IF p_item_idItemOrcamento > 0 THEN
      DELETE MOORCAMENTOXCOMPOSICOESPR compDoc
      WHERE compDoc.idItemOrcamento = p_item_idItemOrcamento
      AND EXISTS(
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.produto = comp.produto
        WHERE comp.composicaoPreco = compDoc.composicaoPreco
        AND gradProd.gradeProduto <> p_item_gradeProduto);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      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_413_obs_add_marca,
      ' ',
      0,
      'O',
      p_item_idItemOrcamento,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    MERGE INTO MOORCAMENTOXITENS a USING (
      SELECT
        r_item_idItemOrcamento         idItemOrcamento,
        p_item_orcamento               orcamento,
        v_item_sequencia               sequencia,
        v_item_cancelado               cancelado,
        p_item_pedidoCompraFornecedor  pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo sequenciaPedidoCompraFornec,
        p_item_ambiente                ambiente,
        p_item_ambienteObservacoes     ambienteObservacoes,
        p_item_modeloDocumento         modeloDocumento,
        p_item_estabelecimentoOriginal estabelecimentoOriginal,
        p_item_vendedor                vendedor,
        p_item_gradeProduto            gradeProduto,
        p_item_atividadeServico        atividadeServico,
        p_item_statusAtividadeServico  statusAtividadeServico,
        p_item_idFormulaTinta          idFormulaTinta,
        p_item_personalizacao          personalizacao,
        p_item_idLoteEstoque           idLoteEstoque,
        p_item_vinculoItemDocumento    vinculoItemDocumento,
        p_item_operacaoFiscal          operacaoFiscal,
        v_item_movimentaEstoque        movimentaEstoque,
        v_item_geraFinanceiro          geraFinanceiro,
        p_item_localEstoque            localEstoque,
        p_item_pessoaParticipante      pessoaParticipante,
        p_item_dataEntrega             dataEntrega,
        p_item_controleQuantidade      controleQuantidade,
        p_item_unidadeMedidaConversao  unidadeMedidaConversao,
        p_item_conversorQuantidade     conversorQuantidade,
        p_item_loteMinimo              loteMinimo,
        p_item_loteMultiplo            loteMultiplo,
        p_item_altura                  altura,
        p_item_largura                 largura,
        p_item_comprimento             comprimento,
        p_item_pecas                   pecas,
        p_item_quantidade              quantidade,
        p_item_quantidadeConvertida    quantidadeConvertida,
        v_item_quantidadeSaldo         quantidadeSaldo,
        p_item_controleEntrega         controleEntrega,
        p_item_pesoLiquido             pesoLiquido,
        p_item_pesoBruto               pesoBruto,
        p_item_tipoPreco               tipoPreco,
        p_item_tabelaPreco             tabelaPreco,
        p_item_precoSugestaoAPrazo     precoSugestaoAPrazo,
        p_item_precoSugestaoAVista     precoSugestaoAVista,
        p_item_precoDesconto           precoDesconto,
        p_item_precoMinimo             precoMinimo,
        p_item_usarPrecoAVista         usarPrecoAVista,
        p_item_precoUnitarioBruto      precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos acrescimoUnitarioComposicao,
        v_item_precoUnitario           precoUnitario,
        v_item_precoUnitarioConvertido precoUnitarioConvertido,
        v_item_valorProdutoServicoBrut valorProdutoServicoBruto,
        v_item_valorProdutoServico     valorProdutoServico,
        p_item_percDescontoItem        percDescontoItem,
        p_item_valorDescontoItem       valorDescontoItem,
        p_item_percAcrescimoItem       percAcrescimoItem,
        p_item_valorAcrescimoItem      valorAcrescimoItem,
        p_item_valorFreteItem          valorFreteItem,
        p_item_valorSeguroItem         valorSeguroItem,
        p_item_valorAdicFreteMarItem   valorAdicFreteMarinhaMerItem,
        p_item_valorDespesasAduanItem  valorDespesasAduaneirasItem,
        v_item_valorFreteGeral         valorFreteGeral,
        p_item_valorSeguroGeral        valorSeguroGeral,
        v_item_valorDescontoGeral      valorDescontoGeral,
        p_item_valorOutrasDespesasGer  valorOutrasDespesasGeral,
        p_item_valorAdicFreteMarGeral  valorAdicFreteMarinhaMerGeral,
        p_item_valorDespesasAduanGeral valorDespesasAduaneirasGeral,
        v_item_valorBasePagamento      valorBasePagamento,
        v_item_valorDescontoPagamento  valorDescontoPagamento,
        v_item_valorOutrasDespPagament valorOutrasDespesasPagamento,
        v_item_valorJurosPagamento     valorJurosPagamento,
        v_item_valorFreteTotal         valorFreteTotal,
        v_item_valorSeguroTotal        valorSeguroTotal,
        v_item_valorDescontoTotal      valorDescontoTotal,
        v_item_valorOutrasDespesasTot  valorOutrasDespesasTotal,
        v_item_valorAdicFreteMarTotal  valorAdicFreteMarinhaMerTotal,
        v_item_valorDespesasAduanTotal valorDespesasAduaneirasTotal,
        v_item_cfop                    cfop,
        v_item_indicadorISSQN          indicadorISSQN,
        v_item_aliquotaISSQN           aliquotaISSQN,
        v_item_retidoISSQN             retidoISSQN,
        v_item_tributadoForaMunicipio  tributadoForaMunicipio,
        v_item_incentivoFiscal         incentivoFiscal,
        v_item_listaServicos           listaServicos,
        v_item_cnae                    cnae,
        v_item_idServicoMunicipio      idServicoMunicipio,
        v_item_numeroProcessoAdministr numeroProcessoAdministrativo,
        v_item_baseISSQN               baseISSQN,
        v_item_valorISSQN              valorISSQN,
        v_item_retencaoIRRF            retencaoIRRF,
        v_item_baseRetIRRF             baseRetIRRF,
        v_item_valorRetIRRF            valorRetIRRF,
        v_item_retencaoINSS            retencaoINSS,
        v_item_baseRetINSS             baseRetINSS,
        v_item_valorRetINSS            valorRetINSS,
        v_item_retencaoPIS             retencaoPIS,
        v_item_baseRetPIS              baseRetPIS,
        v_item_valorRetPIS             valorRetPIS,
        v_item_retencaoCOFINS          retencaoCOFINS,
        v_item_baseRetCOFINS           baseRetCOFINS,
        v_item_valorRetCOFINS          valorRetCOFINS,
        v_item_retencaoCSLL            retencaoCSLL,
        v_item_baseRetCSLL             baseRetCSLL,
        v_item_valorRetCSLL            valorRetCSLL,
        v_item_retencaoOutros          retencaoOutros,
        v_item_baseRetOutros           baseRetOutros,
        v_item_valorRetOutros          valorRetOutros,
        v_item_aliquotaII              aliquotaII,
        v_item_baseII                  baseII,
        v_item_valorII                 valorII,
        v_item_aliquotaIOF             aliquotaIOF,
        v_item_baseIOF                 baseIOF,
        v_item_valorIOF                valorIOF,
        v_item_codigoEnquadramentoIPI  codigoEnquadramentoIPI,
        v_item_stIPI                   stIPI,
        v_item_aliquotaIPI             aliquotaIPI,
        v_item_valorAliquotaIPI        valorAliquotaIPI,
        v_item_baseIPI                 baseIPI,
        v_item_valorIPI                valorIPI,
        v_item_stPIS                   stPIS,
        v_item_aliquotaPIS             aliquotaPIS,
        v_item_valorAliquotaPIS        valorAliquotaPIS,
        v_item_basePIS                 basePIS,
        v_item_valorPIS                valorPIS,
        v_item_aliquotaPISST           aliquotaPISST,
        v_item_valorAliquotaPISST      valorAliquotaPISST,
        v_item_basePISST               basePISST,
        v_item_valorPISST              valorPISST,
        v_item_stCOFINS                stCOFINS,
        v_item_aliquotaCOFINS          aliquotaCOFINS,
        v_item_valorAliquotaCOFINS     valorAliquotaCOFINS,
        v_item_baseCOFINS              baseCOFINS,
        v_item_valorCOFINS             valorCOFINS,
        v_item_aliquotaCOFINSST        aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST   valorAliquotaCOFINSST,
        v_item_baseCOFINSST            baseCOFINSST,
        v_item_valorCOFINSST           valorCOFINSST,
        v_item_stSimplesNacional       stSimplesNacional,
        v_item_creditoSimplesNacional  creditoSimplesNacional,
        v_item_baseCreditoSimplesNac   baseCreditoSimplesNacional,
        v_item_valorCreditoSimplesNac  valorCreditoSimplesNacional,
        v_item_stICMS                  stICMS,
        v_item_modalBaseCalcICMS       modalidadeBaseCalcICMS,
        v_item_reducaoBaseICMS         reducaoBaseICMS,
        v_item_aliquotaICMS            aliquotaICMS,
        v_item_diferimentoICMS         diferimentoICMS,
        v_item_motivoDesoneracaoICMS   motivoDesoneracaoICMS,
        v_item_idBeneficio             idBeneficio,
        v_item_baseICMS                baseICMS,
        v_item_valorICMSOperacao       valorICMSOperacao,
        v_item_valorICMSDiferido       valorICMSDiferido,
        v_item_valorICMS               valorICMS,
        v_item_valorICMSDesoneracao    valorICMSDesoneracao,
        v_item_modalBaseCalcICMSST     modalidadeBaseCalcICMSST,
        v_item_margemValorAdicionadoST margemValorAdicionadoST,
        v_item_reducaoBaseST           reducaoBaseST,
        v_item_aliquotaICMSST          aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin aliquotaSTSuportConsFinal,
        v_item_baseICMSST              baseICMSST,
        v_item_valorICMSST             valorICMSST,
        v_item_baseICMSSTAnteriormente baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment valorICMSSTAnteriormente,
        v_item_valorICMSProprioSubstit valorICMSProprioSubstituto,
        v_item_reducaoBaseICMSEfetivo  reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo     aliquotaICMSEfetivo,
        v_item_baseICMSEfetivo         baseICMSEfetivo,
        v_item_valorICMSEfetivo        valorICMSEfetivo,
        v_item_aliquotaICMSUFDestinat  aliquotaICMSUFDestinatario,
        v_item_aliquotaICMSInterestad  aliquotaICMSInterestadual,
        v_item_partilhaICMSInterestad  partilhaICMSInterestadual,
        v_item_baseICMSUFDestinatario  baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente     baseICMSUFRemetente,
        v_item_valorICMSUFRemetente    valorICMSUFRemetente,
        v_item_aliquotaFCP             aliquotaFCP,
        v_item_baseFCP                 baseFCP,
        v_item_valorFCP                valorFCP,
        v_item_aliquotaFCPST           aliquotaFCPST,
        v_item_baseFCPST               baseFCPST,
        v_item_valorFCPST              valorFCPST,
        v_item_aliquotaFCPSTAnteriorm  aliquotaFCPSTAnteriormente,
        v_item_baseFCPSTAnteriormente  baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente valorFCPSTAnteriormente,
        v_item_aliquotaFCPUFDestinat   aliquotaFCPUFDestinatario,
        v_item_baseFCPUFDestinatario   baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario  valorFCPUFDestinatario,
        v_item_aliquotaEstImpFederais  aliquotaEstimadaImpFederais,
        v_item_aliquotaEstImpEstaduais aliquotaEstimadaImpEstaduais,
        v_item_aliquotaEstImpMunicipai aliquotaEstimadaImpMunicipais,
        v_item_baseEstimadaImpostos    baseEstimadaImpostos,
        v_item_valorEstImpFederais     valorEstimadoImpFederais,
        v_item_valorEstImpEstaduais    valorEstimadoImpEstaduais,
        v_item_valorEstImpMunicipais   valorEstimadoImpMunicipais,
        v_item_valorLiquidoItem        valorLiquidoItem,
        p_item_observacoesDigitadas    observacoesDigitadas,
        v_observacoes                  observacoes
      FROM DUAL) b
    ON (a.idItemOrcamento = b.idItemOrcamento)
    WHEN MATCHED THEN UPDATE SET
      a.orcamento                     = b.orcamento,
      a.sequencia                     = b.sequencia,
      a.cancelado                     = b.cancelado,
      a.pedidoCompraFornecedor        = b.pedidoCompraFornecedor,
      a.sequenciaPedidoCompraFornec   = b.sequenciaPedidoCompraFornec,
      a.ambiente                      = b.ambiente,
      a.ambienteObservacoes           = b.ambienteObservacoes,
      a.vendedor                      = b.vendedor,
      a.modeloDocumento               = b.modeloDocumento,
      a.estabelecimentoOriginal       = b.estabelecimentoOriginal,
      a.gradeProduto                  = b.gradeProduto,
      a.atividadeServico              = b.atividadeServico,
      a.statusAtividadeServico        = b.statusAtividadeServico,
      a.idFormulaTinta                = b.idFormulaTinta,
      a.personalizacao                = b.personalizacao,
      a.idLoteEstoque                 = b.idLoteEstoque,
      a.vinculoItemDocumento          = b.vinculoItemDocumento,
      a.operacaoFiscal                = b.operacaoFiscal,
      a.movimentaEstoque              = b.movimentaEstoque,
      a.geraFinanceiro                = b.geraFinanceiro,
      a.localEstoque                  = b.localEstoque,
      a.pessoaParticipante            = b.pessoaParticipante,
      a.dataEntrega                   = b.dataEntrega,
      a.controleQuantidade            = b.controleQuantidade,
      a.unidadeMedidaConversao        = b.unidadeMedidaConversao,
      a.conversorQuantidade           = b.conversorQuantidade,
      a.loteMinimo                    = b.loteMinimo,
      a.loteMultiplo                  = b.loteMultiplo,
      a.altura                        = b.altura,
      a.largura                       = b.largura,
      a.comprimento                   = b.comprimento,
      a.pecas                         = b.pecas,
      a.quantidade                    = b.quantidade,
      a.quantidadeConvertida          = b.quantidadeConvertida,
      a.quantidadeSaldo               = b.quantidadeSaldo,
      a.controleEntrega               = b.controleEntrega,
      a.pesoLiquido                   = b.pesoLiquido,
      a.pesoBruto                     = b.pesoBruto,
      a.tipoPreco                     = b.tipoPreco,
      a.tabelaPreco                   = b.tabelaPreco,
      a.precoSugestaoAPrazo           = b.precoSugestaoAPrazo,
      a.precoSugestaoAVista           = b.precoSugestaoAVista,
      a.precoDesconto                 = b.precoDesconto,
      a.precoMinimo                   = b.precoMinimo,
      a.usarPrecoAVista               = b.usarPrecoAVista,
      a.precoUnitarioBruto            = b.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao   = b.acrescimoUnitarioComposicao,
      a.precoUnitario                 = b.precoUnitario,
      a.precoUnitarioConvertido       = b.precounitarioConvertido,
      a.valorProdutoServicoBruto      = b.valorProdutoServicoBruto,
      a.valorProdutoServico           = b.valorProdutoServico,
      a.percDescontoItem              = b.percDescontoItem,
      a.valorDescontoItem             = b.valorDescontoItem,
      a.percAcrescimoItem             = b.percAcrescimoItem,
      a.valorAcrescimoItem            = b.valorAcrescimoItem,
      a.valorFreteItem                = b.valorFreteItem,
      a.valorSeguroItem               = b.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem  = b.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem   = b.valorDespesasAduaneirasItem,
      a.valorFreteGeral               = b.valorFreteGeral,
      a.valorSeguroGeral              = b.valorSeguroGeral,
      a.valorDescontoGeral            = b.valorDescontoGeral,
      a.valorOutrasDespesasGeral      = b.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral = b.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral  = b.valorDespesasAduaneirasGeral,
      a.valorBasePagamento            = b.valorBasePagamento,
      a.valorDescontoPagamento        = b.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento  = b.valorOutrasDespesasPagamento,
      a.valorJurosPagamento           = b.valorJurosPagamento,
      a.valorFreteTotal               = b.valorFreteTotal,
      a.valorSeguroTotal              = b.valorSeguroTotal,
      a.valorDescontoTotal            = b.valorDescontoTotal,
      a.valorOutrasDespesasTotal      = b.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal = b.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal  = b.valorDespesasAduaneirasTotal,
      a.cfop                          = b.cfop,
      a.indicadorISSQN                = b.indicadorISSQN,
      a.aliquotaISSQN                 = b.aliquotaISSQN,
      a.baseISSQN                     = b.baseISSQN,
      a.valorISSQN                    = b.valorISSQN,
      a.retidoISSQN                   = b.retidoISSQN,
      a.tributadoForaMunicipio        = b.tributadoForaMunicipio,
      a.incentivoFiscal               = b.incentivoFiscal,
      a.listaServicos                 = b.listaServicos,
      a.cnae                          = b.cnae,
      a.idServicoMunicipio            = b.idServicoMunicipio,
      a.numeroProcessoAdministrativo  = b.numeroProcessoAdministrativo,
      a.retencaoIRRF                  = b.retencaoIRRF,
      a.baseRetIRRF                   = b.baseRetIRRF,
      a.valorRetIRRF                  = b.valorRetIRRF,
      a.retencaoINSS                  = b.retencaoINSS,
      a.baseRetINSS                   = b.baseRetINSS,
      a.valorRetINSS                  = b.valorRetINSS,
      a.retencaoPIS                   = b.retencaoPIS,
      a.baseRetPIS                    = b.baseRetPIS,
      a.valorRetPIS                   = b.valorRetPIS,
      a.retencaoCOFINS                = b.retencaoCOFINS,
      a.baseRetCOFINS                 = b.baseRetCOFINS,
      a.valorRetCOFINS                = b.valorRetCOFINS,
      a.retencaoCSLL                  = b.retencaoCSLL,
      a.baseRetCSLL                   = b.baseRetCSLL,
      a.valorRetCSLL                  = b.valorRetCSLL,
      a.retencaoOutros                = b.retencaoOutros,
      a.baseRetOutros                 = b.baseRetOutros,
      a.valorRetOutros                = b.valorRetOutros,
      a.aliquotaII                    = b.aliquotaII,
      a.baseII                        = b.baseII,
      a.valorII                       = b.valorII,
      a.aliquotaIOF                   = b.aliquotaIOF,
      a.baseIOF                       = b.baseIOF,
      a.valorIOF                      = b.valorIOF,
      a.codigoEnquadramentoIPI        = b.codigoEnquadramentoIPI,
      a.stIPI                         = b.stIPI,
      a.aliquotaIPI                   = b.aliquotaIPI,
      a.valorAliquotaIPI              = b.valorAliquotaIPI,
      a.baseIPI                       = b.baseIPI,
      a.valorIPI                      = b.valorIPI,
      a.stPIS                         = b.stPIS,
      a.aliquotaPIS                   = b.aliquotaPIS,
      a.valorAliquotaPIS              = b.valorAliquotaPIS,
      a.basePIS                       = b.basePIS,
      a.valorPIS                      = b.valorPIS,
      a.aliquotaPISST                 = b.aliquotaPISST,
      a.valorAliquotaPISST            = b.valorAliquotaPISST,
      a.basePISST                     = b.basePISST,
      a.valorPISST                    = b.valorPISST,
      a.stCOFINS                      = b.stCOFINS,
      a.aliquotaCOFINS                = b.aliquotaCOFINS,
      a.valorAliquotaCOFINS           = b.valorAliquotaCOFINS,
      a.baseCOFINS                    = b.baseCOFINS,
      a.valorCOFINS                   = b.valorCOFINS,
      a.aliquotaCOFINSST              = b.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST         = b.valorAliquotaCOFINSST,
      a.baseCOFINSST                  = b.baseCOFINSST,
      a.valorCOFINSST                 = b.valorCOFINSST,
      a.stSimplesNacional             = b.stSimplesNacional,
      a.creditoSimplesNacional        = b.creditoSimplesNacional,
      a.baseCreditoSimplesNacional    = b.baseCreditoSimplesNacional,
      a.valorCreditoSimplesNacional   = b.valorCreditoSimplesNacional,
      a.stICMS                        = b.stICMS,
      a.modalidadeBaseCalcICMS        = b.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS               = b.reducaoBaseICMS,
      a.aliquotaICMS                  = b.aliquotaICMS,
      a.diferimentoICMS               = b.diferimentoICMS,
      a.motivoDesoneracaoICMS         = b.motivoDesoneracaoICMS,
      a.idBeneficio                   = b.idBeneficio,
      a.baseICMS                      = b.baseICMS,
      a.valorICMSoperacao             = b.valorICMSoperacao,
      a.valorICMSdiferido             = b.valorICMSdiferido,
      a.valorICMS                     = b.valorICMS,
      a.valorICMSdesoneracao          = b.valorICMSdesoneracao,
      a.modalidadeBaseCalcICMSST      = b.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST       = b.margemValorAdicionadoST,
      a.reducaoBaseST                 = b.reducaoBaseST,
      a.aliquotaICMSST                = b.aliquotaICMSST,
      a.aliquotaSTSuportConsFinal     = b.aliquotaSTSuportConsFinal,
      a.baseICMSST                    = b.baseICMSST,
      a.valorICMSST                   = b.valorICMSST,
      a.baseICMSSTAnteriormente       = b.baseICMSSTAnteriormente,
      a.valorICMSSTAnteriormente      = b.valorICMSSTAnteriormente,
      a.valorICMSProprioSubstituto    = b.valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo        = b.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo           = b.aliquotaICMSEfetivo,
      a.baseICMSEfetivo               = b.baseICMSEfetivo,
      a.valorICMSEfetivo              = b.valorICMSEfetivo,
      a.aliquotaICMSUFDestinatario    = b.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual     = b.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual     = b.partilhaICMSInterestadual,
      a.baseICMSUFDestinatario        = b.baseICMSUFDestinatario,
      a.valorICMSUFDestinatario       = b.valorICMSUFDestinatario,
      a.baseICMSUFRemetente           = b.baseICMSUFRemetente,
      a.valorICMSUFRemetente          = b.valorICMSUFRemetente,
      a.aliquotaFCP                   = b.aliquotaFCP,
      a.baseFCP                       = b.baseFCP,
      a.valorFCP                      = b.valorFCP,
      a.aliquotaFCPST                 = b.aliquotaFCPST,
      a.baseFCPST                     = b.baseFCPST,
      a.valorFCPST                    = b.valorFCPST,
      a.aliquotaFCPSTAnteriormente    = b.aliquotaFCPSTAnteriormente,
      a.baseFCPSTAnteriormente        = b.baseFCPSTAnteriormente,
      a.valorFCPSTAnteriormente       = b.valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario     = b.aliquotaFCPUFDestinatario,
      a.baseFCPUFDestinatario         = b.baseFCPUFDestinatario,
      a.valorFCPUFDestinatario        = b.valorFCPUFDestinatario,
      a.aliquotaestimadaimpfederais   = b.aliquotaestimadaimpfederais,
      a.aliquotaestimadaimpestaduais  = b.aliquotaestimadaimpestaduais,
      a.aliquotaestimadaimpmunicipais = b.aliquotaestimadaimpmunicipais,
      a.baseestimadaimpostos          = b.baseestimadaimpostos,
      a.valorestimadoimpfederais      = b.valorestimadoimpfederais,
      a.valorEstimadoImpEstaduais     = b.valorEstimadoImpEstaduais,
      a.valorEstimadoImpMunicipais    = b.valorEstimadoImpMunicipais,
      a.valorLiquidoItem              = b.valorLiquidoItem,
      a.observacoesDigitadas          = b.observacoesDigitadas,
      a.observacoes                   = b.observacoes
    WHEN NOT MATCHED THEN INSERT (
      idItemOrcamento,
      orcamento,
      sequencia,
      cancelado,
      pedidoCompraFornecedor,
      sequenciaPedidoCompraFornec,
      ambiente,
      ambienteObservacoes,
      modeloDocumento,
      estabelecimentoOriginal,
      vendedor,
      gradeProduto,
      atividadeServico,
      statusAtividadeServico,
      idFormulaTinta,
      personalizacao,
      idLoteEstoque,
      vinculoItemDocumento,
      operacaoFiscal,
      movimentaEstoque,
      geraFinanceiro,
      localEstoque,
      pessoaParticipante,
      dataEntrega,
      controleQuantidade,
      unidadeMedidaConversao,
      conversorQuantidade,
      loteMinimo,
      loteMultiplo,
      altura,
      largura,
      comprimento,
      pecas,
      quantidade,
      quantidadeConvertida,
      quantidadeSaldo,
      controleEntrega,
      pesoLiquido,
      pesoBruto,
      tipoPreco,
      tabelaPreco,
      precoSugestaoAPrazo,
      precoSugestaoAVista,
      precoDesconto,
      precoMinimo,
      usarPrecoAVista,
      precoUnitarioBruto,
      acrescimoUnitarioComposicao,
      precoUnitario,
      precoUnitarioConvertido,
      valorProdutoServicoBruto,
      valorProdutoServico,
      percDescontoItem,
      valorDescontoItem,
      percAcrescimoItem,
      valorAcrescimoItem,
      valorFreteItem,
      valorSeguroItem,
      valorAdicFreteMarinhaMerItem,
      valorDespesasAduaneirasItem,
      valorFreteGeral,
      valorSeguroGeral,
      valorDescontoGeral,
      valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral,
      valorDespesasAduaneirasGeral,
      valorBasePagamento,
      valorDescontoPagamento,
      valorOutrasDespesasPagamento,
      valorJurosPagamento,
      valorFreteTotal,
      valorSeguroTotal,
      valorDescontoTotal,
      valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal,
      valorDespesasAduaneirasTotal,
      cfop,
      indicadorISSQN,
      aliquotaISSQN,
      retidoISSQN,
      tributadoForaMunicipio,
      incentivoFiscal,
      listaServicos,
      cnae,
      idServicoMunicipio,
      numeroProcessoAdministrativo,
      baseISSQN,
      valorISSQN,
      retencaoIRRF,
      baseRetIRRF,
      valorRetIRRF,
      retencaoINSS,
      baseRetINSS,
      valorRetINSS,
      retencaoPIS,
      baseRetPIS,
      valorRetPIS,
      retencaoCOFINS,
      baseRetCOFINS,
      valorRetCOFINS,
      retencaoCSLL,
      baseRetCSLL,
      valorRetCSLL,
      retencaoOutros,
      baseRetOutros,
      valorRetOutros,
      aliquotaII,
      baseII,
      valorII,
      aliquotaIOF,
      baseIOF,
      valorIOF,
      codigoEnquadramentoIPI,
      stIPI,
      aliquotaIPI,
      valorAliquotaIPI,
      baseIPI,
      valorIPI,
      stPIS,
      aliquotaPIS,
      valorAliquotaPIS,
      basePIS,
      valorPIS,
      aliquotaPISST,
      valorAliquotaPISST,
      basePISST,
      valorPISST,
      stCOFINS,
      aliquotaCOFINS,
      valorAliquotaCOFINS,
      baseCOFINS,
      valorCOFINS,
      aliquotaCOFINSST,
      valorAliquotaCOFINSST,
      baseCOFINSST,
      valorCOFINSST,
      stSimplesNacional,
      creditoSimplesNacional,
      baseCreditoSimplesNacional,
      valorCreditoSimplesNacional,
      stICMS,
      modalidadeBaseCalcICMS,
      reducaoBaseICMS,
      aliquotaICMS,
      diferimentoICMS,
      motivoDesoneracaoICMS,
      idBeneficio,
      baseICMS,
      valorICMSOperacao,
      valorICMSDiferido,
      valorICMS,
      valorICMSDesoneracao,
      modalidadeBaseCalcICMSST,
      margemValorAdicionadoST,
      reducaoBaseST,
      aliquotaICMSST,
      aliquotaSTSuportConsFinal,
      baseICMSST,
      valorICMSST,
      baseICMSSTAnteriormente,
      valorICMSSTAnteriormente,
      valorICMSProprioSubstituto,
      reducaoBaseICMSEfetivo,
      aliquotaICMSEfetivo,
      baseICMSEfetivo,
      valorICMSEfetivo,
      aliquotaICMSUFDestinatario,
      aliquotaICMSInterestadual,
      partilhaICMSInterestadual,
      baseICMSUFDestinatario,
      valorICMSUFDestinatario,
      baseICMSUFRemetente,
      valorICMSUFRemetente,
      aliquotaFCP,
      baseFCP,
      valorFCP,
      aliquotaFCPST,
      baseFCPST,
      valorFCPST,
      aliquotaFCPSTAnteriormente,
      baseFCPSTAnteriormente,
      valorFCPSTAnteriormente,
      aliquotaFCPUFDestinatario,
      baseFCPUFDestinatario,
      valorFCPUFDestinatario,
      aliquotaEstimadaImpFederais,
      aliquotaEstimadaImpEstaduais,
      aliquotaEstimadaImpMunicipais,
      baseEstimadaImpostos,
      valorEstimadoImpFederais,
      valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais,
      valorLiquidoItem,
      observacoesDigitadas,
      observacoes)
    VALUES (
      b.idItemOrcamento,
      b.orcamento,
      b.sequencia,
      b.cancelado,
      b.pedidoCompraFornecedor,
      b.sequenciaPedidoCompraFornec,
      b.ambiente,
      b.ambienteObservacoes,
      b.modeloDocumento,
      b.estabelecimentoOriginal,
      b.vendedor,
      b.gradeProduto,
      b.atividadeServico,
      b.statusAtividadeServico,
      b.idFormulaTinta,
      b.personalizacao,
      b.idLoteEstoque,
      b.vinculoItemDocumento,
      b.operacaoFiscal,
      b.movimentaEstoque,
      b.geraFinanceiro,
      b.localEstoque,
      b.pessoaParticipante,
      b.dataEntrega,
      b.controleQuantidade,
      b.unidadeMedidaConversao,
      b.conversorQuantidade,
      b.loteMinimo,
      b.loteMultiplo,
      b.altura,
      b.largura,
      b.comprimento,
      b.pecas,
      b.quantidade,
      b.quantidadeConvertida,
      b.quantidadeSaldo,
      b.controleEntrega,
      b.pesoLiquido,
      b.pesoBruto,
      b.tipoPreco,
      b.tabelaPreco,
      b.precoSugestaoAPrazo,
      b.precoSugestaoAVista,
      b.precoDesconto,
      b.precoMinimo,
      b.usarPrecoAVista,
      b.precoUnitarioBruto,
      b.acrescimoUnitarioComposicao,
      b.precoUnitario,
      b.precoUnitarioConvertido,
      b.valorProdutoServicoBruto,
      b.valorProdutoServico,
      b.percDescontoItem,
      b.valorDescontoItem,
      b.percAcrescimoItem,
      b.valorAcrescimoItem,
      b.valorFreteItem,
      b.valorSeguroItem,
      b.valorAdicFreteMarinhaMerItem,
      b.valorDespesasAduaneirasItem,
      b.valorFreteGeral,
      b.valorSeguroGeral,
      b.valorDescontoGeral,
      b.valorOutrasDespesasGeral,
      b.valorAdicFreteMarinhaMerGeral,
      b.valorDespesasAduaneirasGeral,
      b.valorBasePagamento,
      b.valorDescontoPagamento,
      b.valorOutrasDespesasPagamento,
      b.valorJurosPagamento,
      b.valorFreteTotal,
      b.valorSeguroTotal,
      b.valorDescontoTotal,
      b.valorOutrasDespesasTotal,
      b.valorAdicFreteMarinhaMerTotal,
      b.valorDespesasAduaneirasTotal,
      b.cfop,
      b.indicadorISSQN,
      b.aliquotaISSQN,
      b.retidoISSQN,
      b.tributadoForaMunicipio,
      b.incentivoFiscal,
      b.listaServicos,
      b.cnae,
      b.idServicoMunicipio,
      b.numeroProcessoAdministrativo,
      b.baseISSQN,
      b.valorISSQN,
      b.retencaoIRRF,
      b.baseRetIRRF,
      b.valorRetIRRF,
      b.retencaoINSS,
      b.baseRetINSS,
      b.valorRetINSS,
      b.retencaoPIS,
      b.baseRetPIS,
      b.valorRetPIS,
      b.retencaoCOFINS,
      b.baseRetCOFINS,
      b.valorRetCOFINS,
      b.retencaoCSLL,
      b.baseRetCSLL,
      b.valorRetCSLL,
      b.retencaoOutros,
      b.baseRetOutros,
      b.valorRetOutros,
      b.aliquotaII,
      b.baseII,
      b.valorII,
      b.aliquotaIOF,
      b.baseIOF,
      b.valorIOF,
      b.codigoEnquadramentoIPI,
      b.stIPI,
      b.aliquotaIPI,
      b.valorAliquotaIPI,
      b.baseIPI,
      b.valorIPI,
      b.stPIS,
      b.aliquotaPIS,
      b.valorAliquotaPIS,
      b.basePIS,
      b.valorPIS,
      b.aliquotaPISST,
      b.valorAliquotaPISST,
      b.basePISST,
      b.valorPISST,
      b.stCOFINS,
      b.aliquotaCOFINS,
      b.valorAliquotaCOFINS,
      b.baseCOFINS,
      b.valorCOFINS,
      b.aliquotaCOFINSST,
      b.valorAliquotaCOFINSST,
      b.baseCOFINSST,
      b.valorCOFINSST,
      b.stSimplesNacional,
      b.creditoSimplesNacional,
      b.baseCreditoSimplesNacional,
      b.valorCreditoSimplesNacional,
      b.stICMS,
      b.modalidadeBaseCalcICMS,
      b.reducaoBaseICMS,
      b.aliquotaICMS,
      b.diferimentoICMS,
      b.motivoDesoneracaoICMS,
      b.idBeneficio,
      b.baseICMS,
      b.valorICMSOperacao,
      b.valorICMSDiferido,
      b.valorICMS,
      b.valorICMSDesoneracao,
      b.modalidadeBaseCalcICMSST,
      b.margemValorAdicionadoST,
      b.reducaoBaseST,
      b.aliquotaICMSST,
      b.aliquotaSTSuportConsFinal,
      b.baseICMSST,
      b.valorICMSST,
      b.baseICMSSTAnteriormente,
      b.valorICMSSTAnteriormente,
      b.valorICMSProprioSubstituto,
      b.reducaoBaseICMSEfetivo,
      b.aliquotaICMSEfetivo,
      b.baseICMSEfetivo,
      b.valorICMSEfetivo,
      b.aliquotaICMSUFDestinatario,
      b.aliquotaICMSInterestadual,
      b.partilhaICMSInterestadual,
      b.baseICMSUFDestinatario,
      b.valorICMSUFDestinatario,
      b.baseICMSUFRemetente,
      b.valorICMSUFRemetente,
      b.aliquotaFCP,
      b.baseFCP,
      b.valorFCP,
      b.aliquotaFCPST,
      b.baseFCPST,
      b.valorFCPST,
      b.aliquotaFCPSTAnteriormente,
      b.baseFCPSTAnteriormente,
      b.valorFCPSTAnteriormente,
      b.aliquotaFCPUFDestinatario,
      b.baseFCPUFDestinatario,
      b.valorFCPUFDestinatario,
      b.aliquotaEstimadaImpFederais,
      b.aliquotaEstimadaImpEstaduais,
      b.aliquotaEstimadaImpMunicipais,
      b.baseEstimadaImpostos,
      b.valorEstimadoImpFederais,
      b.valorEstimadoImpEstaduais,
      b.valorEstimadoImpMunicipais,
      b.valorLiquidoItem,
      b.observacoesDigitadas,
      b.observacoes);
    v_atualizarObservacoes := 0;
    IF p_idItemReferenciado > 0 THEN
      IF p_tipoDocumentoReferenciado = 'C' THEN
        UPDATE MOPAINELCOMPRAXGRADE
        SET idItemOrcamento = r_item_idItemOrcamento
        WHERE idGradePainelCompra = p_idItemReferenciado;
      ELSIF p_tipoDocumentoReferenciado = 'F' THEN
        ADD_ORCAMENTO_ITEM_REF_CONTR (
          p_estabelecimentoAtivo,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      ELSIF p_tipoDocumentoReferenciado = 'L' THEN
        ADD_ORCAMENTO_ITEM_LISTA_GRAVA (
          p_estabelecimentoAtivo,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      ELSIF p_tipoDocumentoReferenciado = 'O' THEN
        ADD_ORCAMENTO_ITEM_REF_ORCAMEN (
          p_estabelecimentoAtivo,
          r_item_idItemOrcamento,
          p_item_quantidade,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'T' THEN
        ADD_ORCAMENTO_ITEM_TRANS_GRAVA (
          p_estabelecimentoAtivo,
          v_cab_entradaSaida,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      END IF;
    END IF;
    IF p_tempComp_nomeTempComposicao <> ' '
      AND (p_tipoDocumentoReferenciado <> 'O'
        OR p_idItemReferenciado <= 0)
    THEN
      ADD_ORCAMENTO_ITEM_COMP_TEMP (
        p_sessaoClient,
        p_estabelecimentoAtivo,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        r_item_idItemOrcamento,
        v_atualizarObservacoes,
        v_atualizarObservacoes);
    END IF;
    v_idEnderecoEstoque := 0;
    IF p_item_idEnderecoEstoque > 0 THEN
      ADD_ORCAMENTO_ITEM_ENDER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemOrcamento,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_quantidade,
        ' ',
        v_idEnderecoEstoque);
    END IF;
    IF p_item_idNumeroSerie > 0 THEN
      ADD_ORCAMENTO_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemOrcamento,
        v_idEnderecoEstoque,
        p_item_gradeProduto,
        p_item_idNumeroSerie,
        0,
        v_auxNumber);
      v_atualizarObservacoes := 1;
    END IF;
    IF p_item_atividadeProjeto > 0 THEN
      ADD_ORCAMENTO_ITEM_PROJ_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemOrcamento,
        p_item_atividadeProjeto,
        v_auxNumber);
    END IF;
    IF v_atualizarObservacoes = 1 THEN
      v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
        p_sessaoClient,
        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_413_obs_add_marca,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        'O',
        r_item_idItemOrcamento,
        p_item_gradeProduto,
        p_item_idFormulaTinta,
        p_item_personalizacao,
        p_item_idLoteEstoque,
        p_item_controleQuantidade,
        p_item_loteMultiplo,
        p_item_altura,
        p_item_largura,
        p_item_comprimento,
        p_item_quantidade,
        p_item_observacoesDigitadas);
      UPDATE MOORCAMENTOXITENS
      SET observacoes = v_observacoes
      WHERE idItemOrcamento = r_item_idItemOrcamento;
    END IF;
    IF v_etOrc_situacaoOrcamento > 40 THEN
      ADD_ORCAMENTO_ITEM_RES_ITEM (
        r_item_idItemOrcamento,
        p_estabelecimentoAtivo,
        ' ',
        v_auxVarchar);
    END IF;
    r_buffer_item_idItemOrcamento := CASE WHEN (r_buffer_item_idItemOrcamento IS NULL OR r_buffer_item_idItemOrcamento = '' OR r_buffer_item_idItemOrcamento = ' ') THEN '' ELSE RTRIM (r_buffer_item_idItemOrcamento) || ';' END || TO_CHAR (LPAD(r_item_idItemOrcamento,14,'0'));
    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;
    IF p_item_idItemOrcamento <= 0
      AND v_item_cancelado = 0
      AND p_item_atividadeServico > 0
    THEN
      SELECT habilitaAtividadePrevista
      INTO v_auxNumber
      FROM PAATIVIDADESSERVICO
      WHERE atividadeServico = p_item_atividadeServico;
      IF v_auxNumber = 1 THEN
        ADD_ORCAMENTO_ITEM_PREV_INSERE (
          p_config_64_casasDecSaidas,
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_perfilUsuarioLogado,
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_estabelecimento,
          v_cab_pessoa,
          v_munEndEst_uf,
          v_munEndPess_uf,
          r_item_idItemOrcamento,
          p_item_atividadeServico,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_tipoPreco,
          p_item_tabelaPreco,
          v_item_precoUnitario,
          v_auxNumber);
        IF v_auxNumber = 1 THEN
          SELECT
            COUNT (1) numeroAtividades,
            SUM (
              CASE
                WHEN prev.faturarAtividade = 'P'
                THEN prev.quantidade
                ELSE COALESCE ((
                  SELECT realiz.quantidade
                  FROM MOORCAMENTOXATIVIDADEREAL realiz
                  WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
                  AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
              END) quantidade,
            MIN (prev.precoUnitario) precoUnitarioMenor,
            MAX (prev.precoUnitario) precoUnitarioMaior,
            SUM (ROUND (
              CASE
                WHEN prev.faturarAtividade = 'P'
                THEN prev.quantidade
                ELSE COALESCE ((
                  SELECT realiz.quantidade
                  FROM MOORCAMENTOXATIVIDADEREAL realiz
                  WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
                  AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
              END * prev.precoUnitario, 2)) valorTotalItem
          INTO
            v_ativ_numero,
            v_ativ_quantidade,
            v_ativ_precoUnitarioMenor,
            v_ativ_precoUnitario,
            v_ativ_valorTotalItem
          FROM MOORCAMENTOXATIVIDADEPREV prev
          WHERE prev.idItemOrcamento = r_item_idItemOrcamento
          AND prev.statusAtividadeServico <> 'C'
          AND prev.faturarAtividade IN ('P','R');
          IF v_ativ_numero > 0 THEN
            IF v_ativ_numero > 1
              AND v_ativ_precoUnitarioMenor <> v_ativ_precoUnitario
              AND v_ativ_quantidade <> 0
            THEN
              v_ativ_precoUnitario := ROUND (v_ativ_valorTotalItem / v_ativ_quantidade, TO_NUMBER (p_config_64_casasDecSaidas));
            END IF;
          ELSE
            SELECT
              COUNT (1) numeroAtividades,
              SUM (COALESCE ((
                SELECT realiz.quantidade
                FROM MOORCAMENTOXATIVIDADEREAL realiz
                WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
                AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)) quantidade
            INTO
              v_ativ_numero,
              v_ativ_quantidade
            FROM MOORCAMENTOXATIVIDADEPREV prev
            WHERE prev.idItemOrcamento = r_item_idItemOrcamento
            AND prev.statusAtividadeServico <> 'C';
            v_ativ_precoUnitario := 0;
          END IF;
          IF v_ativ_numero > 0
            AND (v_ativ_quantidade <> p_item_quantidade
              OR v_ativ_precoUnitario <> v_item_precoUnitario)
          THEN
            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_config_413_obs_add_marca,
              0, -- p_manterFinanceiro_Retotalizar,
              'T', -- p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
              0, -- p_buscarGeraFinanceiroEstoque,
              ' ', -- p_tipoDocumentoReferenciado, 
              0, -- p_idItemReferenciado,
              0, -- p_quantidadeReferenciada
              ' ', -- p_tempComp_nomeTempComposicao,
              0, -- p_tempComp_sequencia
              ' ', -- p_mensagemAviso,
              r_calcularImpostos,
              r_item_idItemOrcamento,
              p_item_orcamento,
              p_item_pedidoCompraFornecedor,
              p_item_sequenciaPedidoCompraFo,
              p_item_ambiente,
              p_item_ambienteObservacoes,
              p_item_vinculoItemDocumento,
              p_item_atividadeServico,
              p_item_statusAtividadeServico,
              p_item_controleEntrega,
              p_item_dataEntrega,
              p_item_modeloDocumento,
              p_item_estabelecimentoOriginal,
              p_item_vendedor,
              p_item_gradeProduto,
              p_item_idFormulaTinta,
              p_item_personalizacao,
              p_item_idLoteEstoque,
              0, -- p_item_idEnderecoEstoque
              0, -- p_item_idNumeroSerie
              0, -- p_item_atividadeProjeto,
              p_item_localEstoque,
              p_item_pessoaParticipante,
              p_item_controleQuantidade,
              p_item_unidadeMedidaConversao,
              p_item_conversorQuantidade,
              p_item_loteMinimo,
              p_item_loteMultiplo,
              p_item_altura,
              p_item_largura,
              p_item_comprimento,
              CASE p_item_controleQuantidade
                WHEN 2
                THEN CASE WHEN p_item_altura = 0 OR p_item_largura = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100))), 3) END
                WHEN 3
                THEN CASE WHEN p_item_altura = 0 OR p_item_comprimento = 0 OR p_item_comprimento = 0 THEN 0 ELSE ROUND (v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100) * p_item_comprimento), 3) END
                WHEN 4
                THEN CASE WHEN p_item_conversorQuantidade = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / p_item_conversorQuantidade), 3) END
                ELSE 0
              END, -- p_item_pecas
              v_ativ_quantidade,
              CASE p_item_controleQuantidade
                WHEN 2
                THEN ROUND (CASE WHEN p_item_altura = 0 OR p_item_largura = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100))), 3) END, v_uniMedConv_casasDecimaisUnid)
                WHEN 3
                THEN ROUND (CASE WHEN p_item_altura = 0 OR p_item_comprimento = 0 OR p_item_comprimento = 0 THEN 0 ELSE ROUND (v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100) * p_item_comprimento), 3) END, v_uniMedConv_casasDecimaisUnid)
                WHEN 4
                THEN ROUND (CASE WHEN p_item_conversorQuantidade = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / p_item_conversorQuantidade), 3) END, v_uniMedConv_casasDecimaisUnid)
                ELSE v_ativ_quantidade
              END, -- p_item_quantidadeConvertida
              ROUND ((v_ativ_quantidade * v_prod_pesoLiquido), 3), -- p_item_pesoLiquido
              ROUND ((v_ativ_quantidade * v_prod_pesoBruto), 3), -- p_item_pesoBruto
              p_item_tipoPreco,
              p_item_tabelaPreco,
              p_item_precoSugestaoAPrazo,
              p_item_precoSugestaoAVista,
              p_item_precoDesconto,
              p_item_precoMinimo,
              p_item_usarPrecoAVista,
              v_ativ_precoUnitario, -- p_item_precoUnitarioBruto
              p_item_acrescimoUnitarioCompos,
              v_ativ_precoUnitario, -- p_item_precoUnitario
              p_item_percDescontoItem,
              p_item_valorDescontoItem,
              p_item_percAcrescimoItem,
              p_item_valorAcrescimoItem,
              p_item_valorFreteItem,
              p_item_valorSeguroItem,
              p_item_valorAdicFreteMarItem,
              p_item_valorDespesasAduanItem,
              p_item_observacoesDigitadas,
              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,
              p_item_operacaoFiscal,
              v_item_movimentaEstoque,
              v_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
              0, -- p_nivel,
              ' ',
              v_auxVarchar, -- r_mensagemAviso
              r_calcularImpostos,
              v_auxNumber, -- idItemOrcamento
              v_auxVarchar, -- r_buffer_item_idItemOrcamento
              v_auxNumber -- r_valorInserido
            );
          END IF;
        END IF;
      END IF;
    END IF;
  END IF;
END ADD_ORCAMENTO_ITEM_GRAVA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_PREV_RECALC (
  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_config_413_obs_add_marca     IN NUMBER,
  p_idItemOrcamento              IN NUMBER)
IS
  v_calcularImpostos        NUMBER;
  v_ativ_numero             NUMBER;
  v_ativ_quantidade         NUMBER;
  v_ativ_precoUnitarioMenor NUMBER;
  v_ativ_precoUnitario      NUMBER;
  v_ativ_valorTotalItem     NUMBER;
  v_auxNumber               NUMBER;
  v_auxVarchar              VARCHAR2 (32000);
BEGIN
  v_calcularImpostos := 0;
  SELECT
    COUNT (1) numeroAtividades,
    SUM (
      CASE
        WHEN prev.faturarAtividade = 'P'
        THEN prev.quantidade
        ELSE COALESCE ((
          SELECT realiz.quantidade
          FROM MOORCAMENTOXATIVIDADEREAL realiz
          WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
          AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
      END) quantidade,
    MIN (prev.precoUnitario) precoUnitarioMenor,
    MAX (prev.precoUnitario) precoUnitarioMaior,
    SUM (ROUND (
      CASE
        WHEN prev.faturarAtividade = 'P'
        THEN prev.quantidade
        ELSE COALESCE ((
          SELECT realiz.quantidade
          FROM MOORCAMENTOXATIVIDADEREAL realiz
          WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
          AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
      END * prev.precoUnitario, 2)) valorTotalItem
  INTO
    v_ativ_numero,
    v_ativ_quantidade,
    v_ativ_precoUnitarioMenor,
    v_ativ_precoUnitario,
    v_ativ_valorTotalItem
  FROM MOORCAMENTOXATIVIDADEPREV prev
  WHERE prev.idItemOrcamento = p_idItemOrcamento
  AND prev.statusAtividadeServico <> 'C'
  AND prev.faturarAtividade IN ('P','R');
  IF v_ativ_numero > 0 THEN
    IF v_ativ_numero > 1
      AND v_ativ_precoUnitarioMenor <> v_ativ_precoUnitario
      AND v_ativ_quantidade <> 0
    THEN
      v_ativ_precoUnitario := ROUND (v_ativ_valorTotalItem / v_ativ_quantidade, TO_NUMBER (p_config_64_casasDecSaidas));
    END IF;
  ELSE
    SELECT
      COUNT (1) numeroAtividades,
      SUM (COALESCE ((
        SELECT realiz.quantidade
        FROM MOORCAMENTOXATIVIDADEREAL realiz
        WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
        AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)) quantidade
    INTO
      v_ativ_numero,
      v_ativ_quantidade
    FROM MOORCAMENTOXATIVIDADEPREV prev
    WHERE prev.idItemOrcamento = p_idItemOrcamento
    AND prev.statusAtividadeServico <> 'C';
    v_ativ_precoUnitario := 0;
  END IF;
  IF v_ativ_numero > 0 THEN
    FOR a IN (
      SELECT
        a.orcamento,
        a.pedidoCompraFornecedor,
        a.sequenciaPedidoCompraFornec,
        a.ambiente,
        a.ambienteObservacoes,
        a.vinculoItemDocumento,
        a.atividadeServico,
        a.statusAtividadeServico,
        a.controleEntrega,
        a.dataEntrega,
        a.modeloDocumento,
        a.estabelecimentoOriginal,
        a.vendedor,
        a.gradeProduto,
        a.idFormulaTinta,
        a.personalizacao,
        a.idLoteEstoque,
        a.localEstoque,
        a.pessoaParticipante,
        a.controleQuantidade,
        a.unidadeMedidaConversao,
        a.conversorQuantidade,
        a.loteMinimo,
        a.loteMultiplo,
        a.altura,
        a.largura,
        a.comprimento,
        a.quantidade,
        a.precoUnitario,
        a.tipoPreco,
        a.tabelaPreco,
        a.precoSugestaoAPrazo,
        a.precoSugestaoAVista,
        a.precoDesconto,
        a.precoMinimo,
        a.usarPrecoAVista,
        a.acrescimoUnitarioComposicao,
        a.percDescontoItem,
        a.valorDescontoItem,
        a.percAcrescimoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.observacoesDigitadas,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.operacaoFiscal,
        a.movimentaEstoque,
        a.geraFinanceiro,
        prod.pesoLiquido prod_pesoLiquido,
        prod.pesoBruto prod_pesoBruto,
        unMedConv.casasDecimaisUnidadeMedida unMedConv_casasDecimais
      FROM MOORCAMENTOXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN SIUNIDADESMEDIDA unMedConv
      ON unMedConv.unidadeMedida = a.unidadeMedidaConversao
      WHERE a.idItemOrcamento = p_idItemOrcamento)
    LOOP   
      IF v_ativ_quantidade <> a.quantidade
        OR v_ativ_precoUnitario <> a.precoUnitario
      THEN
        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_config_413_obs_add_marca,
          0, -- p_manterFinanceiro_Retotalizar,
          'T', -- p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
          0, -- p_buscarGeraFinanceiroEstoque,
          ' ', -- p_tipoDocumentoReferenciado, 
          0, -- p_idItemReferenciado,
          0, -- p_quantidadeReferenciada
          ' ', -- p_tempComp_nomeTempComposicao,
          0, -- p_tempComp_sequencia
          ' ', -- p_mensagemAviso,
          0, -- p_calcularImpostos
          p_idItemOrcamento,
          a.orcamento,
          a.pedidoCompraFornecedor,
          a.sequenciaPedidoCompraFornec,
          a.ambiente,
          a.ambienteObservacoes,
          a.vinculoItemDocumento,
          a.atividadeServico,
          a.statusAtividadeServico,
          a.controleEntrega,
          a.dataEntrega,
          a.modeloDocumento,
          a.estabelecimentoOriginal,
          a.vendedor,
          a.gradeProduto,
          a.idFormulaTinta,
          a.personalizacao,
          a.idLoteEstoque,
          0, -- p_item_idEnderecoEstoque
          0, -- p_item_idNumeroSerie
          0, -- p_item_atividadeProjeto,
          a.localEstoque,
          a.pessoaParticipante,
          a.controleQuantidade,
          a.unidadeMedidaConversao,
          a.conversorQuantidade,
          a.loteMinimo,
          a.loteMultiplo,
          a.altura,
          a.largura,
          a.comprimento,
          CASE a.controleQuantidade
            WHEN 2
            THEN ROUND (CASE WHEN a.altura = 0 OR a.largura = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / ((a.altura / 100) * (a.largura / 100))), 3) END, 6)
            WHEN 3
            THEN ROUND (CASE WHEN a.altura = 0 OR a.comprimento = 0 OR a.comprimento = 0 THEN 0 ELSE ROUND (v_ativ_quantidade / ((a.altura / 100) * (a.largura / 100) * a.comprimento), 3) END, 6)
            WHEN 4
            THEN ROUND (CASE WHEN a.conversorQuantidade = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / a.conversorQuantidade), 3) END, 6)
            ELSE 0
          END, -- p_item_pecas
          v_ativ_quantidade,
          CASE a.controleQuantidade
            WHEN 2
            THEN ROUND (CASE WHEN a.altura = 0 OR a.largura = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / ((a.altura / 100) * (a.largura / 100))), 3) END, a.unMedConv_casasDecimais)
            WHEN 3
            THEN ROUND (CASE WHEN a.altura = 0 OR a.comprimento = 0 OR a.comprimento = 0 THEN 0 ELSE ROUND (v_ativ_quantidade / ((a.altura / 100) * (a.largura / 100) * a.comprimento), 3) END, a.unMedConv_casasDecimais)
            WHEN 4
            THEN ROUND (CASE WHEN a.conversorQuantidade = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / a.conversorQuantidade), 3) END, a.unMedConv_casasDecimais)
            ELSE v_ativ_quantidade
          END, -- p_item_quantidadeConvertida
          ROUND ((v_ativ_quantidade * a.prod_pesoLiquido), 3), -- p_item_pesoLiquido
          ROUND ((v_ativ_quantidade * a.prod_pesoBruto), 3), -- p_item_pesoBruto
          a.tipoPreco,
          a.tabelaPreco,
          a.precoSugestaoAPrazo,
          a.precoSugestaoAVista,
          a.precoDesconto,
          a.precoMinimo,
          a.usarPrecoAVista,
          v_ativ_precoUnitario, -- p_item_precoUnitarioBruto
          a.acrescimoUnitarioComposicao,
          v_ativ_precoUnitario, -- p_item_precoUnitario
          a.percDescontoItem,
          a.valorDescontoItem,
          a.percAcrescimoItem,
          a.valorAcrescimoItem,
          a.valorFreteItem,
          a.valorSeguroItem,
          a.valorAdicFreteMarinhaMerItem,
          a.valorDespesasAduaneirasItem,
          a.observacoesDigitadas,
          a.valorFreteGeral,
          a.valorSeguroGeral,
          a.valorDescontoGeral,
          a.valorOutrasDespesasGeral,
          a.valorAdicFreteMarinhaMerGeral,
          a.valorDespesasAduaneirasGeral,
          a.valorDescontoPagamento,
          a.valorOutrasDespesasPagamento,
          a.valorJurosPagamento,
          a.operacaoFiscal,
          a.movimentaEstoque,
          a.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
          0, -- p_nivel,
          ' ',
          v_auxVarchar, -- r_mensagemAviso
          v_calcularImpostos,
          v_auxNumber, -- idItemOrcamento
          v_auxVarchar, -- r_buffer_idItemOrcamento
          v_auxNumber -- r_valorInserido
        );
        IF v_calcularImpostos = 1 THEN
          ADD_ORCAMENTO_CALC_IMP_CAB (
            p_config_64_casasDecSaidas,
            p_config_209_filtrarGrupoEcon,
            p_config_362_calcCustoPorGrade,
            a.orcamento,
            ' ', -- p_troca_tipoPagamentoFrete,
            ' '); --p_a_cab_tipoPagamentoFrete
        END IF;
      END IF;
    END LOOP;
  END IF;
END ADD_ORCAMENTO_ITEM_PREV_RECALC;

/

UPDATE SIVERSOESSISTEMA SET dataLiberacaoVersao = TO_DATE('20/05/2024','DD/MM/YYYY'), dataAtualizacaoVersao =  SYSDATE, observacoes = 'BETA 9' WHERE idVersaoSistema = 2024001002;

-- FIM BETA 9 - 20/5/24

ALTER TABLE PAATIVIDADEOSXPREVISTA ADD CONSTRAINT PAATIVIDADEOSXPREVISTA_FK3 FOREIGN KEY (tecnico) REFERENCES CATECNICOS (tecnico);

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.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;
    FOR b IN (
      SELECT
        id,
        idItemContrato,
        quantidade
      FROM MOCONTRATOXORCAMENTO
      WHERE idItemOrcamento = p_item_idItemOrcamento)
    LOOP
      UPDATE MOCONTRATOXITENS c
      SET c.quantidadeSaldo = c.quantidadeSaldo + b.quantidade
      WHERE c.idItemContrato = b.idItemContrato;
      DELETE MOCONTRATOXORCAMENTO c
      WHERE c.id = b.id;
    END LOOP;
    -- 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;
    UPDATE MOORCAMENTOXNUMEROSSERIE numSer
    SET numSer.efetivado = 0
    WHERE numSer.efetivado = 1
    AND EXISTS (
      SELECT 1
      FROM MOORCAMENTOXORCAMENTO docXDoc
      WHERE docXDoc.idItemOrcamento = p_item_idItemOrcamento
      AND docXDoc.idItemOrcamentoReferenc = numSer.idItemOrcamento
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MOORCAMENTOXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemOrcamento = p_item_idItemOrcamento
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    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 MOORCAMENTOXTAREFAS b
      WHERE b.idAtividadePrevOrcamento > 0
      AND EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV c
        WHERE c.idAtividadePrevOrcamento = b.idAtividadePrevOrcamento
        AND c.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_PRE_DOC_ITEM_EXCLUI (
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_person_184_tipoEventoCancCon IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_95_etapaOrcamentoCanc IN NUMBER,
  p_config_96_etapaOrdemServCanc IN NUMBER,
  p_config_97_etapaPedCompraCanc IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_415_etapaFatContrCanc IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemPreDocumento      IN NUMBER,
  p_cancelando_Excluindo         IN CHAR,
  p_cancelandoExcluindoDocumento IN NUMBER,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_atualizaUltimaCompra     NUMBER;
  v_cab_estabelecimento          NUMBER;
  v_cab_documentoFiscal          NUMBER;
  v_cab_dataEntradaSaida         DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  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_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota NUMBER;
  v_cab_promocaoExiste           NUMBER;
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  FOR a IN (
    SELECT
      item.preDocumento,
      item.gradeProduto,
      item.cancelado,
      item.usarPrecoAVista,
      item.geraFinanceiro,
      item.controleQuantidade,
      item.loteMultiplo,
      item.quantidade,
      item.quantidadeConvertida,
      item.quantidadeDevolvidaRetornada,
      item.pesoLiquido,
      item.pesoBruto,
      item.valorProdutoServicoBruto,
      item.valorProdutoServico,
      item.valorDescontoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      item.valorFreteGeral,
      item.valorSeguroGeral,
      item.valorDescontoGeral,
      item.valorOutrasDespesasGeral,
      item.valorAdicFreteMarinhaMerGeral,
      item.valorDespesasAduaneirasGeral,
      item.valorBasePagamento,
      item.valorDescontoPagamento,
      item.valorOutrasDespesasPagamento,
      item.valorJurosPagamento,
      item.valorFreteTotal,
      item.valorSeguroTotal,
      item.valorDescontoTotal,
      item.valorOutrasDespesasTotal,
      item.valorAdicFreteMarinhaMerTotal,
      item.valorDespesasAduaneirasTotal,
      item.valorLiquidoItem,
      item.valorDescontoCustoOpItem,
      item.valorDescontoCustoOpGeral,
      item.valorDescontoCustoOpTotal,
      item.valorAcrescimoCustoOpItem,
      item.valorAcrescimoCustoOpGeral,
      item.valorAcrescimoCustoOpTotal,
      item.valorCustoOperacao,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.valorAcrescimoExtempSubtotal,
      item.valorAcrescimoExtempItem,
      item.valorAcrescimoExtempGeral,
      item.valorAcrescimoExtempTotal,
      gradProd.produto,
      prod.tipoProduto
    FROM MOPREDOCUMXITENS item
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE item.idItemPreDocumento = p_item_idItemPreDocumento)
  LOOP
    SELECT
      cab.origemDocumento,
      cab.tipoDocumento,
      cab.entradaSaida,
      cab.devolucaoAnulacaoRetorno,
      cab.atualizaCustoMedio,
      cab.atualizaUltimaCompra,
      cab.estabelecimento,
      cab.documentoFiscal,
      cab.dataEntradaSaida,
      cab.pessoa,
      cab.modalidadeFrete,
      cab.tipoPagamentoFrete,
      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,
      cab.valorDescontoCustoOpItem,
      cab.valorDescontoCustoOpGeral,
      cab.valorDescontoCustoOpTotal,
      cab.valorAcrescimoCustoOpItem,
      cab.valorAcrescimoCustoOpGeral,
      cab.valorAcrescimoCustoOpTotal,
      cab.valorCustoOperacao,
      cab.valorCMV,
      cab.quantidadeExtemporanea,
      cab.valorAcrescimoExtempSubtotal,
      cab.valorAcrescimoExtempItem,
      cab.valorAcrescimoExtempGeral,
      cab.valorAcrescimoExtempTotal
    INTO
      v_cab_origemDocumento,
      v_cab_tipoDocumento,
      v_cab_entradaSaida,
      v_cab_devolucaoAnulacaoRetorno,
      v_cab_atualizaCustoMedio,
      v_cab_atualizaUltimaCompra,
      v_cab_estabelecimento,
      v_cab_documentoFiscal,
      v_cab_dataEntradaSaida,
      v_cab_pessoa,
      v_cab_modalidadeFrete,
      v_cab_tipoPagamentoFrete,
      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_cab_valorDescontoCustoOpItem,
      v_cab_valorDescontoCustoOpGera,
      v_cab_valorDescontoCustoOpTota,
      v_cab_valorAcrescimoCustoOpIte,
      v_cab_valorAcrescimoCustoOpGer,
      v_cab_valorAcrescimoCustoOpTot,
      v_cab_valorCustoOperacao,
      v_cab_valorCMV,
      v_cab_quantidadeExtemporanea,
      v_cab_valorAcrescimoExtempSubt,
      v_cab_valorAcrescimoExtempItem,
      v_cab_valorAcrescimoExtempGera,
      v_cab_valorAcrescimoExtempTota
    FROM MOPREDOCUMENTOS cab
    WHERE cab.preDocumento = a.preDocumento;
    IF p_cancelandoExcluindoDocumento = 0
      AND a.cancelado = 0
    THEN
      SELECT COALESCE (MAX(1), 0)
      INTO v_cab_promocaoExiste
      FROM MOPREDOCUMXPROMOCOES
      WHERE preDocumento = a.preDocumento;
      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 NOT(p_person_190_modeloFrete IS NULL)
        AND p_person_190_modeloFrete <> ' '
        AND a.valorFreteTotal <> 0
        AND v_cab_valorFreteTotal - a.valorFreteTotal <= 0
      THEN
        v_cab_modalidadeFrete := '9';
      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;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      IF v_cab_valorDescontoGeral <> 0
        OR v_cab_valorOutrasDespesasGeral <> 0
        OR v_cab_valorPagamentoBruto <> 0
        OR v_cab_promocaoExiste = 1
      THEN
        ADD_PRE_DOC_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          a.preDocumento,
          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;
      UPDATE MOPREDOCUMENTOS SET
        modalidadeFrete               = v_cab_modalidadeFrete,
        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,
        valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
        valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
        valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
        valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
        valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
        valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
        valorCustoOperacao            = v_cab_valorCustoOperacao,
        valorCMV                      = v_cab_valorCMV,
        quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
        valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
        valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
        valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
        valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
      WHERE preDocumento = a.preDocumento;
    END IF;
    -- Cancela / Exclui Transferências vinculadas.
    FOR b IN (
      SELECT
        itemTransf.documentoTransferencia,
        docXTransf.entradaSaidaOriginal
      FROM MODOCTRANSFXPREDOCUM docXTransf
      JOIN MODOCUMENTOTRANSFXITENS itemTransf
      ON itemTransf.idItemDocTransferencia = docXTransf.idItemDocTransferencia
      WHERE docXTransf.idItemPreDocumento = p_item_idItemPreDocumento
      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 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 docXTransf2.idItemPreDocumento <> docXTransf.idItemPreDocumento)
      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 = 'C' THEN
        ADD_DOCTRANSF_CAB_SIT_GRAVA (
          p_estabelecimentoAtivo,
          b.documentoTransferencia,
          'C',
          'Cancelamento Automático');
      END IF;
    END LOOP;
    IF v_cab_entradaSaida='E'
      AND v_cab_devolucaoAnulacaoRetorno = 0
      AND v_cab_atualizaUltimaCompra = 1
    THEN
      ADD_PRODUTO_CUSTO_DATA_EXCLUI (
        a.produto,
        v_cab_dataEntradaSaida);
    END IF;
    ADD_MOTIVO_PRE_DOC_ITE_EXCLUI (
      p_item_idItemPreDocumento,
      0,
      v_auxNumber);
    ADD_ESTOQUE_PRE_DOC_EXCLUI (
      p_item_idItemPreDocumento,
      '',
      v_auxVarchar);
    ADD_VALEDESCONTO_PRE_ITE_EXCL (
      p_item_idItemPreDocumento,
      '',
      v_auxVarchar);
    ADD_SEPARACAO_ITEM_PRE_EXCLUI (p_item_idItemPreDocumento);
    DELETE MOPREDOCUMXPRODUTOFILHO
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    DELETE MOPREDOCUMXPROMOCOES
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    DELETE MOINGRESSOS
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    DELETE CATABELAPRECOXFORMACOESPR
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    UPDATE MOORCAMENTOXNUMEROSSERIE numSer
    SET numSer.efetivado = 0
    WHERE numSer.efetivado = 1
    AND EXISTS (
      SELECT 1
      FROM MOPREDOCUMXORCAMENTOITEM docXDoc
      WHERE docXDoc.idItemPreDocumento = p_item_idItemPreDocumento
      AND docXDoc.idItemOrcamento = numSer.idItemOrcamento
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MOPREDOCUMXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemPreDocumento = p_item_idItemPreDocumento
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    UPDATE MOPREDOCUMXNUMEROSSERIE numSer
    SET numSer.devolvidoRetornado = 0
    WHERE numSer.devolvidoRetornado = 1
    AND EXISTS (
      SELECT 1
      FROM MOPREDOCUMXPREDOCUM docXDoc
      WHERE docXDoc.idItemPreDocumento = p_item_idItemPreDocumento
      AND docXDoc.idItemPreDocReferenciado = numSer.idItemPreDocumento
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MOPREDOCUMXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemPreDocumento = p_item_idItemPreDocumento
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    UPDATE MODOCFISCALXNUMEROSSERIE numSer
    SET numSer.devolvidoRetornado = 0
    WHERE numSer.devolvidoRetornado = 1
    AND EXISTS (
      SELECT 1
      FROM MOPREDOCUMXDOCFISCAL docXDoc
      WHERE docXDoc.idItemPreDocumento > 0
      AND docXDoc.idItemDocFiscalReferenciado = numSer.idItemDocFiscal
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MOPREDOCUMXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemPreDocumento > 0
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    FOR b IN (
      SELECT
        entrega,
        idItemOrcamento,
        quantidade
      FROM MOENTREGAS
      WHERE idItemPreDocumentoRemessa = p_item_idItemPreDocumento)
    LOOP
      ADD_ENTREGA_SITUACAO_TROCA (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        b.idItemOrcamento,
        b.entrega,
        b.quantidade,
        1, -- p_situacaoEntrega
        'ADD_PRE_DOC_ITEM_EXCLUI');
      ADD_ENTREGA_CRIA_PENDENTE (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        b.idItemOrcamento);
    END LOOP;
    FOR b IN (
      SELECT idConserto
      FROM MOCONSERTOS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      IF p_cancelando_Excluindo = 'C' THEN
        ADD_CONSERTO_CANCELA(
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_person_184_tipoEventoCancCon,
          b.idConserto);
      ELSE
        ADD_CONSERTO_EXCLUI(b.idConserto);
      END IF;
    END LOOP;
    UPDATE MOCONSERTOS SET
      idItemPreDocumentoDevolucao = 0,
      situacaoConserto = 'I'
    WHERE idItemPreDocumentoDevolucao = p_item_idItemPreDocumento;
    FOR b IN (
      SELECT
        id,
        idItemOrcamento,
        quantidade
      FROM MOPREDOCUMXORCAMENTOITEM
      WHERE idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      IF b.quantidade <> 0 THEN
        ADD_ORCAMENTO_ITEM_SALDO_VOLTA (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_person_184_tipoEventoCancCon,
          p_config_95_etapaOrcamentoCanc,
          p_config_96_etapaOrdemServCanc,
          p_config_97_etapaPedCompraCanc,
          p_config_415_etapaFatContrCanc,
          b.idItemOrcamento,
          b.quantidade);
      END IF;
      DELETE MOPREDOCUMXORCAMENTOITEM c
      WHERE c.id = b.id;
    END LOOP;
    FOR b IN (
      SELECT
        docXDoc.id,
        docXDoc.idItemPreDocReferenciado,
        docXDoc.quantidade,
        itemPre.preDocumento,
        cabPre.statusPreDocumento
      FROM MOPREDOCUMXPREDOCUM docXDoc
      JOIN MOPREDOCUMXITENS itemPre
      ON itemPre.idItemPreDocumento = docXDoc.idItemPreDocReferenciado
      JOIN MOPREDOCUMENTOS cabPre
      ON cabPre.predocumento = itemPre.preDocumento
      WHERE docXDoc.idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      IF v_cab_devolucaoAnulacaoRetorno = 1 THEN
        FOR c IN (
          SELECT
            c.entrega,
            c.idItemOrcamento,
            c.quantidade,
            c.situacaoEntrega
          FROM MOENTREGAS c
          WHERE c.idItemPreDocumentoRemessa = b.idItemPreDocReferenciado
          AND c.situacaoEntrega IN (6,7))
        LOOP
          ADD_ENTREGA_SITUACAO_TROCA (
            p_usuarioLogado,
            p_estabelecimentoAtivo,
            c.idItemOrcamento,
            c.entrega,
            c.quantidade,
            c.situacaoEntrega - 1,
            'ADD_PRE_DOC_ITEM_EXCLUI');
          ADD_ENTREGA_CRIA_PENDENTE (
            p_usuarioLogado,
            p_estabelecimentoAtivo,
            c.idItemOrcamento);
        END LOOP;
      END IF;
      IF b.quantidade <> 0 THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_devolucaoAnulacaoRetorno,
          'P',
          p_item_idItemPreDocumento,
          - b.quantidade,
          - a.quantidadeConvertida,
          'P',
          b.idItemPreDocReferenciado);
      END IF;
      IF b.statusPreDocumento = 'F' THEN
        UPDATE MOPREDOCUMENTOS c
        SET c.statusPreDocumento = 'A'
        WHERE c.preDocumento = b.preDocumento;
      END IF;
      DELETE MOPREDOCUMXPREDOCUM c
      WHERE c.id = b.id;
    END LOOP;
    DELETE MOPREDOCUMXPREDOCUM
    WHERE idItemPreDocReferenciado = p_item_idItemPreDocumento;
    FOR b IN (
      SELECT
        id,
        idItemDocFiscalReferenciado,
        quantidade
      FROM MOPREDOCUMXDOCFISCAL
      WHERE idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      IF v_cab_devolucaoAnulacaoRetorno = 1 THEN
        FOR c IN (
          SELECT
            c.entrega,
            c.idItemOrcamento,
            c.quantidade,
            c.situacaoEntrega
          FROM MOENTREGAS c
          WHERE c.idItemDocFiscalRemessa = b.idItemDocFiscalReferenciado
          AND c.situacaoEntrega IN (6,7))
        LOOP
          ADD_ENTREGA_SITUACAO_TROCA (
            p_usuarioLogado,
            p_estabelecimentoAtivo,
            c.idItemOrcamento,
            c.entrega,
            c.quantidade,
            c.situacaoEntrega - 1,
            'ADD_PRE_DOC_ITEM_EXCLUI');
          ADD_ENTREGA_CRIA_PENDENTE (
            p_usuarioLogado,
            p_estabelecimentoAtivo,
            c.idItemOrcamento);
        END LOOP;
      END IF;
      IF b.quantidade <> 0 THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_devolucaoAnulacaoRetorno,
          'P',
          p_item_idItemPreDocumento,
          - b.quantidade,
          - a.quantidadeConvertida,
          'D',
          b.idItemDocFiscalReferenciado);
      END IF;
      DELETE MOPREDOCUMXDOCFISCAL c
      WHERE c.id = b.id;
    END LOOP;
    DELETE MODOCFISCALXPREDOCUM
    WHERE idItemPreDocReferenciado = p_item_idItemPreDocumento;
    DELETE MODOCTRANSFXPREDOCUM
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    IF p_cancelando_Excluindo = 'C' THEN
      UPDATE MOPREDOCUMXITENS
      SET cancelado = 1
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    ELSE
      DELETE MOPREDOCUMXCOMPOSICOESPR
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXNUMEROSSERIE
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXNUMEROSSERIE b
      WHERE b.idEnderecoEstoquePreDocumento > 0
      AND EXISTS (
        SELECT 1
        FROM MOPREDOCUMXENDERECOESTOQ c
        WHERE c.idEnderecoEstoquePreDocumento = b.idEnderecoEstoquePreDocumento
        AND c.idItemPreDocumento = p_item_idItemPreDocumento);
      DELETE MOPREDOCUMXENDERECOESTOQ
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXEMBALAGENSTIN
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXCENTROSCUSTOS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXPROJETOS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MODOCTROCAXITENS
      WHERE idItemPreDocumentoSaida = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXITENS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      IF p_cancelandoExcluindoDocumento = 0 THEN
        v_auxNumber := 0;
        FOR b IN (
          SELECT idItemPreDocumento
          FROM MOPREDOCUMXITENS b
          WHERE b.preDocumento = a.preDocumento
          AND b.idItemPreDocumento <> p_item_idItemPreDocumento
          ORDER BY b.sequencia)
        LOOP
          v_auxNumber := v_auxNumber + 1;
          UPDATE MOPREDOCUMXITENS c
          SET c.sequencia = v_auxNumber
          WHERE c.idItemPreDocumento = b.idItemPreDocumento;
        END LOOP;
      END IF;
    END IF;
  END LOOP;
END ADD_PRE_DOC_ITEM_EXCLUI;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_EXCLUI (
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_person_184_tipoEventoCancCon IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_95_etapaOrcamentoCanc IN NUMBER,
  p_config_96_etapaOrdemServCanc IN NUMBER,
  p_config_97_etapaPedCompraCanc IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_415_etapaFatContrCanc IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_cancelando_Excluindo         IN CHAR,
  p_cancelandoExcluindoDocumento IN NUMBER,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_atualizaUltimaCompra     NUMBER;
  v_cab_estabelecimento          NUMBER;
  v_cab_nfFornecedor             NUMBER;
  v_cab_documentoFiscal          NUMBER;
  v_cab_dataEntradaSaida         DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  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_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota NUMBER;
  v_cab_promocaoExiste           NUMBER;
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  FOR a IN (
    SELECT
      item.idDocumentoFiscal,
      item.gradeProduto,
      item.cancelado,
      item.usarPrecoAVista,
      item.geraFinanceiro,
      item.controleQuantidade,
      item.loteMultiplo,
      item.quantidade,
      item.quantidadeConvertida,
      item.pesoLiquido,
      item.pesoBruto,
      item.valorProdutoServicoBruto,
      item.valorProdutoServico,
      item.valorDescontoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      item.valorFreteGeral,
      item.valorSeguroGeral,
      item.valorDescontoGeral,
      item.valorOutrasDespesasGeral,
      item.valorAdicFreteMarinhaMerGeral,
      item.valorDespesasAduaneirasGeral,
      item.valorBasePagamento,
      item.valorDescontoPagamento,
      item.valorOutrasDespesasPagamento,
      item.valorJurosPagamento,
      item.valorFreteTotal,
      item.valorSeguroTotal,
      item.valorDescontoTotal,
      item.valorOutrasDespesasTotal,
      item.valorAdicFreteMarinhaMerTotal,
      item.valorDespesasAduaneirasTotal,
      item.valorLiquidoItem,
      item.valorDescontoCustoOpItem,
      item.valorDescontoCustoOpGeral,
      item.valorDescontoCustoOpTotal,
      item.valorAcrescimoCustoOpItem,
      item.valorAcrescimoCustoOpGeral,
      item.valorAcrescimoCustoOpTotal,
      item.valorCustoOperacao,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.valorAcrescimoExtempSubtotal,
      item.valorAcrescimoExtempItem,
      item.valorAcrescimoExtempGeral,
      item.valorAcrescimoExtempTotal,
      gradProd.produto,
      prod.tipoProduto
    FROM MODOCFISCALXITENS item
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE item.idItemDocFiscal = p_item_idItemDocFiscal)
  LOOP
    SELECT
      cab.origemDocumento,
      cab.tipoDocumento,
      cab.entradaSaida,
      cab.devolucaoAnulacaoRetorno,
      cab.atualizaCustoMedio,
      cab.atualizaUltimaCompra,
      cab.estabelecimento,
      cab.nfFornecedor,
      cab.documentoFiscal,
      cab.dataEntradaSaida,
      cab.pessoa,
      cab.modalidadeFrete,
      cab.tipoPagamentoFrete,
      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,
      cab.valorDescontoCustoOpItem,
      cab.valorDescontoCustoOpGeral,
      cab.valorDescontoCustoOpTotal,
      cab.valorAcrescimoCustoOpItem,
      cab.valorAcrescimoCustoOpGeral,
      cab.valorAcrescimoCustoOpTotal,
      cab.valorCustoOperacao,
      cab.valorCMV,
      cab.quantidadeExtemporanea,
      cab.valorAcrescimoExtempSubtotal,
      cab.valorAcrescimoExtempItem,
      cab.valorAcrescimoExtempGeral,
      cab.valorAcrescimoExtempTotal
    INTO
      v_cab_origemDocumento,
      v_cab_tipoDocumento,
      v_cab_entradaSaida,
      v_cab_devolucaoAnulacaoRetorno,
      v_cab_atualizaCustoMedio,
      v_cab_atualizaUltimaCompra,
      v_cab_estabelecimento,
      v_cab_nfFornecedor,
      v_cab_documentoFiscal,
      v_cab_dataEntradaSaida,
      v_cab_pessoa,
      v_cab_modalidadeFrete,
      v_cab_tipoPagamentoFrete,
      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_cab_valorDescontoCustoOpItem,
      v_cab_valorDescontoCustoOpGera,
      v_cab_valorDescontoCustoOpTota,
      v_cab_valorAcrescimoCustoOpIte,
      v_cab_valorAcrescimoCustoOpGer,
      v_cab_valorAcrescimoCustoOpTot,
      v_cab_valorCustoOperacao,
      v_cab_valorCMV,
      v_cab_quantidadeExtemporanea,
      v_cab_valorAcrescimoExtempSubt,
      v_cab_valorAcrescimoExtempItem,
      v_cab_valorAcrescimoExtempGera,
      v_cab_valorAcrescimoExtempTota
    FROM MODOCUMENTOSFISCAIS cab
    WHERE cab.idDocumentoFiscal = a.idDocumentoFiscal;
    IF p_cancelandoExcluindoDocumento = 0
      AND a.cancelado = 0
    THEN
      SELECT COALESCE (MAX(1), 0)
      INTO v_cab_promocaoExiste
      FROM MODOCFISCALXPROMOCOES
      WHERE idDocumentoFiscal = a.idDocumentoFiscal;
      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 NOT(p_person_190_modeloFrete IS NULL)
        AND p_person_190_modeloFrete <> ' '
        AND a.valorFreteTotal <> 0
        AND v_cab_valorFreteTotal - a.valorFreteTotal <= 0
      THEN
        v_cab_modalidadeFrete := '9';
      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;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      IF v_cab_valorDescontoGeral <> 0
        OR v_cab_valorOutrasDespesasGeral <> 0
        OR v_cab_valorPagamentoBruto <> 0
        OR v_cab_promocaoExiste = 1
      THEN
        ADD_DOC_FISC_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          a.idDocumentoFiscal,
          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;
      UPDATE MODOCUMENTOSFISCAIS SET
        modalidadeFrete               = v_cab_modalidadeFrete,
        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,
        valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
        valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
        valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
        valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
        valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
        valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
        valorCustoOperacao            = v_cab_valorCustoOperacao,
        valorCMV                      = v_cab_valorCMV,
        quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
        valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
        valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
        valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
        valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
      WHERE idDocumentoFiscal = a.idDocumentoFiscal;
    END IF;
    -- Cancela / Exclui Transferências vinculadas.
    FOR b IN (
      SELECT
        itemTransf.documentoTransferencia,
        docXTransf.entradaSaidaOriginal
      FROM MODOCTRANSFXDOCFISCAL docXTransf
      JOIN MODOCUMENTOTRANSFXITENS itemTransf
      ON itemTransf.idItemDocTransferencia = docXTransf.idItemDocTransferencia
      WHERE docXTransf.idItemDocFiscal = p_item_idItemDocFiscal
      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 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'
        AND docXTransf2.idItemDocFiscal <> docXTransf.idItemDocFiscal)
      GROUP BY
        itemTransf.documentoTransferencia,
        docXTransf.entradaSaidaOriginal)
    LOOP
      IF b.entradaSaidaOriginal = 'O' THEN
        ADD_DOCTRANSF_CAB_EXCLUI (b.documentoTransferencia);
      ELSIF p_cancelando_Excluindo = 'C' THEN
        ADD_DOCTRANSF_CAB_SIT_GRAVA (
          p_estabelecimentoAtivo,
          b.documentoTransferencia,
          'C',
          'Cancelamento Automático');
      END IF;
    END LOOP;
    IF v_cab_entradaSaida='E'
      AND v_cab_devolucaoAnulacaoRetorno = 0
      AND v_cab_atualizaUltimaCompra = 1
    THEN
      ADD_PRODUTO_CUSTO_DATA_EXCLUI (
        a.produto,
        v_cab_dataEntradaSaida);
    END IF;
    ADD_MOTIVO_DOC_FISC_ITE_EXCLUI (
      p_item_idItemDocFiscal,
      0,
      v_auxNumber);
    ADD_ESTOQUE_DOC_FISC_EXCLUI (
      p_item_idItemDocFiscal,
      '',
      v_auxVarchar);
    ADD_VALEDESCONTO_DOC_ITE_EXCL (
      p_item_idItemDocFiscal,
      '',
      v_auxVarchar);
    ADD_SEPARACAO_ITEM_DOC_EXCLUI (p_item_idItemDocFiscal);
    DELETE MODOCFISCALXPRODUTOFILHO
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    DELETE MODOCFISCALXPROMOCOES
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    DELETE MOINGRESSOS
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    DELETE CATABELAPRECOXFORMACOESPR
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    UPDATE MOORCAMENTOXNUMEROSSERIE numSer
    SET numSer.efetivado = 0
    WHERE numSer.efetivado = 1
    AND EXISTS (
      SELECT 1
      FROM MODOCFISCALXORCAMENTOITEM docXDoc
      WHERE docXDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND docXDoc.idItemOrcamento = numSer.idItemOrcamento
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MODOCFISCALXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    UPDATE MOPREDOCUMXNUMEROSSERIE numSer
    SET numSer.devolvidoRetornado = 0
    WHERE numSer.devolvidoRetornado = 1
    AND EXISTS (
      SELECT 1
      FROM MODOCFISCALXPREDOCUM docXDoc
      WHERE docXDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND docXDoc.idItemPreDocReferenciado = numSer.idItemPreDocumento
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MODOCFISCALXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    UPDATE MODOCFISCALXNUMEROSSERIE numSer
    SET numSer.devolvidoRetornado = 0
    WHERE numSer.devolvidoRetornado = 1
    AND EXISTS (
      SELECT 1
      FROM MODOCFISCALXDOCFISCAL docXDoc
      WHERE docXDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND docXDoc.idItemDocFiscalReferenciado = numSer.idItemDocFiscal
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MODOCFISCALXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    FOR b IN (
      SELECT
        entrega,
        idItemOrcamento,
        quantidade
      FROM MOENTREGAS
      WHERE idItemDocFiscalRemessa = p_item_idItemDocFiscal)
    LOOP
      ADD_ENTREGA_SITUACAO_TROCA (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        b.idItemOrcamento,
        b.entrega,
        b.quantidade,
        1, -- p_situacaoEntrega
        'ADD_DOC_FISC_ITEM_EXCLUI');
      ADD_ENTREGA_CRIA_PENDENTE (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        b.idItemOrcamento);
    END LOOP;
    FOR b IN (
      SELECT idConserto
      FROM MOCONSERTOS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      IF p_cancelando_Excluindo = 'C' THEN
        ADD_CONSERTO_CANCELA (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_person_184_tipoEventoCancCon,
          b.idConserto);
      ELSE
        ADD_CONSERTO_EXCLUI (b.idConserto);
      END IF;
    END LOOP;
    UPDATE MOCONSERTOS SET
      idItemDocFiscalDevolucao = 0,
      situacaoConserto = 'I'
    WHERE idItemDocFiscalDevolucao = p_item_idItemDocFiscal;
    FOR b IN (
      SELECT
        id,
        idItemOrcamento,
        quantidade
      FROM MODOCFISCALXORCAMENTOITEM
      WHERE idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      IF b.quantidade <> 0 THEN
        ADD_ORCAMENTO_ITEM_SALDO_VOLTA (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_person_184_tipoEventoCancCon,
          p_config_95_etapaOrcamentoCanc,
          p_config_96_etapaOrdemServCanc,
          p_config_97_etapaPedCompraCanc,
          p_config_415_etapaFatContrCanc,
          b.idItemOrcamento,
          b.quantidade);
      END IF;
      DELETE MODOCFISCALXORCAMENTOITEM c
      WHERE c.id = b.id;
    END LOOP;
    FOR b IN (
      SELECT
        docXDoc.id,
        docXDoc.idItemPreDocReferenciado,
        docXDoc.quantidade,
        itemPre.preDocumento,
        cabPre.statusPreDocumento
      FROM MODOCFISCALXPREDOCUM docXDoc
      JOIN MOPREDOCUMXITENS itemPre
      ON itemPre.idItemPreDocumento = docXDoc.idItemPreDocReferenciado
      JOIN MOPREDOCUMENTOS cabPre
      ON cabPre.predocumento = itemPre.preDocumento
      WHERE docXDoc.idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      IF v_cab_devolucaoAnulacaoRetorno = 1 THEN
        FOR c IN (
          SELECT
            c.entrega,
            c.idItemOrcamento,
            c.quantidade,
            c.situacaoEntrega
          FROM MOENTREGAS c
          WHERE c.idItemPreDocumentoRemessa = b.idItemPreDocReferenciado
          AND c.situacaoEntrega IN (6,7))
        LOOP
          ADD_ENTREGA_SITUACAO_TROCA (
            p_usuarioLogado,
            p_estabelecimentoAtivo,
            c.idItemOrcamento,
            c.entrega,
            c.quantidade,
            c.situacaoEntrega - 1,
            'ADD_DOC_FISC_ITEM_EXCLUI');
          ADD_ENTREGA_CRIA_PENDENTE (
            p_usuarioLogado,
            p_estabelecimentoAtivo,
            c.idItemOrcamento);
        END LOOP;
      END IF;
      IF b.quantidade <> 0 THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_devolucaoAnulacaoRetorno,
          'D',
          p_item_idItemDocFiscal,
          - b.quantidade,
          - a.quantidadeConvertida,
          'P',
          b.idItemPreDocReferenciado);
      END IF;
      IF v_cab_origemDocumento IN (10,13)
        AND b.statusPreDocumento = 'F'
      THEN
        UPDATE MOPREDOCUMENTOS c
        SET c.statusPreDocumento = 'A'
        WHERE c.preDocumento = b.preDocumento;
      END IF;
      DELETE MODOCFISCALXPREDOCUM c
      WHERE c.id = b.id;
    END LOOP;
    DELETE MOPREDOCUMXDOCFISCAL
    WHERE idItemDocFiscalReferenciado = p_item_idItemDocFiscal;
    FOR b IN (
      SELECT
        id,
        idItemDocFiscalReferenciado,
        quantidade
      FROM MODOCFISCALXDOCFISCAL a
      WHERE idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      IF v_cab_devolucaoAnulacaoRetorno = 1 THEN
        FOR c IN (
          SELECT
            c.entrega,
            c.idItemOrcamento,
            c.quantidade,
            c.situacaoEntrega
          FROM MOENTREGAS c
          WHERE c.idItemDocFiscalRemessa = b.idItemDocFiscalReferenciado
          AND c.situacaoEntrega IN (6,7))
        LOOP
          ADD_ENTREGA_SITUACAO_TROCA (
            p_usuarioLogado,
            p_estabelecimentoAtivo,
            c.idItemOrcamento,
            c.entrega,
            c.quantidade,
            c.situacaoEntrega - 1,
            'ADD_DOC_FISC_ITEM_EXCLUI');
          ADD_ENTREGA_CRIA_PENDENTE (
            p_usuarioLogado,
            p_estabelecimentoAtivo,
            c.idItemOrcamento);
        END LOOP;
      END IF;
      IF b.quantidade <> 0 THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_devolucaoAnulacaoRetorno,
          'D',
          p_item_idItemDocFiscal,
          - b.quantidade,
          - a.quantidadeConvertida,
          'D',
          b.idItemDocFiscalReferenciado);
      END IF;
      DELETE MODOCFISCALXDOCFISCAL c
      WHERE c.id = b.id;
    END LOOP;
    DELETE MODOCFISCALXDOCFISCAL
    WHERE idItemDocFiscalReferenciado = p_item_idItemDocFiscal;
    DELETE MODOCTRANSFXDOCFISCAL
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    DELETE MOBALANCOXDOCFISCAL
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    UPDATE MODISTRIBUICAODFEXGRADE
    SET idItemDocFiscal = 0
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    IF p_cancelando_Excluindo = 'C' THEN
      UPDATE MODOCFISCALXITENS
      SET cancelado = 1
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    ELSE
      DELETE MODOCFISCALXCOMPOSICOESPR
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXNUMEROSSERIE
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXNUMEROSSERIE b
      WHERE b.idEnderecoEstoqueDocFiscal > 0
      AND EXISTS (
        SELECT 1
        FROM MODOCFISCALXENDERECOESTOQ c
        WHERE c.idEnderecoEstoqueDocFiscal = b.idEnderecoEstoqueDocFiscal
        AND c.idItemDocFiscal = p_item_idItemDocFiscal);
      DELETE MODOCFISCALXENDERECOESTOQ
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXEMBALAGENSTIN
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXCENTROSCUSTOS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXPROJETOS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCTROCAXITENS
      WHERE idItemDocFiscalSaida = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXITENS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      IF p_cancelandoExcluindoDocumento = 0 THEN
        v_auxNumber := 0;
        FOR b IN (
          SELECT idItemDocFiscal
          FROM MODOCFISCALXITENS b
          WHERE b.idDocumentoFiscal = a.idDocumentoFiscal
          AND b.idItemDocFiscal <> p_item_idItemDocFiscal
          ORDER BY b.sequencia)
        LOOP
          v_auxNumber := v_auxNumber + 1;
          UPDATE MODOCFISCALXITENS c
          SET c.sequencia = v_auxNumber
          WHERE c.idItemDocFiscal = b.idItemDocFiscal;
        END LOOP;
      END IF;
    END IF;
  END LOOP;
END ADD_DOC_FISC_ITEM_EXCLUI;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_N_SER_DOC (
  p_estabelecimentoAtivo IN NUMBER,
  p_idItemDocFiscalDe    IN NUMBER,
  p_idItemDocFiscalPara  IN NUMBER,
  p_quantidade           IN NUMBER,
  p_efetivar             IN NUMBER,
  p_atualizarObservacoes IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes OUT NUMBER)
IS
  v_quantidadeSaldo NUMBER;
  v_auxNumber       NUMBER;
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  v_quantidadeSaldo      := p_quantidade;
  FOR a IN (
    SELECT
      idNumeroSerieDocFiscal,
      gradeProduto,
      idNumeroSerie
    FROM MODOCFISCALXNUMEROSSERIE
    WHERE idItemDocFiscal = p_idItemDocFiscalDe
    AND (p_efetivar = 0
      OR devolvidoRetornado = 0))
  LOOP
    IF v_quantidadeSaldo >= 1 THEN
      v_quantidadeSaldo := v_quantidadeSaldo - 1;
      r_atualizarObservacoes := 1;
      ADD_DOC_FISC_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        p_idItemDocFiscalPara,
        0,
        a.gradeProduto,
        a.idNumeroSerie,
        0,
        /* Retornos */
        v_auxNumber);
      IF p_efetivar = 1 THEN
        UPDATE MODOCFISCALXNUMEROSSERIE b
        SET b.devolvidoRetornado = 1
        WHERE b.idNumeroSerieDocFiscal = a.idNumeroSerieDocFiscal;
      END IF;
    END IF;
  END LOOP;
  IF v_quantidadeSaldo >= 1 THEN
    FOR a IN (
      SELECT
        a.gradeProduto,
        a.idNumeroSerie
      FROM (
        SELECT
          numSer.gradeProduto,
          numSer.idNumeroSerie
        FROM MODOCFISCALXORCAMENTOITEM docXOrc
        JOIN MOENTREGAS entr
        ON entr.idItemOrcamento = docXOrc.idItemOrcamento
        JOIN MOPREDOCUMXNUMEROSSERIE numSer
        ON numSer.idItemPreDocumento = entr.idItemPreDocumentoRemessa
        WHERE docXOrc.idItemDocFiscal = p_idItemDocFiscalDe
        AND entr.idItemPreDocumentoRemessa > 0
        UNION ALL
        SELECT
          numSer.gradeProduto,
          numSer.idNumeroSerie
        FROM MODOCFISCALXORCAMENTOITEM docXOrc
        JOIN MOENTREGAS entr
        ON entr.idItemOrcamento = docXOrc.idItemOrcamento
        JOIN MODOCFISCALXNUMEROSSERIE numSer
        ON numSer.idItemDocFiscal = entr.idItemDocFiscalRemessa
        WHERE docXOrc.idItemDocFiscal = p_idItemDocFiscalDe
        AND entr.idItemDocFiscalRemessa > 0) a
      GROUP BY
        a.gradeProduto,
        a.idNumeroSerie)
    LOOP
      IF v_quantidadeSaldo >= 1 THEN
        v_quantidadeSaldo := v_quantidadeSaldo - 1;
        r_atualizarObservacoes := 1;
        ADD_DOC_FISC_ITEM_N_SER_GRAVA (
          p_estabelecimentoAtivo,
          0,
          p_idItemDocFiscalPara,
          0,
          a.gradeProduto,
          a.idNumeroSerie,
          0,
          /* Retornos */
          v_auxNumber);
      END IF;
    END LOOP;
  END IF;
END ADD_DOC_FISC_ITEM_N_SER_DOC;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_N_SER_ORCAM (
  p_estabelecimentoAtivo IN NUMBER,
  p_idItemOrcamentoDe    IN NUMBER,
  p_idItemDocFiscalPara  IN NUMBER,
  p_quantidade           IN NUMBER,
  p_efetivar             IN NUMBER,
  p_atualizarObservacoes IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes OUT NUMBER)
IS
  v_quantidadeSaldo NUMBER;
  v_auxNumber       NUMBER;
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  v_quantidadeSaldo      := p_quantidade;
  FOR a IN (
    SELECT
      idNumeroSerieOrcamento,
      gradeProduto,
      idNumeroSerie
    FROM MOORCAMENTOXNUMEROSSERIE
    WHERE idItemOrcamento = p_idItemOrcamentoDe
    AND (p_efetivar = 0
      OR efetivado = 0))
  LOOP
    IF v_quantidadeSaldo >= 1 THEN
      v_quantidadeSaldo := v_quantidadeSaldo - 1;
      r_atualizarObservacoes := 1;
      ADD_DOC_FISC_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        p_idItemDocFiscalPara,
        0,
        a.gradeProduto,
        a.idNumeroSerie,
        0,
        /* Retornos */
        v_auxNumber);
      IF p_efetivar = 1 THEN
        UPDATE MOORCAMENTOXNUMEROSSERIE b
        SET b.efetivado = 1
        WHERE b.idNumeroSerieOrcamento = a.idNumeroSerieOrcamento;
      END IF;
    END IF;
  END LOOP;
  IF v_quantidadeSaldo >= 1 THEN
    FOR a IN (
      SELECT
        a.gradeProduto,
        a.idNumeroSerie
      FROM (
        SELECT
          numSer.gradeProduto,
          numSer.idNumeroSerie
        FROM MOENTREGAS entr
        JOIN MOPREDOCUMXNUMEROSSERIE numSer
        ON numSer.idItemPreDocumento = entr.idItemPreDocumentoRemessa
        WHERE entr.idItemOrcamento = p_idItemOrcamentoDe
        AND entr.idItemPreDocumentoRemessa > 0
        UNION ALL
        SELECT
          numSer.gradeProduto,
          numSer.idNumeroSerie
        FROM MOENTREGAS entr
        JOIN MODOCFISCALXNUMEROSSERIE numSer
        ON numSer.idItemDocFiscal = entr.idItemDocFiscalRemessa
        WHERE entr.idItemOrcamento = p_idItemOrcamentoDe
        AND entr.idItemDocFiscalRemessa > 0) a
      GROUP BY
        a.gradeProduto,
        a.idNumeroSerie)
    LOOP
      IF v_quantidadeSaldo >= 1 THEN
        v_quantidadeSaldo := v_quantidadeSaldo - 1;
        r_atualizarObservacoes := 1;
        ADD_DOC_FISC_ITEM_N_SER_GRAVA (
          p_estabelecimentoAtivo,
          0,
          p_idItemDocFiscalPara,
          0,
          a.gradeProduto,
          a.idNumeroSerie,
          0,
          /* Retornos */
          v_auxNumber);
      END IF;
    END LOOP;
  END IF;
END ADD_DOC_FISC_ITEM_N_SER_ORCAM;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_N_SER_PRE (
  p_estabelecimentoAtivo IN NUMBER,
  p_idItemPreDocumentoDe IN NUMBER,
  p_idItemDocFiscalPara  IN NUMBER,
  p_quantidade           IN NUMBER,
  p_efetivar             IN NUMBER,
  p_atualizarObservacoes IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes OUT NUMBER)
IS
  v_quantidadeSaldo NUMBER;
  v_auxNumber       NUMBER;
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  v_quantidadeSaldo      := p_quantidade;
  FOR a IN (
    SELECT
      idNumeroSeriePreDocumento,
      gradeProduto,
      idNumeroSerie
    FROM MOPREDOCUMXNUMEROSSERIE
    WHERE idItemPreDocumento = p_idItemPreDocumentoDe
    AND (p_efetivar = 0
      OR devolvidoRetornado = 0))
  LOOP
    IF v_quantidadeSaldo >= 1 THEN
      v_quantidadeSaldo := v_quantidadeSaldo - 1;
      r_atualizarObservacoes := 1;
      ADD_DOC_FISC_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        p_idItemDocFiscalPara,
        0,
        a.gradeProduto,
        a.idNumeroSerie,
        0,
        /* Retornos */
        v_auxNumber);
      IF p_efetivar = 1 THEN
        UPDATE MOPREDOCUMXNUMEROSSERIE b
        SET b.devolvidoRetornado = 1
        WHERE b.idNumeroSeriePreDocumento = a.idNumeroSeriePreDocumento;
      END IF;
    END IF;
  END LOOP;
  IF v_quantidadeSaldo >= 1 THEN
    FOR a IN (
      SELECT
        a.gradeProduto,
        a.idNumeroSerie
      FROM (
        SELECT
          numSer.gradeProduto,
          numSer.idNumeroSerie
        FROM MOPREDOCUMXORCAMENTOITEM docXOrc
        JOIN MOENTREGAS entr
        ON entr.idItemOrcamento = docXOrc.idItemOrcamento
        JOIN MOPREDOCUMXNUMEROSSERIE numSer
        ON numSer.idItemPreDocumento = entr.idItemPreDocumentoRemessa
        WHERE docXOrc.idItemPreDocumento = p_idItemPreDocumentoDe
        AND entr.idItemPreDocumentoRemessa > 0
        UNION ALL
        SELECT
          numSer.gradeProduto,
          numSer.idNumeroSerie
        FROM MOPREDOCUMXORCAMENTOITEM docXOrc
        JOIN MOENTREGAS entr
        ON entr.idItemOrcamento = docXOrc.idItemOrcamento
        JOIN MODOCFISCALXNUMEROSSERIE numSer
        ON numSer.idItemDocFiscal = entr.idItemDocFiscalRemessa
        WHERE docXOrc.idItemPreDocumento = p_idItemPreDocumentoDe
        AND entr.idItemDocFiscalRemessa > 0) a
      GROUP BY
        a.gradeProduto,
        a.idNumeroSerie)
    LOOP
      IF v_quantidadeSaldo >= 1 THEN
        v_quantidadeSaldo := v_quantidadeSaldo - 1;
        r_atualizarObservacoes := 1;
        ADD_DOC_FISC_ITEM_N_SER_GRAVA (
          p_estabelecimentoAtivo,
          0,
          p_idItemDocFiscalPara,
          0,
          a.gradeProduto,
          a.idNumeroSerie,
          0,
          /* Retornos */
          v_auxNumber);
      END IF;
    END LOOP;
  END IF;
END ADD_DOC_FISC_ITEM_N_SER_PRE;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_N_SER_ORC (
  p_estabelecimentoAtivo IN NUMBER,
  p_idItemOrcamentoDe    IN NUMBER,
  p_idItemOrcamentoPara  IN NUMBER,
  p_quantidade           IN NUMBER,
  p_efetivar             IN NUMBER,
  p_atualizarObservacoes IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes OUT NUMBER)
IS
  v_quantidadeSaldo NUMBER;
  v_auxNumber       NUMBER;
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  v_quantidadeSaldo      := p_quantidade;
  FOR a IN (
    SELECT
      idNumeroSerieOrcamento,
      gradeProduto,
      idNumeroSerie
    FROM MOORCAMENTOXNUMEROSSERIE
    WHERE idItemOrcamento = p_idItemOrcamentoDe
    AND (p_efetivar = 0
      OR efetivado = 0))
  LOOP
    IF v_quantidadeSaldo >= 1 THEN
      v_quantidadeSaldo := v_quantidadeSaldo - 1;
      r_atualizarObservacoes := 1;
      ADD_ORCAMENTO_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        p_idItemOrcamentoPara,
        0,
        a.gradeProduto,
        a.idNumeroSerie,
        0,
        /* Retornos */
        v_auxNumber);
      IF p_efetivar = 1 THEN
        UPDATE MOORCAMENTOXNUMEROSSERIE b
        SET b.efetivado = 1
        WHERE b.idNumeroSerieOrcamento = a.idNumeroSerieOrcamento;
      END IF;
    END IF;
  END LOOP;
  IF v_quantidadeSaldo >= 1 THEN
    FOR a IN (
      SELECT
        a.gradeProduto,
        a.idNumeroSerie
      FROM (
        SELECT
          numSer.gradeProduto,
          numSer.idNumeroSerie
        FROM MOENTREGAS entr
        JOIN MOPREDOCUMXNUMEROSSERIE numSer
        ON numSer.idItemPreDocumento = entr.idItemPreDocumentoRemessa
        WHERE entr.idItemOrcamento = p_idItemOrcamentoDe
        AND entr.idItemPreDocumentoRemessa > 0
        UNION ALL
        SELECT
          numSer.gradeProduto,
          numSer.idNumeroSerie
        FROM MOENTREGAS entr
        JOIN MODOCFISCALXNUMEROSSERIE numSer
        ON numSer.idItemDocFiscal = entr.idItemDocFiscalRemessa
        WHERE entr.idItemOrcamento = p_idItemOrcamentoDe
        AND entr.idItemDocFiscalRemessa > 0) a
      GROUP BY
        a.gradeProduto,
        a.idNumeroSerie)
    LOOP
      IF v_quantidadeSaldo >= 1 THEN
        v_quantidadeSaldo := v_quantidadeSaldo - 1;
        r_atualizarObservacoes := 1;
        ADD_ORCAMENTO_ITEM_N_SER_GRAVA (
          p_estabelecimentoAtivo,
          0,
          p_idItemOrcamentoPara,
          0,
          a.gradeProduto,
          a.idNumeroSerie,
          0,
          /* Retornos */
          v_auxNumber);
      END IF;
    END LOOP;
  END IF;
END ADD_ORCAMENTO_ITEM_N_SER_ORC;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_N_SER_DOC_FIS (
  p_estabelecimentoAtivo   IN NUMBER,
  p_idItemDocFiscalDe      IN NUMBER,
  p_idItemPreDocumentoPara IN NUMBER,
  p_quantidade             IN NUMBER,
  p_efetivar               IN NUMBER,
  p_atualizarObservacoes   IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes   OUT NUMBER)
IS
  v_quantidadeSaldo NUMBER;
  v_auxNumber       NUMBER;
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  v_quantidadeSaldo      := p_quantidade;
  FOR a IN (
    SELECT
      idNumeroSerieDocFiscal,
      gradeProduto,
      idNumeroSerie
    FROM MODOCFISCALXNUMEROSSERIE
    WHERE idItemDocFiscal = p_idItemDocFiscalDe
    AND (p_efetivar = 0
      OR devolvidoRetornado = 0))
  LOOP
    IF v_quantidadeSaldo >= 1 THEN
      v_quantidadeSaldo := v_quantidadeSaldo - 1;
      r_atualizarObservacoes := 1;
      ADD_PRE_DOC_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        p_idItemPreDocumentoPara,
        0,
        a.gradeProduto,
        a.idNumeroSerie,
        0,
        /* Retornos */
        v_auxNumber);
      IF p_efetivar = 1 THEN
        UPDATE MODOCFISCALXNUMEROSSERIE b
        SET b.devolvidoRetornado = 1
        WHERE b.idNumeroSerieDocFiscal = a.idNumeroSerieDocFiscal;
      END IF;
    END IF;
  END LOOP;
  IF v_quantidadeSaldo >= 1 THEN
    FOR a IN (
      SELECT
        a.gradeProduto,
        a.idNumeroSerie
      FROM (
        SELECT
          numSer.gradeProduto,
          numSer.idNumeroSerie
        FROM MODOCFISCALXORCAMENTOITEM docXOrc
        JOIN MOENTREGAS entr
        ON entr.idItemOrcamento = docXOrc.idItemOrcamento
        JOIN MOPREDOCUMXNUMEROSSERIE numSer
        ON numSer.idItemPreDocumento = entr.idItemPreDocumentoRemessa
        WHERE docXOrc.idItemDocFiscal = p_idItemDocFiscalDe
        AND entr.idItemPreDocumentoRemessa > 0
        UNION ALL
        SELECT
          numSer.gradeProduto,
          numSer.idNumeroSerie
        FROM MODOCFISCALXORCAMENTOITEM docXOrc
        JOIN MOENTREGAS entr
        ON entr.idItemOrcamento = docXOrc.idItemOrcamento
        JOIN MODOCFISCALXNUMEROSSERIE numSer
        ON numSer.idItemDocFiscal = entr.idItemDocFiscalRemessa
        WHERE docXOrc.idItemDocFiscal = p_idItemDocFiscalDe
        AND entr.idItemDocFiscalRemessa > 0) a
      GROUP BY
        a.gradeProduto,
        a.idNumeroSerie)
    LOOP
      IF v_quantidadeSaldo >= 1 THEN
        v_quantidadeSaldo := v_quantidadeSaldo - 1;
        r_atualizarObservacoes := 1;
        ADD_PRE_DOC_ITEM_N_SER_GRAVA (
          p_estabelecimentoAtivo,
          0,
          p_idItemPreDocumentoPara,
          0,
          a.gradeProduto,
          a.idNumeroSerie,
          0,
          /* Retornos */
          v_auxNumber);
      END IF;
    END LOOP;
  END IF;
END ADD_PRE_DOC_ITEM_N_SER_DOC_FIS;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_N_SER_ORCAMEN (
  p_estabelecimentoAtivo   IN NUMBER,
  p_idItemOrcamentoDe      IN NUMBER,
  p_idItemPreDocumentoPara IN NUMBER,
  p_quantidade             IN NUMBER,
  p_efetivar               IN NUMBER,
  p_atualizarObservacoes   IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes   OUT NUMBER)
IS
  v_quantidadeSaldo NUMBER;
  v_auxNumber       NUMBER;
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  v_quantidadeSaldo      := p_quantidade;
  FOR a IN (
    SELECT
      idNumeroSerieOrcamento,
      gradeProduto,
      idNumeroSerie
    FROM MOORCAMENTOXNUMEROSSERIE
    WHERE idItemOrcamento = p_idItemOrcamentoDe
    AND (p_efetivar = 0
      OR efetivado = 0))
  LOOP
    IF v_quantidadeSaldo >= 1 THEN
      v_quantidadeSaldo := v_quantidadeSaldo - 1;
      r_atualizarObservacoes := 1;
      ADD_PRE_DOC_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        p_idItemPreDocumentoPara,
        0,
        a.gradeProduto,
        a.idNumeroSerie,
        0,
        /* Retornos */
        v_auxNumber);
      IF p_efetivar = 1 THEN
        UPDATE MOORCAMENTOXNUMEROSSERIE b
        SET b.efetivado = 1
        WHERE b.idNumeroSerieOrcamento = a.idNumeroSerieOrcamento;
      END IF;
    END IF;
  END LOOP;
  IF v_quantidadeSaldo >= 1 THEN
    FOR a IN (
      SELECT
        a.gradeProduto,
        a.idNumeroSerie
      FROM (
        SELECT
          numSer.gradeProduto,
          numSer.idNumeroSerie
        FROM MOENTREGAS entr
        JOIN MOPREDOCUMXNUMEROSSERIE numSer
        ON numSer.idItemPreDocumento = entr.idItemPreDocumentoRemessa
        WHERE entr.idItemOrcamento = p_idItemOrcamentoDe
        AND entr.idItemPreDocumentoRemessa > 0
        UNION ALL
        SELECT
          numSer.gradeProduto,
          numSer.idNumeroSerie
        FROM MOENTREGAS entr
        JOIN MODOCFISCALXNUMEROSSERIE numSer
        ON numSer.idItemDocFiscal = entr.idItemDocFiscalRemessa
        WHERE entr.idItemOrcamento = p_idItemOrcamentoDe
        AND entr.idItemDocFiscalRemessa > 0) a
      GROUP BY
        a.gradeProduto,
        a.idNumeroSerie)
    LOOP
      IF v_quantidadeSaldo >= 1 THEN
        v_quantidadeSaldo := v_quantidadeSaldo - 1;
        r_atualizarObservacoes := 1;
        ADD_PRE_DOC_ITEM_N_SER_GRAVA (
          p_estabelecimentoAtivo,
          0,
          p_idItemPreDocumentoPara,
          0,
          a.gradeProduto,
          a.idNumeroSerie,
          0,
          /* Retornos */
          v_auxNumber);
      END IF;
    END LOOP;
  END IF;
END ADD_PRE_DOC_ITEM_N_SER_ORCAMEN;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_N_SER_PRE_DOC (
  p_estabelecimentoAtivo   IN NUMBER,
  p_idItemPreDocumentoDe   IN NUMBER,
  p_idItemPreDocumentoPara IN NUMBER,
  p_quantidade             IN NUMBER,
  p_efetivar               IN NUMBER,
  p_atualizarObservacoes   IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes   OUT NUMBER)
IS
  v_quantidadeSaldo NUMBER;
  v_auxNumber       NUMBER;
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  v_quantidadeSaldo      := p_quantidade;
  FOR a IN (
    SELECT
      idNumeroSeriePreDocumento,
      gradeProduto,
      idNumeroSerie
    FROM MOPREDOCUMXNUMEROSSERIE
    WHERE idItemPreDocumento = p_idItemPreDocumentoDe
    AND (p_efetivar = 0
      OR devolvidoRetornado = 0))
  LOOP
    IF v_quantidadeSaldo >= 1 THEN
      v_quantidadeSaldo := v_quantidadeSaldo - 1;
      r_atualizarObservacoes := 1;
      ADD_PRE_DOC_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        p_idItemPreDocumentoPara,
        0,
        a.gradeProduto,
        a.idNumeroSerie,
        0,
        /* Retornos */
        v_auxNumber);
      IF p_efetivar = 1 THEN
        UPDATE MOPREDOCUMXNUMEROSSERIE b
        SET b.devolvidoRetornado = 1
        WHERE b.idNumeroSeriePreDocumento = a.idNumeroSeriePreDocumento;
      END IF;
    END IF;
  END LOOP;
  IF v_quantidadeSaldo >= 1 THEN
    FOR a IN (
      SELECT
        a.gradeProduto,
        a.idNumeroSerie
      FROM (
        SELECT
          numSer.gradeProduto,
          numSer.idNumeroSerie
        FROM MOPREDOCUMXORCAMENTOITEM docXOrc
        JOIN MOENTREGAS entr
        ON entr.idItemOrcamento = docXOrc.idItemOrcamento
        JOIN MOPREDOCUMXNUMEROSSERIE numSer
        ON numSer.idItemPreDocumento = entr.idItemPreDocumentoRemessa
        WHERE docXOrc.idItemPreDocumento = p_idItemPreDocumentoDe
        AND entr.idItemPreDocumentoRemessa > 0
        UNION ALL
        SELECT
          numSer.gradeProduto,
          numSer.idNumeroSerie
        FROM MOPREDOCUMXORCAMENTOITEM docXOrc
        JOIN MOENTREGAS entr
        ON entr.idItemOrcamento = docXOrc.idItemOrcamento
        JOIN MODOCFISCALXNUMEROSSERIE numSer
        ON numSer.idItemDocFiscal = entr.idItemDocFiscalRemessa
        WHERE docXOrc.idItemPreDocumento = p_idItemPreDocumentoDe
        AND entr.idItemDocFiscalRemessa > 0) a
      GROUP BY
        a.gradeProduto,
        a.idNumeroSerie)
    LOOP
      IF v_quantidadeSaldo >= 1 THEN
        v_quantidadeSaldo := v_quantidadeSaldo - 1;
        r_atualizarObservacoes := 1;
        ADD_PRE_DOC_ITEM_N_SER_GRAVA (
          p_estabelecimentoAtivo,
          0,
          p_idItemPreDocumentoPara,
          0,
          a.gradeProduto,
          a.idNumeroSerie,
          0,
          /* Retornos */
          v_auxNumber);
      END IF;
    END LOOP;
  END IF;
END ADD_PRE_DOC_ITEM_N_SER_PRE_DOC;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_REF_DOC_FIS (
  p_estabelecimentoAtivo         IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_cab_idDocumentoFiscal        IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_documentoFiscal          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_sequencia               IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR,
  p_item_quantidade              IN NUMBER,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  p_idItemDocFiscalReferenciado  IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_atualizarObservacoes         IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes         OUT NUMBER)
IS
  v_id                           NUMBER;
  v_idDocumentoFiscalReferenciad NUMBER;
  v_sequenciaReferenciado        NUMBER;
  v_orc_pessoa                   NUMBER;
  v_auxAlpha                     VARCHAR (3200);
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  ADD_DOC_FISC_ITEM_N_SER_PRE (
    p_estabelecimentoAtivo,
    p_idItemDocFiscalReferenciado,
    p_item_idItemDocFiscal,
    CASE WHEN p_quantidadeReferenciada > 0 THEN p_quantidadeReferenciada ELSE p_item_quantidade END,
    CASE WHEN p_quantidadeReferenciada > 0 THEN 1 ELSE 0 END,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  ADD_DOC_FISC_ITEM_CUSTO_DOC (
    p_estabelecimentoAtivo,
    p_idItemDocFiscalReferenciado,
    p_item_idItemDocFiscal);
  ADD_DOC_FISC_ITEM_COMP_DOC_FIS (
    p_estabelecimentoAtivo,
    p_idItemDocFiscalReferenciado,
    p_item_idItemDocFiscal,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  IF p_quantidadeReferenciada = 0 THEN
    v_orc_pessoa := 0;
    IF p_config_227_manterPessoaOrcam = 1 THEN
      SELECT COALESCE(MAX(orc.pessoa),0)
      INTO v_orc_pessoa
      FROM MODOCFISCALXITENS itemDoc
      JOIN MODOCFISCALXORCAMENTOITEM docXOrc
      ON docXOrc.idItemDocFiscal = itemDoc.idItemDocFiscal
      JOIN MOORCAMENTOXITENS itemOrc
      ON itemOrc.idItemOrcamento = docXOrc.idItemOrcamento
      JOIN MOORCAMENTOS orc
      ON orc.orcamento = itemOrc.orcamento
      WHERE itemDoc.idDocumentoFiscal = p_cab_idDocumentoFiscal
      AND docXOrc.quantidade <> 0;
    END IF;
    ADD_DOC_FISC_ITEM_MOT_DOC_FIS (
      p_estabelecimentoAtivo,
      p_config_227_manterPessoaOrcam,
      p_cab_idDocumentoFiscal,
      p_cab_tipoDocumento,
      p_cab_documentoFiscal,
      p_cab_estabelecimento,
      p_cab_pessoa,
      v_orc_pessoa,
      p_item_idItemDocFiscal,
      p_item_sequencia,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_unidadeMedidaConversao,
      p_item_quantidadeConvertida,
      p_item_valorLiquidoItem,
      p_idItemDocFiscalReferenciado);
  ELSE
    SELECT
      idDocumentoFiscal,
      sequencia
    INTO
      v_idDocumentoFiscalReferenciad,
      v_sequenciaReferenciado
    FROM MODOCFISCALXITENS
    WHERE idItemDocFiscal = p_idItemDocFiscalReferenciado;
    ADD_DOC_FISC_ITEM_BLOEST_DOC (
      p_estabelecimentoAtivo,
      v_idDocumentoFiscalReferenciad,
      v_sequenciaReferenciado,
      p_cab_idDocumentoFiscal,
      p_item_sequencia);
    SELECT COALESCE (MAX (id),0)
    INTO v_id
    FROM MODOCFISCALXDOCFISCAL
    WHERE idItemDocFiscal = p_item_idItemDocFiscal
    AND idItemDocFiscalReferenciado = p_idItemDocFiscalReferenciado;
    IF v_id > 0 THEN
      IF p_quantidadeReferenciada <> 0 THEN
        UPDATE MODOCFISCALXDOCFISCAL SET
          quantidade = quantidade + p_quantidadeReferenciada
        WHERE id = v_id;
      END IF;
    ELSE
      v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MODOCFISCALXDOCFISCAL', 'id', 14, p_estabelecimentoAtivo, NULL);
      INSERT INTO MODOCFISCALXDOCFISCAL (
        id,
        idItemDocFiscal,
        idItemDocFiscalReferenciado,
        quantidade)
      VALUES (
        v_id,
        p_item_idItemDocFiscal,
        p_idItemDocFiscalReferenciado,
        p_quantidadeReferenciada);
    END IF;
  END IF;
END ADD_DOC_FISC_ITEM_REF_DOC_FIS;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_REF_PRE_DOC (
  p_estabelecimentoAtivo         IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_cab_idDocumentoFiscal        IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_documentoFiscal          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_sequencia               IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR,
  p_item_quantidade              IN NUMBER,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  p_idItemPreDocumentoReferenc   IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_atualizarObservacoes         IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes         OUT NUMBER)
IS
  v_id                       NUMBER;
  v_preDocumentoReferenciado NUMBER;
  v_sequenciaReferenciado    NUMBER;
  v_orc_pessoa               NUMBER;
  v_auxAlpha                 VARCHAR (3200);
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  ADD_DOC_FISC_ITEM_N_SER_PRE (
    p_estabelecimentoAtivo,
    p_idItemPreDocumentoReferenc,
    p_item_idItemDocFiscal,
    CASE WHEN p_quantidadeReferenciada > 0 THEN p_quantidadeReferenciada ELSE p_item_quantidade END,
    CASE WHEN p_quantidadeReferenciada > 0 THEN 1 ELSE 0 END,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  ADD_DOC_FISC_ITEM_CUSTO_PRE (
    p_estabelecimentoAtivo,
    p_idItemPreDocumentoReferenc,
    p_item_idItemDocFiscal);
  ADD_DOC_FISC_ITEM_COMP_PRE_DOC (
    p_estabelecimentoAtivo,
    p_idItemPreDocumentoReferenc,
    p_item_idItemDocFiscal,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  IF p_quantidadeReferenciada = 0 THEN
    v_orc_pessoa := 0;
    IF p_config_227_manterPessoaOrcam = 1 THEN
      SELECT COALESCE(MAX(orc.pessoa),0)
      INTO v_orc_pessoa
      FROM MODOCFISCALXITENS itemDoc
      JOIN MODOCFISCALXORCAMENTOITEM docXOrc
      ON docXOrc.idItemDocFiscal = itemDoc.idItemDocFiscal
      JOIN MOORCAMENTOXITENS itemOrc
      ON itemOrc.idItemOrcamento = docXOrc.idItemOrcamento
      JOIN MOORCAMENTOS orc
      ON orc.orcamento = itemOrc.orcamento
      WHERE itemDoc.idDocumentoFiscal = p_cab_idDocumentoFiscal
      AND docXOrc.quantidade <> 0;
    END IF;
    ADD_DOC_FISC_ITEM_MOT_PRE_DOC (
      p_estabelecimentoAtivo,
      p_config_227_manterPessoaOrcam,
      p_cab_idDocumentoFiscal,
      p_cab_tipoDocumento,
      p_cab_documentoFiscal,
      p_cab_estabelecimento,
      p_cab_pessoa,
      v_orc_pessoa,
      p_item_idItemDocFiscal,
      p_item_sequencia,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_unidadeMedidaConversao,
      p_item_quantidadeConvertida,
      p_item_valorLiquidoItem,
      p_idItemPreDocumentoReferenc);
  ELSE
    SELECT
      preDocumento,
      sequencia
    INTO
      v_preDocumentoReferenciado,
      v_sequenciaReferenciado
    FROM MOPREDOCUMXITENS
    WHERE idItemPreDocumento = p_idItemPreDocumentoReferenc;
    ADD_DOC_FISC_ITEM_BLOEST_PRE (
      p_estabelecimentoAtivo,
      v_preDocumentoReferenciado,
      v_sequenciaReferenciado,
      p_cab_idDocumentoFiscal,
      p_item_sequencia);
    SELECT COALESCE (MAX (id),0)
    INTO v_id
    FROM MODOCFISCALXPREDOCUM
    WHERE idItemDocFiscal = p_item_idItemDocFiscal
    AND idItemPreDocReferenciado = p_idItemPreDocumentoReferenc;
    IF v_id > 0 THEN
      IF p_quantidadeReferenciada <> 0 THEN
        UPDATE MODOCFISCALXPREDOCUM SET
          quantidade = quantidade + p_quantidadeReferenciada
        WHERE id = v_id;
      END IF;
    ELSE
      v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MODOCFISCALXPREDOCUM', 'id', 14, p_estabelecimentoAtivo, NULL);
      INSERT INTO MODOCFISCALXPREDOCUM (
        id,
        idItemDocFiscal,
        idItemPreDocReferenciado,
        quantidade)
      VALUES (
        v_id,
        p_item_idItemDocFiscal,
        p_idItemPreDocumentoReferenc,
        p_quantidadeReferenciada);
    END IF;
  END IF;
END ADD_DOC_FISC_ITEM_REF_PRE_DOC;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_REF_ORCAMEN (
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_cab_idDocumentoFiscal        IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_documentoFiscal          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_sequencia               IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR,
  p_item_quantidade              IN NUMBER,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  p_idItemOrcamento              IN NUMBER,
  p_quantidadeBaixar             IN NUMBER,
  p_atualizarObservacoes         IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes         OUT NUMBER)
IS
  v_id                    NUMBER;
  v_orcamentoReferenciado NUMBER;
  v_sequenciaReferenciado NUMBER;
  v_orc_pessoa            NUMBER;
  v_auxAlpha              VARCHAR (3200);
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  ADD_DOC_FISC_ITEM_N_SER_ORCAM (
    p_estabelecimentoAtivo,
    p_idItemOrcamento,
    p_item_idItemDocFiscal,
    CASE WHEN p_quantidadeBaixar > 0 THEN p_quantidadeBaixar ELSE p_item_quantidade END,
    CASE WHEN p_quantidadeBaixar > 0 THEN 1 ELSE 0 END,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  ADD_DOC_FISC_ITEM_CUSTO_ORCAM (
    p_estabelecimentoAtivo,
    p_idItemOrcamento,
    p_item_idItemDocFiscal);
  ADD_DOC_FISC_ITEM_COMP_ORCAMEN (
    p_estabelecimentoAtivo,
    p_idItemOrcamento,
    p_item_idItemDocFiscal,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  SELECT COALESCE (MAX (id),0)
  INTO v_id
  FROM MODOCFISCALXORCAMENTOITEM
  WHERE idItemDocFiscal = p_item_idItemDocFiscal
  AND idItemOrcamento = p_idItemOrcamento;
  IF v_id > 0 THEN
    IF p_quantidadeBaixar <> 0 THEN
      UPDATE MODOCFISCALXORCAMENTOITEM SET
        quantidade = quantidade + p_quantidadeBaixar
      WHERE id = v_id;
    END IF;
  ELSE
    v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MODOCFISCALXORCAMENTOITEM', 'id', 14, p_estabelecimentoAtivo, NULL);
    INSERT INTO MODOCFISCALXORCAMENTOITEM (
      id,
      idItemDocFiscal,
      idItemOrcamento,
      quantidade,
      efetivacao)
    VALUES (
      v_id,
      p_item_idItemDocFiscal,
      p_idItemOrcamento,
      p_quantidadeBaixar,
      1);
  END IF;
  IF p_quantidadeBaixar <> 0 THEN
    SELECT
      orcamento,
      sequencia
    INTO
      v_orcamentoReferenciado,
      v_sequenciaReferenciado
    FROM MOORCAMENTOXITENS
    WHERE idItemOrcamento = p_idItemOrcamento;
    ADD_DOC_FISC_ITEM_BLOEST_ORC (
      p_estabelecimentoAtivo,
      v_orcamentoReferenciado,
      v_sequenciaReferenciado,
      p_cab_idDocumentoFiscal,
      p_item_sequencia);
    v_orc_pessoa := 0;
    IF p_config_227_manterPessoaOrcam = 1 THEN
      SELECT COALESCE(MAX(orc.pessoa),0)
      INTO v_orc_pessoa
      FROM MODOCFISCALXITENS itemDoc
      JOIN MODOCFISCALXORCAMENTOITEM docXOrc
      ON docXOrc.idItemDocFiscal = itemDoc.idItemDocFiscal
      JOIN MOORCAMENTOXITENS itemOrc
      ON itemOrc.idItemOrcamento = docXOrc.idItemOrcamento
      JOIN MOORCAMENTOS orc
      ON orc.orcamento = itemOrc.orcamento
      WHERE itemDoc.idDocumentoFiscal = p_cab_idDocumentoFiscal
      AND docXOrc.quantidade <> 0;
    END IF;
    ADD_DOC_FISC_ITEM_MOT_ORCAMEN (
      p_estabelecimentoAtivo,
      p_config_227_manterPessoaOrcam,
      p_cab_idDocumentoFiscal,
      p_cab_tipoDocumento,
      p_cab_documentoFiscal,
      p_cab_estabelecimento,
      p_cab_pessoa,
      v_orc_pessoa,
      p_item_idItemDocFiscal,
      p_item_sequencia,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_unidadeMedidaConversao,
      p_item_quantidadeConvertida,
      p_item_valorLiquidoItem,
      p_idItemOrcamento);
    UPDATE MOORCAMENTOXITENS
    SET quantidadeSaldo = quantidadeSaldo - p_quantidadeBaixar
    WHERE idItemOrcamento = p_idItemOrcamento;
    UPDATE MOCONSERTOS cons
    SET cons.situacaoConserto = 'R'
    WHERE cons.documentoTransferenciaFornec > 0
    AND cons.situacaoConserto = 'E'
    AND EXISTS (
      SELECT 1 FROM MODOCUMENTOTRANSFXITENS itemTransf
      JOIN MODOCTRANSFXORCAMENTOITEM transfXDoc
      ON transfXDoc.idItemDocTransferencia = itemTransf.idItemDocTransferencia
      WHERE itemTransf.documentoTransferencia = cons.documentoTransferenciaFornec
      AND transfXDoc.entradaSaidaOriginal = 'E'
      AND transfXDoc.idItemOrcamento = p_idItemOrcamento);
    ADD_ENTREGA_CRIA_PENDENTE (
      p_usuarioLogado,
      p_estabelecimentoAtivo,
      p_idItemOrcamento);
    ADD_ORCAMENTO_ITEM_RES_ITEM (
      p_idItemOrcamento,
      p_estabelecimentoAtivo,
      '',
      v_auxAlpha);
  END IF;
END ADD_DOC_FISC_ITEM_REF_ORCAMEN;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_REF_DFE_GRAD (
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_config_230_etapaPedComprParc IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_cab_idDocumentoFiscal        IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_documentoFiscal          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_sequencia               IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR,
  p_item_quantidade              IN NUMBER,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  p_gradeDistribuicaoDFe         IN NUMBER,
  p_atualizarObservacoes         IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes         OUT NUMBER)
IS
  v_novaEtapaOrcamento NUMBER;
  v_quantidadeSaldo    NUMBER;
  v_auxNumber          NUMBER;
  v_auxChar            CHAR (1);
  v_auxVarchar         VARCHAR2 (32000);
BEGIN
  FOR a IN (
    SELECT
      a.idItemOrcamento,
      a.quantidadeSaldo,
      a.quantidadeBaixar,
      a.zerarSaldo,
      b.orcamento
    FROM MODISTRIBUICAODFEXORCAM a
    JOIN MOORCAMENTOXITENS b
    ON b.idItemOrcamento = a.idItemOrcamento
    WHERE a.gradeDistribuicaoDFe = p_gradeDistribuicaoDFe
    AND a.quantidadeBaixar > 0
    ORDER BY a.sequencia)
  LOOP
    UPDATE MODISTRIBUICAODFEXGRADE
    SET idItemDocFiscal = p_item_idItemDocFiscal
    WHERE gradeDistribuicaoDFe = p_gradeDistribuicaoDFe;
    ADD_DOC_FISC_ITEM_REF_ORCAMEN (
      p_usuarioLogado,
      p_estabelecimentoAtivo,
      p_config_227_manterPessoaOrcam,
      p_cab_idDocumentoFiscal,
      p_cab_tipoDocumento,
      p_cab_documentoFiscal,
      p_cab_estabelecimento,
      p_cab_pessoa,
      p_item_idItemDocFiscal,
      p_item_sequencia,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_unidadeMedidaConversao,
      p_item_quantidadeConvertida,
      p_item_quantidade,
      p_item_valorLiquidoItem,
      a.idItemOrcamento,
      CASE WHEN a.zerarSaldo = 1 THEN a.quantidadeSaldo ELSE a.quantidadeBaixar END,
      r_atualizarObservacoes,
      r_atualizarObservacoes);  
    SELECT COALESCE (SUM(b.quantidadeSaldo),0)
    INTO v_quantidadeSaldo
    FROM MOORCAMENTOXITENS b
    WHERE b.orcamento = a.orcamento
    AND b.cancelado = 0;
    IF v_quantidadeSaldo <= 0 THEN
      SELECT COALESCE(MAX(etapaOrcamento),0)
      INTO v_novaEtapaOrcamento
      FROM PAETAPASORCAMENTO
      WHERE etapaOrcamento > 0
      AND ativo = 1
      AND situacaoOrcamento = 80;      
      ADD_ORCAMENTO_CAB_ETAPA_TROCA (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        p_person_190_modeloFrete,
        p_config_378_calcularVolumes,
        a.orcamento,
        p_usuarioLogado,
        v_novaEtapaOrcamento,
        ' ',
        0,
        0,
        v_auxNumber,
        v_auxVarchar,
        v_auxNumber,
        v_auxChar,
        v_auxNumber);
    ELSE
      v_novaEtapaOrcamento := p_config_230_etapaPedComprParc;
    END IF;  
    IF v_novaEtapaOrcamento <> 0 THEN
      ADD_ORCAMENTO_CAB_ETAPA_TROCA (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        p_person_190_modeloFrete,
        p_config_378_calcularVolumes,
        a.orcamento,
        p_usuarioLogado,
        v_novaEtapaOrcamento,
        ' ',
        0,
        0,
        v_auxNumber,
        v_auxVarchar,
        v_auxNumber,
        v_auxChar,
        v_auxNumber);
    END IF;
  END LOOP;
END ADD_DOC_FISC_ITEM_REF_DFE_GRAD;

/

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,
    CASE WHEN p_quantidadeReferenciada > 0 THEN p_quantidadeReferenciada ELSE p_item_quantidade END,
    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_PRE_DOC_ITEM_REF_DOC_FIS (
  p_estabelecimentoAtivo         IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_cab_preDocumento             IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_documentoFiscal          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_item_idItemPreDocumento      IN NUMBER,
  p_item_sequencia               IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR,
  p_item_quantidade              IN NUMBER,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  p_idItemDocFiscalReferenciado  IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_atualizarObservacoes         IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes         OUT NUMBER)
IS
  v_id                           NUMBER;
  v_idDocumentoFiscalReferenciad NUMBER;
  v_sequenciaReferenciado        NUMBER;
  v_orc_pessoa                   NUMBER;
  v_auxAlpha                     VARCHAR (3200);
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  ADD_PRE_DOC_ITEM_N_SER_DOC_FIS (
    p_estabelecimentoAtivo,
    p_idItemDocFiscalReferenciado,
    p_item_idItemPreDocumento,
    CASE WHEN p_quantidadeReferenciada > 0 THEN p_quantidadeReferenciada ELSE p_item_quantidade END,
    CASE WHEN p_quantidadeReferenciada > 0 THEN 1 ELSE 0 END,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  ADD_PRE_DOC_ITEM_CUSTO_DOC_FIS (
    p_estabelecimentoAtivo,
    p_idItemDocFiscalReferenciado,
    p_item_idItemPreDocumento);
  ADD_PRE_DOC_ITEM_COMP_DOC_FIS (
    p_estabelecimentoAtivo,
    p_idItemDocFiscalReferenciado,
    p_item_idItemPreDocumento,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  IF p_quantidadeReferenciada = 0 THEN
    v_orc_pessoa := 0;
    IF p_config_227_manterPessoaOrcam = 1 THEN
      SELECT COALESCE(MAX(orc.pessoa),0)
      INTO v_orc_pessoa
      FROM MOPREDOCUMXITENS itemDoc
      JOIN MOPREDOCUMXORCAMENTOITEM docXOrc
      ON docXOrc.idItemPreDocumento = itemDoc.idItemPreDocumento
      JOIN MOORCAMENTOXITENS itemOrc
      ON itemOrc.idItemOrcamento = docXOrc.idItemOrcamento
      JOIN MOORCAMENTOS orc
      ON orc.orcamento = itemOrc.orcamento
      WHERE itemDoc.preDocumento = p_cab_preDocumento
      AND docXOrc.quantidade <> 0;
    END IF;
    ADD_PRE_DOC_ITEM_MOT_DOC_FIS (
      p_estabelecimentoAtivo,
      p_config_227_manterPessoaOrcam,
      p_cab_preDocumento,
      p_cab_tipoDocumento,
      p_cab_documentoFiscal,
      p_cab_estabelecimento,
      p_cab_pessoa,
      v_orc_pessoa,
      p_item_idItemPreDocumento,
      p_item_sequencia,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_unidadeMedidaConversao,
      p_item_quantidadeConvertida,
      p_item_valorLiquidoItem,
      p_idItemDocFiscalReferenciado);
  ELSE
    SELECT
      idDocumentoFiscal,
      sequencia
    INTO
      v_idDocumentoFiscalReferenciad,
      v_sequenciaReferenciado
    FROM MODOCFISCALXITENS
    WHERE idItemDocFiscal = p_idItemDocFiscalReferenciado;
    ADD_PRE_DOC_ITEM_BLOEST_DOC (
      p_estabelecimentoAtivo,
      v_idDocumentoFiscalReferenciad,
      v_sequenciaReferenciado,
      p_cab_preDocumento,
      p_item_sequencia);
    SELECT COALESCE (MAX (id),0)
    INTO v_id
    FROM MOPREDOCUMXDOCFISCAL
    WHERE idItemPreDocumento = p_item_idItemPreDocumento
    AND idItemDocFiscalReferenciado = p_idItemDocFiscalReferenciado;
    IF v_id > 0 THEN
      IF p_quantidadeReferenciada <> 0 THEN
        UPDATE MOPREDOCUMXDOCFISCAL SET
          quantidade = quantidade + p_quantidadeReferenciada
        WHERE id = v_id;
      END IF;
    ELSE
      v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MOPREDOCUMXDOCFISCAL', 'id', 14, p_estabelecimentoAtivo, NULL);
      INSERT INTO MOPREDOCUMXDOCFISCAL (
        id,
        idItemPreDocumento,
        idItemDocFiscalReferenciado,
        quantidade)
      VALUES (
        v_id,
        p_item_idItemPreDocumento,
        p_idItemDocFiscalReferenciado,
        p_quantidadeReferenciada);
    END IF;
  END IF;
END ADD_PRE_DOC_ITEM_REF_DOC_FIS;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_REF_ORCAMEN (
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_cab_preDocumento             IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_documentoFiscal          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_item_idItemPreDocumento      IN NUMBER,
  p_item_sequencia               IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR,
  p_item_quantidade              IN NUMBER,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  p_idItemOrcamento              IN NUMBER,
  p_quantidadeBaixar             IN NUMBER,
  p_atualizarObservacoes         IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes         OUT NUMBER)
IS
  v_id                    NUMBER;
  v_orcamentoReferenciado NUMBER;
  v_sequenciaReferenciado NUMBER;
  v_orc_pessoa            NUMBER;
  v_auxAlpha              VARCHAR (3200);
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  ADD_PRE_DOC_ITEM_N_SER_ORCAMEN (
    p_estabelecimentoAtivo,
    p_idItemOrcamento,
    p_item_idItemPreDocumento,
    CASE WHEN p_quantidadeBaixar > 0 THEN p_quantidadeBaixar ELSE p_item_quantidade END,
    CASE WHEN p_quantidadeBaixar > 0 THEN 1 ELSE 0 END,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  ADD_PRE_DOC_ITEM_CUSTO_ORCAMEN (
    p_estabelecimentoAtivo,
    p_idItemOrcamento,
    p_item_idItemPreDocumento);
  ADD_PRE_DOC_ITEM_COMP_ORCAMEN (
    p_estabelecimentoAtivo,
    p_idItemOrcamento,
    p_item_idItemPreDocumento,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  SELECT COALESCE (MAX (id),0)
  INTO v_id
  FROM MOPREDOCUMXORCAMENTOITEM
  WHERE idItemPreDocumento = p_item_idItemPreDocumento
  AND idItemOrcamento = p_idItemOrcamento;
  IF v_id > 0 THEN
    IF p_quantidadeBaixar <> 0 THEN
      UPDATE MOPREDOCUMXORCAMENTOITEM SET
        quantidade = quantidade + p_quantidadeBaixar
      WHERE id = v_id;
    END IF;
  ELSE
    v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MOPREDOCUMXORCAMENTOITEM', 'id', 14, p_estabelecimentoAtivo, NULL);
    INSERT INTO MOPREDOCUMXORCAMENTOITEM (
      id,
      idItemPreDocumento,
      idItemOrcamento,
      quantidade,
      efetivacao)
    VALUES (
      v_id,
      p_item_idItemPreDocumento,
      p_idItemOrcamento,
      p_quantidadeBaixar,
      1);
  END IF;
  IF p_quantidadeBaixar <> 0 THEN
    SELECT
      orcamento,
      sequencia
    INTO
      v_orcamentoReferenciado,
      v_sequenciaReferenciado
    FROM MOORCAMENTOXITENS
    WHERE idItemOrcamento = p_idItemOrcamento;
    ADD_PRE_DOC_ITEM_BLOEST_ORC (
      p_estabelecimentoAtivo,
      v_orcamentoReferenciado,
      v_sequenciaReferenciado,
      p_cab_preDocumento,
      p_item_sequencia);
    v_orc_pessoa := 0;
    IF p_config_227_manterPessoaOrcam = 1 THEN
      SELECT COALESCE(MAX(orc.pessoa),0)
      INTO v_orc_pessoa
      FROM MOPREDOCUMXITENS itemDoc
      JOIN MOPREDOCUMXORCAMENTOITEM docXOrc
      ON docXOrc.idItemPreDocumento = itemDoc.idItemPreDocumento
      JOIN MOORCAMENTOXITENS itemOrc
      ON itemOrc.idItemOrcamento = docXOrc.idItemOrcamento
      JOIN MOORCAMENTOS orc
      ON orc.orcamento = itemOrc.orcamento
      WHERE itemDoc.preDocumento = p_cab_preDocumento
      AND docXOrc.quantidade <> 0;
    END IF;
    ADD_PRE_DOC_ITEM_MOT_ORCAMEN (
      p_estabelecimentoAtivo,
      p_config_227_manterPessoaOrcam,
      p_cab_preDocumento,
      p_cab_tipoDocumento,
      p_cab_documentoFiscal,
      p_cab_estabelecimento,
      p_cab_pessoa,
      v_orc_pessoa,
      p_item_idItemPreDocumento,
      p_item_sequencia,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_unidadeMedidaConversao,
      p_item_quantidadeConvertida,
      p_item_valorLiquidoItem,
      p_idItemOrcamento);
    UPDATE MOORCAMENTOXITENS
    SET quantidadeSaldo = quantidadeSaldo - p_quantidadeBaixar
    WHERE idItemOrcamento = p_idItemOrcamento;
    UPDATE MOCONSERTOS cons
    SET cons.situacaoConserto = 'R'
    WHERE cons.documentoTransferenciaFornec > 0
    AND cons.situacaoConserto = 'E'
    AND EXISTS (
      SELECT 1 FROM MODOCUMENTOTRANSFXITENS itemTransf
      JOIN MODOCTRANSFXORCAMENTOITEM transfXDoc
      ON transfXDoc.idItemDocTransferencia = itemTransf.idItemDocTransferencia
      WHERE itemTransf.documentoTransferencia = cons.documentoTransferenciaFornec
      AND transfXDoc.entradaSaidaOriginal = 'E'
      AND transfXDoc.idItemOrcamento = p_idItemOrcamento);
    ADD_ENTREGA_CRIA_PENDENTE (
      p_usuarioLogado,
      p_estabelecimentoAtivo,
      p_idItemOrcamento);
    ADD_ORCAMENTO_ITEM_RES_ITEM (
      p_idItemOrcamento,
      p_estabelecimentoAtivo,
      '',
      v_auxAlpha);
  END IF;
END ADD_PRE_DOC_ITEM_REF_ORCAMEN;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_REF_PRE_DOC (
  p_estabelecimentoAtivo         IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_cab_preDocumento             IN NUMBER,
  p_cab_tipoDocumento            IN NUMBER,
  p_cab_documentoFiscal          IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_item_idItemPreDocumento      IN NUMBER,
  p_item_sequencia               IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR,
  p_item_quantidade              IN NUMBER,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  p_idItemPreDocumentoReferenc   IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_atualizarObservacoes         IN NUMBER,
  /* Retornos */
  r_atualizarObservacoes         OUT NUMBER)
IS
  v_id                       NUMBER;
  v_preDocumentoReferenciado NUMBER;
  v_sequenciaReferenciado    NUMBER;
  v_orc_pessoa               NUMBER;
  v_auxAlpha                 VARCHAR (3200);
BEGIN
  r_atualizarObservacoes := p_atualizarObservacoes;
  ADD_PRE_DOC_ITEM_N_SER_PRE_DOC (
    p_estabelecimentoAtivo,
    p_idItemPreDocumentoReferenc,
    p_item_idItemPreDocumento,
    CASE WHEN p_quantidadeReferenciada > 0 THEN p_quantidadeReferenciada ELSE p_item_quantidade END,
    CASE WHEN p_quantidadeReferenciada > 0 THEN 1 ELSE 0 END,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  ADD_PRE_DOC_ITEM_CUSTO_PRE_DOC (
    p_estabelecimentoAtivo,
    p_idItemPreDocumentoReferenc,
    p_item_idItemPreDocumento);
  ADD_PRE_DOC_ITEM_COMP_PRE_DOC (
    p_estabelecimentoAtivo,
    p_idItemPreDocumentoReferenc,
    p_item_idItemPreDocumento,
    r_atualizarObservacoes,
    r_atualizarObservacoes);
  IF p_quantidadeReferenciada = 0 THEN
    v_orc_pessoa := 0;
    IF p_config_227_manterPessoaOrcam = 1 THEN
      SELECT COALESCE(MAX(orc.pessoa),0)
      INTO v_orc_pessoa
      FROM MOPREDOCUMXITENS itemDoc
      JOIN MOPREDOCUMXORCAMENTOITEM docXOrc
      ON docXOrc.idItemPreDocumento = itemDoc.idItemPreDocumento
      JOIN MOORCAMENTOXITENS itemOrc
      ON itemOrc.idItemOrcamento = docXOrc.idItemOrcamento
      JOIN MOORCAMENTOS orc
      ON orc.orcamento = itemOrc.orcamento
      WHERE itemDoc.preDocumento = p_cab_preDocumento
      AND docXOrc.quantidade <> 0;
    END IF;
    ADD_PRE_DOC_ITEM_MOT_PRE_DOC (
      p_estabelecimentoAtivo,
      p_config_227_manterPessoaOrcam,
      p_cab_preDocumento,
      p_cab_tipoDocumento,
      p_cab_documentoFiscal,
      p_cab_estabelecimento,
      p_cab_pessoa,
      v_orc_pessoa,
      p_item_idItemPreDocumento,
      p_item_sequencia,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_unidadeMedidaConversao,
      p_item_quantidadeConvertida,
      p_item_valorLiquidoItem,
      p_idItemPreDocumentoReferenc);
  ELSE
    SELECT
      preDocumento,
      sequencia
    INTO
      v_preDocumentoReferenciado,
      v_sequenciaReferenciado
    FROM MOPREDOCUMXITENS
    WHERE idItemPreDocumento = p_idItemPreDocumentoReferenc;
    ADD_PRE_DOC_ITEM_BLOEST_PRE (
      p_estabelecimentoAtivo,
      v_preDocumentoReferenciado,
      v_sequenciaReferenciado,
      p_cab_preDocumento,
      p_item_sequencia);
    SELECT COALESCE (MAX (id),0)
    INTO v_id
    FROM MOPREDOCUMXPREDOCUM
    WHERE idItemPreDocumento = p_item_idItemPreDocumento
    AND idItemPreDocReferenciado = p_idItemPreDocumentoReferenc;
    IF v_id > 0 THEN
      IF p_quantidadeReferenciada <> 0 THEN
        UPDATE MOPREDOCUMXPREDOCUM SET
          quantidade = quantidade + p_quantidadeReferenciada
        WHERE id = v_id;
      END IF;
    ELSE
      v_id := FUNC_ADD_BUSCA_PROXIMO_ID ('MOPREDOCUMXPREDOCUM', 'id', 14, p_estabelecimentoAtivo, NULL);
      INSERT INTO MOPREDOCUMXPREDOCUM (
        id,
        idItemPreDocumento,
        idItemPreDocReferenciado,
        quantidade)
      VALUES (
        v_id,
        p_item_idItemPreDocumento,
        p_idItemPreDocumentoReferenc,
        p_quantidadeReferenciada);
    END IF;
  END IF;
END ADD_PRE_DOC_ITEM_REF_PRE_DOC;

/

create or replace PROCEDURE ADD_DOC_FISC_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_227_manterPessoaOrcam IN NUMBER,
  p_config_230_etapaPedComprParc IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     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, -- B = Balanço, D = Documento Fiscal, G = Grade DF-e, O = Orçamento, P, Pré-Documento, T = Transferência
  p_idItemReferenciado           IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_tempComp_nomeTempComposicao  IN VARCHAR2,
  p_tempComp_sequencia           IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_idDocumentoFiscal       IN NUMBER,
  p_item_pedidoCompraFornecedor  IN VARCHAR2,
  p_item_sequenciaPedidoCompraFo IN NUMBER,
  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_quantidadeExtemporanea  IN NUMBER,
  p_item_acrescimoUnitarioExtemp IN NUMBER,
  p_item_valorAcrescimoExtempIte IN NUMBER,
  p_item_valorDescontoCustoOpIte IN NUMBER,
  p_item_valorAcrescimoCustoOpIt 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_valorAcrescimoExtempGer IN NUMBER,
  p_item_valorDescontoCustoOpGer IN NUMBER,
  p_item_valorAcrescimoCustoOpGe IN NUMBER,
  p_item_valorDescontoPagamento  IN NUMBER,
  p_item_valorOutrasDespPagament IN NUMBER,
  p_item_valorJurosPagamento     IN NUMBER,
  p_item_percentualDevolucao     IN NUMBER,
  p_item_valorIPIDevolucao       IN NUMBER,
  p_item_operacaoFiscal          IN NUMBER,
  p_item_movimentaEstoque        IN NUMBER,
  p_item_movimentaEstoqueFiscal  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_stICMSEscrituracao      IN CHAR,
  p_item_reducaoBaseICMSEscritur IN NUMBER,
  p_item_aliquotaICMSEscrituraca IN NUMBER,
  p_item_diferimentoICMSEscritur IN NUMBER,
  p_item_margemValorAdicSTEscrit IN NUMBER,
  p_item_reducaoBaseSTEscriturac IN NUMBER,
  p_item_aliquotaICMSSTEscritura IN NUMBER,
  p_item_somarICMSST             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_baseICMSEscrituracao    IN NUMBER,
  p_item_valorICMSEscrituracao   IN NUMBER,
  p_item_valorICMSDesonEscritura IN NUMBER,
  p_item_baseICMSSTEscrituracao  IN NUMBER,
  p_item_valorICMSSTEscrituracao 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_idItemDocFiscal       IN VARCHAR2,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER,
  r_item_idItemDocFiscal         OUT NUMBER,
  r_buffer_idItemDocFiscal       OUT VARCHAR2,
  r_valorInserido                OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_finalidadeNota           CHAR (1);
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_nfFornecedor             NUMBER;
  v_cab_documentoFiscal          NUMBER;
  v_cab_estabelecimento          NUMBER;
  v_cab_dataEmissao              DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_vendaConsumidor          NUMBER;
  v_cab_enderecoEntregaPessoa    NUMBER;
  v_cab_municipioFatoGerador     NUMBER;
  v_cab_localDestinoOperacao     CHAR (1);
  v_cab_indicadorConsumidorFinal CHAR (1);
  v_cab_projeto                  VARCHAR2 (60);
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  v_cab_situacaoDocumentoFiscal  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_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota 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_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_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_item_sequencia               NUMBER;
  v_item_cancelado               NUMBER;
  v_item_quantidadeDevolvidaRet  NUMBER;
  v_item_precoUnitario           NUMBER;
  v_item_precoUnitarioConvertido NUMBER;
  v_item_valorProdutoServicoBrut NUMBER;
  v_item_valorProdutoServico     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_movimentaEstoqueFiscal  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_stICMSEscrituracao      CHAR (2);
  v_item_reducaoBaseICMSEscritur NUMBER;
  v_item_aliquotaICMSEscrituraca NUMBER;
  v_item_diferimentoICMSEscritur NUMBER;
  v_item_margemValorAdicSTEscrit NUMBER;
  v_item_reducaoBaseSTEscriturac NUMBER;
  v_item_aliquotaICMSSTEscritura NUMBER;
  v_item_somarICMSST             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_baseICMSEscrituracao    NUMBER;
  v_item_valorICMSEscrituracao   NUMBER;
  v_item_valorICMSDesonEscritura NUMBER;
  v_item_baseICMSSTEscrituracao  NUMBER;
  v_item_valorICMSSTEscrituracao 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_item_valorDescontoCustoOpTot NUMBER;
  v_item_valorAcrescimoCustoOpTo NUMBER;
  v_item_precoCustoOperacao      NUMBER;
  v_item_valorCustoOperacao      NUMBER;
  v_item_precoCMV                NUMBER;
  v_item_valorCMV                NUMBER;
  v_item_valorAcrescimoExtempSub NUMBER;
  v_item_valorAcrescimoExtempTot 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_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_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  r_item_idItemDocFiscal := p_item_idItemDocFiscal;
  r_buffer_idItemDocFiscal := p_buffer_idItemDocFiscal;
  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.devolucaoAnulacaoRetorno,
    cab.finalidadeNota,
    cab.atualizaCustoMedio,
    cab.nfFornecedor,
    cab.documentoFiscal,
    cab.estabelecimento,
    cab.dataEmissao,
    cab.pessoa,
    cab.vendaConsumidor,
    cab.enderecoEntregaPessoa,
    cab.municipioFatoGerador,
    cab.localDestinoOperacao,
    cab.indicadorConsumidorFinal,
    cab.projeto,
    cab.modalidadeFrete,
    cab.tipoPagamentoFrete,
    cab.situacaoDocumentoFiscal,
    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,
    cab.valorDescontoCustoOpItem,
    cab.valorDescontoCustoOpGeral,
    cab.valorDescontoCustoOpTotal,
    cab.valorAcrescimoCustoOpItem,
    cab.valorAcrescimoCustoOpGeral,
    cab.valorAcrescimoCustoOpTotal,
    cab.valorCustoOperacao,
    cab.valorCMV,
    cab.quantidadeExtemporanea,
    cab.valorAcrescimoExtempSubtotal,
    cab.valorAcrescimoExtempItem,
    cab.valorAcrescimoExtempGeral,
    cab.valorAcrescimoExtempTotal,
    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
  INTO
    v_cab_origemDocumento,
    v_cab_tipoDocumento,
    v_cab_entradaSaida,
    v_cab_devolucaoAnulacaoRetorno,
    v_cab_finalidadeNota,
    v_cab_atualizaCustoMedio,
    v_cab_nfFornecedor,
    v_cab_documentoFiscal,
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_pessoa,
    v_cab_vendaConsumidor,
    v_cab_enderecoEntregaPessoa,
    v_cab_municipioFatoGerador,
    v_cab_localDestinoOperacao,
    v_cab_indicadorConsumidorFinal,
    v_cab_projeto,
    v_cab_modalidadeFrete,
    v_cab_tipoPagamentoFrete,
    v_cab_situacaoDocumentoFiscal,
    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_cab_valorDescontoCustoOpItem,
    v_cab_valorDescontoCustoOpGera,
    v_cab_valorDescontoCustoOpTota,
    v_cab_valorAcrescimoCustoOpIte,
    v_cab_valorAcrescimoCustoOpGer,
    v_cab_valorAcrescimoCustoOpTot,
    v_cab_valorCustoOperacao,
    v_cab_valorCMV,
    v_cab_quantidadeExtemporanea,
    v_cab_valorAcrescimoExtempSubt,
    v_cab_valorAcrescimoExtempItem,
    v_cab_valorAcrescimoExtempGera,
    v_cab_valorAcrescimoExtempTota,
    v_est_grupoFiscal,
    v_pessEst_regimeTributario,
    v_munEndEst_uf,
    v_pess_indicadorInscricaoEstad,
    v_endPess_enderecoPessoa,
    v_munEndPess_uf,
    v_munEndEntr_uf
  FROM MODOCUMENTOSFISCAIS 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
  WHERE cab.idDocumentoFiscal = p_item_idDocumentoFiscal;
  v_ini_cab_valorFreteItem := v_cab_valorFreteItem;
  v_ini_cab_valorFreteGeral := v_cab_valorFreteGeral;
  SELECT
    diminuiDescontoPrUnit,
    somaAcrescimosPrUnit,
    somaFreteSeguroPrUnit
  INTO
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit
  FROM PAMODELOSDOCUMENTO
  WHERE modeloDocumento = p_item_modeloDocumento;
  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_valorFreteTotal          := 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_item_quantidadeDevolvidaRet  := 0;
  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_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_movimentaEstoqueFiscal  := p_item_movimentaEstoqueFiscal;
  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_stICMSEscrituracao      := p_item_stICMSEscrituracao;
  v_item_reducaoBaseICMSEscritur := p_item_reducaoBaseICMSEscritur;
  v_item_aliquotaICMSEscrituraca := p_item_aliquotaICMSEscrituraca;
  v_item_diferimentoICMSEscritur := p_item_diferimentoICMSEscritur;
  v_item_margemValorAdicSTEscrit := p_item_margemValorAdicSTEscrit;
  v_item_reducaoBaseSTEscriturac := p_item_reducaoBaseSTEscriturac;
  v_item_aliquotaICMSSTEscritura := p_item_aliquotaICMSSTEscritura;
  v_item_somarICMSST             := p_item_somarICMSST;
  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_baseICMSEscrituracao    := p_item_baseICMSEscrituracao;
  v_item_valorICMSEscrituracao   := p_item_valorICMSEscrituracao;
  v_item_valorICMSDesonEscritura := p_item_valorICMSDesonEscritura;
  v_item_baseICMSSTEscrituracao  := p_item_baseICMSSTEscrituracao;
  v_item_valorICMSSTEscrituracao := p_item_valorICMSSTEscrituracao;
  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;
  IF p_manterFinanceiro_Retotalizar = 0 THEN
    SELECT COALESCE (MAX(1), 0)
    INTO v_cab_promocaoExiste
    FROM MODOCFISCALXPROMOCOES
    WHERE idDocumentoFiscal = p_item_idDocumentoFiscal;
  END IF;
  IF p_item_idItemDocFiscal > 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.quantidadeDevolvidaRetornada,
        a.pesoLiquido,
        a.pesoBruto,
        a.valorProdutoServicoBruto,
        a.valorProdutoServico,
        a.valorDescontoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.quantidadeExtemporanea,
        a.valorAcrescimoExtempSubtotal,
        a.valorAcrescimoExtempItem,
        a.valorDescontoCustoOpItem,
        a.valorAcrescimoCustoOpItem,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorAcrescimoExtempGeral,
        a.valorDescontoCustoOpGeral,
        a.valorAcrescimoCustoOpGeral,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.valorFreteTotal,
        a.valorSeguroTotal,
        a.valorDescontoTotal,
        a.valorOutrasDespesasTotal,
        a.valorAdicFreteMarinhaMerTotal,
        a.valorDespesasAduaneirasTotal,
        a.valorAcrescimoExtempTotal,
        a.valorDescontoCustoOpTotal,
        a.valorAcrescimoCustoOpTotal,
        a.operacaoFiscal,
        a.movimentaEstoque,
        a.movimentaEstoqueFiscal,
        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.stICMSEscrituracao,
        a.reducaoBaseICMSEscrituracao,
        a.aliquotaICMSEscrituracao,
        a.diferimentoICMSEscrituracao,
        a.margemValorAdicSTEscrituracao,
        a.reducaoBaseSTEscrituracao,
        a.aliquotaICMSSTEscrituracao,
        a.somarICMSST,
        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.baseICMSEscrituracao,
        a.valorICMSEscrituracao,
        a.valorICMSDesonEscrituracao,
        a.baseICMSSTEscrituracao,
        a.valorICMSSTEscrituracao,
        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,
        a.valorCustoOperacao,
        a.valorCMV,
        prod.tipoProduto
      FROM MODOCFISCALXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      WHERE a.idItemDocFiscal = p_item_idItemDocFiscal)
    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_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_item_quantidadeDevolvidaRet := a.quantidadeDevolvidaRetornada;
      IF p_buscarAliquotas_CalcularImp ='T'
      THEN
        v_item_movimentaEstoque        := a.movimentaEstoque;
        v_item_movimentaEstoqueFiscal  := a.movimentaEstoqueFiscal;
        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_stICMSEscrituracao      := a.stICMSEscrituracao;
        v_item_reducaoBaseICMSEscritur := a.reducaoBaseICMSEscrituracao;
        v_item_aliquotaICMSEscrituraca := a.aliquotaICMSEscrituracao;
        v_item_diferimentoICMSEscritur := a.diferimentoICMSEscrituracao;
        v_item_margemValorAdicSTEscrit := a.margemValorAdicSTEscrituracao;
        v_item_reducaoBaseSTEscriturac := a.reducaoBaseSTEscrituracao;
        v_item_aliquotaICMSSTEscritura := a.aliquotaICMSSTEscrituracao;
        v_item_somarICMSST             := a.somarICMSST;
        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_baseICMSEscrituracao    := a.baseICMSEscrituracao;
        v_item_valorICMSEscrituracao   := a.valorICMSEscrituracao;
        v_item_valorICMSDesonEscritura := a.valorICMSDesonEscrituracao;
        v_item_baseICMSSTEscrituracao  := a.baseICMSSTEscrituracao;
        v_item_valorICMSSTEscrituracao := a.valorICMSSTEscrituracao;
        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 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 <> p_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;
        v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
        v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
        v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
        v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
        v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
        v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
        v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
        v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
        v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
        v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
        v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
        v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
        v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      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,
    p_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);
  v_item_valorAcrescimoExtempSub := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
    p_item_quantidade,
    v_item_precoUnitario,
    p_item_quantidadeExtemporanea,
    p_item_acrescimoUnitarioExtemp);
  v_item_valorAcrescimoExtempTot := FUNC_ADD_CALC_EXTEMP_TOTAL(
    v_item_valorAcrescimoExtempSub,
    p_item_valorAcrescimoExtempIte,
    p_item_valorAcrescimoExtempGer);
  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,
        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 = CASE WHEN v_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
      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 / ((v_combo_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 / ((v_combo_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,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_estabelecimento,
        NULL, -- p_cab_dataPrecoInicial
        TRUNC (SYSDATE), -- p_cab_dataPrecoFinal
        v_cab_pessoa,
        v_cab_projeto,
        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_DOC_FISC_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_227_manterPessoaOrcam,
        p_config_230_etapaPedComprParc,
        p_config_362_calcCustoPorGrade,
        p_config_378_calcularVolumes,
        p_config_413_obs_add_marca,
        p_manterFinanceiro_Retotalizar,
        'S', -- p_buscarAliquotas_CalcularImp
        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_calcularImpostos,
        0, -- p_item_idItemDocFiscal
        p_item_idDocumentoFiscal,
        p_item_pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo,
        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
        CASE
          WHEN p_item_quantidade = 0
          THEN 0
          ELSE ROUND(p_item_quantidadeExtemporanea * a.quantidade / p_item_quantidade, 2)
        END, -- p_item_quantidadeExtemporanea
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_acrescimoUnitarioExtemp
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_acrescimoUnitarioExtemp
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoExtempIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpIt
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpIt
        p_item_observacoesDigitadas,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorFreteGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_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_valorAcrescimoExtempGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpGe
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpGe
        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
        p_item_percentualDevolucao,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorIPIDevolucao
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorIPIDevolucao,
        v_combo_operacaoFiscal,
        p_item_movimentaEstoque,
        p_item_movimentaEstoqueFiscal,
        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
        '  ', -- p_item_stICMSEscrituracao
        0, -- p_item_reducaoBaseICMSEscritur
        0, -- p_item_aliquotaICMSEscrituraca
        0, -- p_item_diferimentoICMSEscritur
        0, -- p_item_margemValorAdicSTEscrit
        0, -- p_item_reducaoBaseSTEscriturac
        0, -- p_item_aliquotaICMSSTEscritura
        0, -- p_item_somarICMSST
        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_baseICMSEscrituracao
        0, -- p_item_valorICMSEscrituracao
        0, -- p_item_valorICMSDesonEscritura
        0, -- p_item_baseICMSSTEscrituracao
        0, -- p_item_valorICMSSTEscrituracao
        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_idItemDocFiscal,
        /* Retornos */
        r_calcularImpostos,
        v_auxNumber, -- r_item_idItemDocFiscal
        r_buffer_idItemDocFiscal,
        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_DOC_FISC_ITEM_COMBO_RESID (
        p_item_idDocumentoFiscal,
        v_item_valorProdutoServico,
        p_item_valorDescontoItem,
        p_item_valorAcrescimoItem,
        v_modDoc_diminuiDescontoPrUnit,
        v_modDoc_somaAcrescimosPrUnit,
        r_buffer_idItemDocFiscal,
        r_valorInserido);
      r_calcularImpostos := 1;
    END IF;
  ELSE
    IF r_item_idItemDocFiscal <= 0 THEN
      r_item_idItemDocFiscal := FUNC_ADD_BUSCA_PROXIMO_ID ('MODOCFISCALXITENS', 'idItemDocFiscal', 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
          OR p_item_valorAcrescimoExtempGer <> 0
          OR p_item_valorDescontoCustoOpGer <> 0
          OR p_item_valorAcrescimoCustoOpGe <> 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_DOC_FISC_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          p_item_idDocumentoFiscal,
          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 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,
        p_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,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_finalidadeNota,
        v_cab_estabelecimento,
        v_cab_nfFornecedor,
        SYSDATE, -- p_cab_dataEmissao
        v_cab_pessoa,
        v_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,
        p_item_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
        1, -- 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_item_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_item_stICMSEscrituracao,
        v_item_reducaoBaseICMSEscritur,
        v_item_aliquotaICMSEscrituraca,
        v_item_diferimentoICMSEscritur,
        v_item_margemValorAdicSTEscrit,
        v_item_reducaoBaseSTEscriturac,
        v_item_aliquotaICMSSTEscritura,
        v_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,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_estabelecimento,
        v_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
        p_item_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
        1, -- p_calcularICMSEscrituracao
        v_item_stICMSEscrituracao,
        v_item_reducaoBaseICMSEscritur,
        v_item_aliquotaICMSEscrituraca,
        v_item_diferimentoICMSEscritur,
        0, -- p_baseICMSEscrituracao
        0, -- p_valorICMSEscrituracao
        0, -- p_valorICMSDesonEscrituracao
        1, -- p_calcularICMSSTEscrituracao
        v_item_margemValorAdicSTEscrit,
        v_item_reducaoBaseSTEscriturac,
        v_item_aliquotaICMSSTEscritura,
        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_item_baseICMSEscrituracao,
        v_item_valorICMSEscrituracao,
        v_item_valorICMSDesonEscritura,
        v_item_baseICMSSTEscrituracao,
        v_item_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,
      v_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,
      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,
      v_item_valorICMSSTEscrituracao,
      v_item_somarICMSST,
      v_item_valorAcrescimoExtempTot,
      v_modDoc_geraFinanceiro);
    v_item_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
      v_cab_nfFornecedor,
      v_cab_tipoPagamentoFrete,
      v_item_valorProdutoServico,
      v_item_valorFreteTotal,
      v_item_valorSeguroTotal,
      v_item_valorDescontoTotal,
      v_item_valorOutrasDespesasTot,
      p_item_valorIPIDevolucao,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      v_item_valorICMSST,
      v_item_valorICMSSTEscrituracao,
      v_item_somarICMSST);
    ADD_CALCULA_CUSTO_CMV (
      v_cab_atualizaCustoMedio,
      v_cab_estabelecimento,
      v_cab_nfFornecedor,
      p_item_modeloDocumento,
      p_item_quantidade,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      p_item_valorIPIDevolucao,
      v_item_valorPIS,
      v_item_valorPISST,
      v_item_valorCOFINS,
      v_item_valorCOFINSST,
      v_item_valorCreditoSimplesNac,
      v_item_valorICMS,
      v_item_valorICMSST,
      v_item_valorICMSSTEscrituracao,
      v_item_valorLiquidoItem,
      p_item_valorDescontoCustoOpIte,
      p_item_valorDescontoCustoOpGer,
      p_item_valorAcrescimoCustoOpIt,
      p_item_valorAcrescimoCustoOpGe,
      v_item_valorAcrescimoExtempTot,
      v_item_valorDescontoCustoOpTot,
      v_item_valorAcrescimoCustoOpTo,
      v_item_precoCustoOperacao,
      v_item_valorCustoOperacao,
      v_item_precoCMV,
      v_item_valorCMV);
    IF v_inserindoItem = 1 THEN
      SELECT COALESCE (MAX (sequencia),0) + 1
      INTO v_item_sequencia
      FROM MODOCFISCALXITENS
      WHERE idDocumentoFiscal = p_item_idDocumentoFiscal;
      v_cab_ultimoVendedorItem := p_item_vendedor;
    END IF;
    IF v_item_cancelado = 0 THEN
      IF p_manterFinanceiro_Retotalizar <> 2 THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume + TRUNC(CASE WHEN p_item_controleQuantidade = 1 AND p_item_loteMultiplo <> 0 THEN p_item_quantidade / p_item_loteMultiplo ELSE p_item_quantidadeConvertida END,0);
        END IF;
        v_cab_pesoLiquido := v_cab_pesoLiquido + p_item_pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto + p_item_pesoBruto;
      END IF;
      v_cab_quantidade := v_cab_quantidade + p_item_quantidadeConvertida;
      IF v_prod_tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorServicos := v_cab_valorServicos + v_item_valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos + p_item_valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorProdutos := v_cab_valorProdutos + v_item_valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos + p_item_valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem + p_item_valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem + p_item_valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem + p_item_valorAdicFreteMarItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem + p_item_valorDespesasAduanItem;
      v_cab_valorFreteGeral := v_cab_valorFreteGeral + p_item_valorFreteGeral;
      v_cab_valorSeguroGeral := v_cab_valorSeguroGeral + p_item_valorSeguroGeral;
      v_cab_valorDescontoGeral := v_cab_valorDescontoGeral + v_item_valorDescontoGeral;
      v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral + p_item_valorOutrasDespesasGer;
      v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral + p_item_valorAdicFreteMarGeral;
      v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral + p_item_valorDespesasAduanGeral;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento + v_item_valorBasePagamento;
      IF p_item_usarPrecoAVista = 1
        AND v_item_geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo + v_item_valorProdutoServico - v_item_valorDescontoTotal + v_item_valorOutrasDespesasTot;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento + v_item_valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento + v_item_valorOutrasDespPagament;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento + v_item_valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal + v_item_valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal + v_item_valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal + v_item_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_item_valorOutrasDespesasTot;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal + v_item_valorAdicFreteMarTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal + v_item_valorDespesasAduanTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem + v_item_valorLiquidoItem;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem + p_item_valorDescontoCustoOpIte;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera + p_item_valorDescontoCustoOpGer;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota + v_item_valorDescontoCustoOpTot;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte + p_item_valorAcrescimoCustoOpIt;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer + p_item_valorAcrescimoCustoOpGe;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot + v_item_valorAcrescimoCustoOpTo;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao + v_item_valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV + v_item_valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea + p_item_quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt + v_item_valorAcrescimoExtempSub;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem + p_item_valorAcrescimoExtempIte;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera + p_item_valorAcrescimoExtempGer;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota + v_item_valorAcrescimoExtempTot;
    END IF;
    UPDATE MODOCUMENTOSFISCAIS SET
      modalidadeFrete               = v_cab_modalidadeFrete,
      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,
      valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
      valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
      valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
      valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
      valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
      valorCustoOperacao            = v_cab_valorCustoOperacao,
      valorCMV                      = v_cab_valorCMV,
      quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
      valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
      valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
      valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
    WHERE idDocumentoFiscal = p_item_idDocumentoFiscal;
    IF p_item_idItemDocFiscal > 0 THEN
      DELETE MODOCFISCALXCOMPOSICOESPR compDoc
      WHERE compDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND EXISTS(
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.produto = comp.produto
        WHERE comp.composicaoPreco = compDoc.composicaoPreco
        AND gradProd.gradeProduto <> p_item_gradeProduto);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      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_413_obs_add_marca,
      ' ',
      0,
      'D',
      p_item_idItemDocFiscal,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    MERGE INTO MODOCFISCALXITENS a USING (
      SELECT
        r_item_idItemDocFiscal         idItemDocFiscal,
        p_item_idDocumentoFiscal       idDocumentoFiscal,
        v_item_sequencia               sequencia,
        v_item_cancelado               cancelado,
        p_item_pedidoCompraFornecedor  pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo sequenciaPedidoCompraFornec,
        p_item_modeloDocumento         modeloDocumento,
        p_item_estabelecimentoOriginal estabelecimentoOriginal,
        p_item_vendedor                vendedor,
        p_item_gradeProduto            gradeProduto,
        p_item_idFormulaTinta          idFormulaTinta,
        p_item_personalizacao          personalizacao,
        p_item_idLoteEstoque           idLoteEstoque,
        p_item_operacaoFiscal          operacaoFiscal,
        v_item_movimentaEstoque        movimentaEstoque,
        v_item_movimentaEstoqueFiscal  movimentaEstoqueFiscal,
        v_item_geraFinanceiro          geraFinanceiro,
        p_item_localEstoque            localEstoque,
        p_item_pessoaParticipante      pessoaParticipante,
        p_item_controleQuantidade      controleQuantidade,
        p_item_unidadeMedidaConversao  unidadeMedidaConversao,
        p_item_conversorQuantidade     conversorQuantidade,
        p_item_loteMinimo              loteMinimo,
        p_item_loteMultiplo            loteMultiplo,
        p_item_altura                  altura,
        p_item_largura                 largura,
        p_item_comprimento             comprimento,
        p_item_pecas                   pecas,
        p_item_quantidade              quantidade,
        p_item_quantidadeConvertida    quantidadeConvertida,
        v_item_quantidadeDevolvidaRet  quantidadeDevolvidaRetornada,
        p_item_percentualDevolucao     percentualDevolucao,
        p_item_pesoLiquido             pesoLiquido,
        p_item_pesoBruto               pesoBruto,
        p_item_tipoPreco               tipoPreco,
        p_item_tabelaPreco             tabelaPreco,
        p_item_precoSugestaoAPrazo     precoSugestaoAPrazo,
        p_item_precoSugestaoAVista     precoSugestaoAVista,
        p_item_precoDesconto           precoDesconto,
        p_item_precoMinimo             precoMinimo,
        p_item_usarPrecoAVista         usarPrecoAVista,
        p_item_precoUnitarioBruto      precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos acrescimoUnitarioComposicao,
        v_item_precoUnitario           precoUnitario,
        v_item_precoUnitarioConvertido precoUnitarioConvertido,
        v_item_valorProdutoServicoBrut valorProdutoServicoBruto,
        v_item_valorProdutoServico     valorProdutoServico,
        p_item_percDescontoItem        percDescontoItem,
        p_item_valorDescontoItem       valorDescontoItem,
        p_item_percAcrescimoItem       percAcrescimoItem,
        p_item_valorAcrescimoItem      valorAcrescimoItem,
        p_item_valorFreteItem          valorFreteItem,
        p_item_valorSeguroItem         valorSeguroItem,
        p_item_valorAdicFreteMarItem   valorAdicFreteMarinhaMerItem,
        p_item_valorDespesasAduanItem  valorDespesasAduaneirasItem,
        p_item_valorFreteGeral         valorFreteGeral,
        p_item_valorSeguroGeral        valorSeguroGeral,
        v_item_valorDescontoGeral      valorDescontoGeral,
        p_item_valorOutrasDespesasGer  valorOutrasDespesasGeral,
        p_item_valorAdicFreteMarGeral  valorAdicFreteMarinhaMerGeral,
        p_item_valorDespesasAduanGeral valorDespesasAduaneirasGeral,
        v_item_valorBasePagamento      valorBasePagamento,
        v_item_valorDescontoPagamento  valorDescontoPagamento,
        v_item_valorOutrasDespPagament valorOutrasDespesasPagamento,
        v_item_valorJurosPagamento     valorJurosPagamento,
        v_item_valorFreteTotal         valorFreteTotal,
        v_item_valorSeguroTotal        valorSeguroTotal,
        v_item_valorDescontoTotal      valorDescontoTotal,
        v_item_valorOutrasDespesasTot  valorOutrasDespesasTotal,
        v_item_valorAdicFreteMarTotal  valorAdicFreteMarinhaMerTotal,
        v_item_valorDespesasAduanTotal valorDespesasAduaneirasTotal,
        v_item_cfop                    cfop,
        v_item_indicadorISSQN          indicadorISSQN,
        v_item_aliquotaISSQN           aliquotaISSQN,
        v_item_retidoISSQN             retidoISSQN,
        v_item_tributadoForaMunicipio  tributadoForaMunicipio,
        v_item_incentivoFiscal         incentivoFiscal,
        v_item_listaServicos           listaServicos,
        v_item_cnae                    cnae,
        v_item_idServicoMunicipio      idServicoMunicipio,
        v_item_numeroProcessoAdministr numeroProcessoAdministrativo,
        v_item_baseISSQN               baseISSQN,
        v_item_valorISSQN              valorISSQN,
        v_item_retencaoIRRF            retencaoIRRF,
        v_item_baseRetIRRF             baseRetIRRF,
        v_item_valorRetIRRF            valorRetIRRF,
        v_item_retencaoINSS            retencaoINSS,
        v_item_baseRetINSS             baseRetINSS,
        v_item_valorRetINSS            valorRetINSS,
        v_item_retencaoPIS             retencaoPIS,
        v_item_baseRetPIS              baseRetPIS,
        v_item_valorRetPIS             valorRetPIS,
        v_item_retencaoCOFINS          retencaoCOFINS,
        v_item_baseRetCOFINS           baseRetCOFINS,
        v_item_valorRetCOFINS          valorRetCOFINS,
        v_item_retencaoCSLL            retencaoCSLL,
        v_item_baseRetCSLL             baseRetCSLL,
        v_item_valorRetCSLL            valorRetCSLL,
        v_item_retencaoOutros          retencaoOutros,
        v_item_baseRetOutros           baseRetOutros,
        v_item_valorRetOutros          valorRetOutros,
        v_item_aliquotaII              aliquotaII,
        v_item_baseII                  baseII,
        v_item_valorII                 valorII,
        v_item_aliquotaIOF             aliquotaIOF,
        v_item_baseIOF                 baseIOF,
        v_item_valorIOF                valorIOF,
        v_item_codigoEnquadramentoIPI  codigoEnquadramentoIPI,
        v_item_stIPI                   stIPI,
        v_item_aliquotaIPI             aliquotaIPI,
        v_item_valorAliquotaIPI        valorAliquotaIPI,
        v_item_baseIPI                 baseIPI,
        v_item_valorIPI                valorIPI,
        p_item_valorIPIDevolucao       valorIPIDevolucao,
        v_item_stPIS                   stPIS,
        v_item_aliquotaPIS             aliquotaPIS,
        v_item_valorAliquotaPIS        valorAliquotaPIS,
        v_item_basePIS                 basePIS,
        v_item_valorPIS                valorPIS,
        v_item_aliquotaPISST           aliquotaPISST,
        v_item_valorAliquotaPISST      valorAliquotaPISST,
        v_item_basePISST               basePISST,
        v_item_valorPISST              valorPISST,
        v_item_stCOFINS                stCOFINS,
        v_item_aliquotaCOFINS          aliquotaCOFINS,
        v_item_valorAliquotaCOFINS     valorAliquotaCOFINS,
        v_item_baseCOFINS              baseCOFINS,
        v_item_valorCOFINS             valorCOFINS,
        v_item_aliquotaCOFINSST        aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST   valorAliquotaCOFINSST,
        v_item_baseCOFINSST            baseCOFINSST,
        v_item_valorCOFINSST           valorCOFINSST,
        v_item_stSimplesNacional       stSimplesNacional,
        v_item_creditoSimplesNacional  creditoSimplesNacional,
        v_item_baseCreditoSimplesNac   baseCreditoSimplesNacional,
        v_item_valorCreditoSimplesNac  valorCreditoSimplesNacional,
        v_item_stICMS                  stICMS,
        v_item_modalBaseCalcICMS       modalidadeBaseCalcICMS,
        v_item_reducaoBaseICMS         reducaoBaseICMS,
        v_item_aliquotaICMS            aliquotaICMS,
        v_item_diferimentoICMS         diferimentoICMS,
        v_item_motivoDesoneracaoICMS   motivoDesoneracaoICMS,
        v_item_idBeneficio             idBeneficio,
        v_item_baseICMS                baseICMS,
        v_item_valorICMSOperacao       valorICMSOperacao,
        v_item_valorICMSDiferido       valorICMSDiferido,
        v_item_valorICMS               valorICMS,
        v_item_valorICMSDesoneracao    valorICMSDesoneracao,
        v_item_modalBaseCalcICMSST     modalidadeBaseCalcICMSST,
        v_item_margemValorAdicionadoST margemValorAdicionadoST,
        v_item_reducaoBaseST           reducaoBaseST,
        v_item_aliquotaICMSST          aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin aliquotaSTSuportConsFinal,
        v_item_baseICMSST              baseICMSST,
        v_item_valorICMSST             valorICMSST,
        v_item_baseICMSSTAnteriormente baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment valorICMSSTAnteriormente,
        v_item_valorICMSProprioSubstit valorICMSProprioSubstituto,
        v_item_reducaoBaseICMSEfetivo  reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo     aliquotaICMSEfetivo,
        v_item_baseICMSEfetivo         baseICMSEfetivo,
        v_item_valorICMSEfetivo        valorICMSEfetivo,
        v_item_stICMSEscrituracao      stICMSEscrituracao,
        v_item_reducaoBaseICMSEscritur reducaoBaseICMSEscrituracao,
        v_item_aliquotaICMSEscrituraca aliquotaICMSEscrituracao,
        v_item_diferimentoICMSEscritur diferimentoICMSEscrituracao,
        v_item_baseICMSEscrituracao    baseICMSEscrituracao,
        v_item_valorICMSEscrituracao   valorICMSEscrituracao,
        v_item_valorICMSDesonEscritura valorICMSDesonEscrituracao,
        v_item_margemValorAdicSTEscrit margemValorAdicSTEscrituracao,
        v_item_reducaoBaseSTEscriturac reducaoBaseSTEscrituracao,
        v_item_aliquotaICMSSTEscritura aliquotaICMSSTEscrituracao,
        v_item_baseICMSSTEscrituracao  baseICMSSTEscrituracao,
        v_item_valorICMSSTEscrituracao valorICMSSTEscrituracao,
        v_item_somarICMSST             somarICMSST,
        v_item_aliquotaICMSUFDestinat  aliquotaICMSUFDestinatario,
        v_item_aliquotaICMSInterestad  aliquotaICMSInterestadual,
        v_item_partilhaICMSInterestad  partilhaICMSInterestadual,
        v_item_baseICMSUFDestinatario  baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente     baseICMSUFRemetente,
        v_item_valorICMSUFRemetente    valorICMSUFRemetente,
        v_item_aliquotaFCP             aliquotaFCP,
        v_item_baseFCP                 baseFCP,
        v_item_valorFCP                valorFCP,
        v_item_aliquotaFCPST           aliquotaFCPST,
        v_item_baseFCPST               baseFCPST,
        v_item_valorFCPST              valorFCPST,
        v_item_aliquotaFCPSTAnteriorm  aliquotaFCPSTAnteriormente,
        v_item_baseFCPSTAnteriormente  baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente valorFCPSTAnteriormente,
        v_item_aliquotaFCPUFDestinat   aliquotaFCPUFDestinatario,
        v_item_baseFCPUFDestinatario   baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario  valorFCPUFDestinatario,
        v_item_aliquotaEstImpFederais  aliquotaEstimadaImpFederais,
        v_item_aliquotaEstImpEstaduais aliquotaEstimadaImpEstaduais,
        v_item_aliquotaEstImpMunicipai aliquotaEstimadaImpMunicipais,
        v_item_baseEstimadaImpostos    baseEstimadaImpostos,
        v_item_valorEstImpFederais     valorEstimadoImpFederais,
        v_item_valorEstImpEstaduais    valorEstimadoImpEstaduais,
        v_item_valorEstImpMunicipais   valorEstimadoImpMunicipais,
        v_item_valorLiquidoItem        valorLiquidoItem,
        p_item_valorDescontoCustoOpIte valorDescontoCustoOpItem,
        p_item_valorDescontoCustoOpGer valorDescontoCustoOpGeral,
        v_item_valorDescontoCustoOpTot valorDescontoCustoOpTotal,
        p_item_valorAcrescimoCustoOpIt valorAcrescimoCustoOpItem,
        p_item_valorAcrescimoCustoOpGe valorAcrescimoCustoOpGeral,
        v_item_valorAcrescimoCustoOpTo valorAcrescimoCustoOpTotal,
        v_item_precoCustoOperacao      precoCustoOperacao,
        v_item_valorCustoOperacao      valorCustoOperacao,
        v_item_precoCMV                precoCMV,
        v_item_valorCMV                valorCMV,
        p_item_quantidadeExtemporanea  quantidadeExtemporanea,
        p_item_acrescimoUnitarioExtemp acrescimoUnitarioExtemporaneo,
        v_item_valorAcrescimoExtempSub valorAcrescimoExtempSubtotal,
        p_item_valorAcrescimoExtempIte valorAcrescimoExtempItem,
        p_item_valorAcrescimoExtempGer valorAcrescimoExtempGeral,
        v_item_valorAcrescimoExtempTot valorAcrescimoExtempTotal,
        p_item_observacoesDigitadas    observacoesDigitadas,
        v_observacoes                  observacoes
      FROM DUAL) b
    ON (a.idItemDocFiscal = b.idItemDocFiscal)
    WHEN MATCHED THEN UPDATE SET
      a.idDocumentoFiscal             = b.idDocumentoFiscal,
      a.sequencia                     = b.sequencia,
      a.cancelado                     = b.cancelado,
      a.pedidoCompraFornecedor        = b.pedidoCompraFornecedor,
      a.sequenciaPedidoCompraFornec   = b.sequenciaPedidoCompraFornec,
      a.vendedor                      = b.vendedor,
      a.modeloDocumento               = b.modeloDocumento,
      a.estabelecimentoOriginal       = b.estabelecimentoOriginal,
      a.gradeProduto                  = b.gradeProduto,
      a.idFormulaTinta                = b.idFormulaTinta,
      a.personalizacao                = b.personalizacao,
      a.idLoteEstoque                 = b.idLoteEstoque,
      a.operacaoFiscal                = b.operacaoFiscal,
      a.movimentaEstoque              = b.movimentaEstoque,
      a.movimentaEstoqueFiscal        = b.movimentaEstoqueFiscal,
      a.geraFinanceiro                = b.geraFinanceiro,
      a.localEstoque                  = b.localEstoque,
      a.pessoaParticipante            = b.pessoaParticipante,
      a.controleQuantidade            = b.controleQuantidade,
      a.unidadeMedidaConversao        = b.unidadeMedidaConversao,
      a.conversorQuantidade           = b.conversorQuantidade,
      a.loteMinimo                    = b.loteMinimo,
      a.loteMultiplo                  = b.loteMultiplo,
      a.altura                        = b.altura,
      a.largura                       = b.largura,
      a.comprimento                   = b.comprimento,
      a.pecas                         = b.pecas,
      a.quantidade                    = b.quantidade,
      a.quantidadeConvertida          = b.quantidadeConvertida,
      a.quantidadeDevolvidaRetornada  = b.quantidadeDevolvidaRetornada,
      a.percentualDevolucao           = b.percentualDevolucao,
      a.pesoLiquido                   = b.pesoLiquido,
      a.pesoBruto                     = b.pesoBruto,
      a.tipoPreco                     = b.tipoPreco,
      a.tabelaPreco                   = b.tabelaPreco,
      a.precoSugestaoAPrazo           = b.precoSugestaoAPrazo,
      a.precoSugestaoAVista           = b.precoSugestaoAVista,
      a.precoDesconto                 = b.precoDesconto,
      a.precoMinimo                   = b.precoMinimo,
      a.usarPrecoAVista               = b.usarPrecoAVista,
      a.precoUnitarioBruto            = b.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao   = b.acrescimoUnitarioComposicao,
      a.precoUnitario                 = b.precoUnitario,
      a.precoUnitarioConvertido       = b.precounitarioConvertido,
      a.valorProdutoServicoBruto      = b.valorProdutoServicoBruto,
      a.valorProdutoServico           = b.valorProdutoServico,
      a.percDescontoItem              = b.percDescontoItem,
      a.valorDescontoItem             = b.valorDescontoItem,
      a.percAcrescimoItem             = b.percAcrescimoItem,
      a.valorAcrescimoItem            = b.valorAcrescimoItem,
      a.valorFreteItem                = b.valorFreteItem,
      a.valorSeguroItem               = b.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem  = b.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem   = b.valorDespesasAduaneirasItem,
      a.valorFreteGeral               = b.valorFreteGeral,
      a.valorSeguroGeral              = b.valorSeguroGeral,
      a.valorDescontoGeral            = b.valorDescontoGeral,
      a.valorOutrasDespesasGeral      = b.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral = b.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral  = b.valorDespesasAduaneirasGeral,
      a.valorBasePagamento            = b.valorBasePagamento,
      a.valorDescontoPagamento        = b.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento  = b.valorOutrasDespesasPagamento,
      a.valorJurosPagamento           = b.valorJurosPagamento,
      a.valorFreteTotal               = b.valorFreteTotal,
      a.valorSeguroTotal              = b.valorSeguroTotal,
      a.valorDescontoTotal            = b.valorDescontoTotal,
      a.valorOutrasDespesasTotal      = b.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal = b.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal  = b.valorDespesasAduaneirasTotal,
      a.cfop                          = b.cfop,
      a.indicadorISSQN                = b.indicadorISSQN,
      a.aliquotaISSQN                 = b.aliquotaISSQN,
      a.retidoISSQN                   = b.retidoISSQN,
      a.tributadoForaMunicipio        = b.tributadoForaMunicipio,
      a.incentivoFiscal               = b.incentivoFiscal,
      a.listaServicos                 = b.listaServicos,
      a.cnae                          = b.cnae,
      a.idServicoMunicipio            = b.idServicoMunicipio,
      a.numeroProcessoAdministrativo  = b.numeroProcessoAdministrativo,
      a.baseISSQN                     = b.baseISSQN,
      a.valorISSQN                    = b.valorISSQN,
      a.retencaoIRRF                  = b.retencaoIRRF,
      a.baseRetIRRF                   = b.baseRetIRRF,
      a.valorRetIRRF                  = b.valorRetIRRF,
      a.retencaoINSS                  = b.retencaoINSS,
      a.baseRetINSS                   = b.baseRetINSS,
      a.valorRetINSS                  = b.valorRetINSS,
      a.retencaoPIS                   = b.retencaoPIS,
      a.baseRetPIS                    = b.baseRetPIS,
      a.valorRetPIS                   = b.valorRetPIS,
      a.retencaoCOFINS                = b.retencaoCOFINS,
      a.baseRetCOFINS                 = b.baseRetCOFINS,
      a.valorRetCOFINS                = b.valorRetCOFINS,
      a.retencaoCSLL                  = b.retencaoCSLL,
      a.baseRetCSLL                   = b.baseRetCSLL,
      a.valorRetCSLL                  = b.valorRetCSLL,
      a.retencaoOutros                = b.retencaoOutros,
      a.baseRetOutros                 = b.baseRetOutros,
      a.valorRetOutros                = b.valorRetOutros,
      a.aliquotaII                    = b.aliquotaII,
      a.baseII                        = b.baseII,
      a.valorII                       = b.valorII,
      a.aliquotaIOF                   = b.aliquotaIOF,
      a.baseIOF                       = b.baseIOF,
      a.valorIOF                      = b.valorIOF,
      a.codigoEnquadramentoIPI        = b.codigoEnquadramentoIPI,
      a.stIPI                         = b.stIPI,
      a.aliquotaIPI                   = b.aliquotaIPI,
      a.valorAliquotaIPI              = b.valorAliquotaIPI,
      a.baseIPI                       = b.baseIPI,
      a.valorIPI                      = b.valorIPI,
      a.valorIPIDevolucao             = b.valorIPIDevolucao,
      a.stPIS                         = b.stPIS,
      a.aliquotaPIS                   = b.aliquotaPIS,
      a.valorAliquotaPIS              = b.valorAliquotaPIS,
      a.basePIS                       = b.basePIS,
      a.valorPIS                      = b.valorPIS,
      a.aliquotaPISST                 = b.aliquotaPISST,
      a.valorAliquotaPISST            = b.valorAliquotaPISST,
      a.basePISST                     = b.basePISST,
      a.valorPISST                    = b.valorPISST,
      a.stCOFINS                      = b.stCOFINS,
      a.aliquotaCOFINS                = b.aliquotaCOFINS,
      a.valorAliquotaCOFINS           = b.valorAliquotaCOFINS,
      a.baseCOFINS                    = b.baseCOFINS,
      a.valorCOFINS                   = b.valorCOFINS,
      a.aliquotaCOFINSST              = b.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST         = b.valorAliquotaCOFINSST,
      a.baseCOFINSST                  = b.baseCOFINSST,
      a.valorCOFINSST                 = b.valorCOFINSST,
      a.stSimplesNacional             = b.stSimplesNacional,
      a.creditoSimplesNacional        = b.creditoSimplesNacional,
      a.baseCreditoSimplesNacional    = b.baseCreditoSimplesNacional,
      a.valorCreditoSimplesNacional   = b.valorCreditoSimplesNacional,
      a.stICMS                        = b.stICMS,
      a.modalidadeBaseCalcICMS        = b.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS               = b.reducaoBaseICMS,
      a.aliquotaICMS                  = b.aliquotaICMS,
      a.diferimentoICMS               = b.diferimentoICMS,
      a.motivoDesoneracaoICMS         = b.motivoDesoneracaoICMS,
      a.idBeneficio                   = b.idBeneficio,
      a.baseICMS                      = b.baseICMS,
      a.valorICMSoperacao             = b.valorICMSoperacao,
      a.valorICMSdiferido             = b.valorICMSdiferido,
      a.valorICMS                     = b.valorICMS,
      a.valorICMSdesoneracao          = b.valorICMSdesoneracao,
      a.modalidadeBaseCalcICMSST      = b.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST       = b.margemValorAdicionadoST,
      a.reducaoBaseST                 = b.reducaoBaseST,
      a.aliquotaICMSST                = b.aliquotaICMSST,
      a.aliquotaSTSuportConsFinal     = b.aliquotaSTSuportConsFinal,
      a.baseICMSST                    = b.baseICMSST,
      a.valorICMSST                   = b.valorICMSST,
      a.baseICMSSTAnteriormente       = b.baseICMSSTAnteriormente,
      a.valorICMSSTAnteriormente      = b.valorICMSSTAnteriormente,
      a.valorICMSProprioSubstituto    = b.valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo        = b.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo           = b.aliquotaICMSEfetivo,
      a.baseICMSEfetivo               = b.baseICMSEfetivo,
      a.valorICMSEfetivo              = b.valorICMSEfetivo,
      a.stICMSEscrituracao            = b.stICMSEscrituracao,
      a.reducaoBaseICMSEscrituracao   = b.reducaoBaseICMSEscrituracao,
      a.aliquotaICMSEscrituracao      = b.aliquotaICMSEscrituracao,
      a.diferimentoICMSEscrituracao   = b.diferimentoICMSEscrituracao,
      a.baseICMSEscrituracao          = b.baseICMSEscrituracao,
      a.valorICMSEscrituracao         = b.valorICMSEscrituracao,
      a.valorICMSDesonEscrituracao    = b.valorICMSDesonEscrituracao,
      a.margemValorAdicSTEscrituracao = b.margemValorAdicSTEscrituracao,
      a.reducaoBaseSTEscrituracao     = b.reducaoBaseSTEscrituracao,
      a.aliquotaICMSSTEscrituracao    = b.aliquotaICMSSTEscrituracao,
      a.baseICMSSTEscrituracao        = b.baseICMSSTEscrituracao,
      a.valorICMSSTEscrituracao       = b.valorICMSSTEscrituracao,
      a.somarICMSST                   = b.somarICMSST,
      a.aliquotaICMSUFDestinatario    = b.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual     = b.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual     = b.partilhaICMSInterestadual,
      a.baseICMSUFDestinatario        = b.baseICMSUFDestinatario,
      a.valorICMSUFDestinatario       = b.valorICMSUFDestinatario,
      a.baseICMSUFRemetente           = b.baseICMSUFRemetente,
      a.valorICMSUFRemetente          = b.valorICMSUFRemetente,
      a.aliquotaFCP                   = b.aliquotaFCP,
      a.baseFCP                       = b.baseFCP,
      a.valorFCP                      = b.valorFCP,
      a.aliquotaFCPST                 = b.aliquotaFCPST,
      a.baseFCPST                     = b.baseFCPST,
      a.valorFCPST                    = b.valorFCPST,
      a.aliquotaFCPSTAnteriormente    = b.aliquotaFCPSTAnteriormente,
      a.baseFCPSTAnteriormente        = b.baseFCPSTAnteriormente,
      a.valorFCPSTAnteriormente       = b.valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario     = b.aliquotaFCPUFDestinatario,
      a.baseFCPUFDestinatario         = b.baseFCPUFDestinatario,
      a.valorFCPUFDestinatario        = b.valorFCPUFDestinatario,
      a.aliquotaestimadaimpfederais   = b.aliquotaestimadaimpfederais,
      a.aliquotaestimadaimpestaduais  = b.aliquotaestimadaimpestaduais,
      a.aliquotaestimadaimpmunicipais = b.aliquotaestimadaimpmunicipais,
      a.baseestimadaimpostos          = b.baseestimadaimpostos,
      a.valorestimadoimpfederais      = b.valorestimadoimpfederais,
      a.valorEstimadoImpEstaduais     = b.valorEstimadoImpEstaduais,
      a.valorEstimadoImpMunicipais    = b.valorEstimadoImpMunicipais,
      a.valorLiquidoItem              = b.valorLiquidoItem,
      a.valorDescontoCustoOpItem      = b.valorDescontoCustoOpItem,
      a.valorDescontoCustoOpGeral     = b.valorDescontoCustoOpGeral,
      a.valorDescontoCustoOpTotal     = b.valorDescontoCustoOpTotal,
      a.valorAcrescimoCustoOpItem     = b.valorAcrescimoCustoOpItem,
      a.valorAcrescimoCustoOpGeral    = b.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoCustoOpTotal    = b.valorAcrescimoCustoOpTotal,
      a.precoCustoOperacao            = b.precoCustoOperacao,
      a.valorCustoOperacao            = b.valorCustoOperacao,
      a.precoCMV                      = b.precoCMV,
      a.valorCMV                      = b.valorCMV,
      a.quantidadeExtemporanea        = b.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo = b.acrescimoUnitarioExtemporaneo,
      a.valorAcrescimoExtempSubtotal  = b.valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem      = b.valorAcrescimoExtempItem,
      a.valorAcrescimoExtempGeral     = b.valorAcrescimoExtempGeral,
      a.valorAcrescimoExtempTotal     = b.valorAcrescimoExtempTotal,
      a.observacoesDigitadas          = b.observacoesDigitadas,
      a.observacoes                   = b.observacoes
    WHEN NOT MATCHED THEN INSERT (
      idItemDocFiscal,
      idDocumentoFiscal,
      sequencia,
      cancelado,
      pedidoCompraFornecedor,
      sequenciaPedidoCompraFornec,
      modeloDocumento,
      estabelecimentoOriginal,
      vendedor,
      gradeProduto,
      idFormulaTinta,
      personalizacao,
      idLoteEstoque,
      operacaoFiscal,
      movimentaEstoque,
      movimentaEstoqueFiscal,
      geraFinanceiro,
      localEstoque,
      pessoaParticipante,
      controleQuantidade,
      unidadeMedidaConversao,
      conversorQuantidade,
      loteMinimo,
      loteMultiplo,
      altura,
      largura,
      comprimento,
      pecas,
      quantidade,
      quantidadeConvertida,
      quantidadeDevolvidaRetornada,
      percentualDevolucao,
      pesoLiquido,
      pesoBruto,
      tipoPreco,
      tabelaPreco,
      precoSugestaoAPrazo,
      precoSugestaoAVista,
      precoDesconto,
      precoMinimo,
      usarPrecoAVista,
      precoUnitarioBruto,
      acrescimoUnitarioComposicao,
      precoUnitario,
      precoUnitarioConvertido,
      valorProdutoServicoBruto,
      valorProdutoServico,
      percDescontoItem,
      valorDescontoItem,
      percAcrescimoItem,
      valorAcrescimoItem,
      valorFreteItem,
      valorSeguroItem,
      valorAdicFreteMarinhaMerItem,
      valorDespesasAduaneirasItem,
      valorFreteGeral,
      valorSeguroGeral,
      valorDescontoGeral,
      valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral,
      valorDespesasAduaneirasGeral,
      valorBasePagamento,
      valorDescontoPagamento,
      valorOutrasDespesasPagamento,
      valorJurosPagamento,
      valorFreteTotal,
      valorSeguroTotal,
      valorDescontoTotal,
      valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal,
      valorDespesasAduaneirasTotal,
      cfop,
      indicadorISSQN,
      aliquotaISSQN,
      retidoISSQN,
      tributadoForaMunicipio,
      incentivoFiscal,
      listaServicos,
      cnae,
      idServicoMunicipio,
      numeroProcessoAdministrativo,
      baseISSQN,
      valorISSQN,
      retencaoIRRF,
      baseRetIRRF,
      valorRetIRRF,
      retencaoINSS,
      baseRetINSS,
      valorRetINSS,
      retencaoPIS,
      baseRetPIS,
      valorRetPIS,
      retencaoCOFINS,
      baseRetCOFINS,
      valorRetCOFINS,
      retencaoCSLL,
      baseRetCSLL,
      valorRetCSLL,
      retencaoOutros,
      baseRetOutros,
      valorRetOutros,
      aliquotaII,
      baseII,
      valorII,
      aliquotaIOF,
      baseIOF,
      valorIOF,
      codigoEnquadramentoIPI,
      stIPI,
      aliquotaIPI,
      valorAliquotaIPI,
      baseIPI,
      valorIPI,
      valorIPIDevolucao,
      stPIS,
      aliquotaPIS,
      valorAliquotaPIS,
      basePIS,
      valorPIS,
      aliquotaPISST,
      valorAliquotaPISST,
      basePISST,
      valorPISST,
      stCOFINS,
      aliquotaCOFINS,
      valorAliquotaCOFINS,
      baseCOFINS,
      valorCOFINS,
      aliquotaCOFINSST,
      valorAliquotaCOFINSST,
      baseCOFINSST,
      valorCOFINSST,
      stSimplesNacional,
      creditoSimplesNacional,
      baseCreditoSimplesNacional,
      valorCreditoSimplesNacional,
      stICMS,
      modalidadeBaseCalcICMS,
      reducaoBaseICMS,
      aliquotaICMS,
      diferimentoICMS,
      motivoDesoneracaoICMS,
      idBeneficio,
      baseICMS,
      valorICMSOperacao,
      valorICMSDiferido,
      valorICMS,
      valorICMSDesoneracao,
      modalidadeBaseCalcICMSST,
      margemValorAdicionadoST,
      reducaoBaseST,
      aliquotaICMSST,
      aliquotaSTSuportConsFinal,
      baseICMSST,
      valorICMSST,
      baseICMSSTAnteriormente,
      valorICMSSTAnteriormente,
      valorICMSProprioSubstituto,
      reducaoBaseICMSEfetivo,
      aliquotaICMSEfetivo,
      baseICMSEfetivo,
      valorICMSEfetivo,
      stICMSEscrituracao,
      reducaoBaseICMSEscrituracao,
      aliquotaICMSEscrituracao,
      diferimentoICMSEscrituracao,
      baseICMSEscrituracao,
      valorICMSEscrituracao,
      valorICMSDesonEscrituracao,
      margemValorAdicSTEscrituracao,
      reducaoBaseSTEscrituracao,
      aliquotaICMSSTEscrituracao,
      baseICMSSTEscrituracao,
      valorICMSSTEscrituracao,
      somarICMSST,
      aliquotaICMSUFDestinatario,
      aliquotaICMSInterestadual,
      partilhaICMSInterestadual,
      baseICMSUFDestinatario,
      valorICMSUFDestinatario,
      baseICMSUFRemetente,
      valorICMSUFRemetente,
      aliquotaFCP,
      baseFCP,
      valorFCP,
      aliquotaFCPST,
      baseFCPST,
      valorFCPST,
      aliquotaFCPSTAnteriormente,
      baseFCPSTAnteriormente,
      valorFCPSTAnteriormente,
      aliquotaFCPUFDestinatario,
      baseFCPUFDestinatario,
      valorFCPUFDestinatario,
      aliquotaEstimadaImpFederais,
      aliquotaEstimadaImpEstaduais,
      aliquotaEstimadaImpMunicipais,
      baseEstimadaImpostos,
      valorEstimadoImpFederais,
      valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais,
      valorLiquidoItem,
      valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral,
      valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpItem,
      valorAcrescimoCustoOpGeral,
      valorAcrescimoCustoOpTotal,
      precoCustoOperacao,
      valorCustoOperacao,
      precoCMV,
      valorCMV,
      quantidadeExtemporanea,
      acrescimoUnitarioExtemporaneo,
      valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral,
      valorAcrescimoExtempTotal,
      observacoesDigitadas,
      observacoes)
    VALUES (
      b.idItemDocFiscal,
      b.idDocumentoFiscal,
      b.sequencia,
      b.cancelado,
      b.pedidoCompraFornecedor,
      b.sequenciaPedidoCompraFornec,
      b.modeloDocumento,
      b.estabelecimentoOriginal,
      b.vendedor,
      b.gradeProduto,
      b.idFormulaTinta,
      b.personalizacao,
      b.idLoteEstoque,
      b.operacaoFiscal,
      b.movimentaEstoque,
      b.movimentaEstoqueFiscal,
      b.geraFinanceiro,
      b.localEstoque,
      b.pessoaParticipante,
      b.controleQuantidade,
      b.unidadeMedidaConversao,
      b.conversorQuantidade,
      b.loteMinimo,
      b.loteMultiplo,
      b.altura,
      b.largura,
      b.comprimento,
      b.pecas,
      b.quantidade,
      b.quantidadeConvertida,
      b.quantidadeDevolvidaRetornada,
      b.percentualDevolucao,
      b.pesoLiquido,
      b.pesoBruto,
      b.tipoPreco,
      b.tabelaPreco,
      b.precoSugestaoAPrazo,
      b.precoSugestaoAVista,
      b.precoDesconto,
      b.precoMinimo,
      b.usarPrecoAVista,
      b.precoUnitarioBruto,
      b.acrescimoUnitarioComposicao,
      b.precoUnitario,
      b.precoUnitarioConvertido,
      b.valorProdutoServicoBruto,
      b.valorProdutoServico,
      b.percDescontoItem,
      b.valorDescontoItem,
      b.percAcrescimoItem,
      b.valorAcrescimoItem,
      b.valorFreteItem,
      b.valorSeguroItem,
      b.valorAdicFreteMarinhaMerItem,
      b.valorDespesasAduaneirasItem,
      b.valorFreteGeral,
      b.valorSeguroGeral,
      b.valorDescontoGeral,
      b.valorOutrasDespesasGeral,
      b.valorAdicFreteMarinhaMerGeral,
      b.valorDespesasAduaneirasGeral,
      b.valorBasePagamento,
      b.valorDescontoPagamento,
      b.valorOutrasDespesasPagamento,
      b.valorJurosPagamento,
      b.valorFreteTotal,
      b.valorSeguroTotal,
      b.valorDescontoTotal,
      b.valorOutrasDespesasTotal,
      b.valorAdicFreteMarinhaMerTotal,
      b.valorDespesasAduaneirasTotal,
      b.cfop,
      b.indicadorISSQN,
      b.aliquotaISSQN,
      b.retidoISSQN,
      b.tributadoForaMunicipio,
      b.incentivoFiscal,
      b.listaServicos,
      b.cnae,
      b.idServicoMunicipio,
      b.numeroProcessoAdministrativo,
      b.baseISSQN,
      b.valorISSQN,
      b.retencaoIRRF,
      b.baseRetIRRF,
      b.valorRetIRRF,
      b.retencaoINSS,
      b.baseRetINSS,
      b.valorRetINSS,
      b.retencaoPIS,
      b.baseRetPIS,
      b.valorRetPIS,
      b.retencaoCOFINS,
      b.baseRetCOFINS,
      b.valorRetCOFINS,
      b.retencaoCSLL,
      b.baseRetCSLL,
      b.valorRetCSLL,
      b.retencaoOutros,
      b.baseRetOutros,
      b.valorRetOutros,
      b.aliquotaII,
      b.baseII,
      b.valorII,
      b.aliquotaIOF,
      b.baseIOF,
      b.valorIOF,
      b.codigoEnquadramentoIPI,
      b.stIPI,
      b.aliquotaIPI,
      b.valorAliquotaIPI,
      b.baseIPI,
      b.valorIPI,
      b.valorIPIDevolucao,
      b.stPIS,
      b.aliquotaPIS,
      b.valorAliquotaPIS,
      b.basePIS,
      b.valorPIS,
      b.aliquotaPISST,
      b.valorAliquotaPISST,
      b.basePISST,
      b.valorPISST,
      b.stCOFINS,
      b.aliquotaCOFINS,
      b.valorAliquotaCOFINS,
      b.baseCOFINS,
      b.valorCOFINS,
      b.aliquotaCOFINSST,
      b.valorAliquotaCOFINSST,
      b.baseCOFINSST,
      b.valorCOFINSST,
      b.stSimplesNacional,
      b.creditoSimplesNacional,
      b.baseCreditoSimplesNacional,
      b.valorCreditoSimplesNacional,
      b.stICMS,
      b.modalidadeBaseCalcICMS,
      b.reducaoBaseICMS,
      b.aliquotaICMS,
      b.diferimentoICMS,
      b.motivoDesoneracaoICMS,
      b.idBeneficio,
      b.baseICMS,
      b.valorICMSOperacao,
      b.valorICMSDiferido,
      b.valorICMS,
      b.valorICMSDesoneracao,
      b.modalidadeBaseCalcICMSST,
      b.margemValorAdicionadoST,
      b.reducaoBaseST,
      b.aliquotaICMSST,
      b.aliquotaSTSuportConsFinal,
      b.baseICMSST,
      b.valorICMSST,
      b.baseICMSSTAnteriormente,
      b.valorICMSSTAnteriormente,
      b.valorICMSProprioSubstituto,
      b.reducaoBaseICMSEfetivo,
      b.aliquotaICMSEfetivo,
      b.baseICMSEfetivo,
      b.valorICMSEfetivo,
      b.stICMSEscrituracao,
      b.reducaoBaseICMSEscrituracao,
      b.aliquotaICMSEscrituracao,
      b.diferimentoICMSEscrituracao,
      b.baseICMSEscrituracao,
      b.valorICMSEscrituracao,
      b.valorICMSDesonEscrituracao,
      b.margemValorAdicSTEscrituracao,
      b.reducaoBaseSTEscrituracao,
      b.aliquotaICMSSTEscrituracao,
      b.baseICMSSTEscrituracao,
      b.valorICMSSTEscrituracao,
      b.somarICMSST,
      b.aliquotaICMSUFDestinatario,
      b.aliquotaICMSInterestadual,
      b.partilhaICMSInterestadual,
      b.baseICMSUFDestinatario,
      b.valorICMSUFDestinatario,
      b.baseICMSUFRemetente,
      b.valorICMSUFRemetente,
      b.aliquotaFCP,
      b.baseFCP,
      b.valorFCP,
      b.aliquotaFCPST,
      b.baseFCPST,
      b.valorFCPST,
      b.aliquotaFCPSTAnteriormente,
      b.baseFCPSTAnteriormente,
      b.valorFCPSTAnteriormente,
      b.aliquotaFCPUFDestinatario,
      b.baseFCPUFDestinatario,
      b.valorFCPUFDestinatario,
      b.aliquotaEstimadaImpFederais,
      b.aliquotaEstimadaImpEstaduais,
      b.aliquotaEstimadaImpMunicipais,
      b.baseEstimadaImpostos,
      b.valorEstimadoImpFederais,
      b.valorEstimadoImpEstaduais,
      b.valorEstimadoImpMunicipais,
      b.valorLiquidoItem,
      b.valorDescontoCustoOpItem,
      b.valorDescontoCustoOpGeral,
      b.valorDescontoCustoOpTotal,
      b.valorAcrescimoCustoOpItem,
      b.valorAcrescimoCustoOpGeral,
      b.valorAcrescimoCustoOpTotal,
      b.precoCustoOperacao,
      b.valorCustoOperacao,
      b.precoCMV,
      b.valorCMV,
      b.quantidadeExtemporanea,
      b.acrescimoUnitarioExtemporaneo,
      b.valorAcrescimoExtempSubtotal,
      b.valorAcrescimoExtempItem,
      b.valorAcrescimoExtempGeral,
      b.valorAcrescimoExtempTotal,
      b.observacoesDigitadas,
      b.observacoes);
    v_atualizarObservacoes := 0;
    IF p_idItemReferenciado > 0 THEN
      IF p_tipoDocumentoReferenciado IN ('D','P') THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV(
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_devolucaoAnulacaoRetorno,
          'D',
          r_item_idItemDocFiscal,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          p_tipoDocumentoReferenciado,
          p_idItemReferenciado);
      END IF;
      IF p_tipoDocumentoReferenciado = 'B' THEN
        ADD_DOC_FISC_ITEM_BALANC_GRAVA (
          p_estabelecimentoAtivo,
          p_idItemReferenciado,
          r_item_idItemDocFiscal);
      ELSIF p_tipoDocumentoReferenciado = 'D' THEN
        ADD_DOC_FISC_ITEM_REF_DOC_FIS (
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'G' THEN
        ADD_DOC_FISC_ITEM_REF_DFE_GRAD (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_person_190_modeloFrete,
          p_config_227_manterPessoaOrcam,
          p_config_230_etapaPedComprParc,
          p_config_378_calcularVolumes,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'O' THEN
        ADD_DOC_FISC_ITEM_REF_ORCAMEN (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'P' THEN
        ADD_DOC_FISC_ITEM_REF_PRE_DOC (
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'T' THEN
        ADD_DOC_FISC_ITEM_TRANS_GRAVA (
          p_estabelecimentoAtivo,
          v_cab_entradaSaida,
          p_idItemReferenciado,
          r_item_idItemDocFiscal,
          p_quantidadeReferenciada);
      END IF;
    END IF;
    IF p_tempComp_nomeTempComposicao <> ' '
      AND (NOT (p_tipoDocumentoReferenciado IN ('D','O','P'))
        OR p_idItemReferenciado <= 0)
    THEN
      ADD_DOC_FISC_ITEM_COMP_TEMP (
        p_sessaoClient,
        p_estabelecimentoAtivo,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        r_item_idItemDocFiscal,
        v_atualizarObservacoes,
        v_atualizarObservacoes);
    END IF;
    v_idEnderecoEstoque := 0;
    IF p_item_idEnderecoEstoque > 0 THEN
      ADD_DOC_FISC_ITEM_ENDER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemDocFiscal,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_quantidade,
        ' ',
        v_idEnderecoEstoque);
    END IF;
    IF p_item_idNumeroSerie > 0 THEN
      ADD_DOC_FISC_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemDocFiscal,
        v_idEnderecoEstoque,
        p_item_gradeProduto,
        p_item_idNumeroSerie,
        0,
        v_auxNumber);
      v_atualizarObservacoes := 1;
    END IF;
    IF v_atualizarObservacoes = 1 THEN
      v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
        p_sessaoClient,
        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_413_obs_add_marca,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        'D',
        r_item_idItemDocFiscal,
        p_item_gradeProduto,
        p_item_idFormulaTinta,
        p_item_personalizacao,
        p_item_idLoteEstoque,
        p_item_controleQuantidade,
        p_item_loteMultiplo,
        p_item_altura,
        p_item_largura,
        p_item_comprimento,
        p_item_quantidade,
        p_item_observacoesDigitadas);
      UPDATE MODOCFISCALXITENS
      SET observacoes = v_observacoes
      WHERE idItemDocFiscal = r_item_idItemDocFiscal;
    END IF;
    IF v_cab_situacaoDocumentoFiscal > 20 THEN
      ADD_DOC_FISC_ITEM_EST_ATUALIZA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_item_idItemDocFiscal,
        p_estabelecimentoAtivo);
      ADD_DOC_FISC_ITEM_FIL_ATUALIZA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_item_idItemDocFiscal,
        p_estabelecimentoAtivo);
    END IF;
    r_buffer_idItemDocFiscal := CASE WHEN (r_buffer_idItemDocFiscal IS NULL OR r_buffer_idItemDocFiscal = '' OR r_buffer_idItemDocFiscal = ' ') THEN '' ELSE RTRIM (r_buffer_idItemDocFiscal) || ';' END || TO_CHAR (LPAD(r_item_idItemDocFiscal,14,'0'));
    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;
  END IF;
END ADD_DOC_FISC_ITEM_GRAVA;


/

create or replace PROCEDURE ADD_PRE_DOC_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_227_manterPessoaOrcam IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     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, -- D = Documento Fiscal, O = Orçamento, P, Pré-Documento, T = Transferência
  p_idItemReferenciado           IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_tempComp_nomeTempComposicao  IN VARCHAR2,
  p_tempComp_sequencia           IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemPreDocumento      IN NUMBER,
  p_item_preDocumento            IN NUMBER,
  p_item_pedidoCompraFornecedor  IN VARCHAR2,
  p_item_sequenciaPedidoCompraFo IN NUMBER,
  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_quantidadeExtemporanea  IN NUMBER,
  p_item_acrescimoUnitarioExtemp IN NUMBER,
  p_item_valorAcrescimoExtempIte IN NUMBER,
  p_item_valorDescontoCustoOpIte IN NUMBER,
  p_item_valorAcrescimoCustoOpIt 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_valorAcrescimoExtempGer IN NUMBER,
  p_item_valorDescontoCustoOpGer IN NUMBER,
  p_item_valorAcrescimoCustoOpGe IN NUMBER,
  p_item_valorDescontoPagamento  IN NUMBER,
  p_item_valorOutrasDespPagament IN NUMBER,
  p_item_valorJurosPagamento     IN NUMBER,
  p_item_percentualDevolucao     IN NUMBER,
  p_item_valorIPIDevolucao       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_idItemPreDocumento    IN VARCHAR2,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER,
  r_item_idItemPreDocumento      OUT NUMBER,
  r_buffer_idItemPreDocumento    OUT VARCHAR2,
  r_valorInserido                OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_finalidadeNota           CHAR (1);
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_documentoFiscal          NUMBER;
  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_projeto                  VARCHAR2 (60);
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  v_cab_statusPreDocumento       CHAR (1);
  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_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota 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_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_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_item_sequencia               NUMBER;
  v_item_cancelado               NUMBER;
  v_item_quantidadeDevolvidaRet  NUMBER;
  v_item_precoUnitario           NUMBER;
  v_item_precoUnitarioConvertido NUMBER;
  v_item_valorProdutoServicoBrut NUMBER;
  v_item_valorProdutoServico     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_item_valorDescontoCustoOpTot NUMBER;
  v_item_valorAcrescimoCustoOpTo NUMBER;
  v_item_precoCustoOperacao      NUMBER;
  v_item_valorCustoOperacao      NUMBER;
  v_item_precoCMV                NUMBER;
  v_item_valorCMV                NUMBER;
  v_item_valorAcrescimoExtempSub NUMBER;
  v_item_valorAcrescimoExtempTot 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_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_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  r_item_idItemPreDocumento := p_item_idItemPreDocumento;
  r_buffer_idItemPreDocumento := p_buffer_idItemPreDocumento;
  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.devolucaoAnulacaoRetorno,
    cab.finalidadeNota,
    cab.atualizaCustoMedio,
    cab.documentoFiscal,
    cab.estabelecimento,
    cab.dataEmissao,
    cab.pessoa,
    cab.enderecoEntregaPessoa,
    cab.municipioFatoGerador,
    cab.localDestinoOperacao,
    cab.indicadorConsumidorFinal,
    cab.projeto,
    cab.modalidadeFrete,
    cab.tipoPagamentoFrete,
    cab.statusPreDocumento,
    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,
    cab.valorDescontoCustoOpItem,
    cab.valorDescontoCustoOpGeral,
    cab.valorDescontoCustoOpTotal,
    cab.valorAcrescimoCustoOpItem,
    cab.valorAcrescimoCustoOpGeral,
    cab.valorAcrescimoCustoOpTotal,
    cab.valorCustoOperacao,
    cab.valorCMV,
    cab.quantidadeExtemporanea,
    cab.valorAcrescimoExtempSubtotal,
    cab.valorAcrescimoExtempItem,
    cab.valorAcrescimoExtempGeral,
    cab.valorAcrescimoExtempTotal,
    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
  INTO
    v_cab_origemDocumento,
    v_cab_tipoDocumento,
    v_cab_entradaSaida,
    v_cab_devolucaoAnulacaoRetorno,
    v_cab_finalidadeNota,
    v_cab_atualizaCustoMedio,
    v_cab_documentoFiscal,
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_pessoa,
    v_cab_enderecoEntregaPessoa,
    v_cab_municipioFatoGerador,
    v_cab_localDestinoOperacao,
    v_cab_indicadorConsumidorFinal,
    v_cab_projeto,
    v_cab_modalidadeFrete,
    v_cab_tipoPagamentoFrete,
    v_cab_statusPreDocumento,
    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_cab_valorDescontoCustoOpItem,
    v_cab_valorDescontoCustoOpGera,
    v_cab_valorDescontoCustoOpTota,
    v_cab_valorAcrescimoCustoOpIte,
    v_cab_valorAcrescimoCustoOpGer,
    v_cab_valorAcrescimoCustoOpTot,
    v_cab_valorCustoOperacao,
    v_cab_valorCMV,
    v_cab_quantidadeExtemporanea,
    v_cab_valorAcrescimoExtempSubt,
    v_cab_valorAcrescimoExtempItem,
    v_cab_valorAcrescimoExtempGera,
    v_cab_valorAcrescimoExtempTota,
    v_est_grupoFiscal,
    v_pessEst_regimeTributario,
    v_munEndEst_uf,
    v_pess_indicadorInscricaoEstad,
    v_endPess_enderecoPessoa,
    v_munEndPess_uf,
    v_munEndEntr_uf
  FROM MOPREDOCUMENTOS 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
  WHERE cab.preDocumento = p_item_preDocumento;
  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_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_item_quantidadeDevolvidaRet  := 0;
  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_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;
  IF p_manterFinanceiro_Retotalizar = 0 THEN
    SELECT COALESCE (MAX(1), 0)
    INTO v_cab_promocaoExiste
    FROM MOPREDOCUMXPROMOCOES
    WHERE preDocumento = p_item_preDocumento;
  END IF;
  IF p_item_idItemPreDocumento > 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.quantidadeDevolvidaRetornada,
        a.pesoLiquido,
        a.pesoBruto,
        a.valorProdutoServicoBruto,
        a.valorProdutoServico,
        a.valorDescontoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.quantidadeExtemporanea,
        a.valorAcrescimoExtempSubtotal,
        a.valorAcrescimoExtempItem,
        a.valorDescontoCustoOpItem,
        a.valorAcrescimoCustoOpItem,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorAcrescimoExtempGeral,
        a.valorDescontoCustoOpGeral,
        a.valorAcrescimoCustoOpGeral,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.valorFreteTotal,
        a.valorSeguroTotal,
        a.valorDescontoTotal,
        a.valorOutrasDespesasTotal,
        a.valorAdicFreteMarinhaMerTotal,
        a.valorDespesasAduaneirasTotal,
        a.valorAcrescimoExtempTotal,
        a.valorDescontoCustoOpTotal,
        a.valorAcrescimoCustoOpTotal,
        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,
        a.valorCustoOperacao,
        a.valorCMV,
        prod.tipoProduto
      FROM MOPREDOCUMXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      WHERE a.idItemPreDocumento = p_item_idItemPreDocumento)
    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_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_item_quantidadeDevolvidaRet := a.quantidadeDevolvidaRetornada;
      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 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 <> p_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;
        v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
        v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
        v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
        v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
        v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
        v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
        v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
        v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
        v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
        v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
        v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
        v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
        v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      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,
    p_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);
  v_item_valorAcrescimoExtempSub := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
    p_item_quantidade,
    v_item_precoUnitario,
    p_item_quantidadeExtemporanea,
    p_item_acrescimoUnitarioExtemp);
  v_item_valorAcrescimoExtempTot := FUNC_ADD_CALC_EXTEMP_TOTAL(
    v_item_valorAcrescimoExtempSub,
    p_item_valorAcrescimoExtempIte,
    p_item_valorAcrescimoExtempGer);
  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 = CASE WHEN v_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
      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 / ((v_combo_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 / ((v_combo_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,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_estabelecimento,
        NULL, -- p_cab_dataPrecoInicial
        TRUNC(SYSDATE), -- p_cab_dataPrecoFinal
        v_cab_pessoa,
        v_cab_projeto,
        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_PRE_DOC_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_227_manterPessoaOrcam,
        p_config_362_calcCustoPorGrade,
        p_config_378_calcularVolumes,
        p_config_413_obs_add_marca,
        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, -- D = Documento Fiscal, G = Grade DF-e, O = Orçamento, 'P', Pré-Documento, T = Transferência
        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_calcularImpostos,
        0, -- p_item_idItemPreDocumento
        p_item_preDocumento,
        p_item_pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo,
        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
        CASE
          WHEN p_item_quantidade = 0
          THEN 0
          ELSE ROUND(p_item_quantidadeExtemporanea * a.quantidade / p_item_quantidade, 2)
        END, -- p_item_quantidadeExtemporanea
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_acrescimoUnitarioExtemp
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_acrescimoUnitarioExtemp
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoExtempIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpIt
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpIt
        p_item_observacoesDigitadas,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorFreteGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_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_valorAcrescimoExtempGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpGe
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpGe
        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
        p_item_percentualDevolucao,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorIPIDevolucao
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorIPIDevolucao,
        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_idItemPreDocumento,
        /* Retornos */
        r_calcularImpostos,
        v_auxNumber, -- idItemPreDocumento
        r_buffer_idItemPreDocumento,
        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_PRE_DOC_ITEM_COMBO_RESIDUO (
        p_item_preDocumento,
        v_item_valorProdutoServico,
        p_item_valorDescontoItem,
        p_item_valorAcrescimoItem,
        v_modDoc_diminuiDescontoPrUnit,
        v_modDoc_somaAcrescimosPrUnit,
        r_buffer_idItemPreDocumento,
        r_valorInserido);
      r_calcularImpostos := 1;
    END IF;
  ELSE
    IF r_item_idItemPreDocumento <= 0 THEN
      r_item_idItemPreDocumento := FUNC_ADD_BUSCA_PROXIMO_ID ('MOPREDOCUMXITENS', 'idItemPreDocumento', 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
          OR p_item_valorAcrescimoExtempGer <> 0
          OR p_item_valorDescontoCustoOpGer <> 0
          OR p_item_valorAcrescimoCustoOpGe <> 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_PRE_DOC_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          p_item_preDocumento,
          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 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,
        p_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,
        v_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,
        v_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
        p_item_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,
      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
      v_item_valorAcrescimoExtempTot,
      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,
      p_item_valorIPIDevolucao,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      v_item_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0 -- p_item_somarICMSST
      );
    ADD_CALCULA_CUSTO_CMV (
      v_cab_atualizaCustoMedio,
      v_cab_estabelecimento,
      0, -- p_cab_nfFornecedor
      p_item_modeloDocumento,
      p_item_quantidade,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      p_item_valorIPIDevolucao,
      v_item_valorPIS,
      v_item_valorPISST,
      v_item_valorCOFINS,
      v_item_valorCOFINSST,
      v_item_valorCreditoSimplesNac,
      v_item_valorICMS,
      v_item_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      v_item_valorLiquidoItem,
      p_item_valorDescontoCustoOpIte,
      p_item_valorDescontoCustoOpGer,
      p_item_valorAcrescimoCustoOpIt,
      p_item_valorAcrescimoCustoOpGe,
      v_item_valorAcrescimoExtempTot,
      v_item_valorDescontoCustoOpTot,
      v_item_valorAcrescimoCustoOpTo,
      v_item_precoCustoOperacao,
      v_item_valorCustoOperacao,
      v_item_precoCMV,
      v_item_valorCMV);
    IF v_inserindoItem = 1 THEN
      SELECT COALESCE (MAX (sequencia),0) + 1
      INTO v_item_sequencia
      FROM MOPREDOCUMXITENS
      WHERE preDocumento = p_item_preDocumento;
      v_cab_ultimoVendedorItem := p_item_vendedor;
    END IF;
    IF v_item_cancelado = 0 THEN
      IF p_manterFinanceiro_Retotalizar <> 2 THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume + TRUNC(CASE WHEN p_item_controleQuantidade = 1 AND p_item_loteMultiplo <> 0 THEN p_item_quantidade / p_item_loteMultiplo ELSE p_item_quantidadeConvertida END,0);
        END IF;
        v_cab_pesoLiquido := v_cab_pesoLiquido + p_item_pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto + p_item_pesoBruto;
      END IF;
      v_cab_quantidade := v_cab_quantidade + p_item_quantidadeConvertida;
      IF v_prod_tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorServicos := v_cab_valorServicos + v_item_valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos + p_item_valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorProdutos := v_cab_valorProdutos + v_item_valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos + p_item_valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem + p_item_valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem + p_item_valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem + p_item_valorAdicFreteMarItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem + p_item_valorDespesasAduanItem;
      v_cab_valorFreteGeral := v_cab_valorFreteGeral + p_item_valorFreteGeral;
      v_cab_valorSeguroGeral := v_cab_valorSeguroGeral + p_item_valorSeguroGeral;
      v_cab_valorDescontoGeral := v_cab_valorDescontoGeral + v_item_valorDescontoGeral;
      v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral + p_item_valorOutrasDespesasGer;
      v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral + p_item_valorAdicFreteMarGeral;
      v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral + p_item_valorDespesasAduanGeral;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento + v_item_valorBasePagamento;
      IF p_item_usarPrecoAVista = 1
        AND v_item_geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo + v_item_valorProdutoServico - v_item_valorDescontoTotal + v_item_valorOutrasDespesasTot;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento + v_item_valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento + v_item_valorOutrasDespPagament;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento + v_item_valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal + v_item_valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal + v_item_valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal + v_item_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_item_valorOutrasDespesasTot;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal + v_item_valorAdicFreteMarTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal + v_item_valorDespesasAduanTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem + v_item_valorLiquidoItem;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem + p_item_valorDescontoCustoOpIte;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera + p_item_valorDescontoCustoOpGer;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota + v_item_valorDescontoCustoOpTot;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte + p_item_valorAcrescimoCustoOpIt;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer + p_item_valorAcrescimoCustoOpGe;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot + v_item_valorAcrescimoCustoOpTo;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao + v_item_valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV + v_item_valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea + p_item_quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt + v_item_valorAcrescimoExtempSub;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem + p_item_valorAcrescimoExtempIte;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera + p_item_valorAcrescimoExtempGer;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota + v_item_valorAcrescimoExtempTot;
    END IF;
    UPDATE MOPREDOCUMENTOS SET
      modalidadeFrete               = v_cab_modalidadeFrete,
      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,
      valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
      valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
      valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
      valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
      valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
      valorCustoOperacao            = v_cab_valorCustoOperacao,
      valorCMV                      = v_cab_valorCMV,
      quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
      valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
      valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
      valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
    WHERE preDocumento = p_item_preDocumento;
    IF p_item_idItemPreDocumento > 0 THEN
      DELETE MOPREDOCUMXCOMPOSICOESPR compDoc
      WHERE compDoc.idItemPreDocumento = p_item_idItemPreDocumento
      AND EXISTS(
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.produto = comp.produto
        WHERE comp.composicaoPreco = compDoc.composicaoPreco
        AND gradProd.gradeProduto <> p_item_gradeProduto);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      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_413_obs_add_marca,
      ' ',
      0,
      'P',
      p_item_idItemPreDocumento,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    MERGE INTO MOPREDOCUMXITENS a USING (
      SELECT
        r_item_idItemPreDocumento      idItemPreDocumento,
        p_item_preDocumento            preDocumento,
        v_item_sequencia               sequencia,
        v_item_cancelado               cancelado,
        p_item_pedidoCompraFornecedor  pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo sequenciaPedidoCompraFornec,
        p_item_modeloDocumento         modeloDocumento,
        p_item_estabelecimentoOriginal estabelecimentoOriginal,
        p_item_vendedor                vendedor,
        p_item_gradeProduto            gradeProduto,
        p_item_idFormulaTinta          idFormulaTinta,
        p_item_personalizacao          personalizacao,
        p_item_idLoteEstoque           idLoteEstoque,
        p_item_operacaoFiscal          operacaoFiscal,
        v_item_movimentaEstoque        movimentaEstoque,
        v_item_geraFinanceiro          geraFinanceiro,
        p_item_localEstoque            localEstoque,
        p_item_pessoaParticipante      pessoaParticipante,
        p_item_controleQuantidade      controleQuantidade,
        p_item_unidadeMedidaConversao  unidadeMedidaConversao,
        p_item_conversorQuantidade     conversorQuantidade,
        p_item_loteMinimo              loteMinimo,
        p_item_loteMultiplo            loteMultiplo,
        p_item_altura                  altura,
        p_item_largura                 largura,
        p_item_comprimento             comprimento,
        p_item_pecas                   pecas,
        p_item_quantidade              quantidade,
        p_item_quantidadeConvertida    quantidadeConvertida,
        v_item_quantidadeDevolvidaRet  quantidadeDevolvidaRetornada,
        p_item_percentualDevolucao     percentualDevolucao,
        p_item_pesoLiquido             pesoLiquido,
        p_item_pesoBruto               pesoBruto,
        p_item_tipoPreco               tipoPreco,
        p_item_tabelaPreco             tabelaPreco,
        p_item_precoSugestaoAPrazo     precoSugestaoAPrazo,
        p_item_precoSugestaoAVista     precoSugestaoAVista,
        p_item_precoDesconto           precoDesconto,
        p_item_precoMinimo             precoMinimo,
        p_item_usarPrecoAVista         usarPrecoAVista,
        p_item_precoUnitarioBruto      precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos acrescimoUnitarioComposicao,
        v_item_precoUnitario           precoUnitario,
        v_item_precoUnitarioConvertido precoUnitarioConvertido,
        v_item_valorProdutoServicoBrut valorProdutoServicoBruto,
        v_item_valorProdutoServico     valorProdutoServico,
        p_item_percDescontoItem        percDescontoItem,
        p_item_valorDescontoItem       valorDescontoItem,
        p_item_percAcrescimoItem       percAcrescimoItem,
        p_item_valorAcrescimoItem      valorAcrescimoItem,
        p_item_valorFreteItem          valorFreteItem,
        p_item_valorSeguroItem         valorSeguroItem,
        p_item_valorAdicFreteMarItem   valorAdicFreteMarinhaMerItem,
        p_item_valorDespesasAduanItem  valorDespesasAduaneirasItem,
        p_item_valorFreteGeral         valorFreteGeral,
        p_item_valorSeguroGeral        valorSeguroGeral,
        v_item_valorDescontoGeral      valorDescontoGeral,
        p_item_valorOutrasDespesasGer  valorOutrasDespesasGeral,
        p_item_valorAdicFreteMarGeral  valorAdicFreteMarinhaMerGeral,
        p_item_valorDespesasAduanGeral valorDespesasAduaneirasGeral,
        v_item_valorBasePagamento      valorBasePagamento,
        v_item_valorDescontoPagamento  valorDescontoPagamento,
        v_item_valorOutrasDespPagament valorOutrasDespesasPagamento,
        v_item_valorJurosPagamento     valorJurosPagamento,
        v_item_valorFreteTotal         valorFreteTotal,
        v_item_valorSeguroTotal        valorSeguroTotal,
        v_item_valorDescontoTotal      valorDescontoTotal,
        v_item_valorOutrasDespesasTot  valorOutrasDespesasTotal,
        v_item_valorAdicFreteMarTotal  valorAdicFreteMarinhaMerTotal,
        v_item_valorDespesasAduanTotal valorDespesasAduaneirasTotal,
        v_item_cfop                    cfop,
        v_item_indicadorISSQN          indicadorISSQN,
        v_item_aliquotaISSQN           aliquotaISSQN,
        v_item_retidoISSQN             retidoISSQN,
        v_item_tributadoForaMunicipio  tributadoForaMunicipio,
        v_item_incentivoFiscal         incentivoFiscal,
        v_item_listaServicos           listaServicos,
        v_item_cnae                    cnae,
        v_item_idServicoMunicipio      idServicoMunicipio,
        v_item_numeroProcessoAdministr numeroProcessoAdministrativo,
        v_item_baseISSQN               baseISSQN,
        v_item_valorISSQN              valorISSQN,
        v_item_retencaoIRRF            retencaoIRRF,
        v_item_baseRetIRRF             baseRetIRRF,
        v_item_valorRetIRRF            valorRetIRRF,
        v_item_retencaoINSS            retencaoINSS,
        v_item_baseRetINSS             baseRetINSS,
        v_item_valorRetINSS            valorRetINSS,
        v_item_retencaoPIS             retencaoPIS,
        v_item_baseRetPIS              baseRetPIS,
        v_item_valorRetPIS             valorRetPIS,
        v_item_retencaoCOFINS          retencaoCOFINS,
        v_item_baseRetCOFINS           baseRetCOFINS,
        v_item_valorRetCOFINS          valorRetCOFINS,
        v_item_retencaoCSLL            retencaoCSLL,
        v_item_baseRetCSLL             baseRetCSLL,
        v_item_valorRetCSLL            valorRetCSLL,
        v_item_retencaoOutros          retencaoOutros,
        v_item_baseRetOutros           baseRetOutros,
        v_item_valorRetOutros          valorRetOutros,
        v_item_aliquotaII              aliquotaII,
        v_item_baseII                  baseII,
        v_item_valorII                 valorII,
        v_item_aliquotaIOF             aliquotaIOF,
        v_item_baseIOF                 baseIOF,
        v_item_valorIOF                valorIOF,
        v_item_codigoEnquadramentoIPI  codigoEnquadramentoIPI,
        v_item_stIPI                   stIPI,
        v_item_aliquotaIPI             aliquotaIPI,
        v_item_valorAliquotaIPI        valorAliquotaIPI,
        v_item_baseIPI                 baseIPI,
        v_item_valorIPI                valorIPI,
        p_item_valorIPIDevolucao       valorIPIDevolucao,
        v_item_stPIS                   stPIS,
        v_item_aliquotaPIS             aliquotaPIS,
        v_item_valorAliquotaPIS        valorAliquotaPIS,
        v_item_basePIS                 basePIS,
        v_item_valorPIS                valorPIS,
        v_item_aliquotaPISST           aliquotaPISST,
        v_item_valorAliquotaPISST      valorAliquotaPISST,
        v_item_basePISST               basePISST,
        v_item_valorPISST              valorPISST,
        v_item_stCOFINS                stCOFINS,
        v_item_aliquotaCOFINS          aliquotaCOFINS,
        v_item_valorAliquotaCOFINS     valorAliquotaCOFINS,
        v_item_baseCOFINS              baseCOFINS,
        v_item_valorCOFINS             valorCOFINS,
        v_item_aliquotaCOFINSST        aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST   valorAliquotaCOFINSST,
        v_item_baseCOFINSST            baseCOFINSST,
        v_item_valorCOFINSST           valorCOFINSST,
        v_item_stSimplesNacional       stSimplesNacional,
        v_item_creditoSimplesNacional  creditoSimplesNacional,
        v_item_baseCreditoSimplesNac   baseCreditoSimplesNacional,
        v_item_valorCreditoSimplesNac  valorCreditoSimplesNacional,
        v_item_stICMS                  stICMS,
        v_item_modalBaseCalcICMS       modalidadeBaseCalcICMS,
        v_item_reducaoBaseICMS         reducaoBaseICMS,
        v_item_aliquotaICMS            aliquotaICMS,
        v_item_diferimentoICMS         diferimentoICMS,
        v_item_motivoDesoneracaoICMS   motivoDesoneracaoICMS,
        v_item_idBeneficio             idBeneficio,
        v_item_baseICMS                baseICMS,
        v_item_valorICMSOperacao       valorICMSOperacao,
        v_item_valorICMSDiferido       valorICMSDiferido,
        v_item_valorICMS               valorICMS,
        v_item_valorICMSDesoneracao    valorICMSDesoneracao,
        v_item_modalBaseCalcICMSST     modalidadeBaseCalcICMSST,
        v_item_margemValorAdicionadoST margemValorAdicionadoST,
        v_item_reducaoBaseST           reducaoBaseST,
        v_item_aliquotaICMSST          aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin aliquotaSTSuportConsFinal,
        v_item_baseICMSST              baseICMSST,
        v_item_valorICMSST             valorICMSST,
        v_item_baseICMSSTAnteriormente baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment valorICMSSTAnteriormente,
        v_item_valorICMSProprioSubstit valorICMSProprioSubstituto,
        v_item_reducaoBaseICMSEfetivo  reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo     aliquotaICMSEfetivo,
        v_item_baseICMSEfetivo         baseICMSEfetivo,
        v_item_valorICMSEfetivo        valorICMSEfetivo,
        v_item_aliquotaICMSUFDestinat  aliquotaICMSUFDestinatario,
        v_item_aliquotaICMSInterestad  aliquotaICMSInterestadual,
        v_item_partilhaICMSInterestad  partilhaICMSInterestadual,
        v_item_baseICMSUFDestinatario  baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente     baseICMSUFRemetente,
        v_item_valorICMSUFRemetente    valorICMSUFRemetente,
        v_item_aliquotaFCP             aliquotaFCP,
        v_item_baseFCP                 baseFCP,
        v_item_valorFCP                valorFCP,
        v_item_aliquotaFCPST           aliquotaFCPST,
        v_item_baseFCPST               baseFCPST,
        v_item_valorFCPST              valorFCPST,
        v_item_aliquotaFCPSTAnteriorm  aliquotaFCPSTAnteriormente,
        v_item_baseFCPSTAnteriormente  baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente valorFCPSTAnteriormente,
        v_item_aliquotaFCPUFDestinat   aliquotaFCPUFDestinatario,
        v_item_baseFCPUFDestinatario   baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario  valorFCPUFDestinatario,
        v_item_aliquotaEstImpFederais  aliquotaEstimadaImpFederais,
        v_item_aliquotaEstImpEstaduais aliquotaEstimadaImpEstaduais,
        v_item_aliquotaEstImpMunicipai aliquotaEstimadaImpMunicipais,
        v_item_baseEstimadaImpostos    baseEstimadaImpostos,
        v_item_valorEstImpFederais     valorEstimadoImpFederais,
        v_item_valorEstImpEstaduais    valorEstimadoImpEstaduais,
        v_item_valorEstImpMunicipais   valorEstimadoImpMunicipais,
        v_item_valorLiquidoItem        valorLiquidoItem,
        p_item_valorDescontoCustoOpIte valorDescontoCustoOpItem,
        p_item_valorDescontoCustoOpGer valorDescontoCustoOpGeral,
        v_item_valorDescontoCustoOpTot valorDescontoCustoOpTotal,
        p_item_valorAcrescimoCustoOpIt valorAcrescimoCustoOpItem,
        p_item_valorAcrescimoCustoOpGe valorAcrescimoCustoOpGeral,
        v_item_valorAcrescimoCustoOpTo valorAcrescimoCustoOpTotal,
        v_item_precoCustoOperacao      precoCustoOperacao,
        v_item_valorCustoOperacao      valorCustoOperacao,
        v_item_precoCMV                precoCMV,
        v_item_valorCMV                valorCMV,
        p_item_quantidadeExtemporanea  quantidadeExtemporanea,
        p_item_acrescimoUnitarioExtemp acrescimoUnitarioExtemporaneo,
        v_item_valorAcrescimoExtempSub valorAcrescimoExtempSubtotal,
        p_item_valorAcrescimoExtempIte valorAcrescimoExtempItem,
        p_item_valorAcrescimoExtempGer valorAcrescimoExtempGeral,
        v_item_valorAcrescimoExtempTot valorAcrescimoExtempTotal,
        p_item_observacoesDigitadas    observacoesDigitadas,
        v_observacoes                  observacoes
      FROM DUAL) b
    ON (a.idItemPreDocumento = b.idItemPreDocumento)
    WHEN MATCHED THEN UPDATE SET
      a.preDocumento                  = b.preDocumento,
      a.sequencia                     = b.sequencia,
      a.cancelado                     = b.cancelado,
      a.pedidoCompraFornecedor        = b.pedidoCompraFornecedor,
      a.sequenciaPedidoCompraFornec   = b.sequenciaPedidoCompraFornec,
      a.vendedor                      = b.vendedor,
      a.modeloDocumento               = b.modeloDocumento,
      a.estabelecimentoOriginal       = b.estabelecimentoOriginal,
      a.gradeProduto                  = b.gradeProduto,
      a.idFormulaTinta                = b.idFormulaTinta,
      a.personalizacao                = b.personalizacao,
      a.idLoteEstoque                 = b.idLoteEstoque,
      a.operacaoFiscal                = b.operacaoFiscal,
      a.movimentaEstoque              = b.movimentaEstoque,
      a.geraFinanceiro                = b.geraFinanceiro,
      a.localEstoque                  = b.localEstoque,
      a.pessoaParticipante            = b.pessoaParticipante,
      a.controleQuantidade            = b.controleQuantidade,
      a.unidadeMedidaConversao        = b.unidadeMedidaConversao,
      a.conversorQuantidade           = b.conversorQuantidade,
      a.loteMinimo                    = b.loteMinimo,
      a.loteMultiplo                  = b.loteMultiplo,
      a.altura                        = b.altura,
      a.largura                       = b.largura,
      a.comprimento                   = b.comprimento,
      a.pecas                         = b.pecas,
      a.quantidade                    = b.quantidade,
      a.quantidadeConvertida          = b.quantidadeConvertida,
      a.quantidadeDevolvidaRetornada  = b.quantidadeDevolvidaRetornada,
      a.percentualDevolucao           = b.percentualDevolucao,
      a.pesoLiquido                   = b.pesoLiquido,
      a.pesoBruto                     = b.pesoBruto,
      a.tipoPreco                     = b.tipoPreco,
      a.tabelaPreco                   = b.tabelaPreco,
      a.precoSugestaoAPrazo           = b.precoSugestaoAPrazo,
      a.precoSugestaoAVista           = b.precoSugestaoAVista,
      a.precoDesconto                 = b.precoDesconto,
      a.precoMinimo                   = b.precoMinimo,
      a.usarPrecoAVista               = b.usarPrecoAVista,
      a.precoUnitarioBruto            = b.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao   = b.acrescimoUnitarioComposicao,
      a.precoUnitario                 = b.precoUnitario,
      a.precoUnitarioConvertido       = b.precounitarioConvertido,
      a.valorProdutoServicoBruto      = b.valorProdutoServicoBruto,
      a.valorProdutoServico           = b.valorProdutoServico,
      a.percDescontoItem              = b.percDescontoItem,
      a.valorDescontoItem             = b.valorDescontoItem,
      a.percAcrescimoItem             = b.percAcrescimoItem,
      a.valorAcrescimoItem            = b.valorAcrescimoItem,
      a.valorFreteItem                = b.valorFreteItem,
      a.valorSeguroItem               = b.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem  = b.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem   = b.valorDespesasAduaneirasItem,
      a.valorFreteGeral               = b.valorFreteGeral,
      a.valorSeguroGeral              = b.valorSeguroGeral,
      a.valorDescontoGeral            = b.valorDescontoGeral,
      a.valorOutrasDespesasGeral      = b.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral = b.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral  = b.valorDespesasAduaneirasGeral,
      a.valorBasePagamento            = b.valorBasePagamento,
      a.valorDescontoPagamento        = b.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento  = b.valorOutrasDespesasPagamento,
      a.valorJurosPagamento           = b.valorJurosPagamento,
      a.valorFreteTotal               = b.valorFreteTotal,
      a.valorSeguroTotal              = b.valorSeguroTotal,
      a.valorDescontoTotal            = b.valorDescontoTotal,
      a.valorOutrasDespesasTotal      = b.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal = b.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal  = b.valorDespesasAduaneirasTotal,
      a.cfop                          = b.cfop,
      a.indicadorISSQN                = b.indicadorISSQN,
      a.aliquotaISSQN                 = b.aliquotaISSQN,
      a.retidoISSQN                   = b.retidoISSQN,
      a.tributadoForaMunicipio        = b.tributadoForaMunicipio,
      a.incentivoFiscal               = b.incentivoFiscal,
      a.listaServicos                 = b.listaServicos,
      a.cnae                          = b.cnae,
      a.idServicoMunicipio            = b.idServicoMunicipio,
      a.numeroProcessoAdministrativo  = b.numeroProcessoAdministrativo,
      a.baseISSQN                     = b.baseISSQN,
      a.valorISSQN                    = b.valorISSQN,
      a.retencaoIRRF                  = b.retencaoIRRF,
      a.baseRetIRRF                   = b.baseRetIRRF,
      a.valorRetIRRF                  = b.valorRetIRRF,
      a.retencaoINSS                  = b.retencaoINSS,
      a.baseRetINSS                   = b.baseRetINSS,
      a.valorRetINSS                  = b.valorRetINSS,
      a.retencaoPIS                   = b.retencaoPIS,
      a.baseRetPIS                    = b.baseRetPIS,
      a.valorRetPIS                   = b.valorRetPIS,
      a.retencaoCOFINS                = b.retencaoCOFINS,
      a.baseRetCOFINS                 = b.baseRetCOFINS,
      a.valorRetCOFINS                = b.valorRetCOFINS,
      a.retencaoCSLL                  = b.retencaoCSLL,
      a.baseRetCSLL                   = b.baseRetCSLL,
      a.valorRetCSLL                  = b.valorRetCSLL,
      a.retencaoOutros                = b.retencaoOutros,
      a.baseRetOutros                 = b.baseRetOutros,
      a.valorRetOutros                = b.valorRetOutros,
      a.aliquotaII                    = b.aliquotaII,
      a.baseII                        = b.baseII,
      a.valorII                       = b.valorII,
      a.aliquotaIOF                   = b.aliquotaIOF,
      a.baseIOF                       = b.baseIOF,
      a.valorIOF                      = b.valorIOF,
      a.codigoEnquadramentoIPI        = b.codigoEnquadramentoIPI,
      a.stIPI                         = b.stIPI,
      a.aliquotaIPI                   = b.aliquotaIPI,
      a.valorAliquotaIPI              = b.valorAliquotaIPI,
      a.baseIPI                       = b.baseIPI,
      a.valorIPI                      = b.valorIPI,
      a.valorIPIDevolucao             = b.valorIPIDevolucao,
      a.stPIS                         = b.stPIS,
      a.aliquotaPIS                   = b.aliquotaPIS,
      a.valorAliquotaPIS              = b.valorAliquotaPIS,
      a.basePIS                       = b.basePIS,
      a.valorPIS                      = b.valorPIS,
      a.aliquotaPISST                 = b.aliquotaPISST,
      a.valorAliquotaPISST            = b.valorAliquotaPISST,
      a.basePISST                     = b.basePISST,
      a.valorPISST                    = b.valorPISST,
      a.stCOFINS                      = b.stCOFINS,
      a.aliquotaCOFINS                = b.aliquotaCOFINS,
      a.valorAliquotaCOFINS           = b.valorAliquotaCOFINS,
      a.baseCOFINS                    = b.baseCOFINS,
      a.valorCOFINS                   = b.valorCOFINS,
      a.aliquotaCOFINSST              = b.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST         = b.valorAliquotaCOFINSST,
      a.baseCOFINSST                  = b.baseCOFINSST,
      a.valorCOFINSST                 = b.valorCOFINSST,
      a.stSimplesNacional             = b.stSimplesNacional,
      a.creditoSimplesNacional        = b.creditoSimplesNacional,
      a.baseCreditoSimplesNacional    = b.baseCreditoSimplesNacional,
      a.valorCreditoSimplesNacional   = b.valorCreditoSimplesNacional,
      a.stICMS                        = b.stICMS,
      a.modalidadeBaseCalcICMS        = b.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS               = b.reducaoBaseICMS,
      a.aliquotaICMS                  = b.aliquotaICMS,
      a.diferimentoICMS               = b.diferimentoICMS,
      a.motivoDesoneracaoICMS         = b.motivoDesoneracaoICMS,
      a.idBeneficio                   = b.idBeneficio,
      a.baseICMS                      = b.baseICMS,
      a.valorICMSoperacao             = b.valorICMSoperacao,
      a.valorICMSdiferido             = b.valorICMSdiferido,
      a.valorICMS                     = b.valorICMS,
      a.valorICMSdesoneracao          = b.valorICMSdesoneracao,
      a.modalidadeBaseCalcICMSST      = b.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST       = b.margemValorAdicionadoST,
      a.reducaoBaseST                 = b.reducaoBaseST,
      a.aliquotaICMSST                = b.aliquotaICMSST,
      a.aliquotaSTSuportConsFinal     = b.aliquotaSTSuportConsFinal,
      a.baseICMSST                    = b.baseICMSST,
      a.valorICMSST                   = b.valorICMSST,
      a.baseICMSSTAnteriormente       = b.baseICMSSTAnteriormente,
      a.valorICMSSTAnteriormente      = b.valorICMSSTAnteriormente,
      a.valorICMSProprioSubstituto    = b.valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo        = b.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo           = b.aliquotaICMSEfetivo,
      a.baseICMSEfetivo               = b.baseICMSEfetivo,
      a.valorICMSEfetivo              = b.valorICMSEfetivo,
      a.aliquotaICMSUFDestinatario    = b.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual     = b.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual     = b.partilhaICMSInterestadual,
      a.baseICMSUFDestinatario        = b.baseICMSUFDestinatario,
      a.valorICMSUFDestinatario       = b.valorICMSUFDestinatario,
      a.baseICMSUFRemetente           = b.baseICMSUFRemetente,
      a.valorICMSUFRemetente          = b.valorICMSUFRemetente,
      a.aliquotaFCP                   = b.aliquotaFCP,
      a.baseFCP                       = b.baseFCP,
      a.valorFCP                      = b.valorFCP,
      a.aliquotaFCPST                 = b.aliquotaFCPST,
      a.baseFCPST                     = b.baseFCPST,
      a.valorFCPST                    = b.valorFCPST,
      a.aliquotaFCPSTAnteriormente    = b.aliquotaFCPSTAnteriormente,
      a.baseFCPSTAnteriormente        = b.baseFCPSTAnteriormente,
      a.valorFCPSTAnteriormente       = b.valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario     = b.aliquotaFCPUFDestinatario,
      a.baseFCPUFDestinatario         = b.baseFCPUFDestinatario,
      a.valorFCPUFDestinatario        = b.valorFCPUFDestinatario,
      a.aliquotaestimadaimpfederais   = b.aliquotaestimadaimpfederais,
      a.aliquotaestimadaimpestaduais  = b.aliquotaestimadaimpestaduais,
      a.aliquotaestimadaimpmunicipais = b.aliquotaestimadaimpmunicipais,
      a.baseestimadaimpostos          = b.baseestimadaimpostos,
      a.valorestimadoimpfederais      = b.valorestimadoimpfederais,
      a.valorEstimadoImpEstaduais     = b.valorEstimadoImpEstaduais,
      a.valorEstimadoImpMunicipais    = b.valorEstimadoImpMunicipais,
      a.valorLiquidoItem              = b.valorLiquidoItem,
      a.valorDescontoCustoOpItem      = b.valorDescontoCustoOpItem,
      a.valorDescontoCustoOpGeral     = b.valorDescontoCustoOpGeral,
      a.valorDescontoCustoOpTotal     = b.valorDescontoCustoOpTotal,
      a.valorAcrescimoCustoOpItem     = b.valorAcrescimoCustoOpItem,
      a.valorAcrescimoCustoOpGeral    = b.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoCustoOpTotal    = b.valorAcrescimoCustoOpTotal,
      a.precoCustoOperacao            = b.precoCustoOperacao,
      a.valorCustoOperacao            = b.valorCustoOperacao,
      a.precoCMV                      = b.precoCMV,
      a.valorCMV                      = b.valorCMV,
      a.quantidadeExtemporanea        = b.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo = b.acrescimoUnitarioExtemporaneo,
      a.valorAcrescimoExtempSubtotal  = b.valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem      = b.valorAcrescimoExtempItem,
      a.valorAcrescimoExtempGeral     = b.valorAcrescimoExtempGeral,
      a.valorAcrescimoExtempTotal     = b.valorAcrescimoExtempTotal,
      a.observacoesDigitadas          = b.observacoesDigitadas,
      a.observacoes                   = b.observacoes
    WHEN NOT MATCHED THEN INSERT (
      idItemPreDocumento,
      preDocumento,
      sequencia,
      cancelado,
      pedidoCompraFornecedor,
      sequenciaPedidoCompraFornec,
      modeloDocumento,
      estabelecimentoOriginal,
      vendedor,
      gradeProduto,
      idFormulaTinta,
      personalizacao,
      idLoteEstoque,
      operacaoFiscal,
      movimentaEstoque,
      geraFinanceiro,
      localEstoque,
      pessoaParticipante,
      controleQuantidade,
      unidadeMedidaConversao,
      conversorQuantidade,
      loteMinimo,
      loteMultiplo,
      altura,
      largura,
      comprimento,
      pecas,
      quantidade,
      quantidadeConvertida,
      quantidadeDevolvidaRetornada,
      percentualDevolucao,
      pesoLiquido,
      pesoBruto,
      tipoPreco,
      tabelaPreco,
      precoSugestaoAPrazo,
      precoSugestaoAVista,
      precoDesconto,
      precoMinimo,
      usarPrecoAVista,
      precoUnitarioBruto,
      acrescimoUnitarioComposicao,
      precoUnitario,
      precoUnitarioConvertido,
      valorProdutoServicoBruto,
      valorProdutoServico,
      percDescontoItem,
      valorDescontoItem,
      percAcrescimoItem,
      valorAcrescimoItem,
      valorFreteItem,
      valorSeguroItem,
      valorAdicFreteMarinhaMerItem,
      valorDespesasAduaneirasItem,
      valorFreteGeral,
      valorSeguroGeral,
      valorDescontoGeral,
      valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral,
      valorDespesasAduaneirasGeral,
      valorBasePagamento,
      valorDescontoPagamento,
      valorOutrasDespesasPagamento,
      valorJurosPagamento,
      valorFreteTotal,
      valorSeguroTotal,
      valorDescontoTotal,
      valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal,
      valorDespesasAduaneirasTotal,
      cfop,
      indicadorISSQN,
      aliquotaISSQN,
      retidoISSQN,
      tributadoForaMunicipio,
      incentivoFiscal,
      listaServicos,
      cnae,
      idServicoMunicipio,
      numeroProcessoAdministrativo,
      baseISSQN,
      valorISSQN,
      retencaoIRRF,
      baseRetIRRF,
      valorRetIRRF,
      retencaoINSS,
      baseRetINSS,
      valorRetINSS,
      retencaoPIS,
      baseRetPIS,
      valorRetPIS,
      retencaoCOFINS,
      baseRetCOFINS,
      valorRetCOFINS,
      retencaoCSLL,
      baseRetCSLL,
      valorRetCSLL,
      retencaoOutros,
      baseRetOutros,
      valorRetOutros,
      aliquotaII,
      baseII,
      valorII,
      aliquotaIOF,
      baseIOF,
      valorIOF,
      codigoEnquadramentoIPI,
      stIPI,
      aliquotaIPI,
      valorAliquotaIPI,
      baseIPI,
      valorIPI,
      valorIPIDevolucao,
      stPIS,
      aliquotaPIS,
      valorAliquotaPIS,
      basePIS,
      valorPIS,
      aliquotaPISST,
      valorAliquotaPISST,
      basePISST,
      valorPISST,
      stCOFINS,
      aliquotaCOFINS,
      valorAliquotaCOFINS,
      baseCOFINS,
      valorCOFINS,
      aliquotaCOFINSST,
      valorAliquotaCOFINSST,
      baseCOFINSST,
      valorCOFINSST,
      stSimplesNacional,
      creditoSimplesNacional,
      baseCreditoSimplesNacional,
      valorCreditoSimplesNacional,
      stICMS,
      modalidadeBaseCalcICMS,
      reducaoBaseICMS,
      aliquotaICMS,
      diferimentoICMS,
      motivoDesoneracaoICMS,
      idBeneficio,
      baseICMS,
      valorICMSOperacao,
      valorICMSDiferido,
      valorICMS,
      valorICMSDesoneracao,
      modalidadeBaseCalcICMSST,
      margemValorAdicionadoST,
      reducaoBaseST,
      aliquotaICMSST,
      aliquotaSTSuportConsFinal,
      baseICMSST,
      valorICMSST,
      baseICMSSTAnteriormente,
      valorICMSSTAnteriormente,
      valorICMSProprioSubstituto,
      reducaoBaseICMSEfetivo,
      aliquotaICMSEfetivo,
      baseICMSEfetivo,
      valorICMSEfetivo,
      aliquotaICMSUFDestinatario,
      aliquotaICMSInterestadual,
      partilhaICMSInterestadual,
      baseICMSUFDestinatario,
      valorICMSUFDestinatario,
      baseICMSUFRemetente,
      valorICMSUFRemetente,
      aliquotaFCP,
      baseFCP,
      valorFCP,
      aliquotaFCPST,
      baseFCPST,
      valorFCPST,
      aliquotaFCPSTAnteriormente,
      baseFCPSTAnteriormente,
      valorFCPSTAnteriormente,
      aliquotaFCPUFDestinatario,
      baseFCPUFDestinatario,
      valorFCPUFDestinatario,
      aliquotaEstimadaImpFederais,
      aliquotaEstimadaImpEstaduais,
      aliquotaEstimadaImpMunicipais,
      baseEstimadaImpostos,
      valorEstimadoImpFederais,
      valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais,
      valorLiquidoItem,
      valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral,
      valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpItem,
      valorAcrescimoCustoOpGeral,
      valorAcrescimoCustoOpTotal,
      precoCustoOperacao,
      valorCustoOperacao,
      precoCMV,
      valorCMV,
      quantidadeExtemporanea,
      acrescimoUnitarioExtemporaneo,
      valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral,
      valorAcrescimoExtempTotal,
      observacoesDigitadas,
      observacoes)
    VALUES (
      b.idItemPreDocumento,
      b.preDocumento,
      b.sequencia,
      b.cancelado,
      b.pedidoCompraFornecedor,
      b.sequenciaPedidoCompraFornec,
      b.modeloDocumento,
      b.estabelecimentoOriginal,
      b.vendedor,
      b.gradeProduto,
      b.idFormulaTinta,
      b.personalizacao,
      b.idLoteEstoque,
      b.operacaoFiscal,
      b.movimentaEstoque,
      b.geraFinanceiro,
      b.localEstoque,
      b.pessoaParticipante,
      b.controleQuantidade,
      b.unidadeMedidaConversao,
      b.conversorQuantidade,
      b.loteMinimo,
      b.loteMultiplo,
      b.altura,
      b.largura,
      b.comprimento,
      b.pecas,
      b.quantidade,
      b.quantidadeConvertida,
      b.quantidadeDevolvidaRetornada,
      b.percentualDevolucao,
      b.pesoLiquido,
      b.pesoBruto,
      b.tipoPreco,
      b.tabelaPreco,
      b.precoSugestaoAPrazo,
      b.precoSugestaoAVista,
      b.precoDesconto,
      b.precoMinimo,
      b.usarPrecoAVista,
      b.precoUnitarioBruto,
      b.acrescimoUnitarioComposicao,
      b.precoUnitario,
      b.precoUnitarioConvertido,
      b.valorProdutoServicoBruto,
      b.valorProdutoServico,
      b.percDescontoItem,
      b.valorDescontoItem,
      b.percAcrescimoItem,
      b.valorAcrescimoItem,
      b.valorFreteItem,
      b.valorSeguroItem,
      b.valorAdicFreteMarinhaMerItem,
      b.valorDespesasAduaneirasItem,
      b.valorFreteGeral,
      b.valorSeguroGeral,
      b.valorDescontoGeral,
      b.valorOutrasDespesasGeral,
      b.valorAdicFreteMarinhaMerGeral,
      b.valorDespesasAduaneirasGeral,
      b.valorBasePagamento,
      b.valorDescontoPagamento,
      b.valorOutrasDespesasPagamento,
      b.valorJurosPagamento,
      b.valorFreteTotal,
      b.valorSeguroTotal,
      b.valorDescontoTotal,
      b.valorOutrasDespesasTotal,
      b.valorAdicFreteMarinhaMerTotal,
      b.valorDespesasAduaneirasTotal,
      b.cfop,
      b.indicadorISSQN,
      b.aliquotaISSQN,
      b.retidoISSQN,
      b.tributadoForaMunicipio,
      b.incentivoFiscal,
      b.listaServicos,
      b.cnae,
      b.idServicoMunicipio,
      b.numeroProcessoAdministrativo,
      b.baseISSQN,
      b.valorISSQN,
      b.retencaoIRRF,
      b.baseRetIRRF,
      b.valorRetIRRF,
      b.retencaoINSS,
      b.baseRetINSS,
      b.valorRetINSS,
      b.retencaoPIS,
      b.baseRetPIS,
      b.valorRetPIS,
      b.retencaoCOFINS,
      b.baseRetCOFINS,
      b.valorRetCOFINS,
      b.retencaoCSLL,
      b.baseRetCSLL,
      b.valorRetCSLL,
      b.retencaoOutros,
      b.baseRetOutros,
      b.valorRetOutros,
      b.aliquotaII,
      b.baseII,
      b.valorII,
      b.aliquotaIOF,
      b.baseIOF,
      b.valorIOF,
      b.codigoEnquadramentoIPI,
      b.stIPI,
      b.aliquotaIPI,
      b.valorAliquotaIPI,
      b.baseIPI,
      b.valorIPI,
      b.valorIPIDevolucao,
      b.stPIS,
      b.aliquotaPIS,
      b.valorAliquotaPIS,
      b.basePIS,
      b.valorPIS,
      b.aliquotaPISST,
      b.valorAliquotaPISST,
      b.basePISST,
      b.valorPISST,
      b.stCOFINS,
      b.aliquotaCOFINS,
      b.valorAliquotaCOFINS,
      b.baseCOFINS,
      b.valorCOFINS,
      b.aliquotaCOFINSST,
      b.valorAliquotaCOFINSST,
      b.baseCOFINSST,
      b.valorCOFINSST,
      b.stSimplesNacional,
      b.creditoSimplesNacional,
      b.baseCreditoSimplesNacional,
      b.valorCreditoSimplesNacional,
      b.stICMS,
      b.modalidadeBaseCalcICMS,
      b.reducaoBaseICMS,
      b.aliquotaICMS,
      b.diferimentoICMS,
      b.motivoDesoneracaoICMS,
      b.idBeneficio,
      b.baseICMS,
      b.valorICMSOperacao,
      b.valorICMSDiferido,
      b.valorICMS,
      b.valorICMSDesoneracao,
      b.modalidadeBaseCalcICMSST,
      b.margemValorAdicionadoST,
      b.reducaoBaseST,
      b.aliquotaICMSST,
      b.aliquotaSTSuportConsFinal,
      b.baseICMSST,
      b.valorICMSST,
      b.baseICMSSTAnteriormente,
      b.valorICMSSTAnteriormente,
      b.valorICMSProprioSubstituto,
      b.reducaoBaseICMSEfetivo,
      b.aliquotaICMSEfetivo,
      b.baseICMSEfetivo,
      b.valorICMSEfetivo,
      b.aliquotaICMSUFDestinatario,
      b.aliquotaICMSInterestadual,
      b.partilhaICMSInterestadual,
      b.baseICMSUFDestinatario,
      b.valorICMSUFDestinatario,
      b.baseICMSUFRemetente,
      b.valorICMSUFRemetente,
      b.aliquotaFCP,
      b.baseFCP,
      b.valorFCP,
      b.aliquotaFCPST,
      b.baseFCPST,
      b.valorFCPST,
      b.aliquotaFCPSTAnteriormente,
      b.baseFCPSTAnteriormente,
      b.valorFCPSTAnteriormente,
      b.aliquotaFCPUFDestinatario,
      b.baseFCPUFDestinatario,
      b.valorFCPUFDestinatario,
      b.aliquotaEstimadaImpFederais,
      b.aliquotaEstimadaImpEstaduais,
      b.aliquotaEstimadaImpMunicipais,
      b.baseEstimadaImpostos,
      b.valorEstimadoImpFederais,
      b.valorEstimadoImpEstaduais,
      b.valorEstimadoImpMunicipais,
      b.valorLiquidoItem,
      b.valorDescontoCustoOpItem,
      b.valorDescontoCustoOpGeral,
      b.valorDescontoCustoOpTotal,
      b.valorAcrescimoCustoOpItem,
      b.valorAcrescimoCustoOpGeral,
      b.valorAcrescimoCustoOpTotal,
      b.precoCustoOperacao,
      b.valorCustoOperacao,
      b.precoCMV,
      b.valorCMV,
      b.quantidadeExtemporanea,
      b.acrescimoUnitarioExtemporaneo,
      b.valorAcrescimoExtempSubtotal,
      b.valorAcrescimoExtempItem,
      b.valorAcrescimoExtempGeral,
      b.valorAcrescimoExtempTotal,
      b.observacoesDigitadas,
      b.observacoes);
    v_atualizarObservacoes := 0;
    IF p_idItemReferenciado > 0 THEN
      IF p_tipoDocumentoReferenciado IN ('D','P') THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV(
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_devolucaoAnulacaoRetorno,
          'P',
          r_item_idItemPreDocumento,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          p_tipoDocumentoReferenciado,
          p_idItemReferenciado);
      END IF;
      IF p_tipoDocumentoReferenciado = 'D' THEN
        ADD_PRE_DOC_ITEM_REF_DOC_FIS (
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_preDocumento,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemPreDocumento,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'O' THEN
        ADD_PRE_DOC_ITEM_REF_ORCAMEN (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_preDocumento,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemPreDocumento,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'P' THEN
        ADD_PRE_DOC_ITEM_REF_PRE_DOC (
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_preDocumento,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemPreDocumento,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'T' THEN
        ADD_PRE_DOC_ITEM_TRANS_GRAVA (
          p_estabelecimentoAtivo,
          v_cab_entradaSaida,
          p_idItemReferenciado,
          r_item_idItemPreDocumento,
          p_quantidadeReferenciada);
      END IF;
    END IF;
    IF p_tempComp_nomeTempComposicao <> ' '
      AND (NOT (p_tipoDocumentoReferenciado IN ('D','O','P'))
        OR p_idItemReferenciado <= 0)
    THEN
      ADD_PRE_DOC_ITEM_COMP_TEMP (
        p_sessaoClient,
        p_estabelecimentoAtivo,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        r_item_idItemPreDocumento,
        v_atualizarObservacoes,
        v_atualizarObservacoes);
    END IF;
    v_idEnderecoEstoque := 0;
    IF p_item_idEnderecoEstoque > 0 THEN
      ADD_PRE_DOC_ITEM_ENDER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemPreDocumento,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_quantidade,
        ' ',
        v_idEnderecoEstoque);
    END IF;
    IF p_item_idNumeroSerie > 0 THEN
      ADD_PRE_DOC_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemPreDocumento,
        v_idEnderecoEstoque,
        p_item_gradeProduto,
        p_item_idNumeroSerie,
        0,
        v_auxNumber);
      v_atualizarObservacoes := 1;
    END IF;
    IF v_atualizarObservacoes = 1 THEN
      v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
        p_sessaoClient,
        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_413_obs_add_marca,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        'P',
        r_item_idItemPreDocumento,
        p_item_gradeProduto,
        p_item_idFormulaTinta,
        p_item_personalizacao,
        p_item_idLoteEstoque,
        p_item_controleQuantidade,
        p_item_loteMultiplo,
        p_item_altura,
        p_item_largura,
        p_item_comprimento,
        p_item_quantidade,
        p_item_observacoesDigitadas);
      UPDATE MOPREDOCUMXITENS
      SET observacoes = v_observacoes
      WHERE idItemPreDocumento = r_item_idItemPreDocumento;
    END IF;
    IF v_cab_statusPreDocumento = 'A' THEN
      ADD_PRE_DOC_ITEM_EST_ATUALIZA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_item_idItemPreDocumento,
        p_estabelecimentoAtivo);
      ADD_PRE_DOC_ITEM_FIL_ATUALIZA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_item_idItemPreDocumento,
        p_estabelecimentoAtivo);
    END IF;
    r_buffer_idItemPreDocumento := CASE WHEN (r_buffer_idItemPreDocumento IS NULL OR r_buffer_idItemPreDocumento = '' OR r_buffer_idItemPreDocumento = ' ') THEN '' ELSE RTRIM (r_buffer_idItemPreDocumento) || ';' END || TO_CHAR (LPAD(r_item_idItemPreDocumento,14,'0'));
    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;
  END IF;
END ADD_PRE_DOC_ITEM_GRAVA;

/

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_config_413_obs_add_marca     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, 'F' Fatura Contrato, 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_atividadeProjeto        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_item_idItemOrcamento  IN VARCHAR2,
  /* Retornos */
  r_mensagemAviso                OUT VARCHAR,
  r_calcularImpostos             OUT NUMBER,
  r_item_idItemOrcamento         OUT NUMBER,
  r_buffer_item_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_projeto                  VARCHAR2 (60);
  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_pesoLiquido             NUMBER;
  v_prod_pesoBruto               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_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_ativ_numero                  NUMBER;
  v_ativ_quantidade              NUMBER;
  v_ativ_precoUnitarioMenor      NUMBER;
  v_ativ_precoUnitario           NUMBER;
  v_ativ_valorTotalItem          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_item_idItemOrcamento := p_buffer_item_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.projeto,
    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_projeto,
    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.pesoLiquido,
    prod.pesoBruto,
    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_pesoLiquido,
    v_prod_pesoBruto,
    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 / ((v_combo_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 / ((v_combo_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_cab_projeto,
        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_config_413_obs_add_marca,
        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_atividadeProjeto,
        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_item_idItemOrcamento,
        r_mensagemAviso,
        r_calcularImpostos,
        v_auxNumber, -- idItemOrcamento
        r_buffer_item_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_item_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
      SELECT COALESCE (MAX (sequencia),0) + 1
      INTO v_item_sequencia
      FROM MOORCAMENTOXITENS
      WHERE orcamento = p_item_orcamento;
      v_cab_ultimoVendedorItem := p_item_vendedor;
    END IF;
    IF v_item_cancelado = 0 THEN
      IF p_manterFinanceiro_Retotalizar <> 2 THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume + TRUNC(CASE WHEN p_item_controleQuantidade = 1 AND p_item_loteMultiplo <> 0 THEN p_item_quantidade / p_item_loteMultiplo ELSE p_item_quantidadeConvertida END,0);
        END IF;
        v_cab_pesoLiquido := v_cab_pesoLiquido + p_item_pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto + p_item_pesoBruto;
      END IF;
      v_cab_quantidade := v_cab_quantidade + p_item_quantidadeConvertida;
      IF v_prod_tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorServicos := v_cab_valorServicos + v_item_valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos + p_item_valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorProdutos := v_cab_valorProdutos + v_item_valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos + p_item_valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem + p_item_valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem + p_item_valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem + p_item_valorAdicFreteMarItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem + p_item_valorDespesasAduanItem;
      v_cab_valorFreteGeral := v_cab_valorFreteGeral + v_item_valorFreteGeral;
      v_cab_valorSeguroGeral := v_cab_valorSeguroGeral + p_item_valorSeguroGeral;
      v_cab_valorDescontoGeral := v_cab_valorDescontoGeral + v_item_valorDescontoGeral;
      v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral + p_item_valorOutrasDespesasGer;
      v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral + p_item_valorAdicFreteMarGeral;
      v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral + p_item_valorDespesasAduanGeral;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento + v_item_valorBasePagamento;
      IF p_item_usarPrecoAVista = 1
        AND v_item_geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo + v_item_valorProdutoServico - v_item_valorDescontoTotal + v_item_valorOutrasDespesasTot;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento + v_item_valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento + v_item_valorOutrasDespPagament;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento + v_item_valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal + v_item_valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal + v_item_valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal + v_item_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_item_valorOutrasDespesasTot;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal + v_item_valorAdicFreteMarTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal + v_item_valorDespesasAduanTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem + v_item_valorLiquidoItem;
    ELSE
      v_item_quantidadeSaldo := 0;
    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 = p_item_orcamento;
    IF p_item_idItemOrcamento > 0 THEN
      DELETE MOORCAMENTOXCOMPOSICOESPR compDoc
      WHERE compDoc.idItemOrcamento = p_item_idItemOrcamento
      AND EXISTS(
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.produto = comp.produto
        WHERE comp.composicaoPreco = compDoc.composicaoPreco
        AND gradProd.gradeProduto <> p_item_gradeProduto);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      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_413_obs_add_marca,
      ' ',
      0,
      'O',
      p_item_idItemOrcamento,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    MERGE INTO MOORCAMENTOXITENS a USING (
      SELECT
        r_item_idItemOrcamento         idItemOrcamento,
        p_item_orcamento               orcamento,
        v_item_sequencia               sequencia,
        v_item_cancelado               cancelado,
        p_item_pedidoCompraFornecedor  pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo sequenciaPedidoCompraFornec,
        p_item_ambiente                ambiente,
        p_item_ambienteObservacoes     ambienteObservacoes,
        p_item_modeloDocumento         modeloDocumento,
        p_item_estabelecimentoOriginal estabelecimentoOriginal,
        p_item_vendedor                vendedor,
        p_item_gradeProduto            gradeProduto,
        p_item_atividadeServico        atividadeServico,
        p_item_statusAtividadeServico  statusAtividadeServico,
        p_item_idFormulaTinta          idFormulaTinta,
        p_item_personalizacao          personalizacao,
        p_item_idLoteEstoque           idLoteEstoque,
        p_item_vinculoItemDocumento    vinculoItemDocumento,
        p_item_operacaoFiscal          operacaoFiscal,
        v_item_movimentaEstoque        movimentaEstoque,
        v_item_geraFinanceiro          geraFinanceiro,
        p_item_localEstoque            localEstoque,
        p_item_pessoaParticipante      pessoaParticipante,
        p_item_dataEntrega             dataEntrega,
        p_item_controleQuantidade      controleQuantidade,
        p_item_unidadeMedidaConversao  unidadeMedidaConversao,
        p_item_conversorQuantidade     conversorQuantidade,
        p_item_loteMinimo              loteMinimo,
        p_item_loteMultiplo            loteMultiplo,
        p_item_altura                  altura,
        p_item_largura                 largura,
        p_item_comprimento             comprimento,
        p_item_pecas                   pecas,
        p_item_quantidade              quantidade,
        p_item_quantidadeConvertida    quantidadeConvertida,
        v_item_quantidadeSaldo         quantidadeSaldo,
        p_item_controleEntrega         controleEntrega,
        p_item_pesoLiquido             pesoLiquido,
        p_item_pesoBruto               pesoBruto,
        p_item_tipoPreco               tipoPreco,
        p_item_tabelaPreco             tabelaPreco,
        p_item_precoSugestaoAPrazo     precoSugestaoAPrazo,
        p_item_precoSugestaoAVista     precoSugestaoAVista,
        p_item_precoDesconto           precoDesconto,
        p_item_precoMinimo             precoMinimo,
        p_item_usarPrecoAVista         usarPrecoAVista,
        p_item_precoUnitarioBruto      precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos acrescimoUnitarioComposicao,
        v_item_precoUnitario           precoUnitario,
        v_item_precoUnitarioConvertido precoUnitarioConvertido,
        v_item_valorProdutoServicoBrut valorProdutoServicoBruto,
        v_item_valorProdutoServico     valorProdutoServico,
        p_item_percDescontoItem        percDescontoItem,
        p_item_valorDescontoItem       valorDescontoItem,
        p_item_percAcrescimoItem       percAcrescimoItem,
        p_item_valorAcrescimoItem      valorAcrescimoItem,
        p_item_valorFreteItem          valorFreteItem,
        p_item_valorSeguroItem         valorSeguroItem,
        p_item_valorAdicFreteMarItem   valorAdicFreteMarinhaMerItem,
        p_item_valorDespesasAduanItem  valorDespesasAduaneirasItem,
        v_item_valorFreteGeral         valorFreteGeral,
        p_item_valorSeguroGeral        valorSeguroGeral,
        v_item_valorDescontoGeral      valorDescontoGeral,
        p_item_valorOutrasDespesasGer  valorOutrasDespesasGeral,
        p_item_valorAdicFreteMarGeral  valorAdicFreteMarinhaMerGeral,
        p_item_valorDespesasAduanGeral valorDespesasAduaneirasGeral,
        v_item_valorBasePagamento      valorBasePagamento,
        v_item_valorDescontoPagamento  valorDescontoPagamento,
        v_item_valorOutrasDespPagament valorOutrasDespesasPagamento,
        v_item_valorJurosPagamento     valorJurosPagamento,
        v_item_valorFreteTotal         valorFreteTotal,
        v_item_valorSeguroTotal        valorSeguroTotal,
        v_item_valorDescontoTotal      valorDescontoTotal,
        v_item_valorOutrasDespesasTot  valorOutrasDespesasTotal,
        v_item_valorAdicFreteMarTotal  valorAdicFreteMarinhaMerTotal,
        v_item_valorDespesasAduanTotal valorDespesasAduaneirasTotal,
        v_item_cfop                    cfop,
        v_item_indicadorISSQN          indicadorISSQN,
        v_item_aliquotaISSQN           aliquotaISSQN,
        v_item_retidoISSQN             retidoISSQN,
        v_item_tributadoForaMunicipio  tributadoForaMunicipio,
        v_item_incentivoFiscal         incentivoFiscal,
        v_item_listaServicos           listaServicos,
        v_item_cnae                    cnae,
        v_item_idServicoMunicipio      idServicoMunicipio,
        v_item_numeroProcessoAdministr numeroProcessoAdministrativo,
        v_item_baseISSQN               baseISSQN,
        v_item_valorISSQN              valorISSQN,
        v_item_retencaoIRRF            retencaoIRRF,
        v_item_baseRetIRRF             baseRetIRRF,
        v_item_valorRetIRRF            valorRetIRRF,
        v_item_retencaoINSS            retencaoINSS,
        v_item_baseRetINSS             baseRetINSS,
        v_item_valorRetINSS            valorRetINSS,
        v_item_retencaoPIS             retencaoPIS,
        v_item_baseRetPIS              baseRetPIS,
        v_item_valorRetPIS             valorRetPIS,
        v_item_retencaoCOFINS          retencaoCOFINS,
        v_item_baseRetCOFINS           baseRetCOFINS,
        v_item_valorRetCOFINS          valorRetCOFINS,
        v_item_retencaoCSLL            retencaoCSLL,
        v_item_baseRetCSLL             baseRetCSLL,
        v_item_valorRetCSLL            valorRetCSLL,
        v_item_retencaoOutros          retencaoOutros,
        v_item_baseRetOutros           baseRetOutros,
        v_item_valorRetOutros          valorRetOutros,
        v_item_aliquotaII              aliquotaII,
        v_item_baseII                  baseII,
        v_item_valorII                 valorII,
        v_item_aliquotaIOF             aliquotaIOF,
        v_item_baseIOF                 baseIOF,
        v_item_valorIOF                valorIOF,
        v_item_codigoEnquadramentoIPI  codigoEnquadramentoIPI,
        v_item_stIPI                   stIPI,
        v_item_aliquotaIPI             aliquotaIPI,
        v_item_valorAliquotaIPI        valorAliquotaIPI,
        v_item_baseIPI                 baseIPI,
        v_item_valorIPI                valorIPI,
        v_item_stPIS                   stPIS,
        v_item_aliquotaPIS             aliquotaPIS,
        v_item_valorAliquotaPIS        valorAliquotaPIS,
        v_item_basePIS                 basePIS,
        v_item_valorPIS                valorPIS,
        v_item_aliquotaPISST           aliquotaPISST,
        v_item_valorAliquotaPISST      valorAliquotaPISST,
        v_item_basePISST               basePISST,
        v_item_valorPISST              valorPISST,
        v_item_stCOFINS                stCOFINS,
        v_item_aliquotaCOFINS          aliquotaCOFINS,
        v_item_valorAliquotaCOFINS     valorAliquotaCOFINS,
        v_item_baseCOFINS              baseCOFINS,
        v_item_valorCOFINS             valorCOFINS,
        v_item_aliquotaCOFINSST        aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST   valorAliquotaCOFINSST,
        v_item_baseCOFINSST            baseCOFINSST,
        v_item_valorCOFINSST           valorCOFINSST,
        v_item_stSimplesNacional       stSimplesNacional,
        v_item_creditoSimplesNacional  creditoSimplesNacional,
        v_item_baseCreditoSimplesNac   baseCreditoSimplesNacional,
        v_item_valorCreditoSimplesNac  valorCreditoSimplesNacional,
        v_item_stICMS                  stICMS,
        v_item_modalBaseCalcICMS       modalidadeBaseCalcICMS,
        v_item_reducaoBaseICMS         reducaoBaseICMS,
        v_item_aliquotaICMS            aliquotaICMS,
        v_item_diferimentoICMS         diferimentoICMS,
        v_item_motivoDesoneracaoICMS   motivoDesoneracaoICMS,
        v_item_idBeneficio             idBeneficio,
        v_item_baseICMS                baseICMS,
        v_item_valorICMSOperacao       valorICMSOperacao,
        v_item_valorICMSDiferido       valorICMSDiferido,
        v_item_valorICMS               valorICMS,
        v_item_valorICMSDesoneracao    valorICMSDesoneracao,
        v_item_modalBaseCalcICMSST     modalidadeBaseCalcICMSST,
        v_item_margemValorAdicionadoST margemValorAdicionadoST,
        v_item_reducaoBaseST           reducaoBaseST,
        v_item_aliquotaICMSST          aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin aliquotaSTSuportConsFinal,
        v_item_baseICMSST              baseICMSST,
        v_item_valorICMSST             valorICMSST,
        v_item_baseICMSSTAnteriormente baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment valorICMSSTAnteriormente,
        v_item_valorICMSProprioSubstit valorICMSProprioSubstituto,
        v_item_reducaoBaseICMSEfetivo  reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo     aliquotaICMSEfetivo,
        v_item_baseICMSEfetivo         baseICMSEfetivo,
        v_item_valorICMSEfetivo        valorICMSEfetivo,
        v_item_aliquotaICMSUFDestinat  aliquotaICMSUFDestinatario,
        v_item_aliquotaICMSInterestad  aliquotaICMSInterestadual,
        v_item_partilhaICMSInterestad  partilhaICMSInterestadual,
        v_item_baseICMSUFDestinatario  baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente     baseICMSUFRemetente,
        v_item_valorICMSUFRemetente    valorICMSUFRemetente,
        v_item_aliquotaFCP             aliquotaFCP,
        v_item_baseFCP                 baseFCP,
        v_item_valorFCP                valorFCP,
        v_item_aliquotaFCPST           aliquotaFCPST,
        v_item_baseFCPST               baseFCPST,
        v_item_valorFCPST              valorFCPST,
        v_item_aliquotaFCPSTAnteriorm  aliquotaFCPSTAnteriormente,
        v_item_baseFCPSTAnteriormente  baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente valorFCPSTAnteriormente,
        v_item_aliquotaFCPUFDestinat   aliquotaFCPUFDestinatario,
        v_item_baseFCPUFDestinatario   baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario  valorFCPUFDestinatario,
        v_item_aliquotaEstImpFederais  aliquotaEstimadaImpFederais,
        v_item_aliquotaEstImpEstaduais aliquotaEstimadaImpEstaduais,
        v_item_aliquotaEstImpMunicipai aliquotaEstimadaImpMunicipais,
        v_item_baseEstimadaImpostos    baseEstimadaImpostos,
        v_item_valorEstImpFederais     valorEstimadoImpFederais,
        v_item_valorEstImpEstaduais    valorEstimadoImpEstaduais,
        v_item_valorEstImpMunicipais   valorEstimadoImpMunicipais,
        v_item_valorLiquidoItem        valorLiquidoItem,
        p_item_observacoesDigitadas    observacoesDigitadas,
        v_observacoes                  observacoes
      FROM DUAL) b
    ON (a.idItemOrcamento = b.idItemOrcamento)
    WHEN MATCHED THEN UPDATE SET
      a.orcamento                     = b.orcamento,
      a.sequencia                     = b.sequencia,
      a.cancelado                     = b.cancelado,
      a.pedidoCompraFornecedor        = b.pedidoCompraFornecedor,
      a.sequenciaPedidoCompraFornec   = b.sequenciaPedidoCompraFornec,
      a.ambiente                      = b.ambiente,
      a.ambienteObservacoes           = b.ambienteObservacoes,
      a.vendedor                      = b.vendedor,
      a.modeloDocumento               = b.modeloDocumento,
      a.estabelecimentoOriginal       = b.estabelecimentoOriginal,
      a.gradeProduto                  = b.gradeProduto,
      a.atividadeServico              = b.atividadeServico,
      a.statusAtividadeServico        = b.statusAtividadeServico,
      a.idFormulaTinta                = b.idFormulaTinta,
      a.personalizacao                = b.personalizacao,
      a.idLoteEstoque                 = b.idLoteEstoque,
      a.vinculoItemDocumento          = b.vinculoItemDocumento,
      a.operacaoFiscal                = b.operacaoFiscal,
      a.movimentaEstoque              = b.movimentaEstoque,
      a.geraFinanceiro                = b.geraFinanceiro,
      a.localEstoque                  = b.localEstoque,
      a.pessoaParticipante            = b.pessoaParticipante,
      a.dataEntrega                   = b.dataEntrega,
      a.controleQuantidade            = b.controleQuantidade,
      a.unidadeMedidaConversao        = b.unidadeMedidaConversao,
      a.conversorQuantidade           = b.conversorQuantidade,
      a.loteMinimo                    = b.loteMinimo,
      a.loteMultiplo                  = b.loteMultiplo,
      a.altura                        = b.altura,
      a.largura                       = b.largura,
      a.comprimento                   = b.comprimento,
      a.pecas                         = b.pecas,
      a.quantidade                    = b.quantidade,
      a.quantidadeConvertida          = b.quantidadeConvertida,
      a.quantidadeSaldo               = b.quantidadeSaldo,
      a.controleEntrega               = b.controleEntrega,
      a.pesoLiquido                   = b.pesoLiquido,
      a.pesoBruto                     = b.pesoBruto,
      a.tipoPreco                     = b.tipoPreco,
      a.tabelaPreco                   = b.tabelaPreco,
      a.precoSugestaoAPrazo           = b.precoSugestaoAPrazo,
      a.precoSugestaoAVista           = b.precoSugestaoAVista,
      a.precoDesconto                 = b.precoDesconto,
      a.precoMinimo                   = b.precoMinimo,
      a.usarPrecoAVista               = b.usarPrecoAVista,
      a.precoUnitarioBruto            = b.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao   = b.acrescimoUnitarioComposicao,
      a.precoUnitario                 = b.precoUnitario,
      a.precoUnitarioConvertido       = b.precounitarioConvertido,
      a.valorProdutoServicoBruto      = b.valorProdutoServicoBruto,
      a.valorProdutoServico           = b.valorProdutoServico,
      a.percDescontoItem              = b.percDescontoItem,
      a.valorDescontoItem             = b.valorDescontoItem,
      a.percAcrescimoItem             = b.percAcrescimoItem,
      a.valorAcrescimoItem            = b.valorAcrescimoItem,
      a.valorFreteItem                = b.valorFreteItem,
      a.valorSeguroItem               = b.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem  = b.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem   = b.valorDespesasAduaneirasItem,
      a.valorFreteGeral               = b.valorFreteGeral,
      a.valorSeguroGeral              = b.valorSeguroGeral,
      a.valorDescontoGeral            = b.valorDescontoGeral,
      a.valorOutrasDespesasGeral      = b.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral = b.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral  = b.valorDespesasAduaneirasGeral,
      a.valorBasePagamento            = b.valorBasePagamento,
      a.valorDescontoPagamento        = b.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento  = b.valorOutrasDespesasPagamento,
      a.valorJurosPagamento           = b.valorJurosPagamento,
      a.valorFreteTotal               = b.valorFreteTotal,
      a.valorSeguroTotal              = b.valorSeguroTotal,
      a.valorDescontoTotal            = b.valorDescontoTotal,
      a.valorOutrasDespesasTotal      = b.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal = b.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal  = b.valorDespesasAduaneirasTotal,
      a.cfop                          = b.cfop,
      a.indicadorISSQN                = b.indicadorISSQN,
      a.aliquotaISSQN                 = b.aliquotaISSQN,
      a.baseISSQN                     = b.baseISSQN,
      a.valorISSQN                    = b.valorISSQN,
      a.retidoISSQN                   = b.retidoISSQN,
      a.tributadoForaMunicipio        = b.tributadoForaMunicipio,
      a.incentivoFiscal               = b.incentivoFiscal,
      a.listaServicos                 = b.listaServicos,
      a.cnae                          = b.cnae,
      a.idServicoMunicipio            = b.idServicoMunicipio,
      a.numeroProcessoAdministrativo  = b.numeroProcessoAdministrativo,
      a.retencaoIRRF                  = b.retencaoIRRF,
      a.baseRetIRRF                   = b.baseRetIRRF,
      a.valorRetIRRF                  = b.valorRetIRRF,
      a.retencaoINSS                  = b.retencaoINSS,
      a.baseRetINSS                   = b.baseRetINSS,
      a.valorRetINSS                  = b.valorRetINSS,
      a.retencaoPIS                   = b.retencaoPIS,
      a.baseRetPIS                    = b.baseRetPIS,
      a.valorRetPIS                   = b.valorRetPIS,
      a.retencaoCOFINS                = b.retencaoCOFINS,
      a.baseRetCOFINS                 = b.baseRetCOFINS,
      a.valorRetCOFINS                = b.valorRetCOFINS,
      a.retencaoCSLL                  = b.retencaoCSLL,
      a.baseRetCSLL                   = b.baseRetCSLL,
      a.valorRetCSLL                  = b.valorRetCSLL,
      a.retencaoOutros                = b.retencaoOutros,
      a.baseRetOutros                 = b.baseRetOutros,
      a.valorRetOutros                = b.valorRetOutros,
      a.aliquotaII                    = b.aliquotaII,
      a.baseII                        = b.baseII,
      a.valorII                       = b.valorII,
      a.aliquotaIOF                   = b.aliquotaIOF,
      a.baseIOF                       = b.baseIOF,
      a.valorIOF                      = b.valorIOF,
      a.codigoEnquadramentoIPI        = b.codigoEnquadramentoIPI,
      a.stIPI                         = b.stIPI,
      a.aliquotaIPI                   = b.aliquotaIPI,
      a.valorAliquotaIPI              = b.valorAliquotaIPI,
      a.baseIPI                       = b.baseIPI,
      a.valorIPI                      = b.valorIPI,
      a.stPIS                         = b.stPIS,
      a.aliquotaPIS                   = b.aliquotaPIS,
      a.valorAliquotaPIS              = b.valorAliquotaPIS,
      a.basePIS                       = b.basePIS,
      a.valorPIS                      = b.valorPIS,
      a.aliquotaPISST                 = b.aliquotaPISST,
      a.valorAliquotaPISST            = b.valorAliquotaPISST,
      a.basePISST                     = b.basePISST,
      a.valorPISST                    = b.valorPISST,
      a.stCOFINS                      = b.stCOFINS,
      a.aliquotaCOFINS                = b.aliquotaCOFINS,
      a.valorAliquotaCOFINS           = b.valorAliquotaCOFINS,
      a.baseCOFINS                    = b.baseCOFINS,
      a.valorCOFINS                   = b.valorCOFINS,
      a.aliquotaCOFINSST              = b.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST         = b.valorAliquotaCOFINSST,
      a.baseCOFINSST                  = b.baseCOFINSST,
      a.valorCOFINSST                 = b.valorCOFINSST,
      a.stSimplesNacional             = b.stSimplesNacional,
      a.creditoSimplesNacional        = b.creditoSimplesNacional,
      a.baseCreditoSimplesNacional    = b.baseCreditoSimplesNacional,
      a.valorCreditoSimplesNacional   = b.valorCreditoSimplesNacional,
      a.stICMS                        = b.stICMS,
      a.modalidadeBaseCalcICMS        = b.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS               = b.reducaoBaseICMS,
      a.aliquotaICMS                  = b.aliquotaICMS,
      a.diferimentoICMS               = b.diferimentoICMS,
      a.motivoDesoneracaoICMS         = b.motivoDesoneracaoICMS,
      a.idBeneficio                   = b.idBeneficio,
      a.baseICMS                      = b.baseICMS,
      a.valorICMSoperacao             = b.valorICMSoperacao,
      a.valorICMSdiferido             = b.valorICMSdiferido,
      a.valorICMS                     = b.valorICMS,
      a.valorICMSdesoneracao          = b.valorICMSdesoneracao,
      a.modalidadeBaseCalcICMSST      = b.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST       = b.margemValorAdicionadoST,
      a.reducaoBaseST                 = b.reducaoBaseST,
      a.aliquotaICMSST                = b.aliquotaICMSST,
      a.aliquotaSTSuportConsFinal     = b.aliquotaSTSuportConsFinal,
      a.baseICMSST                    = b.baseICMSST,
      a.valorICMSST                   = b.valorICMSST,
      a.baseICMSSTAnteriormente       = b.baseICMSSTAnteriormente,
      a.valorICMSSTAnteriormente      = b.valorICMSSTAnteriormente,
      a.valorICMSProprioSubstituto    = b.valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo        = b.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo           = b.aliquotaICMSEfetivo,
      a.baseICMSEfetivo               = b.baseICMSEfetivo,
      a.valorICMSEfetivo              = b.valorICMSEfetivo,
      a.aliquotaICMSUFDestinatario    = b.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual     = b.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual     = b.partilhaICMSInterestadual,
      a.baseICMSUFDestinatario        = b.baseICMSUFDestinatario,
      a.valorICMSUFDestinatario       = b.valorICMSUFDestinatario,
      a.baseICMSUFRemetente           = b.baseICMSUFRemetente,
      a.valorICMSUFRemetente          = b.valorICMSUFRemetente,
      a.aliquotaFCP                   = b.aliquotaFCP,
      a.baseFCP                       = b.baseFCP,
      a.valorFCP                      = b.valorFCP,
      a.aliquotaFCPST                 = b.aliquotaFCPST,
      a.baseFCPST                     = b.baseFCPST,
      a.valorFCPST                    = b.valorFCPST,
      a.aliquotaFCPSTAnteriormente    = b.aliquotaFCPSTAnteriormente,
      a.baseFCPSTAnteriormente        = b.baseFCPSTAnteriormente,
      a.valorFCPSTAnteriormente       = b.valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario     = b.aliquotaFCPUFDestinatario,
      a.baseFCPUFDestinatario         = b.baseFCPUFDestinatario,
      a.valorFCPUFDestinatario        = b.valorFCPUFDestinatario,
      a.aliquotaestimadaimpfederais   = b.aliquotaestimadaimpfederais,
      a.aliquotaestimadaimpestaduais  = b.aliquotaestimadaimpestaduais,
      a.aliquotaestimadaimpmunicipais = b.aliquotaestimadaimpmunicipais,
      a.baseestimadaimpostos          = b.baseestimadaimpostos,
      a.valorestimadoimpfederais      = b.valorestimadoimpfederais,
      a.valorEstimadoImpEstaduais     = b.valorEstimadoImpEstaduais,
      a.valorEstimadoImpMunicipais    = b.valorEstimadoImpMunicipais,
      a.valorLiquidoItem              = b.valorLiquidoItem,
      a.observacoesDigitadas          = b.observacoesDigitadas,
      a.observacoes                   = b.observacoes
    WHEN NOT MATCHED THEN INSERT (
      idItemOrcamento,
      orcamento,
      sequencia,
      cancelado,
      pedidoCompraFornecedor,
      sequenciaPedidoCompraFornec,
      ambiente,
      ambienteObservacoes,
      modeloDocumento,
      estabelecimentoOriginal,
      vendedor,
      gradeProduto,
      atividadeServico,
      statusAtividadeServico,
      idFormulaTinta,
      personalizacao,
      idLoteEstoque,
      vinculoItemDocumento,
      operacaoFiscal,
      movimentaEstoque,
      geraFinanceiro,
      localEstoque,
      pessoaParticipante,
      dataEntrega,
      controleQuantidade,
      unidadeMedidaConversao,
      conversorQuantidade,
      loteMinimo,
      loteMultiplo,
      altura,
      largura,
      comprimento,
      pecas,
      quantidade,
      quantidadeConvertida,
      quantidadeSaldo,
      controleEntrega,
      pesoLiquido,
      pesoBruto,
      tipoPreco,
      tabelaPreco,
      precoSugestaoAPrazo,
      precoSugestaoAVista,
      precoDesconto,
      precoMinimo,
      usarPrecoAVista,
      precoUnitarioBruto,
      acrescimoUnitarioComposicao,
      precoUnitario,
      precoUnitarioConvertido,
      valorProdutoServicoBruto,
      valorProdutoServico,
      percDescontoItem,
      valorDescontoItem,
      percAcrescimoItem,
      valorAcrescimoItem,
      valorFreteItem,
      valorSeguroItem,
      valorAdicFreteMarinhaMerItem,
      valorDespesasAduaneirasItem,
      valorFreteGeral,
      valorSeguroGeral,
      valorDescontoGeral,
      valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral,
      valorDespesasAduaneirasGeral,
      valorBasePagamento,
      valorDescontoPagamento,
      valorOutrasDespesasPagamento,
      valorJurosPagamento,
      valorFreteTotal,
      valorSeguroTotal,
      valorDescontoTotal,
      valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal,
      valorDespesasAduaneirasTotal,
      cfop,
      indicadorISSQN,
      aliquotaISSQN,
      retidoISSQN,
      tributadoForaMunicipio,
      incentivoFiscal,
      listaServicos,
      cnae,
      idServicoMunicipio,
      numeroProcessoAdministrativo,
      baseISSQN,
      valorISSQN,
      retencaoIRRF,
      baseRetIRRF,
      valorRetIRRF,
      retencaoINSS,
      baseRetINSS,
      valorRetINSS,
      retencaoPIS,
      baseRetPIS,
      valorRetPIS,
      retencaoCOFINS,
      baseRetCOFINS,
      valorRetCOFINS,
      retencaoCSLL,
      baseRetCSLL,
      valorRetCSLL,
      retencaoOutros,
      baseRetOutros,
      valorRetOutros,
      aliquotaII,
      baseII,
      valorII,
      aliquotaIOF,
      baseIOF,
      valorIOF,
      codigoEnquadramentoIPI,
      stIPI,
      aliquotaIPI,
      valorAliquotaIPI,
      baseIPI,
      valorIPI,
      stPIS,
      aliquotaPIS,
      valorAliquotaPIS,
      basePIS,
      valorPIS,
      aliquotaPISST,
      valorAliquotaPISST,
      basePISST,
      valorPISST,
      stCOFINS,
      aliquotaCOFINS,
      valorAliquotaCOFINS,
      baseCOFINS,
      valorCOFINS,
      aliquotaCOFINSST,
      valorAliquotaCOFINSST,
      baseCOFINSST,
      valorCOFINSST,
      stSimplesNacional,
      creditoSimplesNacional,
      baseCreditoSimplesNacional,
      valorCreditoSimplesNacional,
      stICMS,
      modalidadeBaseCalcICMS,
      reducaoBaseICMS,
      aliquotaICMS,
      diferimentoICMS,
      motivoDesoneracaoICMS,
      idBeneficio,
      baseICMS,
      valorICMSOperacao,
      valorICMSDiferido,
      valorICMS,
      valorICMSDesoneracao,
      modalidadeBaseCalcICMSST,
      margemValorAdicionadoST,
      reducaoBaseST,
      aliquotaICMSST,
      aliquotaSTSuportConsFinal,
      baseICMSST,
      valorICMSST,
      baseICMSSTAnteriormente,
      valorICMSSTAnteriormente,
      valorICMSProprioSubstituto,
      reducaoBaseICMSEfetivo,
      aliquotaICMSEfetivo,
      baseICMSEfetivo,
      valorICMSEfetivo,
      aliquotaICMSUFDestinatario,
      aliquotaICMSInterestadual,
      partilhaICMSInterestadual,
      baseICMSUFDestinatario,
      valorICMSUFDestinatario,
      baseICMSUFRemetente,
      valorICMSUFRemetente,
      aliquotaFCP,
      baseFCP,
      valorFCP,
      aliquotaFCPST,
      baseFCPST,
      valorFCPST,
      aliquotaFCPSTAnteriormente,
      baseFCPSTAnteriormente,
      valorFCPSTAnteriormente,
      aliquotaFCPUFDestinatario,
      baseFCPUFDestinatario,
      valorFCPUFDestinatario,
      aliquotaEstimadaImpFederais,
      aliquotaEstimadaImpEstaduais,
      aliquotaEstimadaImpMunicipais,
      baseEstimadaImpostos,
      valorEstimadoImpFederais,
      valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais,
      valorLiquidoItem,
      observacoesDigitadas,
      observacoes)
    VALUES (
      b.idItemOrcamento,
      b.orcamento,
      b.sequencia,
      b.cancelado,
      b.pedidoCompraFornecedor,
      b.sequenciaPedidoCompraFornec,
      b.ambiente,
      b.ambienteObservacoes,
      b.modeloDocumento,
      b.estabelecimentoOriginal,
      b.vendedor,
      b.gradeProduto,
      b.atividadeServico,
      b.statusAtividadeServico,
      b.idFormulaTinta,
      b.personalizacao,
      b.idLoteEstoque,
      b.vinculoItemDocumento,
      b.operacaoFiscal,
      b.movimentaEstoque,
      b.geraFinanceiro,
      b.localEstoque,
      b.pessoaParticipante,
      b.dataEntrega,
      b.controleQuantidade,
      b.unidadeMedidaConversao,
      b.conversorQuantidade,
      b.loteMinimo,
      b.loteMultiplo,
      b.altura,
      b.largura,
      b.comprimento,
      b.pecas,
      b.quantidade,
      b.quantidadeConvertida,
      b.quantidadeSaldo,
      b.controleEntrega,
      b.pesoLiquido,
      b.pesoBruto,
      b.tipoPreco,
      b.tabelaPreco,
      b.precoSugestaoAPrazo,
      b.precoSugestaoAVista,
      b.precoDesconto,
      b.precoMinimo,
      b.usarPrecoAVista,
      b.precoUnitarioBruto,
      b.acrescimoUnitarioComposicao,
      b.precoUnitario,
      b.precoUnitarioConvertido,
      b.valorProdutoServicoBruto,
      b.valorProdutoServico,
      b.percDescontoItem,
      b.valorDescontoItem,
      b.percAcrescimoItem,
      b.valorAcrescimoItem,
      b.valorFreteItem,
      b.valorSeguroItem,
      b.valorAdicFreteMarinhaMerItem,
      b.valorDespesasAduaneirasItem,
      b.valorFreteGeral,
      b.valorSeguroGeral,
      b.valorDescontoGeral,
      b.valorOutrasDespesasGeral,
      b.valorAdicFreteMarinhaMerGeral,
      b.valorDespesasAduaneirasGeral,
      b.valorBasePagamento,
      b.valorDescontoPagamento,
      b.valorOutrasDespesasPagamento,
      b.valorJurosPagamento,
      b.valorFreteTotal,
      b.valorSeguroTotal,
      b.valorDescontoTotal,
      b.valorOutrasDespesasTotal,
      b.valorAdicFreteMarinhaMerTotal,
      b.valorDespesasAduaneirasTotal,
      b.cfop,
      b.indicadorISSQN,
      b.aliquotaISSQN,
      b.retidoISSQN,
      b.tributadoForaMunicipio,
      b.incentivoFiscal,
      b.listaServicos,
      b.cnae,
      b.idServicoMunicipio,
      b.numeroProcessoAdministrativo,
      b.baseISSQN,
      b.valorISSQN,
      b.retencaoIRRF,
      b.baseRetIRRF,
      b.valorRetIRRF,
      b.retencaoINSS,
      b.baseRetINSS,
      b.valorRetINSS,
      b.retencaoPIS,
      b.baseRetPIS,
      b.valorRetPIS,
      b.retencaoCOFINS,
      b.baseRetCOFINS,
      b.valorRetCOFINS,
      b.retencaoCSLL,
      b.baseRetCSLL,
      b.valorRetCSLL,
      b.retencaoOutros,
      b.baseRetOutros,
      b.valorRetOutros,
      b.aliquotaII,
      b.baseII,
      b.valorII,
      b.aliquotaIOF,
      b.baseIOF,
      b.valorIOF,
      b.codigoEnquadramentoIPI,
      b.stIPI,
      b.aliquotaIPI,
      b.valorAliquotaIPI,
      b.baseIPI,
      b.valorIPI,
      b.stPIS,
      b.aliquotaPIS,
      b.valorAliquotaPIS,
      b.basePIS,
      b.valorPIS,
      b.aliquotaPISST,
      b.valorAliquotaPISST,
      b.basePISST,
      b.valorPISST,
      b.stCOFINS,
      b.aliquotaCOFINS,
      b.valorAliquotaCOFINS,
      b.baseCOFINS,
      b.valorCOFINS,
      b.aliquotaCOFINSST,
      b.valorAliquotaCOFINSST,
      b.baseCOFINSST,
      b.valorCOFINSST,
      b.stSimplesNacional,
      b.creditoSimplesNacional,
      b.baseCreditoSimplesNacional,
      b.valorCreditoSimplesNacional,
      b.stICMS,
      b.modalidadeBaseCalcICMS,
      b.reducaoBaseICMS,
      b.aliquotaICMS,
      b.diferimentoICMS,
      b.motivoDesoneracaoICMS,
      b.idBeneficio,
      b.baseICMS,
      b.valorICMSOperacao,
      b.valorICMSDiferido,
      b.valorICMS,
      b.valorICMSDesoneracao,
      b.modalidadeBaseCalcICMSST,
      b.margemValorAdicionadoST,
      b.reducaoBaseST,
      b.aliquotaICMSST,
      b.aliquotaSTSuportConsFinal,
      b.baseICMSST,
      b.valorICMSST,
      b.baseICMSSTAnteriormente,
      b.valorICMSSTAnteriormente,
      b.valorICMSProprioSubstituto,
      b.reducaoBaseICMSEfetivo,
      b.aliquotaICMSEfetivo,
      b.baseICMSEfetivo,
      b.valorICMSEfetivo,
      b.aliquotaICMSUFDestinatario,
      b.aliquotaICMSInterestadual,
      b.partilhaICMSInterestadual,
      b.baseICMSUFDestinatario,
      b.valorICMSUFDestinatario,
      b.baseICMSUFRemetente,
      b.valorICMSUFRemetente,
      b.aliquotaFCP,
      b.baseFCP,
      b.valorFCP,
      b.aliquotaFCPST,
      b.baseFCPST,
      b.valorFCPST,
      b.aliquotaFCPSTAnteriormente,
      b.baseFCPSTAnteriormente,
      b.valorFCPSTAnteriormente,
      b.aliquotaFCPUFDestinatario,
      b.baseFCPUFDestinatario,
      b.valorFCPUFDestinatario,
      b.aliquotaEstimadaImpFederais,
      b.aliquotaEstimadaImpEstaduais,
      b.aliquotaEstimadaImpMunicipais,
      b.baseEstimadaImpostos,
      b.valorEstimadoImpFederais,
      b.valorEstimadoImpEstaduais,
      b.valorEstimadoImpMunicipais,
      b.valorLiquidoItem,
      b.observacoesDigitadas,
      b.observacoes);
    v_atualizarObservacoes := 0;
    IF p_idItemReferenciado > 0 THEN
      IF p_tipoDocumentoReferenciado = 'C' THEN
        UPDATE MOPAINELCOMPRAXGRADE
        SET idItemOrcamento = r_item_idItemOrcamento
        WHERE idGradePainelCompra = p_idItemReferenciado;
      ELSIF p_tipoDocumentoReferenciado = 'F' THEN
        ADD_ORCAMENTO_ITEM_REF_CONTR (
          p_estabelecimentoAtivo,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      ELSIF p_tipoDocumentoReferenciado = 'L' THEN
        ADD_ORCAMENTO_ITEM_LISTA_GRAVA (
          p_estabelecimentoAtivo,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      ELSIF p_tipoDocumentoReferenciado = 'O' THEN
        ADD_ORCAMENTO_ITEM_REF_ORCAMEN (
          p_estabelecimentoAtivo,
          r_item_idItemOrcamento,
          p_item_quantidade,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'T' THEN
        ADD_ORCAMENTO_ITEM_TRANS_GRAVA (
          p_estabelecimentoAtivo,
          v_cab_entradaSaida,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      END IF;
    END IF;
    IF p_tempComp_nomeTempComposicao <> ' '
      AND (p_tipoDocumentoReferenciado <> 'O'
        OR p_idItemReferenciado <= 0)
    THEN
      ADD_ORCAMENTO_ITEM_COMP_TEMP (
        p_sessaoClient,
        p_estabelecimentoAtivo,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        r_item_idItemOrcamento,
        v_atualizarObservacoes,
        v_atualizarObservacoes);
    END IF;
    v_idEnderecoEstoque := 0;
    IF p_item_idEnderecoEstoque > 0 THEN
      ADD_ORCAMENTO_ITEM_ENDER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemOrcamento,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_quantidade,
        ' ',
        v_idEnderecoEstoque);
    END IF;
    IF p_item_idNumeroSerie > 0 THEN
      ADD_ORCAMENTO_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemOrcamento,
        v_idEnderecoEstoque,
        p_item_gradeProduto,
        p_item_idNumeroSerie,
        0,
        v_auxNumber);
      v_atualizarObservacoes := 1;
    END IF;
    IF p_item_atividadeProjeto > 0 THEN
      ADD_ORCAMENTO_ITEM_PROJ_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemOrcamento,
        p_item_atividadeProjeto,
        v_auxNumber);
    END IF;
    IF v_atualizarObservacoes = 1 THEN
      v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
        p_sessaoClient,
        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_413_obs_add_marca,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        'O',
        r_item_idItemOrcamento,
        p_item_gradeProduto,
        p_item_idFormulaTinta,
        p_item_personalizacao,
        p_item_idLoteEstoque,
        p_item_controleQuantidade,
        p_item_loteMultiplo,
        p_item_altura,
        p_item_largura,
        p_item_comprimento,
        p_item_quantidade,
        p_item_observacoesDigitadas);
      UPDATE MOORCAMENTOXITENS
      SET observacoes = v_observacoes
      WHERE idItemOrcamento = r_item_idItemOrcamento;
    END IF;
    IF v_etOrc_situacaoOrcamento > 40 THEN
      ADD_ORCAMENTO_ITEM_RES_ITEM (
        r_item_idItemOrcamento,
        p_estabelecimentoAtivo,
        ' ',
        v_auxVarchar);
    END IF;
    r_buffer_item_idItemOrcamento := CASE WHEN (r_buffer_item_idItemOrcamento IS NULL OR r_buffer_item_idItemOrcamento = '' OR r_buffer_item_idItemOrcamento = ' ') THEN '' ELSE RTRIM (r_buffer_item_idItemOrcamento) || ';' END || TO_CHAR (LPAD(r_item_idItemOrcamento,14,'0'));
    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;
    IF p_item_idItemOrcamento <= 0
      AND v_item_cancelado = 0
      AND p_item_atividadeServico > 0
    THEN
      SELECT habilitaAtividadePrevista
      INTO v_auxNumber
      FROM PAATIVIDADESSERVICO
      WHERE atividadeServico = p_item_atividadeServico;
      IF v_auxNumber = 1 THEN
        ADD_ORCAMENTO_ITEM_PREV_INSERE (
          p_config_64_casasDecSaidas,
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_perfilUsuarioLogado,
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_estabelecimento,
          v_cab_pessoa,
          v_munEndEst_uf,
          v_munEndPess_uf,
          r_item_idItemOrcamento,
          p_item_atividadeServico,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_tipoPreco,
          p_item_tabelaPreco,
          v_item_precoUnitario,
          v_auxNumber);
        IF v_auxNumber = 1 THEN
          SELECT
            COUNT (1) numeroAtividades,
            SUM (
              CASE
                WHEN prev.faturarAtividade = 'P'
                THEN prev.quantidade
                ELSE COALESCE ((
                  SELECT realiz.quantidade
                  FROM MOORCAMENTOXATIVIDADEREAL realiz
                  WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
                  AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
              END) quantidade,
            MIN (prev.precoUnitario) precoUnitarioMenor,
            MAX (prev.precoUnitario) precoUnitarioMaior,
            SUM (ROUND (
              CASE
                WHEN prev.faturarAtividade = 'P'
                THEN prev.quantidade
                ELSE COALESCE ((
                  SELECT realiz.quantidade
                  FROM MOORCAMENTOXATIVIDADEREAL realiz
                  WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
                  AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
              END * prev.precoUnitario, 2)) valorTotalItem
          INTO
            v_ativ_numero,
            v_ativ_quantidade,
            v_ativ_precoUnitarioMenor,
            v_ativ_precoUnitario,
            v_ativ_valorTotalItem
          FROM MOORCAMENTOXATIVIDADEPREV prev
          WHERE prev.idItemOrcamento = r_item_idItemOrcamento
          AND prev.statusAtividadeServico <> 'C'
          AND prev.faturarAtividade IN ('P','R');
          IF v_ativ_numero > 0 THEN
            IF v_ativ_numero > 1
              AND v_ativ_precoUnitarioMenor <> v_ativ_precoUnitario
              AND v_ativ_quantidade <> 0
            THEN
              v_ativ_precoUnitario := ROUND (v_ativ_valorTotalItem / v_ativ_quantidade, TO_NUMBER (p_config_64_casasDecSaidas));
            END IF;
          ELSE
            SELECT
              COUNT (1) numeroAtividades,
              SUM (COALESCE ((
                SELECT realiz.quantidade
                FROM MOORCAMENTOXATIVIDADEREAL realiz
                WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
                AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)) quantidade
            INTO
              v_ativ_numero,
              v_ativ_quantidade
            FROM MOORCAMENTOXATIVIDADEPREV prev
            WHERE prev.idItemOrcamento = r_item_idItemOrcamento
            AND prev.statusAtividadeServico <> 'C';
            v_ativ_precoUnitario := 0;
          END IF;
          IF v_ativ_numero > 0
            AND (v_ativ_quantidade <> p_item_quantidade
              OR v_ativ_precoUnitario <> v_item_precoUnitario)
          THEN
            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_config_413_obs_add_marca,
              0, -- p_manterFinanceiro_Retotalizar,
              'T', -- p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
              0, -- p_buscarGeraFinanceiroEstoque,
              ' ', -- p_tipoDocumentoReferenciado, 
              0, -- p_idItemReferenciado,
              0, -- p_quantidadeReferenciada
              ' ', -- p_tempComp_nomeTempComposicao,
              0, -- p_tempComp_sequencia
              ' ', -- p_mensagemAviso,
              r_calcularImpostos,
              r_item_idItemOrcamento,
              p_item_orcamento,
              p_item_pedidoCompraFornecedor,
              p_item_sequenciaPedidoCompraFo,
              p_item_ambiente,
              p_item_ambienteObservacoes,
              p_item_vinculoItemDocumento,
              p_item_atividadeServico,
              p_item_statusAtividadeServico,
              p_item_controleEntrega,
              p_item_dataEntrega,
              p_item_modeloDocumento,
              p_item_estabelecimentoOriginal,
              p_item_vendedor,
              p_item_gradeProduto,
              p_item_idFormulaTinta,
              p_item_personalizacao,
              p_item_idLoteEstoque,
              0, -- p_item_idEnderecoEstoque
              0, -- p_item_idNumeroSerie
              0, -- p_item_atividadeProjeto,
              p_item_localEstoque,
              p_item_pessoaParticipante,
              p_item_controleQuantidade,
              p_item_unidadeMedidaConversao,
              p_item_conversorQuantidade,
              p_item_loteMinimo,
              p_item_loteMultiplo,
              p_item_altura,
              p_item_largura,
              p_item_comprimento,
              CASE p_item_controleQuantidade
                WHEN 2
                THEN CASE WHEN p_item_altura = 0 OR p_item_largura = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100))), 3) END
                WHEN 3
                THEN CASE WHEN p_item_altura = 0 OR p_item_comprimento = 0 OR p_item_comprimento = 0 THEN 0 ELSE ROUND (v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100) * p_item_comprimento), 3) END
                WHEN 4
                THEN CASE WHEN p_item_conversorQuantidade = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / p_item_conversorQuantidade), 3) END
                ELSE 0
              END, -- p_item_pecas
              v_ativ_quantidade,
              CASE p_item_controleQuantidade
                WHEN 2
                THEN ROUND (CASE WHEN p_item_altura = 0 OR p_item_largura = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100))), 3) END, v_uniMedConv_casasDecimaisUnid)
                WHEN 3
                THEN ROUND (CASE WHEN p_item_altura = 0 OR p_item_comprimento = 0 OR p_item_comprimento = 0 THEN 0 ELSE ROUND (v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100) * p_item_comprimento), 3) END, v_uniMedConv_casasDecimaisUnid)
                WHEN 4
                THEN ROUND (CASE WHEN p_item_conversorQuantidade = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / p_item_conversorQuantidade), 3) END, v_uniMedConv_casasDecimaisUnid)
                ELSE v_ativ_quantidade
              END, -- p_item_quantidadeConvertida
              ROUND ((v_ativ_quantidade * v_prod_pesoLiquido), 3), -- p_item_pesoLiquido
              ROUND ((v_ativ_quantidade * v_prod_pesoBruto), 3), -- p_item_pesoBruto
              p_item_tipoPreco,
              p_item_tabelaPreco,
              p_item_precoSugestaoAPrazo,
              p_item_precoSugestaoAVista,
              p_item_precoDesconto,
              p_item_precoMinimo,
              p_item_usarPrecoAVista,
              v_ativ_precoUnitario, -- p_item_precoUnitarioBruto
              p_item_acrescimoUnitarioCompos,
              v_ativ_precoUnitario, -- p_item_precoUnitario
              p_item_percDescontoItem,
              p_item_valorDescontoItem,
              p_item_percAcrescimoItem,
              p_item_valorAcrescimoItem,
              p_item_valorFreteItem,
              p_item_valorSeguroItem,
              p_item_valorAdicFreteMarItem,
              p_item_valorDespesasAduanItem,
              p_item_observacoesDigitadas,
              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,
              p_item_operacaoFiscal,
              v_item_movimentaEstoque,
              v_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
              0, -- p_nivel,
              ' ',
              v_auxVarchar, -- r_mensagemAviso
              r_calcularImpostos,
              v_auxNumber, -- idItemOrcamento
              v_auxVarchar, -- r_buffer_item_idItemOrcamento
              v_auxNumber); -- r_valorInserido
          END IF;
        END IF;
      END IF;
    END IF;
  END IF;
END ADD_ORCAMENTO_ITEM_GRAVA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_PREV_RECALC (
  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_config_413_obs_add_marca     IN NUMBER,
  p_idItemOrcamento              IN NUMBER)
IS
  v_calcularImpostos        NUMBER;
  v_ativ_numero             NUMBER;
  v_ativ_quantidade         NUMBER;
  v_ativ_precoUnitarioMenor NUMBER;
  v_ativ_precoUnitario      NUMBER;
  v_ativ_valorTotalItem     NUMBER;
  v_auxNumber               NUMBER;
  v_auxVarchar              VARCHAR2 (32000);
BEGIN
  v_calcularImpostos := 0;
  SELECT
    COUNT (1) numeroAtividades,
    SUM (
      CASE
        WHEN prev.faturarAtividade = 'P'
        THEN prev.quantidade
        ELSE COALESCE ((
          SELECT realiz.quantidade
          FROM MOORCAMENTOXATIVIDADEREAL realiz
          WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
          AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
      END) quantidade,
    MIN (prev.precoUnitario) precoUnitarioMenor,
    MAX (prev.precoUnitario) precoUnitarioMaior,
    SUM (ROUND (
      CASE
        WHEN prev.faturarAtividade = 'P'
        THEN prev.quantidade
        ELSE COALESCE ((
          SELECT realiz.quantidade
          FROM MOORCAMENTOXATIVIDADEREAL realiz
          WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
          AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
      END * prev.precoUnitario, 2)) valorTotalItem
  INTO
    v_ativ_numero,
    v_ativ_quantidade,
    v_ativ_precoUnitarioMenor,
    v_ativ_precoUnitario,
    v_ativ_valorTotalItem
  FROM MOORCAMENTOXATIVIDADEPREV prev
  WHERE prev.idItemOrcamento = p_idItemOrcamento
  AND prev.statusAtividadeServico <> 'C'
  AND prev.faturarAtividade IN ('P','R');
  IF v_ativ_numero > 0 THEN
    IF v_ativ_numero > 1
      AND v_ativ_precoUnitarioMenor <> v_ativ_precoUnitario
      AND v_ativ_quantidade <> 0
    THEN
      v_ativ_precoUnitario := ROUND (v_ativ_valorTotalItem / v_ativ_quantidade, TO_NUMBER (p_config_64_casasDecSaidas));
    END IF;
  ELSE
    SELECT
      COUNT (1) numeroAtividades,
      SUM (COALESCE ((
        SELECT realiz.quantidade
        FROM MOORCAMENTOXATIVIDADEREAL realiz
        WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
        AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)) quantidade
    INTO
      v_ativ_numero,
      v_ativ_quantidade
    FROM MOORCAMENTOXATIVIDADEPREV prev
    WHERE prev.idItemOrcamento = p_idItemOrcamento
    AND prev.statusAtividadeServico <> 'C';
    v_ativ_precoUnitario := 0;
  END IF;
  IF v_ativ_numero > 0 THEN
    FOR a IN (
      SELECT
        a.orcamento,
        a.pedidoCompraFornecedor,
        a.sequenciaPedidoCompraFornec,
        a.ambiente,
        a.ambienteObservacoes,
        a.vinculoItemDocumento,
        a.atividadeServico,
        a.statusAtividadeServico,
        a.controleEntrega,
        a.dataEntrega,
        a.modeloDocumento,
        a.estabelecimentoOriginal,
        a.vendedor,
        a.gradeProduto,
        a.idFormulaTinta,
        a.personalizacao,
        a.idLoteEstoque,
        a.localEstoque,
        a.pessoaParticipante,
        a.controleQuantidade,
        a.unidadeMedidaConversao,
        a.conversorQuantidade,
        a.loteMinimo,
        a.loteMultiplo,
        a.altura,
        a.largura,
        a.comprimento,
        a.quantidade,
        a.precoUnitario,
        a.tipoPreco,
        a.tabelaPreco,
        a.precoSugestaoAPrazo,
        a.precoSugestaoAVista,
        a.precoDesconto,
        a.precoMinimo,
        a.usarPrecoAVista,
        a.acrescimoUnitarioComposicao,
        a.percDescontoItem,
        a.valorDescontoItem,
        a.percAcrescimoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.observacoesDigitadas,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.operacaoFiscal,
        a.movimentaEstoque,
        a.geraFinanceiro,
        prod.pesoLiquido prod_pesoLiquido,
        prod.pesoBruto prod_pesoBruto,
        unMedConv.casasDecimaisUnidadeMedida unMedConv_casasDecimais
      FROM MOORCAMENTOXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN SIUNIDADESMEDIDA unMedConv
      ON unMedConv.unidadeMedida = a.unidadeMedidaConversao
      WHERE a.idItemOrcamento = p_idItemOrcamento)
    LOOP   
      IF v_ativ_quantidade <> a.quantidade
        OR v_ativ_precoUnitario <> a.precoUnitario
      THEN
        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_config_413_obs_add_marca,
          0, -- p_manterFinanceiro_Retotalizar,
          'T', -- p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
          0, -- p_buscarGeraFinanceiroEstoque,
          ' ', -- p_tipoDocumentoReferenciado, 
          0, -- p_idItemReferenciado,
          0, -- p_quantidadeReferenciada
          ' ', -- p_tempComp_nomeTempComposicao,
          0, -- p_tempComp_sequencia
          ' ', -- p_mensagemAviso,
          0, -- p_calcularImpostos
          p_idItemOrcamento,
          a.orcamento,
          a.pedidoCompraFornecedor,
          a.sequenciaPedidoCompraFornec,
          a.ambiente,
          a.ambienteObservacoes,
          a.vinculoItemDocumento,
          a.atividadeServico,
          a.statusAtividadeServico,
          a.controleEntrega,
          a.dataEntrega,
          a.modeloDocumento,
          a.estabelecimentoOriginal,
          a.vendedor,
          a.gradeProduto,
          a.idFormulaTinta,
          a.personalizacao,
          a.idLoteEstoque,
          0, -- p_item_idEnderecoEstoque
          0, -- p_item_idNumeroSerie
          0, -- p_item_atividadeProjeto,
          a.localEstoque,
          a.pessoaParticipante,
          a.controleQuantidade,
          a.unidadeMedidaConversao,
          a.conversorQuantidade,
          a.loteMinimo,
          a.loteMultiplo,
          a.altura,
          a.largura,
          a.comprimento,
          CASE a.controleQuantidade
            WHEN 2
            THEN ROUND (CASE WHEN a.altura = 0 OR a.largura = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / ((a.altura / 100) * (a.largura / 100))), 3) END, 6)
            WHEN 3
            THEN ROUND (CASE WHEN a.altura = 0 OR a.comprimento = 0 OR a.comprimento = 0 THEN 0 ELSE ROUND (v_ativ_quantidade / ((a.altura / 100) * (a.largura / 100) * a.comprimento), 3) END, 6)
            WHEN 4
            THEN ROUND (CASE WHEN a.conversorQuantidade = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / a.conversorQuantidade), 3) END, 6)
            ELSE 0
          END, -- p_item_pecas
          v_ativ_quantidade,
          CASE a.controleQuantidade
            WHEN 2
            THEN ROUND (CASE WHEN a.altura = 0 OR a.largura = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / ((a.altura / 100) * (a.largura / 100))), 3) END, a.unMedConv_casasDecimais)
            WHEN 3
            THEN ROUND (CASE WHEN a.altura = 0 OR a.comprimento = 0 OR a.comprimento = 0 THEN 0 ELSE ROUND (v_ativ_quantidade / ((a.altura / 100) * (a.largura / 100) * a.comprimento), 3) END, a.unMedConv_casasDecimais)
            WHEN 4
            THEN ROUND (CASE WHEN a.conversorQuantidade = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / a.conversorQuantidade), 3) END, a.unMedConv_casasDecimais)
            ELSE v_ativ_quantidade
          END, -- p_item_quantidadeConvertida
          ROUND ((v_ativ_quantidade * a.prod_pesoLiquido), 3), -- p_item_pesoLiquido
          ROUND ((v_ativ_quantidade * a.prod_pesoBruto), 3), -- p_item_pesoBruto
          a.tipoPreco,
          a.tabelaPreco,
          a.precoSugestaoAPrazo,
          a.precoSugestaoAVista,
          a.precoDesconto,
          a.precoMinimo,
          a.usarPrecoAVista,
          v_ativ_precoUnitario, -- p_item_precoUnitarioBruto
          a.acrescimoUnitarioComposicao,
          v_ativ_precoUnitario, -- p_item_precoUnitario
          a.percDescontoItem,
          a.valorDescontoItem,
          a.percAcrescimoItem,
          a.valorAcrescimoItem,
          a.valorFreteItem,
          a.valorSeguroItem,
          a.valorAdicFreteMarinhaMerItem,
          a.valorDespesasAduaneirasItem,
          a.observacoesDigitadas,
          a.valorFreteGeral,
          a.valorSeguroGeral,
          a.valorDescontoGeral,
          a.valorOutrasDespesasGeral,
          a.valorAdicFreteMarinhaMerGeral,
          a.valorDespesasAduaneirasGeral,
          a.valorDescontoPagamento,
          a.valorOutrasDespesasPagamento,
          a.valorJurosPagamento,
          a.operacaoFiscal,
          a.movimentaEstoque,
          a.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
          0, -- p_nivel,
          ' ',
          v_auxVarchar, -- r_mensagemAviso
          v_calcularImpostos,
          v_auxNumber, -- idItemOrcamento
          v_auxVarchar, -- r_buffer_idItemOrcamento
          v_auxNumber -- r_valorInserido
        );
        IF v_calcularImpostos = 1 THEN
          ADD_ORCAMENTO_CALC_IMP_CAB (
            p_config_64_casasDecSaidas,
            p_config_209_filtrarGrupoEcon,
            p_config_362_calcCustoPorGrade,
            a.orcamento,
            ' ', -- p_troca_tipoPagamentoFrete,
            ' '); --p_a_cab_tipoPagamentoFrete
        END IF;
      END IF;
    END LOOP;
  END IF;
END ADD_ORCAMENTO_ITEM_PREV_RECALC;

/

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

/

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

/

INSERT INTO SIUNIDADESMEDIDA (unidadeMedida, descricao, ativo, casasDecimaisUnidadeMedida, casasDecimaisMinimoImpressao, permiteInformarTotalItem, observacoes) values ('CD', 'CD - Cada', 1, 0, 0, 0, ' ');

COMMIT;

UPDATE SICAMPOSCOMPOSICAOCREDITO SET campoSelect = 'CASE WHEN COALESCE (fisica.remuneracao, 0) <> 0 THEN 1 ELSE 0 END' WHERE campoComposicaoCredito = 257;
UPDATE SICAMPOSCOMPOSICAOCREDITO SET campoSelect = 'CASE WHEN COALESCE((SELECT COUNT(1) FROM MOFINANCEIROS financ WHERE financ.pessoa = pessoa.pessoa AND EXISTS (SELECT 1 FROM MOBAIXAXNOVOFINANCEIRO novo JOIN MOFINANCEIROXBAIXAS baixa ON baixa.idBaixaFinanceiro = novo.idBaixaFinanceiro WHERE novo.idNovoFinanceiro = financ.idFinanceiro AND baixa.unificadoReparcelado = 1 AND baixa.meioPagamento <> 17 AND NOT (baixa.meioPagamento BETWEEN 20 AND 28))),0) = 0 THEN 0 ELSE ROUND((100 * COALESCE((SELECT COUNT(1) FROM MOFINANCEIROS financ WHERE financ.pessoa = pessoa.pessoa AND financ.efetivado = 0 AND financ.meioPagamento <> 17 AND NOT (financ.meioPagamento BETWEEN 20 AND 28) AND EXISTS (SELECT 1 FROM MOBAIXAXNOVOFINANCEIRO novo JOIN MOFINANCEIROXBAIXAS baixa ON baixa.idBaixaFinanceiro = novo.idBaixaFinanceiro WHERE novo.idNovoFinanceiro = financ.idFinanceiro AND baixa.unificadoReparcelado = 1 AND baixa.meioPagamento <> 17 AND NOT (baixa.meioPagamento BETWEEN 20 AND 28))),0) / COALESCE((SELECT COUNT(1) FROM MOFINANCEIROS financ WHERE financ.pessoa = pessoa.pessoa AND EXISTS (SELECT 1 FROM MOBAIXAXNOVOFINANCEIRO novo JOIN MOFINANCEIROXBAIXAS baixa ON baixa.idBaixaFinanceiro = novo.idBaixaFinanceiro WHERE novo.idNovoFinanceiro = financ.idFinanceiro AND baixa.unificadoReparcelado = 1 AND baixa.meioPagamento <> 17 AND NOT (baixa.meioPagamento BETWEEN 20 AND 28))),0)),2) END' WHERE campoComposicaoCredito = 822;
UPDATE SICAMPOSCOMPOSICAOCREDITO SET campoSelect = 'CASE WHEN COALESCE((SELECT SUM (financ.valor) FROM MOFINANCEIROS financ WHERE financ.pessoa = pessoa.pessoa AND EXISTS (SELECT 1 FROM MOBAIXAXNOVOFINANCEIRO novo JOIN MOFINANCEIROXBAIXAS baixa ON baixa.idBaixaFinanceiro = novo.idBaixaFinanceiro WHERE novo.idNovoFinanceiro = financ.idFinanceiro AND baixa.unificadoReparcelado = 1 AND baixa.meioPagamento <> 17 AND NOT (baixa.meioPagamento BETWEEN 20 AND 28))),0) = 0 THEN 0 ELSE ROUND((100 * COALESCE((SELECT SUM (financ.saldo) FROM MOFINANCEIROS financ WHERE financ.pessoa = pessoa.pessoa AND EXISTS (SELECT 1 FROM MOBAIXAXNOVOFINANCEIRO novo JOIN MOFINANCEIROXBAIXAS baixa ON baixa.idBaixaFinanceiro = novo.idBaixaFinanceiro WHERE novo.idNovoFinanceiro = financ.idFinanceiro)),0) / COALESCE((SELECT SUM (financ.valor) FROM MOFINANCEIROS financ WHERE financ.pessoa = pessoa.pessoa AND EXISTS (SELECT 1 FROM MOBAIXAXNOVOFINANCEIRO novo JOIN MOFINANCEIROXBAIXAS baixa ON baixa.idBaixaFinanceiro = novo.idBaixaFinanceiro WHERE novo.idNovoFinanceiro = financ.idFinanceiro AND baixa.unificadoReparcelado = 1 AND baixa.meioPagamento <> 17 AND NOT (baixa.meioPagamento BETWEEN 20 AND 28))),0)),2) END' WHERE campoComposicaoCredito = 823;
UPDATE SICAMPOSCOMPOSICAOCREDITO SET campoSelect = 'CASE WHEN COALESCE((SELECT COUNT(1) FROM MOFINANCEIROS financ WHERE financ.pessoa = pessoa.pessoa AND EXISTS (SELECT 1 FROM MOBAIXAXNOVOFINANCEIRO novo JOIN MOFINANCEIROXBAIXAS baixa ON baixa.idBaixaFinanceiro = novo.idBaixaFinanceiro JOIN MOBAIXAXNOVOFINANCEIRO novo2 ON novo2.idBaixaFinanceiro = novo.idBaixaFinanceiro JOIN MOFINANCEIROXBAIXAS baixa2 ON baixa2.idBaixaFinanceiro = novo2.idBaixaFinanceiro JOIN MOFINANCEIROS financ2 ON financ2.idFinanceiro = novo2.idNovoFinanceiro WHERE novo.idNovoFinanceiro = financ.idFinanceiro AND baixa.unificadoReparcelado = 1 AND baixa.meioPagamento <> 17 AND NOT (baixa.meioPagamento BETWEEN 20 AND 28) AND baixa2.unificadoReparcelado = 1 AND baixa2.meioPagamento <> 17 AND NOT (baixa2.meioPagamento BETWEEN 20 AND 28) AND financ2.efetivado = 0 AND financ2.meioPagamento <> 17 AND NOT (financ2.meioPagamento BETWEEN 20 AND 28))),0) = 0 THEN 0 ELSE ROUND((100 * COALESCE((SELECT COUNT(1) FROM MOFINANCEIROS financ WHERE financ.pessoa = pessoa.pessoa AND (financ.efetivado = 1 OR financ.meioPagamento = 17 OR financ.meioPagamento BETWEEN 20 AND 28) AND EXISTS (SELECT 1 FROM MOBAIXAXNOVOFINANCEIRO novo JOIN MOFINANCEIROXBAIXAS baixa ON baixa.idBaixaFinanceiro = novo.idBaixaFinanceiro JOIN MOBAIXAXNOVOFINANCEIRO novo2 ON novo2.idBaixaFinanceiro = novo.idBaixaFinanceiro JOIN MOFINANCEIROXBAIXAS baixa2 ON baixa2.idBaixaFinanceiro = novo2.idBaixaFinanceiro JOIN MOFINANCEIROS financ2 ON financ2.idFinanceiro = novo2.idNovoFinanceiro WHERE novo.idNovoFinanceiro = financ.idFinanceiro AND baixa.unificadoReparcelado = 1 AND baixa.meioPagamento <> 17 AND NOT (baixa.meioPagamento BETWEEN 20 AND 28) AND baixa2.unificadoReparcelado = 1 AND baixa2.meioPagamento <> 17 AND NOT (baixa2.meioPagamento BETWEEN 20 AND 28) AND financ2.efetivado = 0 AND financ2.meioPagamento <> 17 AND NOT (financ2.meioPagamento BETWEEN 20 AND 28))),0) / COALESCE((SELECT COUNT(1) FROM MOFINANCEIROS financ WHERE financ.pessoa = pessoa.pessoa AND EXISTS (SELECT 1 FROM MOBAIXAXNOVOFINANCEIRO novo JOIN MOBAIXAXNOVOFINANCEIRO novo2 ON novo2.idBaixaFinanceiro = novo.idBaixaFinanceiro JOIN MOFINANCEIROXBAIXAS baixa2 ON baixa2.idBaixaFinanceiro = novo2.idBaixaFinanceiro JOIN MOFINANCEIROS financ2 ON financ2.idFinanceiro = novo2.idNovoFinanceiro WHERE novo.idNovoFinanceiro = financ.idFinanceiro AND baixa2.unificadoReparcelado = 1 AND baixa2.meioPagamento <> 17 AND NOT (baixa2.meioPagamento BETWEEN 20 AND 28) AND financ2.efetivado = 0 AND financ2.meioPagamento <> 17 AND NOT (financ2.meioPagamento BETWEEN 20 AND 28))),0)),2) END' WHERE campoComposicaoCredito = 824;
UPDATE SICAMPOSCOMPOSICAOCREDITO SET campoSelect = 'CASE WHEN COALESCE((SELECT SUM (financ.valor) FROM MOFINANCEIROS financ WHERE financ.pessoa = pessoa.pessoa AND EXISTS (SELECT 1 FROM MOBAIXAXNOVOFINANCEIRO novo JOIN MOFINANCEIROXBAIXAS baixa ON baixa.idBaixaFinanceiro = novo.idBaixaFinanceiro JOIN MOBAIXAXNOVOFINANCEIRO novo2 ON novo2.idBaixaFinanceiro = novo.idBaixaFinanceiro JOIN MOFINANCEIROXBAIXAS baixa2 ON baixa2.idBaixaFinanceiro = novo2.idBaixaFinanceiro JOIN MOFINANCEIROS financ2 ON financ2.idFinanceiro = novo2.idNovoFinanceiro WHERE novo.idNovoFinanceiro = financ.idFinanceiro AND baixa.unificadoReparcelado = 1 AND baixa.meioPagamento <> 17 AND NOT (baixa.meioPagamento BETWEEN 20 AND 28) AND baixa2.unificadoReparcelado = 1 AND baixa2.meioPagamento <> 17 AND NOT (baixa2.meioPagamento BETWEEN 20 AND 28) AND financ2.efetivado = 0 AND financ2.meioPagamento <> 17 AND NOT (financ2.meioPagamento BETWEEN 20 AND 28))),0) = 0 THEN 0 ELSE ROUND((100 * COALESCE((SELECT SUM (financ.valor - financ.saldo) FROM MOFINANCEIROS financ WHERE financ.pessoa = pessoa.pessoa AND EXISTS (SELECT 1 FROM MOBAIXAXNOVOFINANCEIRO novo JOIN MOFINANCEIROXBAIXAS baixa ON baixa.idBaixaFinanceiro = novo.idBaixaFinanceiro JOIN MOBAIXAXNOVOFINANCEIRO novo2 ON novo2.idBaixaFinanceiro = novo.idBaixaFinanceiro JOIN MOFINANCEIROXBAIXAS baixa2 ON baixa2.idBaixaFinanceiro = novo2.idBaixaFinanceiro JOIN MOFINANCEIROS financ2 ON financ2.idFinanceiro = novo2.idNovoFinanceiro WHERE novo.idNovoFinanceiro = financ.idFinanceiro AND baixa.unificadoReparcelado = 1 AND baixa.meioPagamento <> 17 AND NOT (baixa.meioPagamento BETWEEN 20 AND 28) AND baixa2.unificadoReparcelado = 1 AND baixa2.meioPagamento <> 17 AND NOT (baixa2.meioPagamento BETWEEN 20 AND 28) AND financ2.efetivado = 0 AND financ2.meioPagamento <> 17 AND NOT (financ2.meioPagamento BETWEEN 20 AND 28))),0) / COALESCE((SELECT SUM (financ.valor) FROM MOFINANCEIROS financ WHERE financ.pessoa = pessoa.pessoa AND EXISTS (SELECT 1 FROM MOBAIXAXNOVOFINANCEIRO novo JOIN MOBAIXAXNOVOFINANCEIRO novo2 ON novo2.idBaixaFinanceiro = novo.idBaixaFinanceiro JOIN MOFINANCEIROXBAIXAS baixa2 ON baixa2.idBaixaFinanceiro = novo2.idBaixaFinanceiro JOIN MOFINANCEIROS financ2 ON financ2.idFinanceiro = novo2.idNovoFinanceiro WHERE novo.idNovoFinanceiro = financ.idFinanceiro AND baixa2.unificadoReparcelado = 1 AND baixa2.meioPagamento <> 17 AND NOT (baixa2.meioPagamento BETWEEN 20 AND 28) AND financ2.efetivado = 0 AND financ2.meioPagamento <> 17 AND NOT (financ2.meioPagamento BETWEEN 20 AND 28))),0)),2) END' WHERE campoComposicaoCredito = 825;

COMMIT;

UPDATE SIVERSOESSISTEMA SET dataLiberacaoVersao = TO_DATE ('27/05/2024', 'DD/MM/YYYY'), dataAtualizacaoVersao =  SYSDATE, observacoes = 'BETA 10' WHERE idVersaoSistema = 2024001002;

COMMIT;

-- FIM BETA 10 - 27/5/24

UPDATE SIVERSOESSISTEMA SET dataLiberacaoVersao = TO_DATE ('29/05/2024', 'DD/MM/YYYY'), dataAtualizacaoVersao =  SYSDATE, observacoes = 'BETA 11' WHERE idVersaoSistema = 2024001002;

COMMIT;

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.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;
    FOR b IN (
      SELECT
        id,
        idItemContrato,
        quantidade
      FROM MOCONTRATOXORCAMENTO
      WHERE idItemOrcamento = p_item_idItemOrcamento)
    LOOP
      UPDATE MOCONTRATOXITENS c
      SET c.quantidadeSaldo = c.quantidadeSaldo + b.quantidade
      WHERE c.idItemContrato = b.idItemContrato;
      DELETE MOCONTRATOXORCAMENTO c
      WHERE c.id = b.id;
    END LOOP;
    -- 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 <> docXTransf.entradaSaidaOriginal
            OR docXTransf2.idItemOrcamento <> docXTransf.idItemOrcamento))
        AND NOT EXISTS (
          SELECT 1
          FROM MODOCUMENTOTRANSFXITENS itemTransf2
          JOIN MODOCTRANSFXORCAMENTOS docXTransf2
          ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
          WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia)
        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;
      FOR b IN (
        SELECT
          docXTransf.idItemDocTransferencia,
          cabTransf.situacaoDocTransferencia
        FROM MODOCTRANSFXORCAMENTOITEM docXTransf
        JOIN MODOCUMENTOTRANSFXITENS itemTransf
        ON itemTransf.idItemDocTransferencia = docXTransf.idItemDocTransferencia
        JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
        ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
        WHERE docXTransf.idItemOrcamento = p_item_idItemOrcamento
        AND docXTransf.entradaSaidaOriginal = 'O')
      LOOP
        ADD_DOCTRANSF_ITEM_EXCLUI (
          b.idItemDocTransferencia,
          'C', -- p_cancela_Exclui_Reabre
          b.situacaoDocTransferencia,
          0, -- p_cab_quantidadeConvertida,
          0, -- p_cab_valorProdutoServico,
          /* Retornos */
          v_auxNumber, -- r_cab_quantidadeConvertida
          v_auxNumber); -- r_cab_valorProdutoServico
      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;
    UPDATE MOORCAMENTOXNUMEROSSERIE numSer
    SET numSer.efetivado = 0
    WHERE numSer.efetivado = 1
    AND EXISTS (
      SELECT 1
      FROM MOORCAMENTOXORCAMENTO docXDoc
      WHERE docXDoc.idItemOrcamento = p_item_idItemOrcamento
      AND docXDoc.idItemOrcamentoReferenc = numSer.idItemOrcamento
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MOORCAMENTOXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemOrcamento = p_item_idItemOrcamento
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    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 MOORCAMENTOXTAREFAS b
      WHERE b.idAtividadePrevOrcamento > 0
      AND EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV c
        WHERE c.idAtividadePrevOrcamento = b.idAtividadePrevOrcamento
        AND c.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_PRE_DOC_ITEM_EXCLUI (
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_person_184_tipoEventoCancCon IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_95_etapaOrcamentoCanc IN NUMBER,
  p_config_96_etapaOrdemServCanc IN NUMBER,
  p_config_97_etapaPedCompraCanc IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_415_etapaFatContrCanc IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemPreDocumento      IN NUMBER,
  p_cancelando_Excluindo         IN CHAR,
  p_cancelandoExcluindoDocumento IN NUMBER,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_atualizaUltimaCompra     NUMBER;
  v_cab_estabelecimento          NUMBER;
  v_cab_documentoFiscal          NUMBER;
  v_cab_dataEntradaSaida         DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  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_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota NUMBER;
  v_cab_promocaoExiste           NUMBER;
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  FOR a IN (
    SELECT
      item.preDocumento,
      item.gradeProduto,
      item.cancelado,
      item.usarPrecoAVista,
      item.geraFinanceiro,
      item.controleQuantidade,
      item.loteMultiplo,
      item.quantidade,
      item.quantidadeConvertida,
      item.quantidadeDevolvidaRetornada,
      item.pesoLiquido,
      item.pesoBruto,
      item.valorProdutoServicoBruto,
      item.valorProdutoServico,
      item.valorDescontoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      item.valorFreteGeral,
      item.valorSeguroGeral,
      item.valorDescontoGeral,
      item.valorOutrasDespesasGeral,
      item.valorAdicFreteMarinhaMerGeral,
      item.valorDespesasAduaneirasGeral,
      item.valorBasePagamento,
      item.valorDescontoPagamento,
      item.valorOutrasDespesasPagamento,
      item.valorJurosPagamento,
      item.valorFreteTotal,
      item.valorSeguroTotal,
      item.valorDescontoTotal,
      item.valorOutrasDespesasTotal,
      item.valorAdicFreteMarinhaMerTotal,
      item.valorDespesasAduaneirasTotal,
      item.valorLiquidoItem,
      item.valorDescontoCustoOpItem,
      item.valorDescontoCustoOpGeral,
      item.valorDescontoCustoOpTotal,
      item.valorAcrescimoCustoOpItem,
      item.valorAcrescimoCustoOpGeral,
      item.valorAcrescimoCustoOpTotal,
      item.valorCustoOperacao,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.valorAcrescimoExtempSubtotal,
      item.valorAcrescimoExtempItem,
      item.valorAcrescimoExtempGeral,
      item.valorAcrescimoExtempTotal,
      gradProd.produto,
      prod.tipoProduto
    FROM MOPREDOCUMXITENS item
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE item.idItemPreDocumento = p_item_idItemPreDocumento)
  LOOP
    SELECT
      cab.origemDocumento,
      cab.tipoDocumento,
      cab.entradaSaida,
      cab.devolucaoAnulacaoRetorno,
      cab.atualizaCustoMedio,
      cab.atualizaUltimaCompra,
      cab.estabelecimento,
      cab.documentoFiscal,
      cab.dataEntradaSaida,
      cab.pessoa,
      cab.modalidadeFrete,
      cab.tipoPagamentoFrete,
      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,
      cab.valorDescontoCustoOpItem,
      cab.valorDescontoCustoOpGeral,
      cab.valorDescontoCustoOpTotal,
      cab.valorAcrescimoCustoOpItem,
      cab.valorAcrescimoCustoOpGeral,
      cab.valorAcrescimoCustoOpTotal,
      cab.valorCustoOperacao,
      cab.valorCMV,
      cab.quantidadeExtemporanea,
      cab.valorAcrescimoExtempSubtotal,
      cab.valorAcrescimoExtempItem,
      cab.valorAcrescimoExtempGeral,
      cab.valorAcrescimoExtempTotal
    INTO
      v_cab_origemDocumento,
      v_cab_tipoDocumento,
      v_cab_entradaSaida,
      v_cab_devolucaoAnulacaoRetorno,
      v_cab_atualizaCustoMedio,
      v_cab_atualizaUltimaCompra,
      v_cab_estabelecimento,
      v_cab_documentoFiscal,
      v_cab_dataEntradaSaida,
      v_cab_pessoa,
      v_cab_modalidadeFrete,
      v_cab_tipoPagamentoFrete,
      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_cab_valorDescontoCustoOpItem,
      v_cab_valorDescontoCustoOpGera,
      v_cab_valorDescontoCustoOpTota,
      v_cab_valorAcrescimoCustoOpIte,
      v_cab_valorAcrescimoCustoOpGer,
      v_cab_valorAcrescimoCustoOpTot,
      v_cab_valorCustoOperacao,
      v_cab_valorCMV,
      v_cab_quantidadeExtemporanea,
      v_cab_valorAcrescimoExtempSubt,
      v_cab_valorAcrescimoExtempItem,
      v_cab_valorAcrescimoExtempGera,
      v_cab_valorAcrescimoExtempTota
    FROM MOPREDOCUMENTOS cab
    WHERE cab.preDocumento = a.preDocumento;
    IF p_cancelandoExcluindoDocumento = 0
      AND a.cancelado = 0
    THEN
      SELECT COALESCE (MAX(1), 0)
      INTO v_cab_promocaoExiste
      FROM MOPREDOCUMXPROMOCOES
      WHERE preDocumento = a.preDocumento;
      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 NOT(p_person_190_modeloFrete IS NULL)
        AND p_person_190_modeloFrete <> ' '
        AND a.valorFreteTotal <> 0
        AND v_cab_valorFreteTotal - a.valorFreteTotal <= 0
      THEN
        v_cab_modalidadeFrete := '9';
      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;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      IF v_cab_valorDescontoGeral <> 0
        OR v_cab_valorOutrasDespesasGeral <> 0
        OR v_cab_valorPagamentoBruto <> 0
        OR v_cab_promocaoExiste = 1
      THEN
        ADD_PRE_DOC_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          a.preDocumento,
          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;
      UPDATE MOPREDOCUMENTOS SET
        modalidadeFrete               = v_cab_modalidadeFrete,
        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,
        valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
        valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
        valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
        valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
        valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
        valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
        valorCustoOperacao            = v_cab_valorCustoOperacao,
        valorCMV                      = v_cab_valorCMV,
        quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
        valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
        valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
        valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
        valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
      WHERE preDocumento = a.preDocumento;
    END IF;
    -- Cancela / Exclui Transferências vinculadas.
    FOR b IN (
      SELECT
        itemTransf.documentoTransferencia,
        docXTransf.entradaSaidaOriginal
      FROM MODOCTRANSFXPREDOCUM docXTransf
      JOIN MODOCUMENTOTRANSFXITENS itemTransf
      ON itemTransf.idItemDocTransferencia = docXTransf.idItemDocTransferencia
      WHERE docXTransf.idItemPreDocumento = p_item_idItemPreDocumento
      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 NOT EXISTS (
        SELECT 1
        FROM MODOCUMENTOTRANSFXITENS itemTransf2
        JOIN MODOCTRANSFXPREDOCUM docXTransf2
        ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
        WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia
        AND (docXTransf2.entradaSaidaOriginal <> 'O'
          OR docXTransf2.idItemPreDocumento <> docXTransf.idItemPreDocumento))
      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 = 'C' THEN
        ADD_DOCTRANSF_CAB_SIT_GRAVA (
          p_estabelecimentoAtivo,
          b.documentoTransferencia,
          'C',
          'Cancelamento Automático');
      END IF;
    END LOOP;
    FOR b IN (
      SELECT
        docXTransf.idItemDocTransferencia,
        cabTransf.situacaoDocTransferencia
      FROM MODOCTRANSFXPREDOCUM docXTransf
      JOIN MODOCUMENTOTRANSFXITENS itemTransf
      ON itemTransf.idItemDocTransferencia = docXTransf.idItemDocTransferencia
      JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
      ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
      WHERE docXTransf.idItemPreDocumento = p_item_idItemPreDocumento
      AND docXTransf.entradaSaidaOriginal = 'O')
    LOOP
      ADD_DOCTRANSF_ITEM_EXCLUI (
        b.idItemDocTransferencia,
        'C', -- p_cancela_Exclui_Reabre
        b.situacaoDocTransferencia,
        0, -- p_cab_quantidadeConvertida,
        0, -- p_cab_valorProdutoServico,
        /* Retornos */
        v_auxNumber, -- r_cab_quantidadeConvertida
        v_auxNumber); -- r_cab_valorProdutoServico
    END LOOP;
    IF v_cab_entradaSaida='E'
      AND v_cab_devolucaoAnulacaoRetorno = 0
      AND v_cab_atualizaUltimaCompra = 1
    THEN
      ADD_PRODUTO_CUSTO_DATA_EXCLUI (
        a.produto,
        v_cab_dataEntradaSaida);
    END IF;
    ADD_MOTIVO_PRE_DOC_ITE_EXCLUI (
      p_item_idItemPreDocumento,
      0,
      v_auxNumber);
    ADD_ESTOQUE_PRE_DOC_EXCLUI (
      p_item_idItemPreDocumento,
      '',
      v_auxVarchar);
    ADD_VALEDESCONTO_PRE_ITE_EXCL (
      p_item_idItemPreDocumento,
      '',
      v_auxVarchar);
    ADD_SEPARACAO_ITEM_PRE_EXCLUI (p_item_idItemPreDocumento);
    DELETE MOPREDOCUMXPRODUTOFILHO
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    DELETE MOPREDOCUMXPROMOCOES
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    DELETE MOINGRESSOS
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    DELETE CATABELAPRECOXFORMACOESPR
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    UPDATE MOORCAMENTOXNUMEROSSERIE numSer
    SET numSer.efetivado = 0
    WHERE numSer.efetivado = 1
    AND EXISTS (
      SELECT 1
      FROM MOPREDOCUMXORCAMENTOITEM docXDoc
      WHERE docXDoc.idItemPreDocumento = p_item_idItemPreDocumento
      AND docXDoc.idItemOrcamento = numSer.idItemOrcamento
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MOPREDOCUMXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemPreDocumento = p_item_idItemPreDocumento
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    UPDATE MOPREDOCUMXNUMEROSSERIE numSer
    SET numSer.devolvidoRetornado = 0
    WHERE numSer.devolvidoRetornado = 1
    AND EXISTS (
      SELECT 1
      FROM MOPREDOCUMXPREDOCUM docXDoc
      WHERE docXDoc.idItemPreDocumento = p_item_idItemPreDocumento
      AND docXDoc.idItemPreDocReferenciado = numSer.idItemPreDocumento
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MOPREDOCUMXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemPreDocumento = p_item_idItemPreDocumento
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    UPDATE MODOCFISCALXNUMEROSSERIE numSer
    SET numSer.devolvidoRetornado = 0
    WHERE numSer.devolvidoRetornado = 1
    AND EXISTS (
      SELECT 1
      FROM MOPREDOCUMXDOCFISCAL docXDoc
      WHERE docXDoc.idItemPreDocumento > 0
      AND docXDoc.idItemDocFiscalReferenciado = numSer.idItemDocFiscal
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MOPREDOCUMXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemPreDocumento > 0
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    FOR b IN (
      SELECT
        entrega,
        idItemOrcamento,
        quantidade
      FROM MOENTREGAS
      WHERE idItemPreDocumentoRemessa = p_item_idItemPreDocumento)
    LOOP
      ADD_ENTREGA_SITUACAO_TROCA (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        b.idItemOrcamento,
        b.entrega,
        b.quantidade,
        1, -- p_situacaoEntrega
        'ADD_PRE_DOC_ITEM_EXCLUI');
      ADD_ENTREGA_CRIA_PENDENTE (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        b.idItemOrcamento);
    END LOOP;
    FOR b IN (
      SELECT idConserto
      FROM MOCONSERTOS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      IF p_cancelando_Excluindo = 'C' THEN
        ADD_CONSERTO_CANCELA(
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_person_184_tipoEventoCancCon,
          b.idConserto);
      ELSE
        ADD_CONSERTO_EXCLUI(b.idConserto);
      END IF;
    END LOOP;
    UPDATE MOCONSERTOS SET
      idItemPreDocumentoDevolucao = 0,
      situacaoConserto = 'I'
    WHERE idItemPreDocumentoDevolucao = p_item_idItemPreDocumento;
    FOR b IN (
      SELECT
        id,
        idItemOrcamento,
        quantidade
      FROM MOPREDOCUMXORCAMENTOITEM
      WHERE idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      IF b.quantidade <> 0 THEN
        ADD_ORCAMENTO_ITEM_SALDO_VOLTA (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_person_184_tipoEventoCancCon,
          p_config_95_etapaOrcamentoCanc,
          p_config_96_etapaOrdemServCanc,
          p_config_97_etapaPedCompraCanc,
          p_config_415_etapaFatContrCanc,
          b.idItemOrcamento,
          b.quantidade);
      END IF;
      DELETE MOPREDOCUMXORCAMENTOITEM c
      WHERE c.id = b.id;
    END LOOP;
    FOR b IN (
      SELECT
        docXDoc.id,
        docXDoc.idItemPreDocReferenciado,
        docXDoc.quantidade,
        itemPre.preDocumento,
        cabPre.statusPreDocumento
      FROM MOPREDOCUMXPREDOCUM docXDoc
      JOIN MOPREDOCUMXITENS itemPre
      ON itemPre.idItemPreDocumento = docXDoc.idItemPreDocReferenciado
      JOIN MOPREDOCUMENTOS cabPre
      ON cabPre.predocumento = itemPre.preDocumento
      WHERE docXDoc.idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      IF v_cab_devolucaoAnulacaoRetorno = 1 THEN
        FOR c IN (
          SELECT
            c.entrega,
            c.idItemOrcamento,
            c.quantidade,
            c.situacaoEntrega
          FROM MOENTREGAS c
          WHERE c.idItemPreDocumentoRemessa = b.idItemPreDocReferenciado
          AND c.situacaoEntrega IN (6,7))
        LOOP
          ADD_ENTREGA_SITUACAO_TROCA (
            p_usuarioLogado,
            p_estabelecimentoAtivo,
            c.idItemOrcamento,
            c.entrega,
            c.quantidade,
            c.situacaoEntrega - 1,
            'ADD_PRE_DOC_ITEM_EXCLUI');
          ADD_ENTREGA_CRIA_PENDENTE (
            p_usuarioLogado,
            p_estabelecimentoAtivo,
            c.idItemOrcamento);
        END LOOP;
      END IF;
      IF b.quantidade <> 0 THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_devolucaoAnulacaoRetorno,
          'P',
          p_item_idItemPreDocumento,
          - b.quantidade,
          - a.quantidadeConvertida,
          'P',
          b.idItemPreDocReferenciado);
      END IF;
      IF b.statusPreDocumento = 'F' THEN
        UPDATE MOPREDOCUMENTOS c
        SET c.statusPreDocumento = 'A'
        WHERE c.preDocumento = b.preDocumento;
      END IF;
      DELETE MOPREDOCUMXPREDOCUM c
      WHERE c.id = b.id;
    END LOOP;
    DELETE MOPREDOCUMXPREDOCUM
    WHERE idItemPreDocReferenciado = p_item_idItemPreDocumento;
    FOR b IN (
      SELECT
        id,
        idItemDocFiscalReferenciado,
        quantidade
      FROM MOPREDOCUMXDOCFISCAL
      WHERE idItemPreDocumento = p_item_idItemPreDocumento)
    LOOP
      IF v_cab_devolucaoAnulacaoRetorno = 1 THEN
        FOR c IN (
          SELECT
            c.entrega,
            c.idItemOrcamento,
            c.quantidade,
            c.situacaoEntrega
          FROM MOENTREGAS c
          WHERE c.idItemDocFiscalRemessa = b.idItemDocFiscalReferenciado
          AND c.situacaoEntrega IN (6,7))
        LOOP
          ADD_ENTREGA_SITUACAO_TROCA (
            p_usuarioLogado,
            p_estabelecimentoAtivo,
            c.idItemOrcamento,
            c.entrega,
            c.quantidade,
            c.situacaoEntrega - 1,
            'ADD_PRE_DOC_ITEM_EXCLUI');
          ADD_ENTREGA_CRIA_PENDENTE (
            p_usuarioLogado,
            p_estabelecimentoAtivo,
            c.idItemOrcamento);
        END LOOP;
      END IF;
      IF b.quantidade <> 0 THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_devolucaoAnulacaoRetorno,
          'P',
          p_item_idItemPreDocumento,
          - b.quantidade,
          - a.quantidadeConvertida,
          'D',
          b.idItemDocFiscalReferenciado);
      END IF;
      DELETE MOPREDOCUMXDOCFISCAL c
      WHERE c.id = b.id;
    END LOOP;
    DELETE MODOCFISCALXPREDOCUM
    WHERE idItemPreDocReferenciado = p_item_idItemPreDocumento;
    DELETE MODOCTRANSFXPREDOCUM
    WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    IF p_cancelando_Excluindo = 'C' THEN
      UPDATE MOPREDOCUMXITENS
      SET cancelado = 1
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
    ELSE
      DELETE MOPREDOCUMXCOMPOSICOESPR
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXNUMEROSSERIE
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXNUMEROSSERIE b
      WHERE b.idEnderecoEstoquePreDocumento > 0
      AND EXISTS (
        SELECT 1
        FROM MOPREDOCUMXENDERECOESTOQ c
        WHERE c.idEnderecoEstoquePreDocumento = b.idEnderecoEstoquePreDocumento
        AND c.idItemPreDocumento = p_item_idItemPreDocumento);
      DELETE MOPREDOCUMXENDERECOESTOQ
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXEMBALAGENSTIN
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXCENTROSCUSTOS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXPROJETOS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      DELETE MODOCTROCAXITENS
      WHERE idItemPreDocumentoSaida = p_item_idItemPreDocumento;
      DELETE MOPREDOCUMXITENS
      WHERE idItemPreDocumento = p_item_idItemPreDocumento;
      IF p_cancelandoExcluindoDocumento = 0 THEN
        v_auxNumber := 0;
        FOR b IN (
          SELECT idItemPreDocumento
          FROM MOPREDOCUMXITENS b
          WHERE b.preDocumento = a.preDocumento
          AND b.idItemPreDocumento <> p_item_idItemPreDocumento
          ORDER BY b.sequencia)
        LOOP
          v_auxNumber := v_auxNumber + 1;
          UPDATE MOPREDOCUMXITENS c
          SET c.sequencia = v_auxNumber
          WHERE c.idItemPreDocumento = b.idItemPreDocumento;
        END LOOP;
      END IF;
    END IF;
  END LOOP;
END ADD_PRE_DOC_ITEM_EXCLUI;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_EXCLUI (
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_person_184_tipoEventoCancCon IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_95_etapaOrcamentoCanc IN NUMBER,
  p_config_96_etapaOrdemServCanc IN NUMBER,
  p_config_97_etapaPedCompraCanc IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_415_etapaFatContrCanc IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_cancelando_Excluindo         IN CHAR,
  p_cancelandoExcluindoDocumento IN NUMBER,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_atualizaUltimaCompra     NUMBER;
  v_cab_estabelecimento          NUMBER;
  v_cab_nfFornecedor             NUMBER;
  v_cab_documentoFiscal          NUMBER;
  v_cab_dataEntradaSaida         DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  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_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota NUMBER;
  v_cab_promocaoExiste           NUMBER;
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  FOR a IN (
    SELECT
      item.idDocumentoFiscal,
      item.gradeProduto,
      item.cancelado,
      item.usarPrecoAVista,
      item.geraFinanceiro,
      item.controleQuantidade,
      item.loteMultiplo,
      item.quantidade,
      item.quantidadeConvertida,
      item.pesoLiquido,
      item.pesoBruto,
      item.valorProdutoServicoBruto,
      item.valorProdutoServico,
      item.valorDescontoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      item.valorFreteGeral,
      item.valorSeguroGeral,
      item.valorDescontoGeral,
      item.valorOutrasDespesasGeral,
      item.valorAdicFreteMarinhaMerGeral,
      item.valorDespesasAduaneirasGeral,
      item.valorBasePagamento,
      item.valorDescontoPagamento,
      item.valorOutrasDespesasPagamento,
      item.valorJurosPagamento,
      item.valorFreteTotal,
      item.valorSeguroTotal,
      item.valorDescontoTotal,
      item.valorOutrasDespesasTotal,
      item.valorAdicFreteMarinhaMerTotal,
      item.valorDespesasAduaneirasTotal,
      item.valorLiquidoItem,
      item.valorDescontoCustoOpItem,
      item.valorDescontoCustoOpGeral,
      item.valorDescontoCustoOpTotal,
      item.valorAcrescimoCustoOpItem,
      item.valorAcrescimoCustoOpGeral,
      item.valorAcrescimoCustoOpTotal,
      item.valorCustoOperacao,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.valorAcrescimoExtempSubtotal,
      item.valorAcrescimoExtempItem,
      item.valorAcrescimoExtempGeral,
      item.valorAcrescimoExtempTotal,
      gradProd.produto,
      prod.tipoProduto
    FROM MODOCFISCALXITENS item
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE item.idItemDocFiscal = p_item_idItemDocFiscal)
  LOOP
    SELECT
      cab.origemDocumento,
      cab.tipoDocumento,
      cab.entradaSaida,
      cab.devolucaoAnulacaoRetorno,
      cab.atualizaCustoMedio,
      cab.atualizaUltimaCompra,
      cab.estabelecimento,
      cab.nfFornecedor,
      cab.documentoFiscal,
      cab.dataEntradaSaida,
      cab.pessoa,
      cab.modalidadeFrete,
      cab.tipoPagamentoFrete,
      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,
      cab.valorDescontoCustoOpItem,
      cab.valorDescontoCustoOpGeral,
      cab.valorDescontoCustoOpTotal,
      cab.valorAcrescimoCustoOpItem,
      cab.valorAcrescimoCustoOpGeral,
      cab.valorAcrescimoCustoOpTotal,
      cab.valorCustoOperacao,
      cab.valorCMV,
      cab.quantidadeExtemporanea,
      cab.valorAcrescimoExtempSubtotal,
      cab.valorAcrescimoExtempItem,
      cab.valorAcrescimoExtempGeral,
      cab.valorAcrescimoExtempTotal
    INTO
      v_cab_origemDocumento,
      v_cab_tipoDocumento,
      v_cab_entradaSaida,
      v_cab_devolucaoAnulacaoRetorno,
      v_cab_atualizaCustoMedio,
      v_cab_atualizaUltimaCompra,
      v_cab_estabelecimento,
      v_cab_nfFornecedor,
      v_cab_documentoFiscal,
      v_cab_dataEntradaSaida,
      v_cab_pessoa,
      v_cab_modalidadeFrete,
      v_cab_tipoPagamentoFrete,
      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_cab_valorDescontoCustoOpItem,
      v_cab_valorDescontoCustoOpGera,
      v_cab_valorDescontoCustoOpTota,
      v_cab_valorAcrescimoCustoOpIte,
      v_cab_valorAcrescimoCustoOpGer,
      v_cab_valorAcrescimoCustoOpTot,
      v_cab_valorCustoOperacao,
      v_cab_valorCMV,
      v_cab_quantidadeExtemporanea,
      v_cab_valorAcrescimoExtempSubt,
      v_cab_valorAcrescimoExtempItem,
      v_cab_valorAcrescimoExtempGera,
      v_cab_valorAcrescimoExtempTota
    FROM MODOCUMENTOSFISCAIS cab
    WHERE cab.idDocumentoFiscal = a.idDocumentoFiscal;
    IF p_cancelandoExcluindoDocumento = 0
      AND a.cancelado = 0
    THEN
      SELECT COALESCE (MAX(1), 0)
      INTO v_cab_promocaoExiste
      FROM MODOCFISCALXPROMOCOES
      WHERE idDocumentoFiscal = a.idDocumentoFiscal;
      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 NOT(p_person_190_modeloFrete IS NULL)
        AND p_person_190_modeloFrete <> ' '
        AND a.valorFreteTotal <> 0
        AND v_cab_valorFreteTotal - a.valorFreteTotal <= 0
      THEN
        v_cab_modalidadeFrete := '9';
      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;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      IF v_cab_valorDescontoGeral <> 0
        OR v_cab_valorOutrasDespesasGeral <> 0
        OR v_cab_valorPagamentoBruto <> 0
        OR v_cab_promocaoExiste = 1
      THEN
        ADD_DOC_FISC_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          a.idDocumentoFiscal,
          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;
      UPDATE MODOCUMENTOSFISCAIS SET
        modalidadeFrete               = v_cab_modalidadeFrete,
        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,
        valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
        valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
        valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
        valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
        valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
        valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
        valorCustoOperacao            = v_cab_valorCustoOperacao,
        valorCMV                      = v_cab_valorCMV,
        quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
        valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
        valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
        valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
        valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
      WHERE idDocumentoFiscal = a.idDocumentoFiscal;
    END IF;
    -- Cancela / Exclui Transferências vinculadas.
    FOR b IN (
      SELECT
        itemTransf.documentoTransferencia,
        docXTransf.entradaSaidaOriginal
      FROM MODOCTRANSFXDOCFISCAL docXTransf
      JOIN MODOCUMENTOTRANSFXITENS itemTransf
      ON itemTransf.idItemDocTransferencia = docXTransf.idItemDocTransferencia
      WHERE docXTransf.idItemDocFiscal = p_item_idItemDocFiscal
      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 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'
          OR docXTransf2.idItemDocFiscal <> docXTransf.idItemDocFiscal))
      GROUP BY
        itemTransf.documentoTransferencia,
        docXTransf.entradaSaidaOriginal)
    LOOP
      IF b.entradaSaidaOriginal = 'O' THEN
        ADD_DOCTRANSF_CAB_EXCLUI (b.documentoTransferencia);
      ELSIF p_cancelando_Excluindo = 'C' THEN
        ADD_DOCTRANSF_CAB_SIT_GRAVA (
          p_estabelecimentoAtivo,
          b.documentoTransferencia,
          'C',
          'Cancelamento Automático');
      END IF;
    END LOOP;
    FOR b IN (
      SELECT
        docXTransf.idItemDocTransferencia,
        cabTransf.situacaoDocTransferencia
      FROM MODOCTRANSFXDOCFISCAL docXTransf
      JOIN MODOCUMENTOTRANSFXITENS itemTransf
      ON itemTransf.idItemDocTransferencia = docXTransf.idItemDocTransferencia
      JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
      ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
      WHERE docXTransf.idItemDocFiscal = p_item_idItemDocFiscal
      AND docXTransf.entradaSaidaOriginal = 'O')
    LOOP
      ADD_DOCTRANSF_ITEM_EXCLUI (
        b.idItemDocTransferencia,
        'C', -- p_cancela_Exclui_Reabre
        b.situacaoDocTransferencia,
        0, -- p_cab_quantidadeConvertida,
        0, -- p_cab_valorProdutoServico,
        /* Retornos */
        v_auxNumber, -- r_cab_quantidadeConvertida
        v_auxNumber); -- r_cab_valorProdutoServico
    END LOOP;
    IF v_cab_entradaSaida='E'
      AND v_cab_devolucaoAnulacaoRetorno = 0
      AND v_cab_atualizaUltimaCompra = 1
    THEN
      ADD_PRODUTO_CUSTO_DATA_EXCLUI (
        a.produto,
        v_cab_dataEntradaSaida);
    END IF;
    ADD_MOTIVO_DOC_FISC_ITE_EXCLUI (
      p_item_idItemDocFiscal,
      0,
      v_auxNumber);
    ADD_ESTOQUE_DOC_FISC_EXCLUI (
      p_item_idItemDocFiscal,
      '',
      v_auxVarchar);
    ADD_VALEDESCONTO_DOC_ITE_EXCL (
      p_item_idItemDocFiscal,
      '',
      v_auxVarchar);
    ADD_SEPARACAO_ITEM_DOC_EXCLUI (p_item_idItemDocFiscal);
    DELETE MODOCFISCALXPRODUTOFILHO
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    DELETE MODOCFISCALXPROMOCOES
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    DELETE MOINGRESSOS
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    DELETE CATABELAPRECOXFORMACOESPR
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    UPDATE MOORCAMENTOXNUMEROSSERIE numSer
    SET numSer.efetivado = 0
    WHERE numSer.efetivado = 1
    AND EXISTS (
      SELECT 1
      FROM MODOCFISCALXORCAMENTOITEM docXDoc
      WHERE docXDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND docXDoc.idItemOrcamento = numSer.idItemOrcamento
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MODOCFISCALXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    UPDATE MOPREDOCUMXNUMEROSSERIE numSer
    SET numSer.devolvidoRetornado = 0
    WHERE numSer.devolvidoRetornado = 1
    AND EXISTS (
      SELECT 1
      FROM MODOCFISCALXPREDOCUM docXDoc
      WHERE docXDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND docXDoc.idItemPreDocReferenciado = numSer.idItemPreDocumento
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MODOCFISCALXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    UPDATE MODOCFISCALXNUMEROSSERIE numSer
    SET numSer.devolvidoRetornado = 0
    WHERE numSer.devolvidoRetornado = 1
    AND EXISTS (
      SELECT 1
      FROM MODOCFISCALXDOCFISCAL docXDoc
      WHERE docXDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND docXDoc.idItemDocFiscalReferenciado = numSer.idItemDocFiscal
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MODOCFISCALXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    FOR b IN (
      SELECT
        entrega,
        idItemOrcamento,
        quantidade
      FROM MOENTREGAS
      WHERE idItemDocFiscalRemessa = p_item_idItemDocFiscal)
    LOOP
      ADD_ENTREGA_SITUACAO_TROCA (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        b.idItemOrcamento,
        b.entrega,
        b.quantidade,
        1, -- p_situacaoEntrega
        'ADD_DOC_FISC_ITEM_EXCLUI');
      ADD_ENTREGA_CRIA_PENDENTE (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        b.idItemOrcamento);
    END LOOP;
    FOR b IN (
      SELECT idConserto
      FROM MOCONSERTOS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      IF p_cancelando_Excluindo = 'C' THEN
        ADD_CONSERTO_CANCELA (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_person_184_tipoEventoCancCon,
          b.idConserto);
      ELSE
        ADD_CONSERTO_EXCLUI (b.idConserto);
      END IF;
    END LOOP;
    UPDATE MOCONSERTOS SET
      idItemDocFiscalDevolucao = 0,
      situacaoConserto = 'I'
    WHERE idItemDocFiscalDevolucao = p_item_idItemDocFiscal;
    FOR b IN (
      SELECT
        id,
        idItemOrcamento,
        quantidade
      FROM MODOCFISCALXORCAMENTOITEM
      WHERE idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      IF b.quantidade <> 0 THEN
        ADD_ORCAMENTO_ITEM_SALDO_VOLTA (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_person_184_tipoEventoCancCon,
          p_config_95_etapaOrcamentoCanc,
          p_config_96_etapaOrdemServCanc,
          p_config_97_etapaPedCompraCanc,
          p_config_415_etapaFatContrCanc,
          b.idItemOrcamento,
          b.quantidade);
      END IF;
      DELETE MODOCFISCALXORCAMENTOITEM c
      WHERE c.id = b.id;
    END LOOP;
    FOR b IN (
      SELECT
        docXDoc.id,
        docXDoc.idItemPreDocReferenciado,
        docXDoc.quantidade,
        itemPre.preDocumento,
        cabPre.statusPreDocumento
      FROM MODOCFISCALXPREDOCUM docXDoc
      JOIN MOPREDOCUMXITENS itemPre
      ON itemPre.idItemPreDocumento = docXDoc.idItemPreDocReferenciado
      JOIN MOPREDOCUMENTOS cabPre
      ON cabPre.predocumento = itemPre.preDocumento
      WHERE docXDoc.idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      IF v_cab_devolucaoAnulacaoRetorno = 1 THEN
        FOR c IN (
          SELECT
            c.entrega,
            c.idItemOrcamento,
            c.quantidade,
            c.situacaoEntrega
          FROM MOENTREGAS c
          WHERE c.idItemPreDocumentoRemessa = b.idItemPreDocReferenciado
          AND c.situacaoEntrega IN (6,7))
        LOOP
          ADD_ENTREGA_SITUACAO_TROCA (
            p_usuarioLogado,
            p_estabelecimentoAtivo,
            c.idItemOrcamento,
            c.entrega,
            c.quantidade,
            c.situacaoEntrega - 1,
            'ADD_DOC_FISC_ITEM_EXCLUI');
          ADD_ENTREGA_CRIA_PENDENTE (
            p_usuarioLogado,
            p_estabelecimentoAtivo,
            c.idItemOrcamento);
        END LOOP;
      END IF;
      IF b.quantidade <> 0 THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_devolucaoAnulacaoRetorno,
          'D',
          p_item_idItemDocFiscal,
          - b.quantidade,
          - a.quantidadeConvertida,
          'P',
          b.idItemPreDocReferenciado);
      END IF;
      IF v_cab_origemDocumento IN (10,13)
        AND b.statusPreDocumento = 'F'
      THEN
        UPDATE MOPREDOCUMENTOS c
        SET c.statusPreDocumento = 'A'
        WHERE c.preDocumento = b.preDocumento;
      END IF;
      DELETE MODOCFISCALXPREDOCUM c
      WHERE c.id = b.id;
    END LOOP;
    DELETE MOPREDOCUMXDOCFISCAL
    WHERE idItemDocFiscalReferenciado = p_item_idItemDocFiscal;
    FOR b IN (
      SELECT
        id,
        idItemDocFiscalReferenciado,
        quantidade
      FROM MODOCFISCALXDOCFISCAL a
      WHERE idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      IF v_cab_devolucaoAnulacaoRetorno = 1 THEN
        FOR c IN (
          SELECT
            c.entrega,
            c.idItemOrcamento,
            c.quantidade,
            c.situacaoEntrega
          FROM MOENTREGAS c
          WHERE c.idItemDocFiscalRemessa = b.idItemDocFiscalReferenciado
          AND c.situacaoEntrega IN (6,7))
        LOOP
          ADD_ENTREGA_SITUACAO_TROCA (
            p_usuarioLogado,
            p_estabelecimentoAtivo,
            c.idItemOrcamento,
            c.entrega,
            c.quantidade,
            c.situacaoEntrega - 1,
            'ADD_DOC_FISC_ITEM_EXCLUI');
          ADD_ENTREGA_CRIA_PENDENTE (
            p_usuarioLogado,
            p_estabelecimentoAtivo,
            c.idItemOrcamento);
        END LOOP;
      END IF;
      IF b.quantidade <> 0 THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_devolucaoAnulacaoRetorno,
          'D',
          p_item_idItemDocFiscal,
          - b.quantidade,
          - a.quantidadeConvertida,
          'D',
          b.idItemDocFiscalReferenciado);
      END IF;
      DELETE MODOCFISCALXDOCFISCAL c
      WHERE c.id = b.id;
    END LOOP;
    DELETE MODOCFISCALXDOCFISCAL
    WHERE idItemDocFiscalReferenciado = p_item_idItemDocFiscal;
    DELETE MODOCTRANSFXDOCFISCAL
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    DELETE MOBALANCOXDOCFISCAL
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    UPDATE MODISTRIBUICAODFEXGRADE
    SET idItemDocFiscal = 0
    WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    IF p_cancelando_Excluindo = 'C' THEN
      UPDATE MODOCFISCALXITENS
      SET cancelado = 1
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
    ELSE
      DELETE MODOCFISCALXCOMPOSICOESPR
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXNUMEROSSERIE
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXNUMEROSSERIE b
      WHERE b.idEnderecoEstoqueDocFiscal > 0
      AND EXISTS (
        SELECT 1
        FROM MODOCFISCALXENDERECOESTOQ c
        WHERE c.idEnderecoEstoqueDocFiscal = b.idEnderecoEstoqueDocFiscal
        AND c.idItemDocFiscal = p_item_idItemDocFiscal);
      DELETE MODOCFISCALXENDERECOESTOQ
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXEMBALAGENSTIN
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXCENTROSCUSTOS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXPROJETOS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      DELETE MODOCTROCAXITENS
      WHERE idItemDocFiscalSaida = p_item_idItemDocFiscal;
      DELETE MODOCFISCALXITENS
      WHERE idItemDocFiscal = p_item_idItemDocFiscal;
      IF p_cancelandoExcluindoDocumento = 0 THEN
        v_auxNumber := 0;
        FOR b IN (
          SELECT idItemDocFiscal
          FROM MODOCFISCALXITENS b
          WHERE b.idDocumentoFiscal = a.idDocumentoFiscal
          AND b.idItemDocFiscal <> p_item_idItemDocFiscal
          ORDER BY b.sequencia)
        LOOP
          v_auxNumber := v_auxNumber + 1;
          UPDATE MODOCFISCALXITENS c
          SET c.sequencia = v_auxNumber
          WHERE c.idItemDocFiscal = b.idItemDocFiscal;
        END LOOP;
      END IF;
    END IF;
  END LOOP;
END ADD_DOC_FISC_ITEM_EXCLUI;

/

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_config_413_obs_add_marca     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, 'F' Fatura Contrato, 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_atividadeProjeto        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_item_idItemOrcamento  IN VARCHAR2,
  /* Retornos */
  r_mensagemAviso                OUT VARCHAR,
  r_calcularImpostos             OUT NUMBER,
  r_item_idItemOrcamento         OUT NUMBER,
  r_buffer_item_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_projeto                  VARCHAR2 (60);
  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_unidadeMedida           VARCHAR2(6);
  v_prod_controleEstoque         NUMBER;
  v_prod_pesoLiquido             NUMBER;
  v_prod_pesoBruto               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_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_ativ_numero                  NUMBER;
  v_ativ_quantidade              NUMBER;
  v_ativ_precoUnitarioMenor      NUMBER;
  v_ativ_precoUnitario           NUMBER;
  v_ativ_valorTotalItem          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_item_idItemOrcamento := p_buffer_item_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.projeto,
    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_projeto,
    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.unidadeMedida,
    prod.controleEstoque,
    prod.pesoLiquido,
    prod.pesoBruto,
    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_unidadeMedida,
    v_prod_controleEstoque,
    v_prod_pesoLiquido,
    v_prod_pesoBruto,
    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 / ((v_combo_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 / ((v_combo_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_cab_projeto,
        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_config_413_obs_add_marca,
        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_atividadeProjeto,
        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_item_idItemOrcamento,
        r_mensagemAviso,
        r_calcularImpostos,
        v_auxNumber, -- idItemOrcamento
        r_buffer_item_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_item_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
      SELECT COALESCE (MAX (sequencia),0) + 1
      INTO v_item_sequencia
      FROM MOORCAMENTOXITENS
      WHERE orcamento = p_item_orcamento;
      v_cab_ultimoVendedorItem := p_item_vendedor;
    END IF;
    IF v_item_cancelado = 0 THEN
      IF p_manterFinanceiro_Retotalizar <> 2 THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume + TRUNC(CASE WHEN p_item_controleQuantidade = 1 AND p_item_loteMultiplo <> 0 THEN p_item_quantidade / p_item_loteMultiplo ELSE p_item_quantidadeConvertida END,0);
        END IF;
        v_cab_pesoLiquido := v_cab_pesoLiquido + p_item_pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto + p_item_pesoBruto;
      END IF;
      v_cab_quantidade := v_cab_quantidade + p_item_quantidadeConvertida;
      IF v_prod_tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorServicos := v_cab_valorServicos + v_item_valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos + p_item_valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorProdutos := v_cab_valorProdutos + v_item_valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos + p_item_valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem + p_item_valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem + p_item_valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem + p_item_valorAdicFreteMarItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem + p_item_valorDespesasAduanItem;
      v_cab_valorFreteGeral := v_cab_valorFreteGeral + v_item_valorFreteGeral;
      v_cab_valorSeguroGeral := v_cab_valorSeguroGeral + p_item_valorSeguroGeral;
      v_cab_valorDescontoGeral := v_cab_valorDescontoGeral + v_item_valorDescontoGeral;
      v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral + p_item_valorOutrasDespesasGer;
      v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral + p_item_valorAdicFreteMarGeral;
      v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral + p_item_valorDespesasAduanGeral;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento + v_item_valorBasePagamento;
      IF p_item_usarPrecoAVista = 1
        AND v_item_geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo + v_item_valorProdutoServico - v_item_valorDescontoTotal + v_item_valorOutrasDespesasTot;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento + v_item_valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento + v_item_valorOutrasDespPagament;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento + v_item_valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal + v_item_valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal + v_item_valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal + v_item_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_item_valorOutrasDespesasTot;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal + v_item_valorAdicFreteMarTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal + v_item_valorDespesasAduanTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem + v_item_valorLiquidoItem;
    ELSE
      v_item_quantidadeSaldo := 0;
    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 = p_item_orcamento;
    IF p_item_idItemOrcamento > 0 THEN
      DELETE MOORCAMENTOXCOMPOSICOESPR compDoc
      WHERE compDoc.idItemOrcamento = p_item_idItemOrcamento
      AND EXISTS(
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.produto = comp.produto
        WHERE comp.composicaoPreco = compDoc.composicaoPreco
        AND gradProd.gradeProduto <> p_item_gradeProduto);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      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_413_obs_add_marca,
      ' ',
      0,
      'O',
      p_item_idItemOrcamento,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    MERGE INTO MOORCAMENTOXITENS a USING (
      SELECT
        r_item_idItemOrcamento         idItemOrcamento,
        p_item_orcamento               orcamento,
        v_item_sequencia               sequencia,
        v_item_cancelado               cancelado,
        p_item_pedidoCompraFornecedor  pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo sequenciaPedidoCompraFornec,
        p_item_ambiente                ambiente,
        p_item_ambienteObservacoes     ambienteObservacoes,
        p_item_modeloDocumento         modeloDocumento,
        p_item_estabelecimentoOriginal estabelecimentoOriginal,
        p_item_vendedor                vendedor,
        p_item_gradeProduto            gradeProduto,
        p_item_atividadeServico        atividadeServico,
        p_item_statusAtividadeServico  statusAtividadeServico,
        p_item_idFormulaTinta          idFormulaTinta,
        p_item_personalizacao          personalizacao,
        p_item_idLoteEstoque           idLoteEstoque,
        p_item_vinculoItemDocumento    vinculoItemDocumento,
        p_item_operacaoFiscal          operacaoFiscal,
        v_item_movimentaEstoque        movimentaEstoque,
        v_item_geraFinanceiro          geraFinanceiro,
        p_item_localEstoque            localEstoque,
        p_item_pessoaParticipante      pessoaParticipante,
        p_item_dataEntrega             dataEntrega,
        p_item_controleQuantidade      controleQuantidade,
        p_item_unidadeMedidaConversao  unidadeMedidaConversao,
        p_item_conversorQuantidade     conversorQuantidade,
        p_item_loteMinimo              loteMinimo,
        p_item_loteMultiplo            loteMultiplo,
        p_item_altura                  altura,
        p_item_largura                 largura,
        p_item_comprimento             comprimento,
        p_item_pecas                   pecas,
        p_item_quantidade              quantidade,
        p_item_quantidadeConvertida    quantidadeConvertida,
        v_item_quantidadeSaldo         quantidadeSaldo,
        p_item_controleEntrega         controleEntrega,
        p_item_pesoLiquido             pesoLiquido,
        p_item_pesoBruto               pesoBruto,
        p_item_tipoPreco               tipoPreco,
        p_item_tabelaPreco             tabelaPreco,
        p_item_precoSugestaoAPrazo     precoSugestaoAPrazo,
        p_item_precoSugestaoAVista     precoSugestaoAVista,
        p_item_precoDesconto           precoDesconto,
        p_item_precoMinimo             precoMinimo,
        p_item_usarPrecoAVista         usarPrecoAVista,
        p_item_precoUnitarioBruto      precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos acrescimoUnitarioComposicao,
        v_item_precoUnitario           precoUnitario,
        v_item_precoUnitarioConvertido precoUnitarioConvertido,
        v_item_valorProdutoServicoBrut valorProdutoServicoBruto,
        v_item_valorProdutoServico     valorProdutoServico,
        p_item_percDescontoItem        percDescontoItem,
        p_item_valorDescontoItem       valorDescontoItem,
        p_item_percAcrescimoItem       percAcrescimoItem,
        p_item_valorAcrescimoItem      valorAcrescimoItem,
        p_item_valorFreteItem          valorFreteItem,
        p_item_valorSeguroItem         valorSeguroItem,
        p_item_valorAdicFreteMarItem   valorAdicFreteMarinhaMerItem,
        p_item_valorDespesasAduanItem  valorDespesasAduaneirasItem,
        v_item_valorFreteGeral         valorFreteGeral,
        p_item_valorSeguroGeral        valorSeguroGeral,
        v_item_valorDescontoGeral      valorDescontoGeral,
        p_item_valorOutrasDespesasGer  valorOutrasDespesasGeral,
        p_item_valorAdicFreteMarGeral  valorAdicFreteMarinhaMerGeral,
        p_item_valorDespesasAduanGeral valorDespesasAduaneirasGeral,
        v_item_valorBasePagamento      valorBasePagamento,
        v_item_valorDescontoPagamento  valorDescontoPagamento,
        v_item_valorOutrasDespPagament valorOutrasDespesasPagamento,
        v_item_valorJurosPagamento     valorJurosPagamento,
        v_item_valorFreteTotal         valorFreteTotal,
        v_item_valorSeguroTotal        valorSeguroTotal,
        v_item_valorDescontoTotal      valorDescontoTotal,
        v_item_valorOutrasDespesasTot  valorOutrasDespesasTotal,
        v_item_valorAdicFreteMarTotal  valorAdicFreteMarinhaMerTotal,
        v_item_valorDespesasAduanTotal valorDespesasAduaneirasTotal,
        v_item_cfop                    cfop,
        v_item_indicadorISSQN          indicadorISSQN,
        v_item_aliquotaISSQN           aliquotaISSQN,
        v_item_retidoISSQN             retidoISSQN,
        v_item_tributadoForaMunicipio  tributadoForaMunicipio,
        v_item_incentivoFiscal         incentivoFiscal,
        v_item_listaServicos           listaServicos,
        v_item_cnae                    cnae,
        v_item_idServicoMunicipio      idServicoMunicipio,
        v_item_numeroProcessoAdministr numeroProcessoAdministrativo,
        v_item_baseISSQN               baseISSQN,
        v_item_valorISSQN              valorISSQN,
        v_item_retencaoIRRF            retencaoIRRF,
        v_item_baseRetIRRF             baseRetIRRF,
        v_item_valorRetIRRF            valorRetIRRF,
        v_item_retencaoINSS            retencaoINSS,
        v_item_baseRetINSS             baseRetINSS,
        v_item_valorRetINSS            valorRetINSS,
        v_item_retencaoPIS             retencaoPIS,
        v_item_baseRetPIS              baseRetPIS,
        v_item_valorRetPIS             valorRetPIS,
        v_item_retencaoCOFINS          retencaoCOFINS,
        v_item_baseRetCOFINS           baseRetCOFINS,
        v_item_valorRetCOFINS          valorRetCOFINS,
        v_item_retencaoCSLL            retencaoCSLL,
        v_item_baseRetCSLL             baseRetCSLL,
        v_item_valorRetCSLL            valorRetCSLL,
        v_item_retencaoOutros          retencaoOutros,
        v_item_baseRetOutros           baseRetOutros,
        v_item_valorRetOutros          valorRetOutros,
        v_item_aliquotaII              aliquotaII,
        v_item_baseII                  baseII,
        v_item_valorII                 valorII,
        v_item_aliquotaIOF             aliquotaIOF,
        v_item_baseIOF                 baseIOF,
        v_item_valorIOF                valorIOF,
        v_item_codigoEnquadramentoIPI  codigoEnquadramentoIPI,
        v_item_stIPI                   stIPI,
        v_item_aliquotaIPI             aliquotaIPI,
        v_item_valorAliquotaIPI        valorAliquotaIPI,
        v_item_baseIPI                 baseIPI,
        v_item_valorIPI                valorIPI,
        v_item_stPIS                   stPIS,
        v_item_aliquotaPIS             aliquotaPIS,
        v_item_valorAliquotaPIS        valorAliquotaPIS,
        v_item_basePIS                 basePIS,
        v_item_valorPIS                valorPIS,
        v_item_aliquotaPISST           aliquotaPISST,
        v_item_valorAliquotaPISST      valorAliquotaPISST,
        v_item_basePISST               basePISST,
        v_item_valorPISST              valorPISST,
        v_item_stCOFINS                stCOFINS,
        v_item_aliquotaCOFINS          aliquotaCOFINS,
        v_item_valorAliquotaCOFINS     valorAliquotaCOFINS,
        v_item_baseCOFINS              baseCOFINS,
        v_item_valorCOFINS             valorCOFINS,
        v_item_aliquotaCOFINSST        aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST   valorAliquotaCOFINSST,
        v_item_baseCOFINSST            baseCOFINSST,
        v_item_valorCOFINSST           valorCOFINSST,
        v_item_stSimplesNacional       stSimplesNacional,
        v_item_creditoSimplesNacional  creditoSimplesNacional,
        v_item_baseCreditoSimplesNac   baseCreditoSimplesNacional,
        v_item_valorCreditoSimplesNac  valorCreditoSimplesNacional,
        v_item_stICMS                  stICMS,
        v_item_modalBaseCalcICMS       modalidadeBaseCalcICMS,
        v_item_reducaoBaseICMS         reducaoBaseICMS,
        v_item_aliquotaICMS            aliquotaICMS,
        v_item_diferimentoICMS         diferimentoICMS,
        v_item_motivoDesoneracaoICMS   motivoDesoneracaoICMS,
        v_item_idBeneficio             idBeneficio,
        v_item_baseICMS                baseICMS,
        v_item_valorICMSOperacao       valorICMSOperacao,
        v_item_valorICMSDiferido       valorICMSDiferido,
        v_item_valorICMS               valorICMS,
        v_item_valorICMSDesoneracao    valorICMSDesoneracao,
        v_item_modalBaseCalcICMSST     modalidadeBaseCalcICMSST,
        v_item_margemValorAdicionadoST margemValorAdicionadoST,
        v_item_reducaoBaseST           reducaoBaseST,
        v_item_aliquotaICMSST          aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin aliquotaSTSuportConsFinal,
        v_item_baseICMSST              baseICMSST,
        v_item_valorICMSST             valorICMSST,
        v_item_baseICMSSTAnteriormente baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment valorICMSSTAnteriormente,
        v_item_valorICMSProprioSubstit valorICMSProprioSubstituto,
        v_item_reducaoBaseICMSEfetivo  reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo     aliquotaICMSEfetivo,
        v_item_baseICMSEfetivo         baseICMSEfetivo,
        v_item_valorICMSEfetivo        valorICMSEfetivo,
        v_item_aliquotaICMSUFDestinat  aliquotaICMSUFDestinatario,
        v_item_aliquotaICMSInterestad  aliquotaICMSInterestadual,
        v_item_partilhaICMSInterestad  partilhaICMSInterestadual,
        v_item_baseICMSUFDestinatario  baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente     baseICMSUFRemetente,
        v_item_valorICMSUFRemetente    valorICMSUFRemetente,
        v_item_aliquotaFCP             aliquotaFCP,
        v_item_baseFCP                 baseFCP,
        v_item_valorFCP                valorFCP,
        v_item_aliquotaFCPST           aliquotaFCPST,
        v_item_baseFCPST               baseFCPST,
        v_item_valorFCPST              valorFCPST,
        v_item_aliquotaFCPSTAnteriorm  aliquotaFCPSTAnteriormente,
        v_item_baseFCPSTAnteriormente  baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente valorFCPSTAnteriormente,
        v_item_aliquotaFCPUFDestinat   aliquotaFCPUFDestinatario,
        v_item_baseFCPUFDestinatario   baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario  valorFCPUFDestinatario,
        v_item_aliquotaEstImpFederais  aliquotaEstimadaImpFederais,
        v_item_aliquotaEstImpEstaduais aliquotaEstimadaImpEstaduais,
        v_item_aliquotaEstImpMunicipai aliquotaEstimadaImpMunicipais,
        v_item_baseEstimadaImpostos    baseEstimadaImpostos,
        v_item_valorEstImpFederais     valorEstimadoImpFederais,
        v_item_valorEstImpEstaduais    valorEstimadoImpEstaduais,
        v_item_valorEstImpMunicipais   valorEstimadoImpMunicipais,
        v_item_valorLiquidoItem        valorLiquidoItem,
        p_item_observacoesDigitadas    observacoesDigitadas,
        v_observacoes                  observacoes
      FROM DUAL) b
    ON (a.idItemOrcamento = b.idItemOrcamento)
    WHEN MATCHED THEN UPDATE SET
      a.orcamento                     = b.orcamento,
      a.sequencia                     = b.sequencia,
      a.cancelado                     = b.cancelado,
      a.pedidoCompraFornecedor        = b.pedidoCompraFornecedor,
      a.sequenciaPedidoCompraFornec   = b.sequenciaPedidoCompraFornec,
      a.ambiente                      = b.ambiente,
      a.ambienteObservacoes           = b.ambienteObservacoes,
      a.vendedor                      = b.vendedor,
      a.modeloDocumento               = b.modeloDocumento,
      a.estabelecimentoOriginal       = b.estabelecimentoOriginal,
      a.gradeProduto                  = b.gradeProduto,
      a.atividadeServico              = b.atividadeServico,
      a.statusAtividadeServico        = b.statusAtividadeServico,
      a.idFormulaTinta                = b.idFormulaTinta,
      a.personalizacao                = b.personalizacao,
      a.idLoteEstoque                 = b.idLoteEstoque,
      a.vinculoItemDocumento          = b.vinculoItemDocumento,
      a.operacaoFiscal                = b.operacaoFiscal,
      a.movimentaEstoque              = b.movimentaEstoque,
      a.geraFinanceiro                = b.geraFinanceiro,
      a.localEstoque                  = b.localEstoque,
      a.pessoaParticipante            = b.pessoaParticipante,
      a.dataEntrega                   = b.dataEntrega,
      a.controleQuantidade            = b.controleQuantidade,
      a.unidadeMedidaConversao        = b.unidadeMedidaConversao,
      a.conversorQuantidade           = b.conversorQuantidade,
      a.loteMinimo                    = b.loteMinimo,
      a.loteMultiplo                  = b.loteMultiplo,
      a.altura                        = b.altura,
      a.largura                       = b.largura,
      a.comprimento                   = b.comprimento,
      a.pecas                         = b.pecas,
      a.quantidade                    = b.quantidade,
      a.quantidadeConvertida          = b.quantidadeConvertida,
      a.quantidadeSaldo               = b.quantidadeSaldo,
      a.controleEntrega               = b.controleEntrega,
      a.pesoLiquido                   = b.pesoLiquido,
      a.pesoBruto                     = b.pesoBruto,
      a.tipoPreco                     = b.tipoPreco,
      a.tabelaPreco                   = b.tabelaPreco,
      a.precoSugestaoAPrazo           = b.precoSugestaoAPrazo,
      a.precoSugestaoAVista           = b.precoSugestaoAVista,
      a.precoDesconto                 = b.precoDesconto,
      a.precoMinimo                   = b.precoMinimo,
      a.usarPrecoAVista               = b.usarPrecoAVista,
      a.precoUnitarioBruto            = b.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao   = b.acrescimoUnitarioComposicao,
      a.precoUnitario                 = b.precoUnitario,
      a.precoUnitarioConvertido       = b.precounitarioConvertido,
      a.valorProdutoServicoBruto      = b.valorProdutoServicoBruto,
      a.valorProdutoServico           = b.valorProdutoServico,
      a.percDescontoItem              = b.percDescontoItem,
      a.valorDescontoItem             = b.valorDescontoItem,
      a.percAcrescimoItem             = b.percAcrescimoItem,
      a.valorAcrescimoItem            = b.valorAcrescimoItem,
      a.valorFreteItem                = b.valorFreteItem,
      a.valorSeguroItem               = b.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem  = b.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem   = b.valorDespesasAduaneirasItem,
      a.valorFreteGeral               = b.valorFreteGeral,
      a.valorSeguroGeral              = b.valorSeguroGeral,
      a.valorDescontoGeral            = b.valorDescontoGeral,
      a.valorOutrasDespesasGeral      = b.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral = b.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral  = b.valorDespesasAduaneirasGeral,
      a.valorBasePagamento            = b.valorBasePagamento,
      a.valorDescontoPagamento        = b.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento  = b.valorOutrasDespesasPagamento,
      a.valorJurosPagamento           = b.valorJurosPagamento,
      a.valorFreteTotal               = b.valorFreteTotal,
      a.valorSeguroTotal              = b.valorSeguroTotal,
      a.valorDescontoTotal            = b.valorDescontoTotal,
      a.valorOutrasDespesasTotal      = b.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal = b.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal  = b.valorDespesasAduaneirasTotal,
      a.cfop                          = b.cfop,
      a.indicadorISSQN                = b.indicadorISSQN,
      a.aliquotaISSQN                 = b.aliquotaISSQN,
      a.baseISSQN                     = b.baseISSQN,
      a.valorISSQN                    = b.valorISSQN,
      a.retidoISSQN                   = b.retidoISSQN,
      a.tributadoForaMunicipio        = b.tributadoForaMunicipio,
      a.incentivoFiscal               = b.incentivoFiscal,
      a.listaServicos                 = b.listaServicos,
      a.cnae                          = b.cnae,
      a.idServicoMunicipio            = b.idServicoMunicipio,
      a.numeroProcessoAdministrativo  = b.numeroProcessoAdministrativo,
      a.retencaoIRRF                  = b.retencaoIRRF,
      a.baseRetIRRF                   = b.baseRetIRRF,
      a.valorRetIRRF                  = b.valorRetIRRF,
      a.retencaoINSS                  = b.retencaoINSS,
      a.baseRetINSS                   = b.baseRetINSS,
      a.valorRetINSS                  = b.valorRetINSS,
      a.retencaoPIS                   = b.retencaoPIS,
      a.baseRetPIS                    = b.baseRetPIS,
      a.valorRetPIS                   = b.valorRetPIS,
      a.retencaoCOFINS                = b.retencaoCOFINS,
      a.baseRetCOFINS                 = b.baseRetCOFINS,
      a.valorRetCOFINS                = b.valorRetCOFINS,
      a.retencaoCSLL                  = b.retencaoCSLL,
      a.baseRetCSLL                   = b.baseRetCSLL,
      a.valorRetCSLL                  = b.valorRetCSLL,
      a.retencaoOutros                = b.retencaoOutros,
      a.baseRetOutros                 = b.baseRetOutros,
      a.valorRetOutros                = b.valorRetOutros,
      a.aliquotaII                    = b.aliquotaII,
      a.baseII                        = b.baseII,
      a.valorII                       = b.valorII,
      a.aliquotaIOF                   = b.aliquotaIOF,
      a.baseIOF                       = b.baseIOF,
      a.valorIOF                      = b.valorIOF,
      a.codigoEnquadramentoIPI        = b.codigoEnquadramentoIPI,
      a.stIPI                         = b.stIPI,
      a.aliquotaIPI                   = b.aliquotaIPI,
      a.valorAliquotaIPI              = b.valorAliquotaIPI,
      a.baseIPI                       = b.baseIPI,
      a.valorIPI                      = b.valorIPI,
      a.stPIS                         = b.stPIS,
      a.aliquotaPIS                   = b.aliquotaPIS,
      a.valorAliquotaPIS              = b.valorAliquotaPIS,
      a.basePIS                       = b.basePIS,
      a.valorPIS                      = b.valorPIS,
      a.aliquotaPISST                 = b.aliquotaPISST,
      a.valorAliquotaPISST            = b.valorAliquotaPISST,
      a.basePISST                     = b.basePISST,
      a.valorPISST                    = b.valorPISST,
      a.stCOFINS                      = b.stCOFINS,
      a.aliquotaCOFINS                = b.aliquotaCOFINS,
      a.valorAliquotaCOFINS           = b.valorAliquotaCOFINS,
      a.baseCOFINS                    = b.baseCOFINS,
      a.valorCOFINS                   = b.valorCOFINS,
      a.aliquotaCOFINSST              = b.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST         = b.valorAliquotaCOFINSST,
      a.baseCOFINSST                  = b.baseCOFINSST,
      a.valorCOFINSST                 = b.valorCOFINSST,
      a.stSimplesNacional             = b.stSimplesNacional,
      a.creditoSimplesNacional        = b.creditoSimplesNacional,
      a.baseCreditoSimplesNacional    = b.baseCreditoSimplesNacional,
      a.valorCreditoSimplesNacional   = b.valorCreditoSimplesNacional,
      a.stICMS                        = b.stICMS,
      a.modalidadeBaseCalcICMS        = b.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS               = b.reducaoBaseICMS,
      a.aliquotaICMS                  = b.aliquotaICMS,
      a.diferimentoICMS               = b.diferimentoICMS,
      a.motivoDesoneracaoICMS         = b.motivoDesoneracaoICMS,
      a.idBeneficio                   = b.idBeneficio,
      a.baseICMS                      = b.baseICMS,
      a.valorICMSoperacao             = b.valorICMSoperacao,
      a.valorICMSdiferido             = b.valorICMSdiferido,
      a.valorICMS                     = b.valorICMS,
      a.valorICMSdesoneracao          = b.valorICMSdesoneracao,
      a.modalidadeBaseCalcICMSST      = b.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST       = b.margemValorAdicionadoST,
      a.reducaoBaseST                 = b.reducaoBaseST,
      a.aliquotaICMSST                = b.aliquotaICMSST,
      a.aliquotaSTSuportConsFinal     = b.aliquotaSTSuportConsFinal,
      a.baseICMSST                    = b.baseICMSST,
      a.valorICMSST                   = b.valorICMSST,
      a.baseICMSSTAnteriormente       = b.baseICMSSTAnteriormente,
      a.valorICMSSTAnteriormente      = b.valorICMSSTAnteriormente,
      a.valorICMSProprioSubstituto    = b.valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo        = b.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo           = b.aliquotaICMSEfetivo,
      a.baseICMSEfetivo               = b.baseICMSEfetivo,
      a.valorICMSEfetivo              = b.valorICMSEfetivo,
      a.aliquotaICMSUFDestinatario    = b.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual     = b.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual     = b.partilhaICMSInterestadual,
      a.baseICMSUFDestinatario        = b.baseICMSUFDestinatario,
      a.valorICMSUFDestinatario       = b.valorICMSUFDestinatario,
      a.baseICMSUFRemetente           = b.baseICMSUFRemetente,
      a.valorICMSUFRemetente          = b.valorICMSUFRemetente,
      a.aliquotaFCP                   = b.aliquotaFCP,
      a.baseFCP                       = b.baseFCP,
      a.valorFCP                      = b.valorFCP,
      a.aliquotaFCPST                 = b.aliquotaFCPST,
      a.baseFCPST                     = b.baseFCPST,
      a.valorFCPST                    = b.valorFCPST,
      a.aliquotaFCPSTAnteriormente    = b.aliquotaFCPSTAnteriormente,
      a.baseFCPSTAnteriormente        = b.baseFCPSTAnteriormente,
      a.valorFCPSTAnteriormente       = b.valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario     = b.aliquotaFCPUFDestinatario,
      a.baseFCPUFDestinatario         = b.baseFCPUFDestinatario,
      a.valorFCPUFDestinatario        = b.valorFCPUFDestinatario,
      a.aliquotaestimadaimpfederais   = b.aliquotaestimadaimpfederais,
      a.aliquotaestimadaimpestaduais  = b.aliquotaestimadaimpestaduais,
      a.aliquotaestimadaimpmunicipais = b.aliquotaestimadaimpmunicipais,
      a.baseestimadaimpostos          = b.baseestimadaimpostos,
      a.valorestimadoimpfederais      = b.valorestimadoimpfederais,
      a.valorEstimadoImpEstaduais     = b.valorEstimadoImpEstaduais,
      a.valorEstimadoImpMunicipais    = b.valorEstimadoImpMunicipais,
      a.valorLiquidoItem              = b.valorLiquidoItem,
      a.observacoesDigitadas          = b.observacoesDigitadas,
      a.observacoes                   = b.observacoes
    WHEN NOT MATCHED THEN INSERT (
      idItemOrcamento,
      orcamento,
      sequencia,
      cancelado,
      pedidoCompraFornecedor,
      sequenciaPedidoCompraFornec,
      ambiente,
      ambienteObservacoes,
      modeloDocumento,
      estabelecimentoOriginal,
      vendedor,
      gradeProduto,
      atividadeServico,
      statusAtividadeServico,
      idFormulaTinta,
      personalizacao,
      idLoteEstoque,
      vinculoItemDocumento,
      operacaoFiscal,
      movimentaEstoque,
      geraFinanceiro,
      localEstoque,
      pessoaParticipante,
      dataEntrega,
      controleQuantidade,
      unidadeMedidaConversao,
      conversorQuantidade,
      loteMinimo,
      loteMultiplo,
      altura,
      largura,
      comprimento,
      pecas,
      quantidade,
      quantidadeConvertida,
      quantidadeSaldo,
      controleEntrega,
      pesoLiquido,
      pesoBruto,
      tipoPreco,
      tabelaPreco,
      precoSugestaoAPrazo,
      precoSugestaoAVista,
      precoDesconto,
      precoMinimo,
      usarPrecoAVista,
      precoUnitarioBruto,
      acrescimoUnitarioComposicao,
      precoUnitario,
      precoUnitarioConvertido,
      valorProdutoServicoBruto,
      valorProdutoServico,
      percDescontoItem,
      valorDescontoItem,
      percAcrescimoItem,
      valorAcrescimoItem,
      valorFreteItem,
      valorSeguroItem,
      valorAdicFreteMarinhaMerItem,
      valorDespesasAduaneirasItem,
      valorFreteGeral,
      valorSeguroGeral,
      valorDescontoGeral,
      valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral,
      valorDespesasAduaneirasGeral,
      valorBasePagamento,
      valorDescontoPagamento,
      valorOutrasDespesasPagamento,
      valorJurosPagamento,
      valorFreteTotal,
      valorSeguroTotal,
      valorDescontoTotal,
      valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal,
      valorDespesasAduaneirasTotal,
      cfop,
      indicadorISSQN,
      aliquotaISSQN,
      retidoISSQN,
      tributadoForaMunicipio,
      incentivoFiscal,
      listaServicos,
      cnae,
      idServicoMunicipio,
      numeroProcessoAdministrativo,
      baseISSQN,
      valorISSQN,
      retencaoIRRF,
      baseRetIRRF,
      valorRetIRRF,
      retencaoINSS,
      baseRetINSS,
      valorRetINSS,
      retencaoPIS,
      baseRetPIS,
      valorRetPIS,
      retencaoCOFINS,
      baseRetCOFINS,
      valorRetCOFINS,
      retencaoCSLL,
      baseRetCSLL,
      valorRetCSLL,
      retencaoOutros,
      baseRetOutros,
      valorRetOutros,
      aliquotaII,
      baseII,
      valorII,
      aliquotaIOF,
      baseIOF,
      valorIOF,
      codigoEnquadramentoIPI,
      stIPI,
      aliquotaIPI,
      valorAliquotaIPI,
      baseIPI,
      valorIPI,
      stPIS,
      aliquotaPIS,
      valorAliquotaPIS,
      basePIS,
      valorPIS,
      aliquotaPISST,
      valorAliquotaPISST,
      basePISST,
      valorPISST,
      stCOFINS,
      aliquotaCOFINS,
      valorAliquotaCOFINS,
      baseCOFINS,
      valorCOFINS,
      aliquotaCOFINSST,
      valorAliquotaCOFINSST,
      baseCOFINSST,
      valorCOFINSST,
      stSimplesNacional,
      creditoSimplesNacional,
      baseCreditoSimplesNacional,
      valorCreditoSimplesNacional,
      stICMS,
      modalidadeBaseCalcICMS,
      reducaoBaseICMS,
      aliquotaICMS,
      diferimentoICMS,
      motivoDesoneracaoICMS,
      idBeneficio,
      baseICMS,
      valorICMSOperacao,
      valorICMSDiferido,
      valorICMS,
      valorICMSDesoneracao,
      modalidadeBaseCalcICMSST,
      margemValorAdicionadoST,
      reducaoBaseST,
      aliquotaICMSST,
      aliquotaSTSuportConsFinal,
      baseICMSST,
      valorICMSST,
      baseICMSSTAnteriormente,
      valorICMSSTAnteriormente,
      valorICMSProprioSubstituto,
      reducaoBaseICMSEfetivo,
      aliquotaICMSEfetivo,
      baseICMSEfetivo,
      valorICMSEfetivo,
      aliquotaICMSUFDestinatario,
      aliquotaICMSInterestadual,
      partilhaICMSInterestadual,
      baseICMSUFDestinatario,
      valorICMSUFDestinatario,
      baseICMSUFRemetente,
      valorICMSUFRemetente,
      aliquotaFCP,
      baseFCP,
      valorFCP,
      aliquotaFCPST,
      baseFCPST,
      valorFCPST,
      aliquotaFCPSTAnteriormente,
      baseFCPSTAnteriormente,
      valorFCPSTAnteriormente,
      aliquotaFCPUFDestinatario,
      baseFCPUFDestinatario,
      valorFCPUFDestinatario,
      aliquotaEstimadaImpFederais,
      aliquotaEstimadaImpEstaduais,
      aliquotaEstimadaImpMunicipais,
      baseEstimadaImpostos,
      valorEstimadoImpFederais,
      valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais,
      valorLiquidoItem,
      observacoesDigitadas,
      observacoes)
    VALUES (
      b.idItemOrcamento,
      b.orcamento,
      b.sequencia,
      b.cancelado,
      b.pedidoCompraFornecedor,
      b.sequenciaPedidoCompraFornec,
      b.ambiente,
      b.ambienteObservacoes,
      b.modeloDocumento,
      b.estabelecimentoOriginal,
      b.vendedor,
      b.gradeProduto,
      b.atividadeServico,
      b.statusAtividadeServico,
      b.idFormulaTinta,
      b.personalizacao,
      b.idLoteEstoque,
      b.vinculoItemDocumento,
      b.operacaoFiscal,
      b.movimentaEstoque,
      b.geraFinanceiro,
      b.localEstoque,
      b.pessoaParticipante,
      b.dataEntrega,
      b.controleQuantidade,
      b.unidadeMedidaConversao,
      b.conversorQuantidade,
      b.loteMinimo,
      b.loteMultiplo,
      b.altura,
      b.largura,
      b.comprimento,
      b.pecas,
      b.quantidade,
      b.quantidadeConvertida,
      b.quantidadeSaldo,
      b.controleEntrega,
      b.pesoLiquido,
      b.pesoBruto,
      b.tipoPreco,
      b.tabelaPreco,
      b.precoSugestaoAPrazo,
      b.precoSugestaoAVista,
      b.precoDesconto,
      b.precoMinimo,
      b.usarPrecoAVista,
      b.precoUnitarioBruto,
      b.acrescimoUnitarioComposicao,
      b.precoUnitario,
      b.precoUnitarioConvertido,
      b.valorProdutoServicoBruto,
      b.valorProdutoServico,
      b.percDescontoItem,
      b.valorDescontoItem,
      b.percAcrescimoItem,
      b.valorAcrescimoItem,
      b.valorFreteItem,
      b.valorSeguroItem,
      b.valorAdicFreteMarinhaMerItem,
      b.valorDespesasAduaneirasItem,
      b.valorFreteGeral,
      b.valorSeguroGeral,
      b.valorDescontoGeral,
      b.valorOutrasDespesasGeral,
      b.valorAdicFreteMarinhaMerGeral,
      b.valorDespesasAduaneirasGeral,
      b.valorBasePagamento,
      b.valorDescontoPagamento,
      b.valorOutrasDespesasPagamento,
      b.valorJurosPagamento,
      b.valorFreteTotal,
      b.valorSeguroTotal,
      b.valorDescontoTotal,
      b.valorOutrasDespesasTotal,
      b.valorAdicFreteMarinhaMerTotal,
      b.valorDespesasAduaneirasTotal,
      b.cfop,
      b.indicadorISSQN,
      b.aliquotaISSQN,
      b.retidoISSQN,
      b.tributadoForaMunicipio,
      b.incentivoFiscal,
      b.listaServicos,
      b.cnae,
      b.idServicoMunicipio,
      b.numeroProcessoAdministrativo,
      b.baseISSQN,
      b.valorISSQN,
      b.retencaoIRRF,
      b.baseRetIRRF,
      b.valorRetIRRF,
      b.retencaoINSS,
      b.baseRetINSS,
      b.valorRetINSS,
      b.retencaoPIS,
      b.baseRetPIS,
      b.valorRetPIS,
      b.retencaoCOFINS,
      b.baseRetCOFINS,
      b.valorRetCOFINS,
      b.retencaoCSLL,
      b.baseRetCSLL,
      b.valorRetCSLL,
      b.retencaoOutros,
      b.baseRetOutros,
      b.valorRetOutros,
      b.aliquotaII,
      b.baseII,
      b.valorII,
      b.aliquotaIOF,
      b.baseIOF,
      b.valorIOF,
      b.codigoEnquadramentoIPI,
      b.stIPI,
      b.aliquotaIPI,
      b.valorAliquotaIPI,
      b.baseIPI,
      b.valorIPI,
      b.stPIS,
      b.aliquotaPIS,
      b.valorAliquotaPIS,
      b.basePIS,
      b.valorPIS,
      b.aliquotaPISST,
      b.valorAliquotaPISST,
      b.basePISST,
      b.valorPISST,
      b.stCOFINS,
      b.aliquotaCOFINS,
      b.valorAliquotaCOFINS,
      b.baseCOFINS,
      b.valorCOFINS,
      b.aliquotaCOFINSST,
      b.valorAliquotaCOFINSST,
      b.baseCOFINSST,
      b.valorCOFINSST,
      b.stSimplesNacional,
      b.creditoSimplesNacional,
      b.baseCreditoSimplesNacional,
      b.valorCreditoSimplesNacional,
      b.stICMS,
      b.modalidadeBaseCalcICMS,
      b.reducaoBaseICMS,
      b.aliquotaICMS,
      b.diferimentoICMS,
      b.motivoDesoneracaoICMS,
      b.idBeneficio,
      b.baseICMS,
      b.valorICMSOperacao,
      b.valorICMSDiferido,
      b.valorICMS,
      b.valorICMSDesoneracao,
      b.modalidadeBaseCalcICMSST,
      b.margemValorAdicionadoST,
      b.reducaoBaseST,
      b.aliquotaICMSST,
      b.aliquotaSTSuportConsFinal,
      b.baseICMSST,
      b.valorICMSST,
      b.baseICMSSTAnteriormente,
      b.valorICMSSTAnteriormente,
      b.valorICMSProprioSubstituto,
      b.reducaoBaseICMSEfetivo,
      b.aliquotaICMSEfetivo,
      b.baseICMSEfetivo,
      b.valorICMSEfetivo,
      b.aliquotaICMSUFDestinatario,
      b.aliquotaICMSInterestadual,
      b.partilhaICMSInterestadual,
      b.baseICMSUFDestinatario,
      b.valorICMSUFDestinatario,
      b.baseICMSUFRemetente,
      b.valorICMSUFRemetente,
      b.aliquotaFCP,
      b.baseFCP,
      b.valorFCP,
      b.aliquotaFCPST,
      b.baseFCPST,
      b.valorFCPST,
      b.aliquotaFCPSTAnteriormente,
      b.baseFCPSTAnteriormente,
      b.valorFCPSTAnteriormente,
      b.aliquotaFCPUFDestinatario,
      b.baseFCPUFDestinatario,
      b.valorFCPUFDestinatario,
      b.aliquotaEstimadaImpFederais,
      b.aliquotaEstimadaImpEstaduais,
      b.aliquotaEstimadaImpMunicipais,
      b.baseEstimadaImpostos,
      b.valorEstimadoImpFederais,
      b.valorEstimadoImpEstaduais,
      b.valorEstimadoImpMunicipais,
      b.valorLiquidoItem,
      b.observacoesDigitadas,
      b.observacoes);
    v_atualizarObservacoes := 0;
    IF p_idItemReferenciado > 0 THEN
      IF p_tipoDocumentoReferenciado = 'C' THEN
        UPDATE MOPAINELCOMPRAXGRADE
        SET idItemOrcamento = r_item_idItemOrcamento
        WHERE idGradePainelCompra = p_idItemReferenciado;
      ELSIF p_tipoDocumentoReferenciado = 'F' THEN
        ADD_ORCAMENTO_ITEM_REF_CONTR (
          p_estabelecimentoAtivo,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      ELSIF p_tipoDocumentoReferenciado = 'L' THEN
        ADD_ORCAMENTO_ITEM_LISTA_GRAVA (
          p_estabelecimentoAtivo,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      ELSIF p_tipoDocumentoReferenciado = 'O' THEN
        ADD_ORCAMENTO_ITEM_REF_ORCAMEN (
          p_estabelecimentoAtivo,
          r_item_idItemOrcamento,
          p_item_quantidade,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'T' THEN
        ADD_ORCAMENTO_ITEM_TRANS_GRAVA (
          p_estabelecimentoAtivo,
          v_cab_entradaSaida,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      END IF;
    END IF;
    IF p_tempComp_nomeTempComposicao <> ' '
      AND (p_tipoDocumentoReferenciado <> 'O'
        OR p_idItemReferenciado <= 0)
    THEN
      ADD_ORCAMENTO_ITEM_COMP_TEMP (
        p_sessaoClient,
        p_estabelecimentoAtivo,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        r_item_idItemOrcamento,
        v_atualizarObservacoes,
        v_atualizarObservacoes);
    END IF;
    v_idEnderecoEstoque := 0;
    IF p_item_idEnderecoEstoque > 0 THEN
      ADD_ORCAMENTO_ITEM_ENDER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemOrcamento,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_quantidade,
        ' ',
        v_idEnderecoEstoque);
    END IF;
    IF p_item_idNumeroSerie > 0 THEN
      ADD_ORCAMENTO_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemOrcamento,
        v_idEnderecoEstoque,
        p_item_gradeProduto,
        p_item_idNumeroSerie,
        0,
        v_auxNumber);
      v_atualizarObservacoes := 1;
    END IF;
    IF p_item_atividadeProjeto > 0 THEN
      ADD_ORCAMENTO_ITEM_PROJ_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemOrcamento,
        p_item_atividadeProjeto,
        v_auxNumber);
    END IF;
    IF v_atualizarObservacoes = 1 THEN
      v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
        p_sessaoClient,
        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_413_obs_add_marca,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        'O',
        r_item_idItemOrcamento,
        p_item_gradeProduto,
        p_item_idFormulaTinta,
        p_item_personalizacao,
        p_item_idLoteEstoque,
        p_item_controleQuantidade,
        p_item_loteMultiplo,
        p_item_altura,
        p_item_largura,
        p_item_comprimento,
        p_item_quantidade,
        p_item_observacoesDigitadas);
      UPDATE MOORCAMENTOXITENS
      SET observacoes = v_observacoes
      WHERE idItemOrcamento = r_item_idItemOrcamento;
    END IF;
    IF v_etOrc_situacaoOrcamento > 40 THEN
      ADD_ORCAMENTO_ITEM_RES_ITEM (
        r_item_idItemOrcamento,
        p_estabelecimentoAtivo,
        ' ',
        v_auxVarchar);
    END IF;
    r_buffer_item_idItemOrcamento := CASE WHEN (r_buffer_item_idItemOrcamento IS NULL OR r_buffer_item_idItemOrcamento = '' OR r_buffer_item_idItemOrcamento = ' ') THEN '' ELSE RTRIM (r_buffer_item_idItemOrcamento) || ';' END || TO_CHAR (LPAD(r_item_idItemOrcamento,14,'0'));
    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;
    IF p_item_idItemOrcamento <= 0
      AND v_item_cancelado = 0
      AND p_item_atividadeServico > 0
    THEN
      SELECT habilitaAtividadePrevista
      INTO v_auxNumber
      FROM PAATIVIDADESSERVICO
      WHERE atividadeServico = p_item_atividadeServico;
      IF v_auxNumber = 1 THEN
        ADD_ORCAMENTO_ITEM_PREV_INSERE (
          p_config_64_casasDecSaidas,
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_perfilUsuarioLogado,
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_estabelecimento,
          v_cab_pessoa,
          v_munEndEst_uf,
          v_munEndPess_uf,
          r_item_idItemOrcamento,
          p_item_atividadeServico,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_tipoPreco,
          p_item_tabelaPreco,
          v_item_precoUnitario,
          v_auxNumber);
        IF v_auxNumber = 1 THEN
          SELECT
            COUNT (1) numeroAtividades,
            SUM (
              CASE
                WHEN prev.faturarAtividade = 'P'
                THEN prev.quantidade
                ELSE COALESCE ((
                  SELECT realiz.quantidade
                  FROM MOORCAMENTOXATIVIDADEREAL realiz
                  WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
                  AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
              END) quantidade,
            MIN (prev.precoUnitario) precoUnitarioMenor,
            MAX (prev.precoUnitario) precoUnitarioMaior,
            SUM (ROUND (
              CASE
                WHEN prev.faturarAtividade = 'P'
                THEN prev.quantidade
                ELSE COALESCE ((
                  SELECT realiz.quantidade
                  FROM MOORCAMENTOXATIVIDADEREAL realiz
                  WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
                  AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
              END * prev.precoUnitario, 2)) valorTotalItem
          INTO
            v_ativ_numero,
            v_ativ_quantidade,
            v_ativ_precoUnitarioMenor,
            v_ativ_precoUnitario,
            v_ativ_valorTotalItem
          FROM MOORCAMENTOXATIVIDADEPREV prev
          WHERE prev.idItemOrcamento = r_item_idItemOrcamento
          AND prev.statusAtividadeServico <> 'C'
          AND prev.faturarAtividade IN ('P','R');
          IF v_ativ_numero > 0 THEN
            IF v_ativ_numero > 1
              AND v_ativ_precoUnitarioMenor <> v_ativ_precoUnitario
              AND v_ativ_quantidade <> 0
            THEN
              v_ativ_precoUnitario := ROUND (v_ativ_valorTotalItem / v_ativ_quantidade, TO_NUMBER (p_config_64_casasDecSaidas));
            END IF;
          ELSE
            SELECT
              COUNT (1) numeroAtividades,
              SUM (COALESCE ((
                SELECT realiz.quantidade
                FROM MOORCAMENTOXATIVIDADEREAL realiz
                WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
                AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)) quantidade
            INTO
              v_ativ_numero,
              v_ativ_quantidade
            FROM MOORCAMENTOXATIVIDADEPREV prev
            JOIN PAATIVIDADESSERVICO ativ
            ON ativ.atividadeServico = prev.atividadeServico
            JOIN CAGRADESPRODUTO gradProd
            ON gradProd.gradeProduto = ativ.gradeProduto
            JOIN CAPRODUTOS prod
            ON prod.produto = gradProd.produto
            WHERE prev.idItemOrcamento = r_item_idItemOrcamento
            AND prev.statusAtividadeServico <> 'C'
            AND ativ.gradeProduto > 0
            AND prod.unidadeMedida = v_prod_unidadeMedida;
            v_ativ_precoUnitario := 0;
          END IF;
          IF v_ativ_numero > 0
            AND (v_ativ_quantidade <> p_item_quantidade
              OR v_ativ_precoUnitario <> v_item_precoUnitario)
          THEN
            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_config_413_obs_add_marca,
              0, -- p_manterFinanceiro_Retotalizar,
              'T', -- p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
              0, -- p_buscarGeraFinanceiroEstoque,
              ' ', -- p_tipoDocumentoReferenciado, 
              0, -- p_idItemReferenciado,
              0, -- p_quantidadeReferenciada
              ' ', -- p_tempComp_nomeTempComposicao,
              0, -- p_tempComp_sequencia
              ' ', -- p_mensagemAviso,
              r_calcularImpostos,
              r_item_idItemOrcamento,
              p_item_orcamento,
              p_item_pedidoCompraFornecedor,
              p_item_sequenciaPedidoCompraFo,
              p_item_ambiente,
              p_item_ambienteObservacoes,
              p_item_vinculoItemDocumento,
              p_item_atividadeServico,
              p_item_statusAtividadeServico,
              p_item_controleEntrega,
              p_item_dataEntrega,
              p_item_modeloDocumento,
              p_item_estabelecimentoOriginal,
              p_item_vendedor,
              p_item_gradeProduto,
              p_item_idFormulaTinta,
              p_item_personalizacao,
              p_item_idLoteEstoque,
              0, -- p_item_idEnderecoEstoque
              0, -- p_item_idNumeroSerie
              0, -- p_item_atividadeProjeto,
              p_item_localEstoque,
              p_item_pessoaParticipante,
              p_item_controleQuantidade,
              p_item_unidadeMedidaConversao,
              p_item_conversorQuantidade,
              p_item_loteMinimo,
              p_item_loteMultiplo,
              p_item_altura,
              p_item_largura,
              p_item_comprimento,
              CASE p_item_controleQuantidade
                WHEN 2
                THEN CASE WHEN p_item_altura = 0 OR p_item_largura = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100))), 3) END
                WHEN 3
                THEN CASE WHEN p_item_altura = 0 OR p_item_comprimento = 0 OR p_item_comprimento = 0 THEN 0 ELSE ROUND (v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100) * p_item_comprimento), 3) END
                WHEN 4
                THEN CASE WHEN p_item_conversorQuantidade = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / p_item_conversorQuantidade), 3) END
                ELSE 0
              END, -- p_item_pecas
              v_ativ_quantidade,
              CASE p_item_controleQuantidade
                WHEN 2
                THEN ROUND (CASE WHEN p_item_altura = 0 OR p_item_largura = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100))), 3) END, v_uniMedConv_casasDecimaisUnid)
                WHEN 3
                THEN ROUND (CASE WHEN p_item_altura = 0 OR p_item_comprimento = 0 OR p_item_comprimento = 0 THEN 0 ELSE ROUND (v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100) * p_item_comprimento), 3) END, v_uniMedConv_casasDecimaisUnid)
                WHEN 4
                THEN ROUND (CASE WHEN p_item_conversorQuantidade = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / p_item_conversorQuantidade), 3) END, v_uniMedConv_casasDecimaisUnid)
                ELSE v_ativ_quantidade
              END, -- p_item_quantidadeConvertida
              ROUND ((v_ativ_quantidade * v_prod_pesoLiquido), 3), -- p_item_pesoLiquido
              ROUND ((v_ativ_quantidade * v_prod_pesoBruto), 3), -- p_item_pesoBruto
              p_item_tipoPreco,
              p_item_tabelaPreco,
              p_item_precoSugestaoAPrazo,
              p_item_precoSugestaoAVista,
              p_item_precoDesconto,
              p_item_precoMinimo,
              p_item_usarPrecoAVista,
              v_ativ_precoUnitario, -- p_item_precoUnitarioBruto
              p_item_acrescimoUnitarioCompos,
              v_ativ_precoUnitario, -- p_item_precoUnitario
              p_item_percDescontoItem,
              p_item_valorDescontoItem,
              p_item_percAcrescimoItem,
              p_item_valorAcrescimoItem,
              p_item_valorFreteItem,
              p_item_valorSeguroItem,
              p_item_valorAdicFreteMarItem,
              p_item_valorDespesasAduanItem,
              p_item_observacoesDigitadas,
              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,
              p_item_operacaoFiscal,
              v_item_movimentaEstoque,
              v_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
              0, -- p_nivel,
              ' ',
              v_auxVarchar, -- r_mensagemAviso
              r_calcularImpostos,
              v_auxNumber, -- idItemOrcamento
              v_auxVarchar, -- r_buffer_item_idItemOrcamento
              v_auxNumber); -- r_valorInserido
          END IF;
        END IF;
      END IF;
    END IF;
  END IF;
END ADD_ORCAMENTO_ITEM_GRAVA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_PREV_RECALC (
  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_config_413_obs_add_marca     IN NUMBER,
  p_idItemOrcamento              IN NUMBER)
IS
  v_calcularImpostos        NUMBER;
  v_ativ_numero             NUMBER;
  v_ativ_quantidade         NUMBER;
  v_ativ_precoUnitarioMenor NUMBER;
  v_ativ_precoUnitario      NUMBER;
  v_ativ_valorTotalItem     NUMBER;
  v_auxNumber               NUMBER;
  v_auxVarchar              VARCHAR2 (32000);
BEGIN
  v_calcularImpostos := 0;
  SELECT
    COUNT (1) numeroAtividades,
    SUM (
      CASE
        WHEN prev.faturarAtividade = 'P'
        THEN prev.quantidade
        ELSE COALESCE ((
          SELECT realiz.quantidade
          FROM MOORCAMENTOXATIVIDADEREAL realiz
          WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
          AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
      END) quantidade,
    MIN (prev.precoUnitario) precoUnitarioMenor,
    MAX (prev.precoUnitario) precoUnitarioMaior,
    SUM (ROUND (
      CASE
        WHEN prev.faturarAtividade = 'P'
        THEN prev.quantidade
        ELSE COALESCE ((
          SELECT realiz.quantidade
          FROM MOORCAMENTOXATIVIDADEREAL realiz
          WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
          AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
      END * prev.precoUnitario, 2)) valorTotalItem
  INTO
    v_ativ_numero,
    v_ativ_quantidade,
    v_ativ_precoUnitarioMenor,
    v_ativ_precoUnitario,
    v_ativ_valorTotalItem
  FROM MOORCAMENTOXATIVIDADEPREV prev
  WHERE prev.idItemOrcamento = p_idItemOrcamento
  AND prev.statusAtividadeServico <> 'C'
  AND prev.faturarAtividade IN ('P','R');
  IF v_ativ_numero > 0 THEN
    IF v_ativ_numero > 1
      AND v_ativ_precoUnitarioMenor <> v_ativ_precoUnitario
      AND v_ativ_quantidade <> 0
    THEN
      v_ativ_precoUnitario := ROUND (v_ativ_valorTotalItem / v_ativ_quantidade, TO_NUMBER (p_config_64_casasDecSaidas));
    END IF;
  ELSE
    SELECT
      COUNT (1) numeroAtividades,
      SUM (COALESCE ((
        SELECT realiz.quantidade
        FROM MOORCAMENTOXATIVIDADEREAL realiz
        WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
        AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)) quantidade
    INTO
      v_ativ_numero,
      v_ativ_quantidade
    FROM MOORCAMENTOXATIVIDADEPREV prev
    JOIN MOORCAMENTOXITENS item
    ON item.idItemOrcamento = p_idItemOrcamento
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PAATIVIDADESSERVICO ativ
    ON ativ.atividadeServico = prev.atividadeServico
    JOIN CAGRADESPRODUTO gradProdAtiv
    ON gradProdAtiv.gradeProduto = ativ.gradeProduto
    JOIN CAPRODUTOS prodAtiv
    ON prodAtiv.produto = gradProdAtiv.produto
    WHERE prev.idItemOrcamento = p_idItemOrcamento
    AND prev.statusAtividadeServico <> 'C'
    AND ativ.gradeProduto > 0
    AND prodAtiv.unidadeMedida = prod.unidadeMedida;
    v_ativ_precoUnitario := 0;
  END IF;
  IF v_ativ_numero > 0 THEN
    FOR a IN (
      SELECT
        a.orcamento,
        a.pedidoCompraFornecedor,
        a.sequenciaPedidoCompraFornec,
        a.ambiente,
        a.ambienteObservacoes,
        a.vinculoItemDocumento,
        a.atividadeServico,
        a.statusAtividadeServico,
        a.controleEntrega,
        a.dataEntrega,
        a.modeloDocumento,
        a.estabelecimentoOriginal,
        a.vendedor,
        a.gradeProduto,
        a.idFormulaTinta,
        a.personalizacao,
        a.idLoteEstoque,
        a.localEstoque,
        a.pessoaParticipante,
        a.controleQuantidade,
        a.unidadeMedidaConversao,
        a.conversorQuantidade,
        a.loteMinimo,
        a.loteMultiplo,
        a.altura,
        a.largura,
        a.comprimento,
        a.quantidade,
        a.precoUnitario,
        a.tipoPreco,
        a.tabelaPreco,
        a.precoSugestaoAPrazo,
        a.precoSugestaoAVista,
        a.precoDesconto,
        a.precoMinimo,
        a.usarPrecoAVista,
        a.acrescimoUnitarioComposicao,
        a.percDescontoItem,
        a.valorDescontoItem,
        a.percAcrescimoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.observacoesDigitadas,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.operacaoFiscal,
        a.movimentaEstoque,
        a.geraFinanceiro,
        prod.pesoLiquido prod_pesoLiquido,
        prod.pesoBruto prod_pesoBruto,
        unMedConv.casasDecimaisUnidadeMedida unMedConv_casasDecimais
      FROM MOORCAMENTOXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN SIUNIDADESMEDIDA unMedConv
      ON unMedConv.unidadeMedida = a.unidadeMedidaConversao
      WHERE a.idItemOrcamento = p_idItemOrcamento)
    LOOP   
      IF v_ativ_quantidade <> a.quantidade
        OR v_ativ_precoUnitario <> a.precoUnitario
      THEN
        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_config_413_obs_add_marca,
          0, -- p_manterFinanceiro_Retotalizar,
          'T', -- p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
          0, -- p_buscarGeraFinanceiroEstoque,
          ' ', -- p_tipoDocumentoReferenciado, 
          0, -- p_idItemReferenciado,
          0, -- p_quantidadeReferenciada
          ' ', -- p_tempComp_nomeTempComposicao,
          0, -- p_tempComp_sequencia
          ' ', -- p_mensagemAviso,
          0, -- p_calcularImpostos
          p_idItemOrcamento,
          a.orcamento,
          a.pedidoCompraFornecedor,
          a.sequenciaPedidoCompraFornec,
          a.ambiente,
          a.ambienteObservacoes,
          a.vinculoItemDocumento,
          a.atividadeServico,
          a.statusAtividadeServico,
          a.controleEntrega,
          a.dataEntrega,
          a.modeloDocumento,
          a.estabelecimentoOriginal,
          a.vendedor,
          a.gradeProduto,
          a.idFormulaTinta,
          a.personalizacao,
          a.idLoteEstoque,
          0, -- p_item_idEnderecoEstoque
          0, -- p_item_idNumeroSerie
          0, -- p_item_atividadeProjeto,
          a.localEstoque,
          a.pessoaParticipante,
          a.controleQuantidade,
          a.unidadeMedidaConversao,
          a.conversorQuantidade,
          a.loteMinimo,
          a.loteMultiplo,
          a.altura,
          a.largura,
          a.comprimento,
          CASE a.controleQuantidade
            WHEN 2
            THEN ROUND (CASE WHEN a.altura = 0 OR a.largura = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / ((a.altura / 100) * (a.largura / 100))), 3) END, 6)
            WHEN 3
            THEN ROUND (CASE WHEN a.altura = 0 OR a.comprimento = 0 OR a.comprimento = 0 THEN 0 ELSE ROUND (v_ativ_quantidade / ((a.altura / 100) * (a.largura / 100) * a.comprimento), 3) END, 6)
            WHEN 4
            THEN ROUND (CASE WHEN a.conversorQuantidade = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / a.conversorQuantidade), 3) END, 6)
            ELSE 0
          END, -- p_item_pecas
          v_ativ_quantidade,
          CASE a.controleQuantidade
            WHEN 2
            THEN ROUND (CASE WHEN a.altura = 0 OR a.largura = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / ((a.altura / 100) * (a.largura / 100))), 3) END, a.unMedConv_casasDecimais)
            WHEN 3
            THEN ROUND (CASE WHEN a.altura = 0 OR a.comprimento = 0 OR a.comprimento = 0 THEN 0 ELSE ROUND (v_ativ_quantidade / ((a.altura / 100) * (a.largura / 100) * a.comprimento), 3) END, a.unMedConv_casasDecimais)
            WHEN 4
            THEN ROUND (CASE WHEN a.conversorQuantidade = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / a.conversorQuantidade), 3) END, a.unMedConv_casasDecimais)
            ELSE v_ativ_quantidade
          END, -- p_item_quantidadeConvertida
          ROUND ((v_ativ_quantidade * a.prod_pesoLiquido), 3), -- p_item_pesoLiquido
          ROUND ((v_ativ_quantidade * a.prod_pesoBruto), 3), -- p_item_pesoBruto
          a.tipoPreco,
          a.tabelaPreco,
          a.precoSugestaoAPrazo,
          a.precoSugestaoAVista,
          a.precoDesconto,
          a.precoMinimo,
          a.usarPrecoAVista,
          v_ativ_precoUnitario, -- p_item_precoUnitarioBruto
          a.acrescimoUnitarioComposicao,
          v_ativ_precoUnitario, -- p_item_precoUnitario
          a.percDescontoItem,
          a.valorDescontoItem,
          a.percAcrescimoItem,
          a.valorAcrescimoItem,
          a.valorFreteItem,
          a.valorSeguroItem,
          a.valorAdicFreteMarinhaMerItem,
          a.valorDespesasAduaneirasItem,
          a.observacoesDigitadas,
          a.valorFreteGeral,
          a.valorSeguroGeral,
          a.valorDescontoGeral,
          a.valorOutrasDespesasGeral,
          a.valorAdicFreteMarinhaMerGeral,
          a.valorDespesasAduaneirasGeral,
          a.valorDescontoPagamento,
          a.valorOutrasDespesasPagamento,
          a.valorJurosPagamento,
          a.operacaoFiscal,
          a.movimentaEstoque,
          a.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
          0, -- p_nivel,
          ' ',
          v_auxVarchar, -- r_mensagemAviso
          v_calcularImpostos,
          v_auxNumber, -- idItemOrcamento
          v_auxVarchar, -- r_buffer_idItemOrcamento
          v_auxNumber); -- r_valorInserido
        IF v_calcularImpostos = 1 THEN
          ADD_ORCAMENTO_CALC_IMP_CAB (
            p_config_64_casasDecSaidas,
            p_config_209_filtrarGrupoEcon,
            p_config_362_calcCustoPorGrade,
            a.orcamento,
            ' ', -- p_troca_tipoPagamentoFrete,
            ' '); --p_a_cab_tipoPagamentoFrete
        END IF;
      END IF;
    END LOOP;
  END IF;
END ADD_ORCAMENTO_ITEM_PREV_RECALC;

/

INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, areaMenu, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, nomePublicoDetalhe, categoriaConfiguracao, categoriaPersonalCampo, eCard, observacoes) VALUES (956, 'Tabela Preço X Alterações Preços', 1, 1080002200, 10, 'OCU', 0, 208, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqTabPrecXAlteracoes', ' ', 0, 0, NULL, ' ');

COMMIT;

INSERT INTO SIPERSONALIZACOESCAMPOS (personalizacaoCampo, ordenacao, descricao, ativo, subcategoriaPersonalCampo, tipoCampo, mascara, exibirCampo, tipoArquivo, alteraTipoCampo, alteraExibirCampo, visivelSugestao, modificavelSugestao, obrigatorioSugestao, nomeCampoSugestao, conteudoSugestao, tabelaSistema, observacoes) VALUES (243, 80001005, 'Retirada', 1, 80001, 'D', 'DD/MM/YYYYA', 'E', 0, 0, 0, 0, 1, 0, 'Retirada', ' ', ' ', ' ');

COMMIT;

-- FIM BETA 11 - 29/5/24

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_FORMACAO (
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataPrecoInicial         IN DATE,
  p_cab_dataPrecoFinal           IN DATE,
  p_item_personalizacao          IN NUMBER,
  p_gradProd_produto             IN NUMBER,
  p_gradProd_cor                 IN NUMBER,
  p_gradProd_tamanho             IN VARCHAR,
  p_prod_controleEstoque         IN NUMBER,
  p_gerandoInventario            IN NUMBER)
  RETURN NUMBER
IS
  v_data  DATE;
  v_preco NUMBER;
BEGIN
  SELECT
    MAX (a.data),
    COALESCE (MAX (a.novoPrecoCusto), 0)
  INTO
    v_data,
    v_preco
  FROM (
    SELECT 
      ROW_NUMBER() OVER (
        ORDER BY
          data Desc,
          novoPrecoCusto Desc) ordenacao,
      data,
      novoPrecoCusto
    FROM CAPRODUTOXCUSTOS
    WHERE produto = p_gradProd_produto
    AND ativo = 1
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_cor = 0
      OR cor = p_gradProd_cor)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_tamanho = ''
      OR p_gradProd_tamanho = ' '
      OR tamanho = p_gradProd_tamanho)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_item_personalizacao = 0
      OR personalizacao = p_item_personalizacao)
    AND data >= COALESCE (TRUNC (p_cab_dataPrecoInicial), TO_DATE ('01/01/1900', 'DD/MM/YYYY'))
    AND data < TRUNC(p_cab_dataPrecoFinal) + 1) a
  WHERE a.ordenacao = 1;
  IF p_prod_controleEstoque NOT IN (3,4) THEN
    v_preco := FUNC_ADD_BUSCA_PRECO_INVENT (
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_cab_estabelecimento,
      COALESCE (v_data, COALESCE(TRUNC (p_cab_dataPrecoInicial), TO_DATE ('01/01/1900', 'DD/MM/YYYY'))),
      TRUNC(p_cab_dataPrecoFinal),
      p_item_personalizacao,
      p_gradProd_produto,
      p_gradProd_cor,
      p_gradProd_tamanho,
      v_preco,
      p_gerandoInventario,
      'F');
    IF v_preco = 0
      AND (p_cab_dataPrecoInicial IS NULL
        OR p_cab_dataPrecoInicial = TO_DATE ('01/01/1900','DD/MM/YYYY'))
    THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_PRODXEST (
        p_config_209_filtrarGrupoEcon,
        p_cab_estabelecimento,
        p_gradProd_produto,
        'P');
    END IF;
    IF v_preco = 0 THEN
      v_preco := FUNC_ADD_BUSCA_PRECO_ULT_COMPR (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_cab_estabelecimento,
        p_cab_dataPrecoInicial,
        p_cab_dataPrecoFinal,
        p_item_personalizacao,
        p_gradProd_produto,
        p_gradProd_cor,
        p_gradProd_tamanho,
        0, -- p_precoRetornar
        p_gerandoInventario);
    END IF;
  END IF;
  RETURN v_preco;
END;

/

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

/

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

/

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

/

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

/

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

/

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

/

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

/

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

/

create or replace PROCEDURE ADD_BUSCA_PRECO_GRADE_PRODUTO (
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_usuarioLogado                IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_devolucaoAnulacaoRetorno IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_cab_projeto                  IN VARCHAR,
  p_orc_pessoa                   IN NUMBER,
  p_item_modeloDocumento         IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_manterPreco                  IN NUMBER,
  p_precoSugestaoAPrazoOriginal  IN NUMBER,
  p_precoSugestaoAVistaOriginal  IN NUMBER,
  p_tipoPreco                    IN CHAR,
  p_tabelaPreco                  IN VARCHAR,
  r_tipoPreco                    OUT CHAR,
  r_tabelaPreco                  OUT VARCHAR,
  r_precoSugestaoAPrazo          OUT NUMBER,
  r_precoSugestaoAVista          OUT NUMBER,
  r_precoDesconto                OUT NUMBER,
  r_precoMinimo                  OUT NUMBER,
  r_informarPrecoManualmente     OUT NUMBER)
IS
  v_precoAPrazo         NUMBER;
  v_precoAVista         NUMBER;
  v_promocao            NUMBER;
  v_precoPromocaoAPrazo NUMBER;
  v_precoPromocaoAVista NUMBER;
  v_precoIndexadoAPrazo NUMBER;
  v_precoIndexadoAVista NUMBER;
BEGIN
  r_tipoPreco                := ' ';
  r_tabelaPreco              := ' ';
  r_precoSugestaoAPrazo      := 0;
  r_precoSugestaoAVista      := 0;
  r_precoDesconto            := 0;
  r_precoMinimo              := 0;
  r_informarPrecoManualmente := 0;
  v_precoAPrazo              := 0;
  v_precoAVista              := 0;
  v_promocao                 := 0;
  v_precoPromocaoAPrazo      := 0;
  v_precoPromocaoAVista      := 0;
  v_precoIndexadoAPrazo      := 0;
  v_precoIndexadoAVista      := 0;
  IF p_item_gradeProduto > 0 THEN
    FOR a IN (
      SELECT
        modDoc.capituloNaturezaFiscal,
        modDoc.tipoPreco,
        modDoc.tabelaPreco,
        modDoc.fatorMultiplicadorPreco,
        modDoc.tipoPrecoB,
        modDoc.tabelaPrecoB,
        modDoc.fatorMultiplicadorPrecoB,
        gradProd.produto,
        gradProd.cor,
        gradProd.tamanho,
        prod.controleEstoque,
        locEst.indicadorPropriedadePosseItem,
        COALESCE((
          SELECT MAX(munEndEst.uf)
          FROM CAENDERECOSPESSOA endEst
          JOIN SIMUNICIPIOS munEndEst
          ON munEndEst.municipio = endEst.municipio
          WHERE endEst.pessoa = est.pessoaEstabelecimento
          AND endEst.ativo = 1
          AND endEst.principal = 1),'  ') ufEstabelecimento,
        COALESCE((
          SELECT MAX(munEndPess.uf)
          FROM CAENDERECOSPESSOA endPess
          JOIN SIMUNICIPIOS munEndPess
          ON munEndPess.municipio = endPess.municipio
          WHERE endPess.pessoa = CASE WHEN p_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN p_cab_pessoa ELSE p_orc_pessoa END
          AND endPess.ativo = 1
          AND endPess.principal = 1),'  ') ufPessoa
      FROM CAGRADESPRODUTO gradProd
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN PAESTABELECIMENTOS est
      ON est.estabelecimento = p_cab_estabelecimento
      JOIN PAMODELOSDOCUMENTO modDoc
      ON modDoc.modeloDocumento = p_item_modeloDocumento
      JOIN PALOCAISESTOQUE locEst
      ON locEst.localEstoque = p_item_localEstoque
      WHERE gradProd.gradeProduto = p_item_gradeProduto)
    LOOP
      IF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'I' THEN
        r_tipoPreco := 'I';
      ELSE
        IF a.controleEstoque = 12 AND p_item_idFormulaTinta > 0 THEN
          ADD_BUSCA_PRECO_INTERNO_TINTA (
            p_config_209_filtrarGrupoEcon,
            p_config_362_calcCustoPorGrade,
            p_perfilUsuarioLogado,
            p_usuarioLogado,
            p_cab_entradaSaida,
            p_cab_devolucaoAnulacaoRetorno,
            p_cab_estabelecimento,
            NULL,
            TRUNC(SYSDATE),
            CASE WHEN p_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN p_cab_pessoa ELSE p_orc_pessoa END,
            p_cab_projeto,
            a.capituloNaturezaFiscal,
            a.ufEstabelecimento,
            a.ufPessoa,
            p_item_vendedor,
            p_item_idFormulaTinta,
            p_item_personalizacao,
            p_item_localEstoque,
            p_item_pessoaParticipante,
            p_item_quantidade,
            a.indicadorPropriedadePosseItem,
            p_manterPreco,
            CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END, --p_tipoPreco
            CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE a.tabelaPreco END, --p_tabelaPreco
            r_tabelaPreco,
            r_precoSugestaoAPrazo,
            r_precoSugestaoAVista,
            r_precoDesconto,
            r_precoMinimo,
            r_informarPrecoManualmente,
            v_precoAPrazo,
            v_precoAVista,
            v_promocao,
            v_precoPromocaoAPrazo,
            v_precoPromocaoAVista,
            v_precoIndexadoAPrazo,
            v_precoIndexadoAVista);
        ELSE
          -- A Tabela de Preço Anterior
          IF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'A' THEN
            ADD_BUSCA_PRECO_INTERNO_ANTER (
              p_perfilUsuarioLogado,
              p_usuarioLogado,
              p_cab_entradaSaida,
              p_cab_devolucaoAnulacaoRetorno,
              p_cab_estabelecimento,
              TRUNC(SYSDATE),
              CASE WHEN p_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN p_cab_pessoa ELSE p_orc_pessoa END,
              p_cab_projeto,
              a.capituloNaturezaFiscal,
              a.ufEstabelecimento,
              a.ufPessoa,
              p_item_vendedor,
              p_item_personalizacao,
              p_item_localEstoque,
              p_item_quantidade,
              a.produto,
              a.cor,
              a.tamanho,
              p_manterPreco,
              p_precoSugestaoAPrazoOriginal,
              p_precoSugestaoAVistaOriginal,
              CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE a.tabelaPreco END,
              r_tabelaPreco,
              r_precoSugestaoAPrazo,
              r_precoSugestaoAVista,
              r_precoDesconto,
              r_precoMinimo,
              r_informarPrecoManualmente,
              v_precoAPrazo,
              v_precoAVista,
              v_promocao,
              v_precoPromocaoAPrazo,
              v_precoPromocaoAVista,
              v_precoIndexadoAPrazo,
              v_precoIndexadoAVista);
          -- C Custo Médio da Venda (CMV)
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'C' AND NOT(a.controleEstoque IN (3,4)) THEN
            r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_MEDIO_FIS (
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_cab_estabelecimento,
              TRUNC(SYSDATE),
              p_item_pessoaParticipante,
              a.produto,
              a.cor,
              a.tamanho,
              a.indicadorPropriedadePosseItem,
              0); --p_gerandoInventario
          -- F Formação Preço (Custo)
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'F' THEN
            r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_FORMACAO(
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_cab_estabelecimento,
              NULL,
              TRUNC(SYSDATE),
              p_item_personalizacao,
              a.produto,
              a.cor,
              a.tamanho,
              a.controleEstoque,
              0); --p_gerandoInventario
          -- G Custo Médio da Venda Gerencial (CMV)
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'G' AND NOT(a.controleEstoque IN (3,4)) THEN
            r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_MEDIO_GER(
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_cab_estabelecimento,
              TRUNC(SYSDATE),
              p_item_personalizacao,
              p_item_pessoaParticipante,
              a.produto,
              a.cor,
              a.tamanho,
              a.indicadorPropriedadePosseItem,
              0); --p_gerandoInventario
          -- P Preço de Custo (Último Custo)
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'P' THEN
            r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_CUSTO (
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_cab_estabelecimento,
              NULL,
              TRUNC(SYSDATE),
              p_item_personalizacao,
              p_item_pessoaParticipante,
              a.produto,
              a.cor,
              a.tamanho,
              a.indicadorPropriedadePosseItem,
              0); --p_gerandoInventario
          -- R Último Preço de Reposição
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'R' THEN
            r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_COMPR (
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_cab_estabelecimento,
              NULL,
              TRUNC(SYSDATE),
              p_item_personalizacao,
              a.produto,
              a.cor,
              a.tamanho,
              2, -- p_precoRetornar
              0); -- p_gerandoInventario
          -- T Tabela de Preço
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'T' THEN
            ADD_BUSCA_PRECO_INTERNO_TABELA (
              p_perfilUsuarioLogado,
              p_usuarioLogado,
              p_cab_entradaSaida,
              p_cab_devolucaoAnulacaoRetorno,
              p_cab_estabelecimento,
              TRUNC(SYSDATE),
              CASE WHEN p_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN p_cab_pessoa ELSE p_orc_pessoa END,
              p_cab_projeto,
              a.capituloNaturezaFiscal,
              a.ufEstabelecimento,
              a.ufPessoa,
              p_item_vendedor,
              p_item_personalizacao,
              p_item_localEstoque,
              p_item_quantidade,
              a.produto,
              a.cor,
              a.tamanho,
              p_manterPreco,
              p_precoSugestaoAPrazoOriginal,
              p_precoSugestaoAVistaOriginal,
              CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE a.tabelaPreco END,
              r_tabelaPreco,
              r_precoSugestaoAPrazo,
              r_precoSugestaoAVista,
              r_precoDesconto,
              r_precoMinimo,
              r_informarPrecoManualmente,
              v_precoAPrazo,
              v_precoAVista,
              v_promocao,
              v_precoPromocaoAPrazo,
              v_precoPromocaoAVista,
              v_precoIndexadoAPrazo,
              v_precoIndexadoAVista);
          -- U Última Compra
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'U' THEN
            r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_COMPR (
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_cab_estabelecimento,
              NULL,
              TRUNC(SYSDATE),
              p_item_personalizacao,
              a.produto,
              a.cor,
              a.tamanho,
              0, -- p_precoRetornar
              0); -- p_gerandoInventario
          -- 2 Última Compra Bruto
          ELSIF CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = '2' THEN
            r_precoSugestaoAPrazo := FUNC_ADD_BUSCA_PRECO_ULT_COMPR (
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_cab_estabelecimento,
              NULL,
              TRUNC(SYSDATE),
              p_item_personalizacao,
              a.produto,
              a.cor,
              a.tamanho,
              1, -- p_precoRetornar
              0); -- p_gerandoInventario
          END IF;
          IF NOT(CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END IN ('A','T')) THEN
            r_tabelaPreco              := ' ';
            r_precoSugestaoAVista      := r_precoSugestaoAPrazo;
            r_precoDesconto            := 0;
            r_precoMinimo              := 0;
            r_informarPrecoManualmente := 0;
            v_precoAPrazo              := r_precoSugestaoAPrazo;
            v_precoAVista              := r_precoSugestaoAPrazo;
            v_promocao                 := 0;
            v_precoPromocaoAPrazo      := r_precoSugestaoAPrazo;
            v_precoPromocaoAVista      := r_precoSugestaoAPrazo;
            v_precoIndexadoAPrazo      := r_precoSugestaoAPrazo;
            v_precoIndexadoAVista      := r_precoSugestaoAPrazo;
          END IF;
          -- 3 = Combo / 4 = Kit
          IF r_tabelaPreco = ' ' AND r_precoSugestaoAPrazo = 0 AND a.controleEstoque IN (3,4) THEN
            ADD_BUSCA_PRECO_INTERNO_KIT (
              p_config_209_filtrarGrupoEcon,
              p_config_362_calcCustoPorGrade,
              p_perfilUsuarioLogado,
              p_usuarioLogado,
              p_cab_entradaSaida,
              p_cab_devolucaoAnulacaoRetorno,
              p_cab_estabelecimento,
              NULL,
              TRUNC(SYSDATE),
              CASE WHEN p_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN p_cab_pessoa ELSE p_orc_pessoa END,
              p_cab_projeto,
              a.capituloNaturezaFiscal,
              a.ufEstabelecimento,
              a.ufPessoa,
              p_item_vendedor,
              p_item_personalizacao,
              p_item_localEstoque,
              p_item_pessoaParticipante,
              p_item_quantidade,
              a.produto,
              a.indicadorPropriedadePosseItem,
              p_manterPreco,
              CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END,
              CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE a.tabelaPreco END,
              r_tabelaPreco,
              r_precoSugestaoAPrazo,
              r_precoSugestaoAVista,
              r_precoDesconto,
              r_precoMinimo,
              r_informarPrecoManualmente,
              v_precoAPrazo,
              v_precoAVista,
              v_promocao,
              v_precoPromocaoAPrazo,
              v_precoPromocaoAVista,
              v_precoIndexadoAPrazo,
              v_precoIndexadoAVista);
          END IF;
        END IF;
        -- Se encontrou preço
        IF r_tabelaPreco <> ' ' OR r_precoSugestaoAPrazo <> 0 OR r_precoSugestaoAVista <> 0 OR r_precoDesconto <> 0 OR r_precoMinimo <> 0 OR r_informarPrecoManualmente <> 0 OR v_precoAPrazo <> 0 OR v_precoAVista <> 0 OR v_precoPromocaoAPrazo <> 0 OR v_precoPromocaoAVista <> 0 OR v_precoIndexadoAPrazo <> 0 OR v_precoIndexadoAVista <> 0 OR CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END = 'I' THEN
          r_tipoPreco := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco ELSE a.tipoPreco END;
          IF NOT (a.fatorMultiplicadorPreco IN (0,1)) AND (p_manterPreco = 0 OR p_tipoPreco = a.tipoPreco AND p_tabelaPreco = a.tabelaPreco) THEN
            r_precoSugestaoAPrazo := r_precoSugestaoAPrazo * a.fatorMultiplicadorPreco;
            r_precoSugestaoAVista := r_precoSugestaoAVista * a.fatorMultiplicadorPreco;
            r_precoDesconto       := r_precoDesconto       * a.fatorMultiplicadorPreco;
            r_precoMinimo         := r_precoMinimo         * a.fatorMultiplicadorPreco;
            v_precoAPrazo         := v_precoAPrazo         * a.fatorMultiplicadorPreco;
            v_precoAVista         := v_precoAVista         * a.fatorMultiplicadorPreco;
            v_precoPromocaoAPrazo := v_precoPromocaoAPrazo * a.fatorMultiplicadorPreco;
            v_precoPromocaoAVista := v_precoPromocaoAVista * a.fatorMultiplicadorPreco;
            v_precoIndexadoAPrazo := v_precoIndexadoAPrazo * a.fatorMultiplicadorPreco;
            v_precoIndexadoAVista := v_precoIndexadoAVista * a.fatorMultiplicadorPreco;
          END IF;
        -- Se não encontrou preço, não mantém o atual e existe regra de preço B
        ELSIF p_manterPreco = 0 AND a.tipoPrecoB <> ' ' THEN
          ADD_BUSCA_PRECO (
            p_config_64_casasDecSaidas,
            p_config_65_casasDecEntrada,
            p_config_209_filtrarGrupoEcon,
            p_config_362_calcCustoPorGrade,
            p_perfilUsuarioLogado,
            p_usuarioLogado,
            p_cab_entradaSaida,
            p_cab_devolucaoAnulacaoRetorno,
            p_cab_estabelecimento,
            NULL,
            TRUNC(SYSDATE),
            CASE WHEN p_orc_pessoa = 0 OR p_config_227_manterPessoaOrcam = 0 THEN p_cab_pessoa ELSE p_orc_pessoa END,
            p_cab_projeto,
            a.capituloNaturezaFiscal,
            a.tipoPrecoB,
            a.tabelaPrecoB,
            a.fatorMultiplicadorPrecoB,
            ' ', --a.tipoPrecoB
            ' ', --a.tabelaPrecoB
            0, --a.fatorMultiplicadorPrecoB
            a.ufEstabelecimento,
            a.ufPessoa,
            p_item_vendedor,
            p_item_idFormulaTinta,
            p_item_personalizacao,
            p_item_localEstoque,
            p_item_pessoaParticipante,
            p_item_quantidade,
            a.produto,
            a.cor,
            a.tamanho,
            a.controleEstoque,
            a.indicadorPropriedadePosseItem,
            0, --p_manterPreco
            p_precoSugestaoAPrazoOriginal,
            p_precoSugestaoAVistaOriginal,
            a.tipoPrecoB,
            a.tabelaPrecoB,
            r_tipoPreco,
            r_tabelaPreco,
            r_precoSugestaoAPrazo,
            r_precoSugestaoAVista,
            r_precoDesconto,
            r_precoMinimo,
            r_informarPrecoManualmente,
            v_precoAPrazo,
            v_precoAVista,
            v_promocao,
            v_precoPromocaoAPrazo,
            v_precoPromocaoAVista,
            v_precoIndexadoAPrazo,
            v_precoIndexadoAVista);
          -- Se não encontrou preço B, devolve tipo preço e tabela atual
          IF r_precoSugestaoAPrazo = 0 AND r_precoSugestaoAVista = 0 AND r_precoDesconto = 0 AND r_precoMinimo = 0 AND r_informarPrecoManualmente = 0 AND v_precoAPrazo = 0 AND v_precoAVista = 0 AND v_precoPromocaoAPrazo = 0 AND v_precoPromocaoAVista = 0 AND v_precoIndexadoAPrazo = 0 AND v_precoIndexadoAVista = 0 AND a.tipoPrecoB <> 'I' THEN
            r_tipoPreco   := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco   ELSE a.tipoPreco   END;
            r_tabelaPreco := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE a.tabelaPreco END;
          END IF;
        -- Se não encontrou e não usa regra B, devolve tipo preço e tabela atual
        ELSE
          r_tipoPreco   := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tipoPreco   ELSE a.tipoPreco   END;
          r_tabelaPreco := CASE WHEN p_manterPreco = 1 AND p_tipoPreco <> ' ' THEN p_tabelaPreco ELSE a.tabelaPreco END;
        END IF;
        -- Efetua arredondamento de preço
        r_precoSugestaoAPrazo := ROUND (r_precoSugestaoAPrazo, TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
        r_precoSugestaoAVista := ROUND (r_precoSugestaoAVista, TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
        r_precoDesconto       := ROUND (r_precoDesconto      , TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
        r_precoMinimo         := ROUND (r_precoMinimo        , TO_NUMBER(CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN p_config_64_casasDecSaidas ELSE p_config_65_casasDecEntrada END));
      END IF;
    END LOOP;
  END IF;
END ADD_BUSCA_PRECO_GRADE_PRODUTO;

/

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

/

create or replace PROCEDURE ADD_BUSCA_ICMS_ST_ANTERIOR (
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEntradaSaida         IN DATE,
  p_item_personalizacao          IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_calcularICMSSTAnterEfetivo   IN NUMBER,
  p_calcularFCP                  IN NUMBER,
  p_gradProd_produto             IN NUMBER,
  p_gradProd_cor                 IN NUMBER,
  p_gradProd_tamanho             IN VARCHAR,
  p_prod_controleEstoque         IN NUMBER,
  /* Retornos */
  r_item_baseICMSSTAnteriormente OUT NUMBER,
  r_item_valorICMSSTAnteriorment OUT NUMBER,
  r_item_valorICMSProprioSubstit OUT NUMBER,
  r_item_baseFCPSTAnteriormente  OUT NUMBER,
  r_item_valorFCPSTAnteriormente OUT NUMBER)
IS
  v_contaGradesProduto       NUMBER;
  v_gradeProduto             NUMBER;
  v_quantidade               NUMBER;
  v_baseICMSST               NUMBER;
  v_valorICMSST              NUMBER;
  v_baseICMSSTEscrituracao   NUMBER;
  v_valorICMSSTEscrituracao  NUMBER;
  v_baseICMSSTAnteriormente  NUMBER;
  v_valorICMSSTAnteriormente NUMBER;
  v_valorICMS                NUMBER;
  v_baseFCPST                NUMBER;
  v_valorFCPST               NUMBER;
  v_ufOrigDest_aliquotaIcms  NUMBER;
BEGIN
  r_item_baseICMSSTAnteriormente := 0;
  r_item_valorICMSSTAnteriorment := 0;
  r_item_valorICMSProprioSubstit := 0;
  r_item_baseFCPSTAnteriormente  := 0;
  r_item_valorFCPSTAnteriormente := 0;
  v_contaGradesProduto           := 0;
  v_gradeProduto                 := 0;
  v_quantidade                   := 0;
  v_baseICMSST                   := 0;
  v_valorICMSST                  := 0;
  v_baseICMSSTEscrituracao       := 0;
  v_valorICMSSTEscrituracao      := 0;
  v_baseICMSSTAnteriormente      := 0;
  v_valorICMSSTAnteriormente     := 0;
  v_valorICMS                    := 0;
  v_baseFCPST                    := 0;
  v_valorFCPST                   := 0;
  v_ufOrigDest_aliquotaIcms      := 0;
  SELECT
    COALESCE (MAX(gradeProduto), 0),
    COALESCE (COUNT (1), 0)
  INTO
    v_gradeProduto,
    v_contaGradesProduto
  FROM CAGRADESPRODUTO
  WHERE produto = p_gradProd_produto
  AND (p_config_362_calcCustoPorGrade = 0
    OR p_gradProd_cor = 0
    OR cor = p_gradProd_cor)
  AND (p_config_362_calcCustoPorGrade = 0
    OR p_gradProd_tamanho = ''
    OR p_gradProd_tamanho = ' '
    OR tamanho = p_gradProd_tamanho);
  IF v_contaGradesProduto = 1 THEN
    WITH ESTABELECIMENTOS AS (
      SELECT DISTINCT a.estabelecimento
      FROM (
        SELECT est.estabelecimento
        FROM PAESTABELECIMENTOS est
        WHERE est.estabelecimento = p_cab_estabelecimento
        UNION ALL
        SELECT est2.estabelecimento
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND est2.ativo = 1
        UNION ALL
        SELECT est2.estabelecimento
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE p_config_209_filtrarGrupoEcon = 1
        AND est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.ativo = 1) a)
    SELECT
      COALESCE(MAX(a.quantidade),0),
      COALESCE(MAX(a.baseICMSST),0),
      COALESCE(MAX(a.valorICMSST),0),
      COALESCE(MAX(a.baseICMSSTEscrituracao),0),
      COALESCE(MAX(a.valorICMSSTEscrituracao),0),
      COALESCE(MAX(a.baseICMSSTAnteriormente),0),
      COALESCE(MAX(a.valorICMSSTAnteriormente),0),
      COALESCE(MAX(a.valorICMS),0),
      COALESCE(MAX(a.baseFCPST),0),
      COALESCE(MAX(a.valorFCPST),0)
    INTO
      v_quantidade,
      v_baseICMSST,
      v_valorICMSST,
      v_baseICMSSTEscrituracao,
      v_valorICMSSTEscrituracao,
      v_baseICMSSTAnteriormente,
      v_valorICMSSTAnteriormente,
      v_valorICMS,
      v_baseFCPST,
      v_valorFCPST
    FROM (
      SELECT
        ROW_NUMBER() OVER (ORDER BY cab.dataEntradaSaida DESC) ordenacao,
        item.quantidade,
        item.baseICMSST,
        item.valorICMSST,
        item.baseICMSSTEscrituracao,
        item.valorICMSSTEscrituracao,
        item.baseICMSSTAnteriormente,
        item.valorICMSSTAnteriormente,
        item.valorICMS,
        item.baseFCPST,
        item.valorFCPST
      FROM MODOCFISCALXITENS item
      JOIN MODOCUMENTOSFISCAIS cab
      ON cab.idDocumentoFiscal = item.idDocumentoFiscal
      JOIN ESTABELECIMENTOS est
      ON est.estabelecimento = cab.estabelecimento
      WHERE item.gradeProduto = v_gradeProduto
      AND item.cancelado = 0
      AND item.quantidade > 0
      AND (item.baseICMSSTEscrituracao > 0
        AND item.valorICMSSTEscrituracao > 0
        OR item.baseICMSST > 0
        AND item.valorICMSST > 0
        OR item.baseICMSSTAnteriormente > 0
        AND item.valorICMSSTAnteriormente > 0
        OR item.valorICMS > 0)
      AND cab.entradaSaida = 'E'
      AND cab.nfFornecedor = 1
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida < TRUNC (CASE WHEN p_cab_dataEntradaSaida IS NULL THEN SYSDATE ELSE p_cab_dataEntradaSaida END) + 1) a
    WHERE a.ordenacao = 1;
  ELSIF v_contaGradesProduto > 1 THEN
    WITH ESTABELECIMENTOS AS (
      SELECT DISTINCT a.estabelecimento
      FROM (
        SELECT est.estabelecimento
        FROM PAESTABELECIMENTOS est
        WHERE est.estabelecimento = p_cab_estabelecimento
        UNION ALL
        SELECT est2.estabelecimento
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND est2.ativo = 1
        UNION ALL
        SELECT est2.estabelecimento
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst
        ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2
        ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2
        ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE p_config_209_filtrarGrupoEcon = 1
        AND est.estabelecimento = p_cab_estabelecimento
        AND est.pessoaEstabelecimento > 0
        AND pessEst.grupoEconomico > 0
        AND est2.ativo = 1) a)
    SELECT
      COALESCE(MAX(a.quantidade),0),
      COALESCE(MAX(a.baseICMSST),0),
      COALESCE(MAX(a.valorICMSST),0),
      COALESCE(MAX(a.baseICMSSTEscrituracao),0),
      COALESCE(MAX(a.valorICMSSTEscrituracao),0),
      COALESCE(MAX(a.baseICMSSTAnteriormente),0),
      COALESCE(MAX(a.valorICMSSTAnteriormente),0),
      COALESCE(MAX(a.valorICMS),0),
      COALESCE(MAX(a.baseFCPST),0),
      COALESCE(MAX(a.valorFCPST),0)
    INTO
      v_quantidade,
      v_baseICMSST,
      v_valorICMSST,
      v_baseICMSSTEscrituracao,
      v_valorICMSSTEscrituracao,
      v_baseICMSSTAnteriormente,
      v_valorICMSSTAnteriormente,
      v_valorICMS,
      v_baseFCPST,
      v_valorFCPST
    FROM (
      SELECT
        ROW_NUMBER() OVER (ORDER BY cab.dataEntradaSaida DESC) ordenacao,
        item.quantidade,
        item.baseICMSST,
        item.valorICMSST,
        item.baseICMSSTEscrituracao,
        item.valorICMSSTEscrituracao,
        item.baseICMSSTAnteriormente,
        item.valorICMSSTAnteriormente,
        item.valorICMS,
        item.baseFCPST,
        item.valorFCPST
      FROM MODOCFISCALXITENS item
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = item.gradeProduto
      JOIN MODOCUMENTOSFISCAIS cab
      ON cab.idDocumentoFiscal = item.idDocumentoFiscal
      JOIN ESTABELECIMENTOS est
      ON est.estabelecimento = cab.estabelecimento
      WHERE item.cancelado = 0
      AND item.quantidade > 0
      AND (item.baseICMSSTEscrituracao > 0
        AND item.valorICMSSTEscrituracao > 0
        OR item.baseICMSST > 0
        AND item.valorICMSST > 0
        OR item.baseICMSSTAnteriormente > 0
        AND item.valorICMSSTAnteriormente > 0
        OR item.valorICMS > 0)
      AND gradProd.produto = p_gradProd_produto
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gradProd_cor = 0
        OR gradProd.cor = p_gradProd_cor)
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gradProd_tamanho = ''
        OR p_gradProd_tamanho = ' '
        OR gradProd.tamanho = p_gradProd_tamanho)
      AND cab.entradaSaida = 'E'
      AND cab.nfFornecedor = 1
      AND cab.devolucaoAnulacaoRetorno = 0
      AND cab.atualizaUltimaCompra = 1
      AND cab.dataEntradaSaida < TRUNC (CASE WHEN p_cab_dataEntradaSaida IS NULL THEN SYSDATE ELSE p_cab_dataEntradaSaida END) + 1) a
    WHERE a.ordenacao = 1;
  END IF;
  IF p_calcularICMSSTAnterEfetivo = 1 AND v_quantidade > 0 THEN
    IF v_baseICMSSTEscrituracao > 0 AND v_valorICMSSTEscrituracao > 0 THEN
      r_item_baseICMSSTAnteriormente := ROUND ((v_baseICMSSTEscrituracao * p_item_quantidade / v_quantidade), 2);
      r_item_valorICMSSTAnteriorment := ROUND ((v_valorICMSSTEscrituracao * p_item_quantidade / v_quantidade), 2);
    ELSIF v_baseICMSST > 0 AND v_valorICMSST > 0 THEN
      r_item_baseICMSSTAnteriormente := ROUND ((v_baseICMSST * p_item_quantidade / v_quantidade), 2);
      r_item_valorICMSSTAnteriorment := ROUND ((v_valorICMSST * p_item_quantidade / v_quantidade), 2);
    ELSE
      r_item_baseICMSSTAnteriormente := ROUND ((v_baseICMSSTAnteriormente * p_item_quantidade / v_quantidade), 2);
      r_item_valorICMSSTAnteriorment := ROUND ((v_valorICMSSTAnteriormente * p_item_quantidade / v_quantidade), 2);
    END IF;
    r_item_valorICMSProprioSubstit := ROUND ((v_valorICMS * p_item_quantidade / v_quantidade), 2);
  END IF;
  IF p_calcularFCP = 1 AND v_quantidade > 0 THEN
    r_item_baseFCPSTAnteriormente := ROUND ((v_baseFCPST * p_item_quantidade / v_quantidade), 2);
    r_item_valorFCPSTAnteriormente := ROUND ((v_valorFCPST * p_item_quantidade / v_quantidade), 2);
  END IF;
  IF p_calcularICMSSTAnterEfetivo = 1 AND r_item_baseICMSSTAnteriormente = 0 AND r_item_valorICMSSTAnteriorment = 0 AND r_item_valorICMSProprioSubstit = 0 THEN
    r_item_baseICMSSTAnteriormente := ROUND ((p_item_quantidade *
      FUNC_ADD_BUSCA_PRECO(
        p_config_64_casasDecSaidas,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        0,
        0,
        p_cab_estabelecimento,
        CASE WHEN p_cab_dataEntradaSaida IS NULL THEN TRUNC(SYSDATE) ELSE p_cab_dataEntradaSaida END,
        0,
        ' ',
        ' ',
        0,
        0,
        p_item_personalizacao,
        p_gradProd_produto,
        p_gradProd_cor,
        p_gradProd_tamanho,
        p_prod_controleEstoque,
        'U',
        ' ')), 2);
    SELECT
      COALESCE((
        SELECT MAX(ufOrigDest.aliquotaIcms)
        FROM PAESTABELECIMENTOS est
        JOIN CAENDERECOSPESSOA endEst
        ON endEst.pessoa = est.pessoaEstabelecimento
        JOIN SIMUNICIPIOS munEst
        ON munEst.municipio = endEst.municipio
        JOIN PAUFORIGEMXUFDESTINO ufOrigDest
        ON ufOrigDest.ufOrigem = munEst.uf
        AND ufOrigDest.ufDestino = munEst.uf
        WHERE est.estabelecimento = p_cab_estabelecimento
        AND endEst.ativo = 1
        AND endEst.principal = 1),0)
    INTO v_ufOrigDest_aliquotaIcms
    FROM DUAL;
    r_item_valorICMSSTAnteriorment := ROUND (r_item_baseICMSSTAnteriormente * v_ufOrigDest_aliquotaIcms / 100, 2);
  END IF;
END ADD_BUSCA_ICMS_ST_ANTERIOR;

/

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

/

create or replace PROCEDURE ADD_CALCULA_MARGEM_CONTRIB (
  p_usuarioLogado                IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_regMarg_tipoPreco            IN CHAR,
  p_regMarg_tabelaPreco          IN VARCHAR2,
  p_regMarg_fatorMultiplicador   IN NUMBER,
  p_regMarg_tipoPrecoB           IN CHAR,
  p_regMarg_tabelaPrecoB         IN VARCHAR2,
  p_regMarg_fatorMultiplicadorB  IN NUMBER,
  p_regMarg_reduzirImpostos      IN NUMBER,
  p_regMarg_reduzirTarifaCartao  IN NUMBER,
  p_regMarg_taxaCapitacaoCustoFi IN NUMBER,
  p_regMarg_exibImagemMargemItem IN NUMBER,
  p_regMarg_regraImagemItem      IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_prazoMedioPonderado      IN NUMBER,
  p_cab_valorLiquidoItem         IN NUMBER,
  p_cab_valorTarifaCartao        IN NUMBER,
  p_munEndEst_uf                 IN CHAR,
  p_munEndPess_uf                IN CHAR,
  p_item_modeloDocumento         IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_valorFreteItem          IN NUMBER,
  p_item_valorSeguroItem         IN NUMBER,
  p_item_valorFreteGeral         IN NUMBER,
  p_item_valorSeguroGeral        IN NUMBER,
  p_item_valorAdicFreteMarTotal  IN NUMBER,
  p_item_valorDespesasAduanTotal IN NUMBER,
  p_item_valorRetIRRF            IN NUMBER,
  p_item_valorRetCSLL            IN NUMBER,
  p_item_valorII                 IN NUMBER,
  p_item_valorIOF                IN NUMBER,
  p_item_valorIPI                IN NUMBER,
  p_item_valorIPIDevolucao       IN NUMBER,
  p_item_valorPIS                IN NUMBER,
  p_item_valorPISST              IN NUMBER,
  p_item_valorCOFINS             IN NUMBER,
  p_item_valorCOFINSST           IN NUMBER,
  p_item_valorCreditoSimplesNac  IN NUMBER,
  p_item_valorICMSOperacao       IN NUMBER,
  p_item_valorICMSDiferido       IN NUMBER,
  p_item_valorICMS               IN NUMBER,
  p_item_valorICMSDesoneracao    IN NUMBER,
  p_item_valorICMSST             IN NUMBER,
  p_item_valorICMSUFDestinatario IN NUMBER,
  p_item_valorICMSUFRemetente    IN NUMBER,
  p_item_valorFCP                IN NUMBER,
  p_item_valorFCPST              IN NUMBER,
  p_item_valorFCPSTAnteriormente IN NUMBER,
  p_item_valorFCPUFDestinatario  IN NUMBER,
  p_item_valorLiquidoItem        IN NUMBER,
  /* Retornos */
  r_valorLiquidoSemFreteSeguro   OUT NUMBER,
  r_valorCaptacao                OUT NUMBER,
  r_valorTarifaCartao            OUT NUMBER,
  r_valorImpostos                OUT NUMBER,
  r_precoCusto                   OUT NUMBER,
  r_valorCusto                   OUT NUMBER,
  r_valorMargem                  OUT NUMBER,
  r_percentualMargem             OUT NUMBER)
IS
  v_gradProd_produto             NUMBER;
  v_gradProd_cor                 NUMBER;
  v_gradProd_tamanho             VARCHAR(10);
  v_prod_subcategoriaProduto     NUMBER;
  v_prod_marca                   NUMBER;
  v_prod_caracteristicaA         NUMBER;
  v_prod_caracteristicaB         NUMBER;
  v_prod_caracteristicaC         NUMBER;
  v_prod_caracteristicaD         NUMBER;
  v_prod_caracteristicaE         NUMBER;
  v_prod_idNcm                   NUMBER;
  v_prod_listaServicos           NUMBER;
  v_prod_controleEstoque         NUMBER;
  v_subCatProd_categoriaProduto  NUMBER;
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2(256);    
BEGIN
  SELECT
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho,
    prod.subcategoriaProduto,
    prod.marca,
    prod.caracteristicaA,
    prod.caracteristicaB,
    prod.caracteristicaC,
    prod.caracteristicaD,
    prod.caracteristicaE,
    prod.idNcm,
    prod.listaServicos,
    prod.controleEstoque,
    subCatProd.categoriaProduto
  INTO
    v_gradProd_produto,
    v_gradProd_cor,
    v_gradProd_tamanho,
    v_prod_subcategoriaProduto,
    v_prod_marca,
    v_prod_caracteristicaA,
    v_prod_caracteristicaB,
    v_prod_caracteristicaC,
    v_prod_caracteristicaD,
    v_prod_caracteristicaE,
    v_prod_idNcm,
    v_prod_listaServicos,
    v_prod_controleEstoque,
    v_subCatProd_categoriaProduto
  FROM CAGRADESPRODUTO gradProd
  JOIN CAPRODUTOS prod
  ON prod.produto = gradProd.produto
  JOIN PASUBCATEGORIASPRODUTO subCatProd
  ON subCatProd.subcategoriaProduto = prod.subcategoriaProduto
  WHERE gradProd.gradeProduto = p_item_gradeProduto;
  r_valorLiquidoSemFreteSeguro :=
    p_item_valorLiquidoItem
    - p_item_valorFreteItem
    - p_item_valorSeguroItem
    - p_item_valorFreteGeral
    - p_item_valorSeguroGeral
    - p_item_valorAdicFreteMarTotal
    - p_item_valorDespesasAduanTotal;
  r_valorCaptacao := FUNC_ADD_CALC_VALOR_CAPTACAO(
    p_cab_prazoMedioPonderado,
    p_regMarg_taxaCapitacaoCustoFi,
    r_valorLiquidoSemFreteSeguro);
  IF p_regMarg_reduzirTarifaCartao = 1
    AND p_cab_valorLiquidoItem <> 0
  THEN
    r_valorTarifaCartao :=
      CASE
        WHEN p_cab_valorLiquidoItem = 0
        THEN 0
        ELSE ROUND ((p_cab_valorTarifaCartao * p_item_valorLiquidoItem / p_cab_valorLiquidoItem), 2)
      END;
  ELSE
    r_valorTarifaCartao := 0;
  END IF;
  r_valorImpostos := 0;
  IF p_regMarg_reduzirImpostos = 1 THEN
    r_valorImpostos := FUNC_ADD_BUSCA_IMPOSTOS_MARGEM (
      p_usuarioLogado,
      p_perfilUsuarioLogado,
      FUNC_ADD_BUSCA_CENARIO_CALC_PR (
        'V', -- p_compraVenda
        p_cab_estabelecimento,
        p_munEndEst_uf,
        p_munEndPess_uf,
        p_item_modeloDocumento),
      p_cab_estabelecimento,
      p_munEndEst_uf,
      p_munEndPess_uf,
      p_item_quantidade,
      p_item_valorRetIRRF,
      p_item_valorRetCSLL,
      p_item_valorII,
      p_item_valorIOF,
      p_item_valorIPI,
      p_item_valorIPIDevolucao,
      p_item_valorPIS,
      p_item_valorPISST,
      p_item_valorCOFINS,
      p_item_valorCOFINSST,
      p_item_valorCreditoSimplesNac,
      p_item_valorICMSOperacao,
      p_item_valorICMSDiferido,
      p_item_valorICMS,
      p_item_valorICMSDesoneracao,
      p_item_valorICMSST,
      p_item_valorICMSUFDestinatario,
      p_item_valorICMSUFRemetente,
      p_item_valorFCP,
      p_item_valorFCPST,
      p_item_valorFCPSTAnteriormente,
      p_item_valorFCPUFDestinatario,
      r_valorLiquidoSemFreteSeguro,
      v_gradProd_produto,
      v_prod_subcategoriaProduto,
      v_prod_marca,
      v_prod_caracteristicaA,
      v_prod_caracteristicaB,
      v_prod_caracteristicaC,
      v_prod_caracteristicaD,
      v_prod_caracteristicaE,
      v_prod_idNcm,
      v_prod_listaServicos,
      v_subCatProd_categoriaProduto);
  END IF;
  ADD_BUSCA_PRECO (
    p_config_65_casasDecEntrada, -- p_config_64_casasDecSaidas
    p_config_65_casasDecEntrada,
    p_config_209_filtrarGrupoEcon,
    p_config_362_calcCustoPorGrade,
    0, -- p_perfilUsuarioLogado
    0, -- p_usuarioLogado
    'E', -- p_cab_entradaSaida
    0, -- p_cab_devolucaoAnulacaoRetorno
    p_cab_estabelecimento,
    TO_DATE('01/01/1900','DD/MM/YYYY'), -- p_cab_dataPrecoInicial
    TRUNC(SYSDATE), -- p_cab_dataPrecoFinal
    0, -- p_cab_pessoa
    ' ', -- p_cab_projeto
    0, -- p_modDoc_capituloNaturezaFisc
    p_regMarg_tipoPreco,
    p_regMarg_tabelaPreco,
    p_regMarg_fatorMultiplicador,
    p_regMarg_tipoPrecoB,
    p_regMarg_tabelaPrecoB,
    p_regMarg_fatorMultiplicadorB,
    p_munEndEst_uf, -- p_endPessEst_uf
    p_munEndEst_uf, -- p_endPess_uf
    0, -- p_item_vendedor
    0, -- p_item_idFormulaTinta,
    p_item_personalizacao,
    0, -- p_item_localEstoque,
    0, -- p_item_pessoaParticipante,
    p_item_quantidade,
    v_gradProd_produto,
    v_gradProd_cor,
    v_gradProd_tamanho,
    v_prod_controleEstoque,
    '0', -- v_locEst_indicadorPropPosseIt,
    0, -- p_manterPreco
    0, -- p_precoSugestaoAPrazoOriginal
    0, -- p_precoSugestaoAVistaOriginal
    ' ', -- p_tipoPreco
    ' ', -- p_tabelaPreco
    /* Retornos */
    v_auxVarchar, -- r_tipoPreco
    v_auxVarchar, -- r_tabelaPreco
    r_precoCusto,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber,
    v_auxNumber);
  r_valorCusto := ROUND ((p_item_quantidade * r_precoCusto),2);
  r_valorMargem :=
    r_valorLiquidoSemFreteSeguro
    - r_valorCaptacao
    - r_valorImpostos
    - r_valorTarifaCartao
    - r_valorCusto;
  r_percentualMargem :=
    CASE
      WHEN r_valorLiquidoSemFreteSeguro = 0
      THEN 0
      ELSE ROUND ((100 * r_valorMargem / r_valorLiquidoSemFreteSeguro), 8)
    END;
END ADD_CALCULA_MARGEM_CONTRIB;

/

create or replace PROCEDURE ADD_ORCAMENTO_GERA_TEMP_MARGEM (
  p_sessaoClient                 IN VARCHAR2,
  p_usuarioLogado                IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_regMarg_tipoPreco            IN CHAR,
  p_regMarg_tabelaPreco          IN VARCHAR2,
  p_regMarg_fatorMultiplicador   IN NUMBER,
  p_regMarg_tipoPrecoB           IN CHAR,
  p_regMarg_tabelaPrecoB         IN VARCHAR2,
  p_regMarg_fatorMultiplicadorB  IN NUMBER,
  p_regMarg_reduzirImpostos      IN NUMBER,
  p_regMarg_reduzirTarifaCartao  IN NUMBER,
  p_regMarg_taxaCapitacaoCustoFi IN NUMBER,
  p_regMarg_exibImagemMargemCab  IN NUMBER,
  p_regMarg_regraImagemCab       IN NUMBER,
  p_regMarg_exibImagemMargemItem IN NUMBER,
  p_regMarg_regraImagemItem      IN NUMBER,
  p_orcamento                    IN NUMBER,
  p_cabMargem_valorTarifaCartao  IN NUMBER,
  p_cabMargem_valorMargem        IN NUMBER,
  p_idItemOrcamento              IN NUMBER,
  p_item_ini_cancelado           IN NUMBER,
  /* Retornos */
  r_cabMargem_valorTarifaCartao  OUT NUMBER,
  r_cabMargem_valorMargem        OUT NUMBER,
  r_cabMargem_percentualMargem   OUT NUMBER,
  r_cabMargem_imagemMargem       OUT VARCHAR2)
IS
  v_cab_estabelecimento          NUMBER;
  v_cab_tipoPagamentoFrete       CHAR(1);
  v_cab_prazoMedioPonderado      NUMBER;
  v_cab_valorFreteItem           NUMBER;
  v_cab_valorSeguroItem          NUMBER;
  v_cab_valorFreteGeral          NUMBER;
  v_cab_valorSeguroGeral         NUMBER;
  v_cab_valorAdicFreteMarinTotal NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_munEndEst_uf                 CHAR(2);
  v_munEndPess_uf                CHAR(2);
  v_item_valorLiquidoSemFreteSeg NUMBER;
  v_item_valorCaptacao           NUMBER;
  v_item_valorTarifaCartao       NUMBER;
  v_item_valorImpostos           NUMBER;
  v_item_precoCusto              NUMBER;
  v_item_valorCusto              NUMBER;
  v_item_valorMargem             NUMBER;
  v_item_percentualMargem        NUMBER;
  v_item_imagemMargem            VARCHAR2(256);
BEGIN
  IF p_idItemOrcamento = 0 THEN
    r_cabMargem_valorTarifaCartao := FUNC_ADD_TARIFA_CART_ORCAMENTO (p_orcamento);
    r_cabMargem_valorMargem := 0;
    DELETE TEMPMARGEMCONTRIBUICAO
    WHERE sessaoClient = p_sessaoClient
    AND orcamentoPredocumentoDocumento = 'O'
    AND idCabecalho = p_orcamento;
  ELSE
    r_cabMargem_valorTarifaCartao := p_cabMargem_valorTarifaCartao;
    r_cabMargem_valorMargem := p_cabMargem_valorMargem;
    IF p_item_ini_cancelado = 0 THEN
      SELECT COALESCE (MAX (temp.valorMargem), 0)
      INTO v_item_valorMargem
      FROM MOORCAMENTOXITENS a
      JOIN TEMPMARGEMCONTRIBUICAO temp
      ON temp.sequencia = a.sequencia
      WHERE a.idItemOrcamento = p_idItemOrcamento
      AND temp.sessaoClient = p_sessaoClient
      AND temp.orcamentoPredocumentoDocumento = 'O'
      AND temp.idCabecalho = p_orcamento;
      r_cabMargem_valorMargem := p_cabMargem_valorMargem - v_item_valorMargem;
    END IF;
  END IF;
  SELECT
    cab.estabelecimento,
    cab.prazoMedioPonderado,
    cab.valorFreteItem,
    cab.valorSeguroItem,
    cab.valorFreteGeral,
    cab.valorSeguroGeral,
    cab.valorAdicFreteMarinhaMerTotal,
    cab.valorDespesasAduaneirasTotal,
    cab.valorLiquidoItem,
    COALESCE((
      SELECT MAX(munEndEst.uf)
      FROM CAENDERECOSPESSOA endEst
      JOIN SIMUNICIPIOS munEndEst
      ON munEndEst.municipio = endEst.municipio
      WHERE endEst.pessoa = est.pessoaEstabelecimento
      AND endEst.ativo = 1
      AND endEst.principal = 1),'  '),
    COALESCE((
      SELECT MAX(munEndPess.uf)
      FROM CAENDERECOSPESSOA endPess
      JOIN SIMUNICIPIOS munEndPess
      ON munEndPess.municipio = endPess.municipio
      WHERE endPess.pessoa = cab.pessoa
      AND endPess.ativo = 1
      AND endPess.principal = 1),'  ')
  INTO
    v_cab_estabelecimento,
    v_cab_prazoMedioPonderado,
    v_cab_valorFreteItem,
    v_cab_valorSeguroItem,
    v_cab_valorFreteGeral,
    v_cab_valorSeguroGeral,
    v_cab_valorAdicFreteMarinTotal,
    v_cab_valorDespesasAduanTotal,
    v_cab_valorLiquidoItem,
    v_munEndEst_uf,
    v_munEndPess_uf
  FROM MOORCAMENTOS cab
  JOIN PAESTABELECIMENTOS est
  ON est.estabelecimento = cab.estabelecimento
  WHERE cab.orcamento = p_orcamento;
  FOR a IN (
    SELECT
      a.sequencia,
      a.cancelado,
      a.modeloDocumento,
      a.gradeProduto,
      a.personalizacao,
      a.quantidade,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorRetIRRF,
      a.valorRetCSLL,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMSOperacao,
      a.valorICMSDiferido,
      a.valorICMS,
      a.valorICMSDesoneracao,
      a.valorICMSST,
      a.valorICMSUFDestinatario,
      a.valorICMSUFRemetente,
      a.valorFCP,
      a.valorFCPST,
      a.valorFCPSTAnteriormente,
      a.valorFCPUFDestinatario,
      a.valorLiquidoItem
    FROM MOORCAMENTOXITENS a
    WHERE p_idItemOrcamento = 0
    AND orcamento = p_orcamento
    OR p_idItemOrcamento <> 0
    AND idItemOrcamento = p_idItemOrcamento)
  LOOP
    ADD_CALCULA_MARGEM_CONTRIB (
      p_usuarioLogado,
      p_perfilUsuarioLogado,
      p_config_65_casasDecEntrada,
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_regMarg_tipoPreco,
      p_regMarg_tabelaPreco,
      p_regMarg_fatorMultiplicador,
      p_regMarg_tipoPrecoB,
      p_regMarg_tabelaPrecoB,
      p_regMarg_fatorMultiplicadorB,
      p_regMarg_reduzirImpostos,
      p_regMarg_reduzirTarifaCartao,
      p_regMarg_taxaCapitacaoCustoFi,
      p_regMarg_exibImagemMargemItem,
      p_regMarg_regraImagemItem,
      v_cab_estabelecimento,
      v_cab_prazoMedioPonderado,
      v_cab_valorLiquidoItem,
      r_cabMargem_valorTarifaCartao,
      v_munEndEst_uf,
      v_munEndPess_uf,
      a.modeloDocumento,
      a.gradeProduto,
      a.personalizacao,
      a.quantidade,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorRetIRRF,
      a.valorRetCSLL,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      0,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMSOperacao,
      a.valorICMSDiferido,
      a.valorICMS,
      a.valorICMSDesoneracao,
      a.valorICMSST,
      a.valorICMSUFDestinatario,
      a.valorICMSUFRemetente,
      a.valorFCP,
      a.valorFCPST,
      a.valorFCPSTAnteriormente,
      a.valorFCPUFDestinatario,
      a.valorLiquidoItem,
      /* Retornos */
      v_item_valorLiquidoSemFreteSeg,
      v_item_valorCaptacao,
      v_item_valorTarifaCartao,
      v_item_valorImpostos,
      v_item_precoCusto,
      v_item_valorCusto,
      v_item_valorMargem,
      v_item_percentualMargem);
    IF p_regMarg_exibImagemMargemItem = 1
      AND p_regMarg_regraImagemItem <> 0
    THEN
      v_item_imagemMargem :=
        FUNC_ADD_BUSCA_IMAGEM_FAIXA (
          p_regMarg_regraImagemItem,
          v_item_percentualMargem);
    ELSE
      v_item_imagemMargem := ' ';
    END IF;
    IF a.cancelado = 0 THEN
      r_cabMargem_valorMargem := r_cabMargem_valorMargem + v_item_valorMargem;
    END IF;
  MERGE INTO TEMPMARGEMCONTRIBUICAO a USING (
    SELECT
      p_sessaoClient                 sessaoClient,
      'O'                            orcamentoPredocumentoDocumento,
      p_orcamento                    idCabecalho,
      a.sequencia                    sequencia,
      v_item_valorLiquidoSemFreteSeg valorLiquidoSemFreteSeguro,
      v_item_valorCaptacao           valorCaptacao,
      v_item_valorTarifaCartao       valorTarifaCartao,
      v_item_valorImpostos           valorImpostos,
      v_item_precoCusto              precoCusto,
      v_item_valorCusto              valorCusto,
      v_item_valorMargem             valorMargem,
      v_item_percentualMargem        percentualMargem,
      v_item_imagemMargem            imagemMargem
    FROM DUAL) b ON (
      a.sessaoClient = b.sessaoClient 
      AND a.orcamentoPredocumentoDocumento = b.orcamentoPredocumentoDocumento
      AND a.idCabecalho = b.idCabecalho
      AND a.sequencia = b.sequencia)
  WHEN MATCHED THEN UPDATE SET
    a.valorLiquidoSemFreteSeguro = b.valorLiquidoSemFreteSeguro,
    a.valorCaptacao              = b.valorCaptacao,
    a.valorTarifaCartao          = b.valorTarifaCartao,
    a.valorImpostos              = b.valorImpostos,
    a.precoCusto                 = b.precoCusto,
    a.valorCusto                 = b.valorCusto,
    a.valorMargem                = b.valorMargem,
    a.percentualMargem           = b.percentualMargem,
    a.imagemMargem               = b.imagemMargem
  WHEN NOT MATCHED THEN INSERT (
    sessaoClient,
    orcamentoPredocumentoDocumento,
    idCabecalho,
    sequencia,
    valorLiquidoSemFreteSeguro,
    valorCaptacao,
    valorTarifaCartao,
    valorImpostos,
    precoCusto,
    valorCusto,
    valorMargem,
    percentualMargem,
    imagemMargem)
  VALUES (
    b.sessaoClient,
    b.orcamentoPredocumentoDocumento,
    b.idCabecalho,
    b.sequencia,
    b.valorLiquidoSemFreteSeguro,
    b.valorCaptacao,
    b.valorTarifaCartao,
    b.valorImpostos,
    b.precoCusto,
    b.valorCusto,
    b.valorMargem,
    b.percentualMargem,
    b.imagemMargem);
  END LOOP;
  r_cabMargem_percentualMargem :=
    CASE
      WHEN v_cab_valorLiquidoItem
        - v_cab_valorFreteItem
        - v_cab_valorSeguroItem
        - v_cab_valorFreteGeral
        - v_cab_valorSeguroGeral
        - v_cab_valorAdicFreteMarinTotal
        - v_cab_valorDespesasAduanTotal = 0
      THEN 0
      ELSE ROUND ((100 * r_cabMargem_valorMargem
        / ( v_cab_valorLiquidoItem
          - v_cab_valorFreteItem
          - v_cab_valorSeguroItem
          - v_cab_valorFreteGeral
          - v_cab_valorSeguroGeral
          - v_cab_valorAdicFreteMarinTotal
          - v_cab_valorDespesasAduanTotal)), 8)
    END;
  IF p_regMarg_exibImagemMargemCab = 1
    AND p_regMarg_regraImagemCab <> 0
  THEN
    r_cabMargem_imagemMargem :=
      FUNC_ADD_BUSCA_IMAGEM_FAIXA (
        p_regMarg_regraImagemCab,
        r_cabMargem_percentualMargem);
  ELSE
    r_cabMargem_imagemMargem := ' ';
  END IF;
END ADD_ORCAMENTO_GERA_TEMP_MARGEM;

/

create or replace PROCEDURE ADD_ORCAMENTO_CALC_IMP_ITENS (
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_orcamento                IN NUMBER,
  p_cab_origemDocumento          IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEntradaSaida         IN DATE,
  p_cab_pessoa                   IN NUMBER,
  p_cab_localDestinoOperacao     IN CHAR,
  p_cab_indicadorConsumidorFinal IN CHAR,
  p_cab_tipoPagamentoFrete       IN CHAR,
  p_pess_indicadorInscricaoEstad IN CHAR,
  /* Retornos */
  r_cab_valorProdutos            OUT NUMBER,
  r_cab_valorServicos            OUT NUMBER,
  r_cab_valorBasePagamento       OUT NUMBER,
  r_cab_valorAVistaMinimo        OUT NUMBER,
  r_cab_valorFreteTotal          OUT NUMBER,
  r_cab_valorSeguroTotal         OUT NUMBER,
  r_cab_valorDescontoTotal       OUT NUMBER,
  r_cab_valorOutrasDespesasTotal OUT NUMBER,
  r_cab_valorAdicFreteMarinTotal OUT NUMBER,
  r_cab_valorDespesasAduanTotal  OUT NUMBER,
  r_cab_valorLiquidoItem         OUT NUMBER)
IS
  v_auxNumber                    NUMBER;
  v_precoUnitario                NUMBER;
  v_precoUnitarioConvertido      NUMBER;
  v_valorProdutoServico          NUMBER;
  v_valorBasePagamento           NUMBER;
  v_valorFreteTotal              NUMBER;
  v_valorSeguroTotal             NUMBER;
  v_valorDescontoTotal           NUMBER;
  v_valorOutrasDespesasTotal     NUMBER;
  v_valorAdicFreteMarinMerTotal  NUMBER;
  v_valorDespesasAduaneirasTotal NUMBER;
  v_baseISSQN                    NUMBER;
  v_valorISSQN                   NUMBER;
  v_baseRetIRRF                  NUMBER;
  v_valorRetIRRF                 NUMBER;
  v_baseRetINSS                  NUMBER;
  v_valorRetINSS                 NUMBER;
  v_baseRetPIS                   NUMBER;
  v_valorRetPIS                  NUMBER;
  v_baseRetCOFINS                NUMBER;
  v_valorRetCOFINS               NUMBER;
  v_baseRetCSLL                  NUMBER;
  v_valorRetCSLL                 NUMBER;
  v_baseRetOutros                NUMBER;
  v_valorRetOutros               NUMBER;
  v_baseII                       NUMBER;
  v_valorII                      NUMBER;
  v_baseIOF                      NUMBER;
  v_valorIOF                     NUMBER;
  v_baseIPI                      NUMBER;
  v_valorIPI                     NUMBER;
  v_basePIS                      NUMBER;
  v_valorPIS                     NUMBER;
  v_basePISST                    NUMBER;
  v_valorPISST                   NUMBER;
  v_baseCOFINS                   NUMBER;
  v_valorCOFINS                  NUMBER;
  v_baseCOFINSST                 NUMBER;
  v_valorCOFINSST                NUMBER;
  v_baseCreditoSimplesNacional   NUMBER;
  v_valorCreditoSimplesNacional  NUMBER;
  v_baseICMS                     NUMBER;
  v_valorICMSOperacao            NUMBER;
  v_valorICMSDiferido            NUMBER;
  v_valorICMS                    NUMBER;
  v_valorICMSDesoneracao         NUMBER;
  v_baseICMSST                   NUMBER;
  v_valorICMSST                  NUMBER;
  v_baseICMSSTAnteriormente      NUMBER;
  v_valorICMSSTAnteriormente     NUMBER;
  v_valorICMSProprioSubstituto   NUMBER;
  v_baseICMSEfetivo              NUMBER;
  v_valorICMSEfetivo             NUMBER;
  v_baseICMSUFDestinatario       NUMBER;
  v_valorICMSUFDestinatario      NUMBER;
  v_baseICMSUFRemetente          NUMBER;
  v_valorICMSUFRemetente         NUMBER;
  v_baseFCP                      NUMBER;
  v_valorFCP                     NUMBER;
  v_baseFCPST                    NUMBER;
  v_valorFCPST                   NUMBER;
  v_baseFCPSTAnteriormente       NUMBER;
  v_valorFCPSTAnteriormente      NUMBER;
  v_baseFCPUFDestinatario        NUMBER;
  v_valorFCPUFDestinatario       NUMBER;
  v_baseEstimadaImpostos         NUMBER;
  v_valorEstimadoImpFederais     NUMBER;
  v_valorEstimadoImpEstaduais    NUMBER;
  v_valorEstimadoImpMunicipais   NUMBER;
  v_valorLiquidoItem             NUMBER;
BEGIN
  r_cab_valorProdutos            := 0;
  r_cab_valorServicos            := 0;
  r_cab_valorBasePagamento       := 0;
  r_cab_valorAVistaMinimo        := 0;
  r_cab_valorFreteTotal          := 0;
  r_cab_valorSeguroTotal         := 0;
  r_cab_valorDescontoTotal       := 0;
  r_cab_valorOutrasDespesasTotal := 0;
  r_cab_valorAdicFreteMarinTotal := 0;
  r_cab_valorDespesasAduanTotal  := 0;
  r_cab_valorLiquidoItem         := 0;
  FOR a IN (
    SELECT
      a.*,
      gradProd.produto,
      gradProd.cor,
      gradProd.tamanho,
      prod.controleEstoque,
      prod.tipoProduto,
      prod.precoPautaTabelado,
      modDoc.geraFinanceiro modDoc_geraFinanceiro,
      modDoc.diminuiDescontoPrUnit,
      modDoc.somaAcrescimosPrUnit,
      modDoc.somaFreteSeguroPrUnit,
      CASE
        WHEN EXISTS (
          SELECT 1
          FROM CAPRODUTOXCOMPOSICOESPREC compPrec
          WHERE compPrec.produto = gradProd.produto
          AND compPrec.ativo = 1)
        THEN 1
        ELSE 0
      END composicaoPreco
    FROM MOORCAMENTOXITENS a
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = a.modeloDocumento
    WHERE a.orcamento = p_cab_orcamento
    AND a.cancelado = 0
    ORDER BY a.sequencia)
  LOOP
    v_precoUnitario                := a.precoUnitario;
    v_precoUnitarioConvertido      := a.precoUnitarioConvertido;
    v_valorProdutoServico          := a.valorProdutoServico;
    v_valorBasePagamento           := a.valorBasePagamento;
    v_valorFreteTotal              := a.valorFreteTotal;
    v_valorSeguroTotal             := a.valorSeguroTotal;
    v_valorDescontoTotal           := a.valorDescontoTotal;
    v_valorOutrasDespesasTotal     := a.valorOutrasDespesasTotal;
    v_valorAdicFreteMarinMerTotal  := a.valorAdicFreteMarinhaMerTotal;
    v_valorDespesasAduaneirasTotal := a.valorDespesasAduaneirasTotal;
    v_baseISSQN                    := a.baseISSQN;
    v_valorISSQN                   := a.valorISSQN;
    v_baseRetIRRF                  := a.baseRetIRRF;
    v_valorRetIRRF                 := a.valorRetIRRF;
    v_baseRetINSS                  := a.baseRetINSS;
    v_valorRetINSS                 := a.valorRetINSS;
    v_baseRetOutros                := a.baseRetOutros;
    v_valorRetOutros               := a.valorRetOutros;
    v_baseRetPIS                   := a.baseRetPIS;
    v_valorRetPIS                  := a.valorRetPIS;
    v_baseRetCOFINS                := a.baseRetCOFINS;
    v_valorRetCOFINS               := a.valorRetCOFINS;
    v_baseRetCSLL                  := a.baseRetCSLL;
    v_valorRetCSLL                 := a.valorRetCSLL;
    v_baseII                       := a.baseII;
    v_valorII                      := a.valorII;
    v_baseIOF                      := a.baseIOF;
    v_valorIOF                     := a.valorIOF;
    v_baseIPI                      := a.baseIPI;
    v_valorIPI                     := a.valorIPI;
    v_basePIS                      := a.basePIS;
    v_valorPIS                     := a.valorPIS;
    v_basePISST                    := a.basePISST;
    v_valorPISST                   := a.valorPISST;
    v_baseCOFINS                   := a.baseCOFINS;
    v_valorCOFINS                  := a.valorCOFINS;
    v_baseCOFINSST                 := a.baseCOFINSST;
    v_valorCOFINSST                := a.valorCOFINSST;
    v_baseCreditoSimplesNacional   := a.baseCreditoSimplesNacional;
    v_valorCreditoSimplesNacional  := a.valorCreditoSimplesNacional;
    v_baseICMS                     := a.baseICMS;
    v_valorICMSOperacao            := a.valorICMSOperacao;
    v_valorICMSDiferido            := a.valorICMSDiferido;
    v_valorICMS                    := a.valorICMS;
    v_valorICMSDesoneracao         := a.valorICMSDesoneracao;
    v_baseICMSST                   := a.baseICMSST;
    v_valorICMSST                  := a.valorICMSST;
    v_baseICMSSTAnteriormente      := a.baseICMSSTAnteriormente;
    v_valorICMSSTAnteriormente     := a.valorICMSSTAnteriormente;
    v_valorICMSProprioSubstituto   := a.valorICMSProprioSubstituto;
    v_baseICMSEfetivo              := a.baseICMSEfetivo;
    v_valorICMSEfetivo             := a.valorICMSEfetivo;
    v_baseICMSUFDestinatario       := a.baseICMSUFDestinatario;
    v_valorICMSUFDestinatario      := a.valorICMSUFDestinatario;
    v_baseICMSUFRemetente          := a.baseICMSUFRemetente;
    v_valorICMSUFRemetente         := a.valorICMSUFRemetente;
    v_baseFCP                      := a.baseFCP;
    v_valorFCP                     := a.valorFCP;
    v_baseFCPST                    := a.baseFCPST;
    v_valorFCPST                   := a.valorFCPST;
    v_baseFCPSTAnteriormente       := a.baseFCPSTAnteriormente;
    v_valorFCPSTAnteriormente      := a.valorFCPSTAnteriormente;
    v_baseFCPUFDestinatario        := a.baseFCPUFDestinatario;
    v_valorFCPUFDestinatario       := a.valorFCPUFDestinatario;
    v_baseEstimadaImpostos         := a.baseEstimadaImpostos;
    v_valorEstimadoImpFederais     := a.valorEstimadoImpFederais;
    v_valorEstimadoImpEstaduais    := a.valorEstimadoImpEstaduais;
    v_valorEstimadoImpMunicipais   := a.valorEstimadoImpMunicipais;
    v_valorLiquidoItem             := a.valorLiquidoItem;
    ADD_CALCULA_TOTAIS_ITEM(
      p_cab_tipoPagamentoFrete,
      a.quantidade,
      a.quantidadeConvertida,
      a.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao,
      a.precoUnitario,
      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.diminuiDescontoPrUnit,
      a.somaAcrescimosPrUnit,
      a.somaFreteSeguroPrUnit,
      a.composicaoPreco,
      /* Retornos */
      v_precoUnitario,
      v_precoUnitarioConvertido,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal);
    ADD_CALCULA_IMPOSTOS_ITEM (
      p_config_64_casasDecSaidas,
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_cab_entradaSaida,
      0,
      p_cab_estabelecimento,
      0,
      p_cab_dataEntradaSaida,
      p_cab_pessoa,
      p_cab_localDestinoOperacao,
      p_cab_indicadorConsumidorFinal,
      p_cab_tipoPagamentoFrete,
      p_pess_indicadorInscricaoEstad,
      a.personalizacao,
      a.quantidade,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal,
      a.cfop,
      1,
      a.indicadorISSQN,
      a.aliquotaISSQN,
      v_baseISSQN,
      v_valorISSQN,
      1,
      a.retencaoIRRF,
      v_baseRetIRRF,
      v_valorRetIRRF,
      1,
      a.retencaoINSS,
      v_baseRetINSS,
      v_valorRetINSS,
      1,
      a.retencaoPIS,
      v_baseRetPIS,
      v_valorRetPIS,
      1,
      a.retencaoCOFINS,
      v_baseRetCOFINS,
      v_valorRetCOFINS,
      1,
      a.retencaoCSLL,
      v_baseRetCSLL,
      v_valorRetCSLL,
      1,
      a.retencaoOutros,
      v_baseRetOutros,
      v_valorRetOutros,
      1,
      a.aliquotaII,
      v_baseII,
      v_valorII,
      1,
      a.aliquotaIOF,
      v_baseIOF,
      v_valorIOF,
      1,
      a.aliquotaIPI,
      a.valorAliquotaIPI,
      v_baseIPI,
      v_valorIPI,
      0,
      1,
      a.aliquotaPIS,
      a.valorAliquotaPIS,
      v_basePIS,
      v_valorPIS,
      1,
      a.aliquotaPISST,
      a.valorAliquotaPISST,
      v_basePISST,
      v_valorPISST,
      1,
      a.aliquotaCOFINS,
      a.valorAliquotaCOFINS,
      v_baseCOFINS,
      v_valorCOFINS,
      1,
      a.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST,
      v_baseCOFINSST,
      v_valorCOFINSST,
      1,
      a.stSimplesNacional,
      a.creditoSimplesNacional,
      v_baseCreditoSimplesNacional,
      v_valorCreditoSimplesNacional,
      1,
      a.stICMS,
      a.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS,
      a.aliquotaICMS,
      a.diferimentoICMS,
      v_baseICMS,
      v_valorICMSOperacao,
      v_valorICMSDiferido,
      v_valorICMS,
      v_valorICMSDesoneracao,
      1,
      a.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST,
      a.reducaoBaseST,
      a.aliquotaICMSST,
      v_baseICMSST,
      v_valorICMSST,
      1,
      v_baseICMSSTAnteriormente,
      v_valorICMSSTAnteriormente,
      v_valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo,
      v_baseICMSEfetivo,
      v_valorICMSEfetivo,
      0,
      '  ',
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      1,
      a.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual,
      v_baseICMSUFDestinatario,
      v_valorICMSUFDestinatario,
      v_baseICMSUFRemetente,
      v_valorICMSUFRemetente,
      1,
      a.aliquotaFCP,
      v_baseFCP,
      v_valorFCP,
      a.aliquotaFCPST,
      v_baseFCPST,
      v_valorFCPST,
      a.aliquotaFCPSTAnteriormente,
      v_baseFCPSTAnteriormente,
      v_valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario,
      v_baseFCPUFDestinatario,
      v_valorFCPUFDestinatario,
      1,
      a.aliquotaEstimadaImpFederais,
      a.aliquotaEstimadaImpEstaduais,
      a.aliquotaEstimadaImpMunicipais,
      v_baseEstimadaImpostos,
      v_valorEstimadoImpFederais,
      v_valorEstimadoImpEstaduais,
      v_valorEstimadoImpMunicipais,
      a.produto,
      a.cor,
      a.tamanho,
      a.controleEstoque,
      a.tipoProduto,
      a.precoPautaTabelado,
      /* Retornos */
      v_baseISSQN,
      v_valorISSQN,
      v_baseRetIRRF,
      v_valorRetIRRF,
      v_baseRetINSS,
      v_valorRetINSS,
      v_baseRetPIS,
      v_valorRetPIS,
      v_baseRetCOFINS,
      v_valorRetCOFINS,
      v_baseRetCSLL,
      v_valorRetCSLL,
      v_baseRetOutros,
      v_valorRetOutros,
      v_baseII,
      v_valorII,
      v_baseIOF,
      v_valorIOF,
      v_baseIPI,
      v_valorIPI,
      v_basePIS,
      v_valorPIS,
      v_basePISST,
      v_valorPISST,
      v_baseCOFINS,
      v_valorCOFINS,
      v_baseCOFINSST,
      v_valorCOFINSST,
      v_baseCreditoSimplesNacional,
      v_valorCreditoSimplesNacional,
      v_baseICMS,
      v_valorICMSOperacao,
      v_valorICMSDiferido,
      v_valorICMS,
      v_valorICMSDesoneracao,
      v_baseICMSST,
      v_valorICMSST,
      v_baseICMSSTAnteriormente,
      v_valorICMSSTAnteriormente,
      v_valorICMSProprioSubstituto,
      v_baseICMSEfetivo,
      v_valorICMSEfetivo,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_baseICMSUFDestinatario,
      v_valorICMSUFDestinatario,
      v_baseICMSUFRemetente,
      v_valorICMSUFRemetente,
      v_baseFCP,
      v_valorFCP,
      v_baseFCPST,
      v_valorFCPST,
      v_baseFCPSTAnteriormente,
      v_valorFCPSTAnteriormente,
      v_baseFCPUFDestinatario,
      v_valorFCPUFDestinatario,
      v_baseEstimadaImpostos,
      v_valorEstimadoImpFederais,
      v_valorEstimadoImpEstaduais,
      v_valorEstimadoImpMunicipais);
    v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
      p_cab_origemDocumento,
      0, -- p_cab_nfFornecedor
      p_cab_tipoPagamentoFrete,
      a.geraFinanceiro,
      v_valorProdutoServico,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      0, -- p_item_valorIPIDevolucao
      a.retidoISSQN,
      v_valorISSQN,
      v_valorRetIRRF,
      v_valorRetINSS,
      v_valorRetPIS,
      v_valorRetCOFINS,
      v_valorRetCSLL,
      v_valorRetOutros,
      v_valorII,
      v_valorIOF,
      v_valorIPI,
      v_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0, -- p_item_somarICMSST
      0, -- p_item_valorAcrescExtempTotal
      a.modDoc_geraFinanceiro);
    v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
      0, -- p_cab_nfFornecedor
      p_cab_tipoPagamentoFrete,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      0, -- p_item_valorIPIDevolucao
      v_valorII,
      v_valorIOF,
      v_valorIPI,
      v_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0 -- p_item_somarICMSST
      );
    UPDATE MOORCAMENTOXITENS SET
      precoUnitario                 = v_precoUnitario,
      precoUnitarioConvertido       = v_precoUnitarioConvertido,
      valorProdutoServico           = v_valorProdutoServico,
      valorBasePagamento            = v_valorBasePagamento,
      valorFreteTotal               = v_valorFreteTotal,
      valorSeguroTotal              = v_valorSeguroTotal,
      valorDescontoTotal            = v_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
      valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
      baseISSQN                     = v_baseISSQN,
      valorISSQN                    = v_valorISSQN,
      baseRetIRRF                   = v_baseRetIRRF,
      valorRetIRRF                  = v_valorRetIRRF,
      baseRetINSS                   = v_baseRetINSS,
      valorRetINSS                  = v_valorRetINSS,
      baseRetPIS                    = v_baseRetPIS,
      valorRetPIS                   = v_valorRetPIS,
      baseRetCOFINS                 = v_baseRetCOFINS,
      valorRetCOFINS                = v_valorRetCOFINS,
      baseRetCSLL                   = v_baseRetCSLL,
      valorRetCSLL                  = v_valorRetCSLL,
      baseRetOutros                 = v_baseRetOutros,
      valorRetOutros                = v_valorRetOutros,
      baseII                        = v_baseII,
      valorII                       = v_valorII,
      baseIOF                       = v_baseIOF,
      valorIOF                      = v_valorIOF,
      baseIPI                       = v_baseIPI,
      valorIPI                      = v_valorIPI,
      basePIS                       = v_basePIS,
      valorPIS                      = v_valorPIS,
      basePISST                     = v_basePISST,
      valorPISST                    = v_valorPISST,
      baseCOFINS                    = v_baseCOFINS,
      valorCOFINS                   = v_valorCOFINS,
      baseCOFINSST                  = v_baseCOFINSST,
      valorCOFINSST                 = v_valorCOFINSST,
      baseCreditoSimplesNacional    = v_baseCreditoSimplesNacional,
      valorCreditoSimplesNacional   = v_valorCreditoSimplesNacional,
      baseICMS                      = v_baseICMS,
      valorICMSOperacao             = v_valorICMSOperacao,
      valorICMSDiferido             = v_valorICMSDiferido,
      valorICMS                     = v_valorICMS,
      valorICMSDesoneracao          = v_valorICMSDesoneracao,
      baseICMSST                    = v_baseICMSST,
      valorICMSST                   = v_valorICMSST,
      baseICMSSTAnteriormente       = v_baseICMSSTAnteriormente,
      valorICMSSTAnteriormente      = v_valorICMSSTAnteriormente,
      valorICMSProprioSubstituto    = v_valorICMSProprioSubstituto,
      baseICMSEfetivo               = v_baseICMSEfetivo,
      valorICMSEfetivo              = v_valorICMSEfetivo,
      baseICMSUFDestinatario        = v_baseICMSUFDestinatario,
      valorICMSUFDestinatario       = v_valorICMSUFDestinatario,
      baseICMSUFRemetente           = v_baseICMSUFRemetente,
      valorICMSUFRemetente          = v_valorICMSUFRemetente,
      baseFCP                       = v_baseFCP,
      valorFCP                      = v_valorFCP,
      baseFCPST                     = v_baseFCPST,
      valorFCPST                    = v_valorFCPST,
      baseFCPSTAnteriormente        = v_baseFCPSTAnteriormente,
      valorFCPSTAnteriormente       = v_valorFCPSTAnteriormente,
      baseFCPUFDestinatario         = v_baseFCPUFDestinatario,
      valorFCPUFDestinatario        = v_valorFCPUFDestinatario,
      baseEstimadaImpostos          = v_baseEstimadaImpostos,
      valorEstimadoImpFederais      = v_valorEstimadoImpFederais,
      valorEstimadoImpEstaduais     = v_valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais    = v_valorEstimadoImpMunicipais,
      valorLiquidoItem              = v_valorLiquidoItem
    WHERE idItemOrcamento           = a.idItemOrcamento;
    IF a.tipoProduto = '09' THEN
      r_cab_valorServicos            := r_cab_valorServicos + v_valorProdutoServico;
    ELSE
      r_cab_valorProdutos            := r_cab_valorProdutos + v_valorProdutoServico;
    END IF;
    r_cab_valorBasePagamento       := r_cab_valorBasePagamento + v_valorBasePagamento;
    IF a.usarPrecoAVista = 1 AND a.geraFinanceiro = 1 THEN
      r_cab_valorAVistaMinimo        := r_cab_valorAVistaMinimo + v_valorProdutoServico + a.valorDescontoPagamento - a.valorOutrasDespesasPagamento - a.valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
    END IF;
    r_cab_valorFreteTotal          := r_cab_valorFreteTotal + v_valorFreteTotal;
    r_cab_valorSeguroTotal         := r_cab_valorSeguroTotal + v_valorSeguroTotal;
    r_cab_valorDescontoTotal       := r_cab_valorDescontoTotal + v_valorDescontoTotal;
    r_cab_valorOutrasDespesasTotal := r_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
    r_cab_valorAdicFreteMarinTotal := r_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
    r_cab_valorDespesasAduanTotal  := r_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
    r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem + v_valorLiquidoItem;
  END LOOP;
END ADD_ORCAMENTO_CALC_IMP_ITENS;

/

create or replace PROCEDURE ADD_ORCAMENTO_CALC_IMP_CAB (
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_orcamento                IN NUMBER,
  p_troca_tipoPagamentoFrete     IN NUMBER,
  p_a_cab_tipoPagamentoFrete     IN CHAR)
IS
  v_cab_valorProdutos            NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarinTotal NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_calcularImpostosItem         NUMBER;
BEGIN
  FOR a IN (
    SELECT a.*,
      pess.indicadorInscricaoEstadual,
      COALESCE((
        SELECT MIN(munEndEst.uf)
        FROM PAESTABELECIMENTOS est
        JOIN CAENDERECOSPESSOA endEst
        ON endEst.pessoa = est.pessoaEstabelecimento
        JOIN SIMUNICIPIOS munEndEst
        ON munEndEst.municipio = endEst.municipio
        WHERE est.estabelecimento = a.estabelecimento
        AND endEst.ativo = 1
        AND endEst.principal = 1
        ),'  ') munEndEst_uf
    FROM MOORCAMENTOS a
    JOIN CAPESSOAS pess
    ON pess.pessoa = a.pessoa
    WHERE a.orcamento = p_cab_orcamento)
  LOOP
    v_cab_valorProdutos            := a.valorProdutos;
    v_cab_valorServicos            := a.valorServicos;
    v_cab_valorBasePagamento       := a.valorBasePagamento;
    v_cab_valorAVistaMinimo        := a.valorAVistaMinimo;
    v_cab_valorFreteTotal          := a.valorFreteTotal;
    v_cab_valorSeguroTotal         := a.valorSeguroTotal;
    v_cab_valorDescontoTotal       := a.valorDescontoTotal;
    v_cab_valorOutrasDespesasTotal := a.valorOutrasDespesasTotal;
    v_cab_valorAdicFreteMarinTotal := a.valorAdicFreteMarinhaMerTotal;
    v_cab_valorDespesasAduanTotal  := a.valorDespesasAduaneirasTotal;
    v_cab_valorLiquidoItem         := a.valorLiquidoItem;
    ADD_ORCAMENTO_CALC_IMP_RATEIO (
      a.orcamento,
      p_troca_tipoPagamentoFrete,
      p_a_cab_tipoPagamentoFrete,
      a.origemDocumento,
      a.modeloDocumento,
      a.entradaSaida,
      a.atualizaCustoMedio,
      a.tipoPagamentoFrete,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorDescontoGeral,
      a.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      a.impostosEditados,
      /* Retornos */
      v_cab_valorProdutos,
      v_cab_valorServicos,
      v_cab_valorBasePagamento,
      v_cab_valorAVistaMinimo,
      v_cab_valorFreteTotal,
      v_cab_valorSeguroTotal,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespesasTotal,
      v_cab_valorAdicFreteMarinTotal,
      v_cab_valorDespesasAduanTotal,
      v_cab_valorLiquidoItem,
      v_calcularImpostosItem);
    IF v_calcularImpostosItem = 1 THEN
      ADD_ORCAMENTO_CALC_IMP_ITENS (
        p_config_64_casasDecSaidas,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        a.orcamento,
        a.origemDocumento,
        a.entradaSaida,
        a.estabelecimento,
        a.dataEmissao,
        a.pessoa,
        a.localDestinoOperacao,
        a.indicadorConsumidorFinal,
        a.tipoPagamentoFrete,
        a.indicadorInscricaoEstadual,
        /* Retornos */
        v_cab_valorProdutos,
        v_cab_valorServicos,
        v_cab_valorBasePagamento,
        v_cab_valorAVistaMinimo,
        v_cab_valorFreteTotal,
        v_cab_valorSeguroTotal,
        v_cab_valorDescontoTotal,
        v_cab_valorOutrasDespesasTotal,
        v_cab_valorAdicFreteMarinTotal,
        v_cab_valorDespesasAduanTotal,
        v_cab_valorLiquidoItem);
    END IF;
    UPDATE MOORCAMENTOS SET 
      valorProdutos                 = v_cab_valorProdutos,
      valorServicos                 = v_cab_valorServicos,
      valorBasePagamento            = v_cab_valorBasePagamento,
      valorAVistaMinimo             = v_cab_valorAVistaMinimo,
      valorFreteTotal               = v_cab_valorFreteTotal,
      valorSeguroTotal              = v_cab_valorSeguroTotal,
      valorDescontoTotal            = v_cab_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarinTotal,
      valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
      valorLiquidoItem              = v_cab_valorLiquidoItem
    WHERE orcamento                 = a.orcamento;
  END LOOP;
END ADD_ORCAMENTO_CALC_IMP_CAB;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_PREV_INSERE (
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_munEndEst_uf                 IN CHAR,
  p_munEndPess_uf                 IN CHAR,
  p_item_idItemOrcamento         IN NUMBER,
  p_item_atividadeServico        IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_tipoPreco               IN CHAR,
  p_item_tabelaPreco             IN VARCHAR,
  p_item_precoUnitario           IN NUMBER,
  /* Retornos */
  r_inseriuAtividadePrevista     OUT NUMBER)
IS
  v_sequenciaAtividade      NUMBER;
  v_tecnico                 NUMBER;
  v_checklist               NUMBER;
  v_auxNumber               NUMBER;
BEGIN
  r_inseriuAtividadePrevista := 0;
  v_sequenciaAtividade := 0;
  SELECT COALESCE (MAX (tecnico), 0)
  INTO v_tecnico
  FROM CATECNICOS
  WHERE tecnico = p_usuarioLogado
  AND ativo = 1;
  FOR a IN (
    SELECT
      a.atividadeServicoPrevista,
      a.tecnico,
      a.faturarAtividade,
      a.etapaAtividade,
      a.observacoes,
      COALESCE ((
        SELECT MAX (b.checklist)
        FROM (
          SELECT
            b.atividadeServico,
            b.checklist,
            ROW_NUMBER() OVER (
              PARTITION BY b.atividadeServico
              ORDER BY
                b.atividadeServico,
                b.ordenacao,
                b.id) ordenacao
          FROM PAATIVIDADESERVXCHECKLIST b
          WHERE b.ativo = 1) b
        WHERE b.atividadeServico = a.atividadeServicoPrevista
        AND b.ordenacao = 1), 0) checklist,
      CASE ativ.gradeProduto
        WHEN 0
        THEN 0
        WHEN p_item_gradeProduto
        THEN p_item_precoUnitario
        ELSE FUNC_ADD_BUSCA_PRECO (
          p_config_64_casasDecSaidas,
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_perfilUsuarioLogado,
          p_usuarioLogado,
          p_cab_estabelecimento,
          SYSDATE, -- p_cab_dataPrecoFinal
          p_cab_pessoa,
          p_munEndEst_uf,
          p_munEndPess_uf,
          p_item_vendedor,
          0, -- p_item_idFormulaTinta
          0, -- p_item_personalizacao
          gradProd.produto,
          gradProd.cor,
          gradProd.tamanho,
          prod.controleEstoque,
          p_item_tipoPreco,
          p_item_tabelaPreco)
      END precoUnitario
    FROM PAATIVIDADEOSXPREVISTA a
    JOIN PAATIVIDADESSERVICO ativ
    ON ativ.atividadeServico = a.atividadeServicoPrevista
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = ativ.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE a.atividadeServicoOs = p_item_atividadeServico
    AND a.ativo = 1
    AND a.sugestao = 1
    ORDER BY
      a.atividadeServicoOs,
      a.ordenacao,
      a.id)
  LOOP
    r_inseriuAtividadePrevista := 1;
    v_sequenciaAtividade := v_sequenciaAtividade + 1;  
    ADD_ORCAMENTO_ITEM_PREV_GRAVA (
      p_estabelecimentoAtivo,
      0,
      p_item_idItemOrcamento,
      v_sequenciaAtividade,
      a.atividadeServicoPrevista,
      ' ',
      CASE WHEN v_sequenciaAtividade = 1 AND a.tecnico = 0 THEN v_tecnico ELSE a.tecnico END,
      a.faturarAtividade,
      a.checklist,
      a.etapaAtividade,
      CASE WHEN v_sequenciaAtividade = 1 THEN CASE WHEN CASE WHEN a.tecnico = 0 THEN v_tecnico ELSE a.tecnico END = p_usuarioLogado THEN 'I' ELSE 'P' END ELSE 'A' END,
      CASE WHEN v_sequenciaAtividade = 1 THEN SYSDATE ELSE NULL END,
      CASE WHEN v_sequenciaAtividade = 1 THEN SYSDATE ELSE NULL END,
      0,
      a.precoUnitario,
      a.observacoes,
      1,
      CASE WHEN v_sequenciaAtividade = 1 AND CASE WHEN a.tecnico = 0 THEN v_tecnico ELSE a.tecnico END = p_usuarioLogado THEN 1 ELSE 0 END,
      0,
      CASE WHEN v_sequenciaAtividade = 1 AND CASE WHEN a.tecnico = 0 THEN v_tecnico ELSE a.tecnico END = p_usuarioLogado THEN SYSDATE ELSE NULL END,
      NULL,
      0,
      /* Retornos */
      v_auxNumber,
      v_auxNumber);
  END LOOP;
  IF r_inseriuAtividadePrevista = 0 THEN
    SELECT COALESCE (MAX (validoPrevisto), 0)
    INTO v_auxNumber
    FROM PAATIVIDADESSERVICO
    WHERE atividadeServico = p_item_atividadeServico;
    IF v_auxNumber = 1 THEN
      SELECT COALESCE (MAX (c.checklist),0)
      INTO v_checklist
      FROM (
        SELECT
          b.checklist,
          ROW_NUMBER() OVER (
            ORDER BY
              b.ordenacao,
              b.id) ordenacao
        FROM PAATIVIDADESERVXCHECKLIST b
        WHERE b.atividadeServico = p_item_atividadeServico
        AND b.ativo = 1) c
      WHERE c.ordenacao = 1;
      r_inseriuAtividadePrevista := 1;
      ADD_ORCAMENTO_ITEM_PREV_GRAVA (
        p_estabelecimentoAtivo,
        0,
        p_item_idItemOrcamento,
        1,
        p_item_atividadeServico,
        ' ',
        v_tecnico,
        'N',
        v_checklist,
        0,
        'P',
        SYSDATE,
        SYSDATE,
        0,
        p_item_precoUnitario,
        ' ',
        1,
        0,
        0,
        NULL,
        NULL,
        0,
        /* Retornos */
        v_auxNumber,
        v_auxNumber);
    END IF;
  END IF;
END ADD_ORCAMENTO_ITEM_PREV_INSERE;

/

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_config_413_obs_add_marca     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, 'F' Fatura Contrato, 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_atividadeProjeto        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_item_idItemOrcamento  IN VARCHAR2,
  /* Retornos */
  r_mensagemAviso                OUT VARCHAR,
  r_calcularImpostos             OUT NUMBER,
  r_item_idItemOrcamento         OUT NUMBER,
  r_buffer_item_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_projeto                  VARCHAR2 (60);
  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_unidadeMedida           VARCHAR2(6);
  v_prod_controleEstoque         NUMBER;
  v_prod_pesoLiquido             NUMBER;
  v_prod_pesoBruto               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_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_ativ_numero                  NUMBER;
  v_ativ_quantidade              NUMBER;
  v_ativ_precoUnitarioMenor      NUMBER;
  v_ativ_precoUnitario           NUMBER;
  v_ativ_valorTotalItem          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_item_idItemOrcamento := p_buffer_item_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.projeto,
    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_projeto,
    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.unidadeMedida,
    prod.controleEstoque,
    prod.pesoLiquido,
    prod.pesoBruto,
    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_unidadeMedida,
    v_prod_controleEstoque,
    v_prod_pesoLiquido,
    v_prod_pesoBruto,
    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 / ((v_combo_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 / ((v_combo_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_cab_projeto,
        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_config_413_obs_add_marca,
        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_atividadeProjeto,
        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_item_idItemOrcamento,
        r_mensagemAviso,
        r_calcularImpostos,
        v_auxNumber, -- idItemOrcamento
        r_buffer_item_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_item_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
      SELECT COALESCE (MAX (sequencia),0) + 1
      INTO v_item_sequencia
      FROM MOORCAMENTOXITENS
      WHERE orcamento = p_item_orcamento;
      v_cab_ultimoVendedorItem := p_item_vendedor;
    END IF;
    IF v_item_cancelado = 0 THEN
      IF p_manterFinanceiro_Retotalizar <> 2 THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume + TRUNC(CASE WHEN p_item_controleQuantidade = 1 AND p_item_loteMultiplo <> 0 THEN p_item_quantidade / p_item_loteMultiplo ELSE p_item_quantidadeConvertida END,0);
        END IF;
        v_cab_pesoLiquido := v_cab_pesoLiquido + p_item_pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto + p_item_pesoBruto;
      END IF;
      v_cab_quantidade := v_cab_quantidade + p_item_quantidadeConvertida;
      IF v_prod_tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorServicos := v_cab_valorServicos + v_item_valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos + p_item_valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorProdutos := v_cab_valorProdutos + v_item_valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos + p_item_valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem + p_item_valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem + p_item_valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem + p_item_valorAdicFreteMarItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem + p_item_valorDespesasAduanItem;
      v_cab_valorFreteGeral := v_cab_valorFreteGeral + v_item_valorFreteGeral;
      v_cab_valorSeguroGeral := v_cab_valorSeguroGeral + p_item_valorSeguroGeral;
      v_cab_valorDescontoGeral := v_cab_valorDescontoGeral + v_item_valorDescontoGeral;
      v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral + p_item_valorOutrasDespesasGer;
      v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral + p_item_valorAdicFreteMarGeral;
      v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral + p_item_valorDespesasAduanGeral;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento + v_item_valorBasePagamento;
      IF p_item_usarPrecoAVista = 1
        AND v_item_geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo + v_item_valorProdutoServico - v_item_valorDescontoTotal + v_item_valorOutrasDespesasTot;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento + v_item_valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento + v_item_valorOutrasDespPagament;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento + v_item_valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal + v_item_valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal + v_item_valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal + v_item_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_item_valorOutrasDespesasTot;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal + v_item_valorAdicFreteMarTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal + v_item_valorDespesasAduanTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem + v_item_valorLiquidoItem;
    ELSE
      v_item_quantidadeSaldo := 0;
    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 = p_item_orcamento;
    IF p_item_idItemOrcamento > 0 THEN
      DELETE MOORCAMENTOXCOMPOSICOESPR compDoc
      WHERE compDoc.idItemOrcamento = p_item_idItemOrcamento
      AND EXISTS(
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.produto = comp.produto
        WHERE comp.composicaoPreco = compDoc.composicaoPreco
        AND gradProd.gradeProduto <> p_item_gradeProduto);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      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_413_obs_add_marca,
      ' ',
      0,
      'O',
      p_item_idItemOrcamento,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    MERGE INTO MOORCAMENTOXITENS a USING (
      SELECT
        r_item_idItemOrcamento         idItemOrcamento,
        p_item_orcamento               orcamento,
        v_item_sequencia               sequencia,
        v_item_cancelado               cancelado,
        p_item_pedidoCompraFornecedor  pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo sequenciaPedidoCompraFornec,
        p_item_ambiente                ambiente,
        p_item_ambienteObservacoes     ambienteObservacoes,
        p_item_modeloDocumento         modeloDocumento,
        p_item_estabelecimentoOriginal estabelecimentoOriginal,
        p_item_vendedor                vendedor,
        p_item_gradeProduto            gradeProduto,
        p_item_atividadeServico        atividadeServico,
        p_item_statusAtividadeServico  statusAtividadeServico,
        p_item_idFormulaTinta          idFormulaTinta,
        p_item_personalizacao          personalizacao,
        p_item_idLoteEstoque           idLoteEstoque,
        p_item_vinculoItemDocumento    vinculoItemDocumento,
        p_item_operacaoFiscal          operacaoFiscal,
        v_item_movimentaEstoque        movimentaEstoque,
        v_item_geraFinanceiro          geraFinanceiro,
        p_item_localEstoque            localEstoque,
        p_item_pessoaParticipante      pessoaParticipante,
        p_item_dataEntrega             dataEntrega,
        p_item_controleQuantidade      controleQuantidade,
        p_item_unidadeMedidaConversao  unidadeMedidaConversao,
        p_item_conversorQuantidade     conversorQuantidade,
        p_item_loteMinimo              loteMinimo,
        p_item_loteMultiplo            loteMultiplo,
        p_item_altura                  altura,
        p_item_largura                 largura,
        p_item_comprimento             comprimento,
        p_item_pecas                   pecas,
        p_item_quantidade              quantidade,
        p_item_quantidadeConvertida    quantidadeConvertida,
        v_item_quantidadeSaldo         quantidadeSaldo,
        p_item_controleEntrega         controleEntrega,
        p_item_pesoLiquido             pesoLiquido,
        p_item_pesoBruto               pesoBruto,
        p_item_tipoPreco               tipoPreco,
        p_item_tabelaPreco             tabelaPreco,
        p_item_precoSugestaoAPrazo     precoSugestaoAPrazo,
        p_item_precoSugestaoAVista     precoSugestaoAVista,
        p_item_precoDesconto           precoDesconto,
        p_item_precoMinimo             precoMinimo,
        p_item_usarPrecoAVista         usarPrecoAVista,
        p_item_precoUnitarioBruto      precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos acrescimoUnitarioComposicao,
        v_item_precoUnitario           precoUnitario,
        v_item_precoUnitarioConvertido precoUnitarioConvertido,
        v_item_valorProdutoServicoBrut valorProdutoServicoBruto,
        v_item_valorProdutoServico     valorProdutoServico,
        p_item_percDescontoItem        percDescontoItem,
        p_item_valorDescontoItem       valorDescontoItem,
        p_item_percAcrescimoItem       percAcrescimoItem,
        p_item_valorAcrescimoItem      valorAcrescimoItem,
        p_item_valorFreteItem          valorFreteItem,
        p_item_valorSeguroItem         valorSeguroItem,
        p_item_valorAdicFreteMarItem   valorAdicFreteMarinhaMerItem,
        p_item_valorDespesasAduanItem  valorDespesasAduaneirasItem,
        v_item_valorFreteGeral         valorFreteGeral,
        p_item_valorSeguroGeral        valorSeguroGeral,
        v_item_valorDescontoGeral      valorDescontoGeral,
        p_item_valorOutrasDespesasGer  valorOutrasDespesasGeral,
        p_item_valorAdicFreteMarGeral  valorAdicFreteMarinhaMerGeral,
        p_item_valorDespesasAduanGeral valorDespesasAduaneirasGeral,
        v_item_valorBasePagamento      valorBasePagamento,
        v_item_valorDescontoPagamento  valorDescontoPagamento,
        v_item_valorOutrasDespPagament valorOutrasDespesasPagamento,
        v_item_valorJurosPagamento     valorJurosPagamento,
        v_item_valorFreteTotal         valorFreteTotal,
        v_item_valorSeguroTotal        valorSeguroTotal,
        v_item_valorDescontoTotal      valorDescontoTotal,
        v_item_valorOutrasDespesasTot  valorOutrasDespesasTotal,
        v_item_valorAdicFreteMarTotal  valorAdicFreteMarinhaMerTotal,
        v_item_valorDespesasAduanTotal valorDespesasAduaneirasTotal,
        v_item_cfop                    cfop,
        v_item_indicadorISSQN          indicadorISSQN,
        v_item_aliquotaISSQN           aliquotaISSQN,
        v_item_retidoISSQN             retidoISSQN,
        v_item_tributadoForaMunicipio  tributadoForaMunicipio,
        v_item_incentivoFiscal         incentivoFiscal,
        v_item_listaServicos           listaServicos,
        v_item_cnae                    cnae,
        v_item_idServicoMunicipio      idServicoMunicipio,
        v_item_numeroProcessoAdministr numeroProcessoAdministrativo,
        v_item_baseISSQN               baseISSQN,
        v_item_valorISSQN              valorISSQN,
        v_item_retencaoIRRF            retencaoIRRF,
        v_item_baseRetIRRF             baseRetIRRF,
        v_item_valorRetIRRF            valorRetIRRF,
        v_item_retencaoINSS            retencaoINSS,
        v_item_baseRetINSS             baseRetINSS,
        v_item_valorRetINSS            valorRetINSS,
        v_item_retencaoPIS             retencaoPIS,
        v_item_baseRetPIS              baseRetPIS,
        v_item_valorRetPIS             valorRetPIS,
        v_item_retencaoCOFINS          retencaoCOFINS,
        v_item_baseRetCOFINS           baseRetCOFINS,
        v_item_valorRetCOFINS          valorRetCOFINS,
        v_item_retencaoCSLL            retencaoCSLL,
        v_item_baseRetCSLL             baseRetCSLL,
        v_item_valorRetCSLL            valorRetCSLL,
        v_item_retencaoOutros          retencaoOutros,
        v_item_baseRetOutros           baseRetOutros,
        v_item_valorRetOutros          valorRetOutros,
        v_item_aliquotaII              aliquotaII,
        v_item_baseII                  baseII,
        v_item_valorII                 valorII,
        v_item_aliquotaIOF             aliquotaIOF,
        v_item_baseIOF                 baseIOF,
        v_item_valorIOF                valorIOF,
        v_item_codigoEnquadramentoIPI  codigoEnquadramentoIPI,
        v_item_stIPI                   stIPI,
        v_item_aliquotaIPI             aliquotaIPI,
        v_item_valorAliquotaIPI        valorAliquotaIPI,
        v_item_baseIPI                 baseIPI,
        v_item_valorIPI                valorIPI,
        v_item_stPIS                   stPIS,
        v_item_aliquotaPIS             aliquotaPIS,
        v_item_valorAliquotaPIS        valorAliquotaPIS,
        v_item_basePIS                 basePIS,
        v_item_valorPIS                valorPIS,
        v_item_aliquotaPISST           aliquotaPISST,
        v_item_valorAliquotaPISST      valorAliquotaPISST,
        v_item_basePISST               basePISST,
        v_item_valorPISST              valorPISST,
        v_item_stCOFINS                stCOFINS,
        v_item_aliquotaCOFINS          aliquotaCOFINS,
        v_item_valorAliquotaCOFINS     valorAliquotaCOFINS,
        v_item_baseCOFINS              baseCOFINS,
        v_item_valorCOFINS             valorCOFINS,
        v_item_aliquotaCOFINSST        aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST   valorAliquotaCOFINSST,
        v_item_baseCOFINSST            baseCOFINSST,
        v_item_valorCOFINSST           valorCOFINSST,
        v_item_stSimplesNacional       stSimplesNacional,
        v_item_creditoSimplesNacional  creditoSimplesNacional,
        v_item_baseCreditoSimplesNac   baseCreditoSimplesNacional,
        v_item_valorCreditoSimplesNac  valorCreditoSimplesNacional,
        v_item_stICMS                  stICMS,
        v_item_modalBaseCalcICMS       modalidadeBaseCalcICMS,
        v_item_reducaoBaseICMS         reducaoBaseICMS,
        v_item_aliquotaICMS            aliquotaICMS,
        v_item_diferimentoICMS         diferimentoICMS,
        v_item_motivoDesoneracaoICMS   motivoDesoneracaoICMS,
        v_item_idBeneficio             idBeneficio,
        v_item_baseICMS                baseICMS,
        v_item_valorICMSOperacao       valorICMSOperacao,
        v_item_valorICMSDiferido       valorICMSDiferido,
        v_item_valorICMS               valorICMS,
        v_item_valorICMSDesoneracao    valorICMSDesoneracao,
        v_item_modalBaseCalcICMSST     modalidadeBaseCalcICMSST,
        v_item_margemValorAdicionadoST margemValorAdicionadoST,
        v_item_reducaoBaseST           reducaoBaseST,
        v_item_aliquotaICMSST          aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin aliquotaSTSuportConsFinal,
        v_item_baseICMSST              baseICMSST,
        v_item_valorICMSST             valorICMSST,
        v_item_baseICMSSTAnteriormente baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment valorICMSSTAnteriormente,
        v_item_valorICMSProprioSubstit valorICMSProprioSubstituto,
        v_item_reducaoBaseICMSEfetivo  reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo     aliquotaICMSEfetivo,
        v_item_baseICMSEfetivo         baseICMSEfetivo,
        v_item_valorICMSEfetivo        valorICMSEfetivo,
        v_item_aliquotaICMSUFDestinat  aliquotaICMSUFDestinatario,
        v_item_aliquotaICMSInterestad  aliquotaICMSInterestadual,
        v_item_partilhaICMSInterestad  partilhaICMSInterestadual,
        v_item_baseICMSUFDestinatario  baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente     baseICMSUFRemetente,
        v_item_valorICMSUFRemetente    valorICMSUFRemetente,
        v_item_aliquotaFCP             aliquotaFCP,
        v_item_baseFCP                 baseFCP,
        v_item_valorFCP                valorFCP,
        v_item_aliquotaFCPST           aliquotaFCPST,
        v_item_baseFCPST               baseFCPST,
        v_item_valorFCPST              valorFCPST,
        v_item_aliquotaFCPSTAnteriorm  aliquotaFCPSTAnteriormente,
        v_item_baseFCPSTAnteriormente  baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente valorFCPSTAnteriormente,
        v_item_aliquotaFCPUFDestinat   aliquotaFCPUFDestinatario,
        v_item_baseFCPUFDestinatario   baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario  valorFCPUFDestinatario,
        v_item_aliquotaEstImpFederais  aliquotaEstimadaImpFederais,
        v_item_aliquotaEstImpEstaduais aliquotaEstimadaImpEstaduais,
        v_item_aliquotaEstImpMunicipai aliquotaEstimadaImpMunicipais,
        v_item_baseEstimadaImpostos    baseEstimadaImpostos,
        v_item_valorEstImpFederais     valorEstimadoImpFederais,
        v_item_valorEstImpEstaduais    valorEstimadoImpEstaduais,
        v_item_valorEstImpMunicipais   valorEstimadoImpMunicipais,
        v_item_valorLiquidoItem        valorLiquidoItem,
        p_item_observacoesDigitadas    observacoesDigitadas,
        v_observacoes                  observacoes
      FROM DUAL) b
    ON (a.idItemOrcamento = b.idItemOrcamento)
    WHEN MATCHED THEN UPDATE SET
      a.orcamento                     = b.orcamento,
      a.sequencia                     = b.sequencia,
      a.cancelado                     = b.cancelado,
      a.pedidoCompraFornecedor        = b.pedidoCompraFornecedor,
      a.sequenciaPedidoCompraFornec   = b.sequenciaPedidoCompraFornec,
      a.ambiente                      = b.ambiente,
      a.ambienteObservacoes           = b.ambienteObservacoes,
      a.vendedor                      = b.vendedor,
      a.modeloDocumento               = b.modeloDocumento,
      a.estabelecimentoOriginal       = b.estabelecimentoOriginal,
      a.gradeProduto                  = b.gradeProduto,
      a.atividadeServico              = b.atividadeServico,
      a.statusAtividadeServico        = b.statusAtividadeServico,
      a.idFormulaTinta                = b.idFormulaTinta,
      a.personalizacao                = b.personalizacao,
      a.idLoteEstoque                 = b.idLoteEstoque,
      a.vinculoItemDocumento          = b.vinculoItemDocumento,
      a.operacaoFiscal                = b.operacaoFiscal,
      a.movimentaEstoque              = b.movimentaEstoque,
      a.geraFinanceiro                = b.geraFinanceiro,
      a.localEstoque                  = b.localEstoque,
      a.pessoaParticipante            = b.pessoaParticipante,
      a.dataEntrega                   = b.dataEntrega,
      a.controleQuantidade            = b.controleQuantidade,
      a.unidadeMedidaConversao        = b.unidadeMedidaConversao,
      a.conversorQuantidade           = b.conversorQuantidade,
      a.loteMinimo                    = b.loteMinimo,
      a.loteMultiplo                  = b.loteMultiplo,
      a.altura                        = b.altura,
      a.largura                       = b.largura,
      a.comprimento                   = b.comprimento,
      a.pecas                         = b.pecas,
      a.quantidade                    = b.quantidade,
      a.quantidadeConvertida          = b.quantidadeConvertida,
      a.quantidadeSaldo               = b.quantidadeSaldo,
      a.controleEntrega               = b.controleEntrega,
      a.pesoLiquido                   = b.pesoLiquido,
      a.pesoBruto                     = b.pesoBruto,
      a.tipoPreco                     = b.tipoPreco,
      a.tabelaPreco                   = b.tabelaPreco,
      a.precoSugestaoAPrazo           = b.precoSugestaoAPrazo,
      a.precoSugestaoAVista           = b.precoSugestaoAVista,
      a.precoDesconto                 = b.precoDesconto,
      a.precoMinimo                   = b.precoMinimo,
      a.usarPrecoAVista               = b.usarPrecoAVista,
      a.precoUnitarioBruto            = b.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao   = b.acrescimoUnitarioComposicao,
      a.precoUnitario                 = b.precoUnitario,
      a.precoUnitarioConvertido       = b.precounitarioConvertido,
      a.valorProdutoServicoBruto      = b.valorProdutoServicoBruto,
      a.valorProdutoServico           = b.valorProdutoServico,
      a.percDescontoItem              = b.percDescontoItem,
      a.valorDescontoItem             = b.valorDescontoItem,
      a.percAcrescimoItem             = b.percAcrescimoItem,
      a.valorAcrescimoItem            = b.valorAcrescimoItem,
      a.valorFreteItem                = b.valorFreteItem,
      a.valorSeguroItem               = b.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem  = b.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem   = b.valorDespesasAduaneirasItem,
      a.valorFreteGeral               = b.valorFreteGeral,
      a.valorSeguroGeral              = b.valorSeguroGeral,
      a.valorDescontoGeral            = b.valorDescontoGeral,
      a.valorOutrasDespesasGeral      = b.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral = b.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral  = b.valorDespesasAduaneirasGeral,
      a.valorBasePagamento            = b.valorBasePagamento,
      a.valorDescontoPagamento        = b.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento  = b.valorOutrasDespesasPagamento,
      a.valorJurosPagamento           = b.valorJurosPagamento,
      a.valorFreteTotal               = b.valorFreteTotal,
      a.valorSeguroTotal              = b.valorSeguroTotal,
      a.valorDescontoTotal            = b.valorDescontoTotal,
      a.valorOutrasDespesasTotal      = b.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal = b.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal  = b.valorDespesasAduaneirasTotal,
      a.cfop                          = b.cfop,
      a.indicadorISSQN                = b.indicadorISSQN,
      a.aliquotaISSQN                 = b.aliquotaISSQN,
      a.baseISSQN                     = b.baseISSQN,
      a.valorISSQN                    = b.valorISSQN,
      a.retidoISSQN                   = b.retidoISSQN,
      a.tributadoForaMunicipio        = b.tributadoForaMunicipio,
      a.incentivoFiscal               = b.incentivoFiscal,
      a.listaServicos                 = b.listaServicos,
      a.cnae                          = b.cnae,
      a.idServicoMunicipio            = b.idServicoMunicipio,
      a.numeroProcessoAdministrativo  = b.numeroProcessoAdministrativo,
      a.retencaoIRRF                  = b.retencaoIRRF,
      a.baseRetIRRF                   = b.baseRetIRRF,
      a.valorRetIRRF                  = b.valorRetIRRF,
      a.retencaoINSS                  = b.retencaoINSS,
      a.baseRetINSS                   = b.baseRetINSS,
      a.valorRetINSS                  = b.valorRetINSS,
      a.retencaoPIS                   = b.retencaoPIS,
      a.baseRetPIS                    = b.baseRetPIS,
      a.valorRetPIS                   = b.valorRetPIS,
      a.retencaoCOFINS                = b.retencaoCOFINS,
      a.baseRetCOFINS                 = b.baseRetCOFINS,
      a.valorRetCOFINS                = b.valorRetCOFINS,
      a.retencaoCSLL                  = b.retencaoCSLL,
      a.baseRetCSLL                   = b.baseRetCSLL,
      a.valorRetCSLL                  = b.valorRetCSLL,
      a.retencaoOutros                = b.retencaoOutros,
      a.baseRetOutros                 = b.baseRetOutros,
      a.valorRetOutros                = b.valorRetOutros,
      a.aliquotaII                    = b.aliquotaII,
      a.baseII                        = b.baseII,
      a.valorII                       = b.valorII,
      a.aliquotaIOF                   = b.aliquotaIOF,
      a.baseIOF                       = b.baseIOF,
      a.valorIOF                      = b.valorIOF,
      a.codigoEnquadramentoIPI        = b.codigoEnquadramentoIPI,
      a.stIPI                         = b.stIPI,
      a.aliquotaIPI                   = b.aliquotaIPI,
      a.valorAliquotaIPI              = b.valorAliquotaIPI,
      a.baseIPI                       = b.baseIPI,
      a.valorIPI                      = b.valorIPI,
      a.stPIS                         = b.stPIS,
      a.aliquotaPIS                   = b.aliquotaPIS,
      a.valorAliquotaPIS              = b.valorAliquotaPIS,
      a.basePIS                       = b.basePIS,
      a.valorPIS                      = b.valorPIS,
      a.aliquotaPISST                 = b.aliquotaPISST,
      a.valorAliquotaPISST            = b.valorAliquotaPISST,
      a.basePISST                     = b.basePISST,
      a.valorPISST                    = b.valorPISST,
      a.stCOFINS                      = b.stCOFINS,
      a.aliquotaCOFINS                = b.aliquotaCOFINS,
      a.valorAliquotaCOFINS           = b.valorAliquotaCOFINS,
      a.baseCOFINS                    = b.baseCOFINS,
      a.valorCOFINS                   = b.valorCOFINS,
      a.aliquotaCOFINSST              = b.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST         = b.valorAliquotaCOFINSST,
      a.baseCOFINSST                  = b.baseCOFINSST,
      a.valorCOFINSST                 = b.valorCOFINSST,
      a.stSimplesNacional             = b.stSimplesNacional,
      a.creditoSimplesNacional        = b.creditoSimplesNacional,
      a.baseCreditoSimplesNacional    = b.baseCreditoSimplesNacional,
      a.valorCreditoSimplesNacional   = b.valorCreditoSimplesNacional,
      a.stICMS                        = b.stICMS,
      a.modalidadeBaseCalcICMS        = b.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS               = b.reducaoBaseICMS,
      a.aliquotaICMS                  = b.aliquotaICMS,
      a.diferimentoICMS               = b.diferimentoICMS,
      a.motivoDesoneracaoICMS         = b.motivoDesoneracaoICMS,
      a.idBeneficio                   = b.idBeneficio,
      a.baseICMS                      = b.baseICMS,
      a.valorICMSoperacao             = b.valorICMSoperacao,
      a.valorICMSdiferido             = b.valorICMSdiferido,
      a.valorICMS                     = b.valorICMS,
      a.valorICMSdesoneracao          = b.valorICMSdesoneracao,
      a.modalidadeBaseCalcICMSST      = b.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST       = b.margemValorAdicionadoST,
      a.reducaoBaseST                 = b.reducaoBaseST,
      a.aliquotaICMSST                = b.aliquotaICMSST,
      a.aliquotaSTSuportConsFinal     = b.aliquotaSTSuportConsFinal,
      a.baseICMSST                    = b.baseICMSST,
      a.valorICMSST                   = b.valorICMSST,
      a.baseICMSSTAnteriormente       = b.baseICMSSTAnteriormente,
      a.valorICMSSTAnteriormente      = b.valorICMSSTAnteriormente,
      a.valorICMSProprioSubstituto    = b.valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo        = b.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo           = b.aliquotaICMSEfetivo,
      a.baseICMSEfetivo               = b.baseICMSEfetivo,
      a.valorICMSEfetivo              = b.valorICMSEfetivo,
      a.aliquotaICMSUFDestinatario    = b.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual     = b.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual     = b.partilhaICMSInterestadual,
      a.baseICMSUFDestinatario        = b.baseICMSUFDestinatario,
      a.valorICMSUFDestinatario       = b.valorICMSUFDestinatario,
      a.baseICMSUFRemetente           = b.baseICMSUFRemetente,
      a.valorICMSUFRemetente          = b.valorICMSUFRemetente,
      a.aliquotaFCP                   = b.aliquotaFCP,
      a.baseFCP                       = b.baseFCP,
      a.valorFCP                      = b.valorFCP,
      a.aliquotaFCPST                 = b.aliquotaFCPST,
      a.baseFCPST                     = b.baseFCPST,
      a.valorFCPST                    = b.valorFCPST,
      a.aliquotaFCPSTAnteriormente    = b.aliquotaFCPSTAnteriormente,
      a.baseFCPSTAnteriormente        = b.baseFCPSTAnteriormente,
      a.valorFCPSTAnteriormente       = b.valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario     = b.aliquotaFCPUFDestinatario,
      a.baseFCPUFDestinatario         = b.baseFCPUFDestinatario,
      a.valorFCPUFDestinatario        = b.valorFCPUFDestinatario,
      a.aliquotaestimadaimpfederais   = b.aliquotaestimadaimpfederais,
      a.aliquotaestimadaimpestaduais  = b.aliquotaestimadaimpestaduais,
      a.aliquotaestimadaimpmunicipais = b.aliquotaestimadaimpmunicipais,
      a.baseestimadaimpostos          = b.baseestimadaimpostos,
      a.valorestimadoimpfederais      = b.valorestimadoimpfederais,
      a.valorEstimadoImpEstaduais     = b.valorEstimadoImpEstaduais,
      a.valorEstimadoImpMunicipais    = b.valorEstimadoImpMunicipais,
      a.valorLiquidoItem              = b.valorLiquidoItem,
      a.observacoesDigitadas          = b.observacoesDigitadas,
      a.observacoes                   = b.observacoes
    WHEN NOT MATCHED THEN INSERT (
      idItemOrcamento,
      orcamento,
      sequencia,
      cancelado,
      pedidoCompraFornecedor,
      sequenciaPedidoCompraFornec,
      ambiente,
      ambienteObservacoes,
      modeloDocumento,
      estabelecimentoOriginal,
      vendedor,
      gradeProduto,
      atividadeServico,
      statusAtividadeServico,
      idFormulaTinta,
      personalizacao,
      idLoteEstoque,
      vinculoItemDocumento,
      operacaoFiscal,
      movimentaEstoque,
      geraFinanceiro,
      localEstoque,
      pessoaParticipante,
      dataEntrega,
      controleQuantidade,
      unidadeMedidaConversao,
      conversorQuantidade,
      loteMinimo,
      loteMultiplo,
      altura,
      largura,
      comprimento,
      pecas,
      quantidade,
      quantidadeConvertida,
      quantidadeSaldo,
      controleEntrega,
      pesoLiquido,
      pesoBruto,
      tipoPreco,
      tabelaPreco,
      precoSugestaoAPrazo,
      precoSugestaoAVista,
      precoDesconto,
      precoMinimo,
      usarPrecoAVista,
      precoUnitarioBruto,
      acrescimoUnitarioComposicao,
      precoUnitario,
      precoUnitarioConvertido,
      valorProdutoServicoBruto,
      valorProdutoServico,
      percDescontoItem,
      valorDescontoItem,
      percAcrescimoItem,
      valorAcrescimoItem,
      valorFreteItem,
      valorSeguroItem,
      valorAdicFreteMarinhaMerItem,
      valorDespesasAduaneirasItem,
      valorFreteGeral,
      valorSeguroGeral,
      valorDescontoGeral,
      valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral,
      valorDespesasAduaneirasGeral,
      valorBasePagamento,
      valorDescontoPagamento,
      valorOutrasDespesasPagamento,
      valorJurosPagamento,
      valorFreteTotal,
      valorSeguroTotal,
      valorDescontoTotal,
      valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal,
      valorDespesasAduaneirasTotal,
      cfop,
      indicadorISSQN,
      aliquotaISSQN,
      retidoISSQN,
      tributadoForaMunicipio,
      incentivoFiscal,
      listaServicos,
      cnae,
      idServicoMunicipio,
      numeroProcessoAdministrativo,
      baseISSQN,
      valorISSQN,
      retencaoIRRF,
      baseRetIRRF,
      valorRetIRRF,
      retencaoINSS,
      baseRetINSS,
      valorRetINSS,
      retencaoPIS,
      baseRetPIS,
      valorRetPIS,
      retencaoCOFINS,
      baseRetCOFINS,
      valorRetCOFINS,
      retencaoCSLL,
      baseRetCSLL,
      valorRetCSLL,
      retencaoOutros,
      baseRetOutros,
      valorRetOutros,
      aliquotaII,
      baseII,
      valorII,
      aliquotaIOF,
      baseIOF,
      valorIOF,
      codigoEnquadramentoIPI,
      stIPI,
      aliquotaIPI,
      valorAliquotaIPI,
      baseIPI,
      valorIPI,
      stPIS,
      aliquotaPIS,
      valorAliquotaPIS,
      basePIS,
      valorPIS,
      aliquotaPISST,
      valorAliquotaPISST,
      basePISST,
      valorPISST,
      stCOFINS,
      aliquotaCOFINS,
      valorAliquotaCOFINS,
      baseCOFINS,
      valorCOFINS,
      aliquotaCOFINSST,
      valorAliquotaCOFINSST,
      baseCOFINSST,
      valorCOFINSST,
      stSimplesNacional,
      creditoSimplesNacional,
      baseCreditoSimplesNacional,
      valorCreditoSimplesNacional,
      stICMS,
      modalidadeBaseCalcICMS,
      reducaoBaseICMS,
      aliquotaICMS,
      diferimentoICMS,
      motivoDesoneracaoICMS,
      idBeneficio,
      baseICMS,
      valorICMSOperacao,
      valorICMSDiferido,
      valorICMS,
      valorICMSDesoneracao,
      modalidadeBaseCalcICMSST,
      margemValorAdicionadoST,
      reducaoBaseST,
      aliquotaICMSST,
      aliquotaSTSuportConsFinal,
      baseICMSST,
      valorICMSST,
      baseICMSSTAnteriormente,
      valorICMSSTAnteriormente,
      valorICMSProprioSubstituto,
      reducaoBaseICMSEfetivo,
      aliquotaICMSEfetivo,
      baseICMSEfetivo,
      valorICMSEfetivo,
      aliquotaICMSUFDestinatario,
      aliquotaICMSInterestadual,
      partilhaICMSInterestadual,
      baseICMSUFDestinatario,
      valorICMSUFDestinatario,
      baseICMSUFRemetente,
      valorICMSUFRemetente,
      aliquotaFCP,
      baseFCP,
      valorFCP,
      aliquotaFCPST,
      baseFCPST,
      valorFCPST,
      aliquotaFCPSTAnteriormente,
      baseFCPSTAnteriormente,
      valorFCPSTAnteriormente,
      aliquotaFCPUFDestinatario,
      baseFCPUFDestinatario,
      valorFCPUFDestinatario,
      aliquotaEstimadaImpFederais,
      aliquotaEstimadaImpEstaduais,
      aliquotaEstimadaImpMunicipais,
      baseEstimadaImpostos,
      valorEstimadoImpFederais,
      valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais,
      valorLiquidoItem,
      observacoesDigitadas,
      observacoes)
    VALUES (
      b.idItemOrcamento,
      b.orcamento,
      b.sequencia,
      b.cancelado,
      b.pedidoCompraFornecedor,
      b.sequenciaPedidoCompraFornec,
      b.ambiente,
      b.ambienteObservacoes,
      b.modeloDocumento,
      b.estabelecimentoOriginal,
      b.vendedor,
      b.gradeProduto,
      b.atividadeServico,
      b.statusAtividadeServico,
      b.idFormulaTinta,
      b.personalizacao,
      b.idLoteEstoque,
      b.vinculoItemDocumento,
      b.operacaoFiscal,
      b.movimentaEstoque,
      b.geraFinanceiro,
      b.localEstoque,
      b.pessoaParticipante,
      b.dataEntrega,
      b.controleQuantidade,
      b.unidadeMedidaConversao,
      b.conversorQuantidade,
      b.loteMinimo,
      b.loteMultiplo,
      b.altura,
      b.largura,
      b.comprimento,
      b.pecas,
      b.quantidade,
      b.quantidadeConvertida,
      b.quantidadeSaldo,
      b.controleEntrega,
      b.pesoLiquido,
      b.pesoBruto,
      b.tipoPreco,
      b.tabelaPreco,
      b.precoSugestaoAPrazo,
      b.precoSugestaoAVista,
      b.precoDesconto,
      b.precoMinimo,
      b.usarPrecoAVista,
      b.precoUnitarioBruto,
      b.acrescimoUnitarioComposicao,
      b.precoUnitario,
      b.precoUnitarioConvertido,
      b.valorProdutoServicoBruto,
      b.valorProdutoServico,
      b.percDescontoItem,
      b.valorDescontoItem,
      b.percAcrescimoItem,
      b.valorAcrescimoItem,
      b.valorFreteItem,
      b.valorSeguroItem,
      b.valorAdicFreteMarinhaMerItem,
      b.valorDespesasAduaneirasItem,
      b.valorFreteGeral,
      b.valorSeguroGeral,
      b.valorDescontoGeral,
      b.valorOutrasDespesasGeral,
      b.valorAdicFreteMarinhaMerGeral,
      b.valorDespesasAduaneirasGeral,
      b.valorBasePagamento,
      b.valorDescontoPagamento,
      b.valorOutrasDespesasPagamento,
      b.valorJurosPagamento,
      b.valorFreteTotal,
      b.valorSeguroTotal,
      b.valorDescontoTotal,
      b.valorOutrasDespesasTotal,
      b.valorAdicFreteMarinhaMerTotal,
      b.valorDespesasAduaneirasTotal,
      b.cfop,
      b.indicadorISSQN,
      b.aliquotaISSQN,
      b.retidoISSQN,
      b.tributadoForaMunicipio,
      b.incentivoFiscal,
      b.listaServicos,
      b.cnae,
      b.idServicoMunicipio,
      b.numeroProcessoAdministrativo,
      b.baseISSQN,
      b.valorISSQN,
      b.retencaoIRRF,
      b.baseRetIRRF,
      b.valorRetIRRF,
      b.retencaoINSS,
      b.baseRetINSS,
      b.valorRetINSS,
      b.retencaoPIS,
      b.baseRetPIS,
      b.valorRetPIS,
      b.retencaoCOFINS,
      b.baseRetCOFINS,
      b.valorRetCOFINS,
      b.retencaoCSLL,
      b.baseRetCSLL,
      b.valorRetCSLL,
      b.retencaoOutros,
      b.baseRetOutros,
      b.valorRetOutros,
      b.aliquotaII,
      b.baseII,
      b.valorII,
      b.aliquotaIOF,
      b.baseIOF,
      b.valorIOF,
      b.codigoEnquadramentoIPI,
      b.stIPI,
      b.aliquotaIPI,
      b.valorAliquotaIPI,
      b.baseIPI,
      b.valorIPI,
      b.stPIS,
      b.aliquotaPIS,
      b.valorAliquotaPIS,
      b.basePIS,
      b.valorPIS,
      b.aliquotaPISST,
      b.valorAliquotaPISST,
      b.basePISST,
      b.valorPISST,
      b.stCOFINS,
      b.aliquotaCOFINS,
      b.valorAliquotaCOFINS,
      b.baseCOFINS,
      b.valorCOFINS,
      b.aliquotaCOFINSST,
      b.valorAliquotaCOFINSST,
      b.baseCOFINSST,
      b.valorCOFINSST,
      b.stSimplesNacional,
      b.creditoSimplesNacional,
      b.baseCreditoSimplesNacional,
      b.valorCreditoSimplesNacional,
      b.stICMS,
      b.modalidadeBaseCalcICMS,
      b.reducaoBaseICMS,
      b.aliquotaICMS,
      b.diferimentoICMS,
      b.motivoDesoneracaoICMS,
      b.idBeneficio,
      b.baseICMS,
      b.valorICMSOperacao,
      b.valorICMSDiferido,
      b.valorICMS,
      b.valorICMSDesoneracao,
      b.modalidadeBaseCalcICMSST,
      b.margemValorAdicionadoST,
      b.reducaoBaseST,
      b.aliquotaICMSST,
      b.aliquotaSTSuportConsFinal,
      b.baseICMSST,
      b.valorICMSST,
      b.baseICMSSTAnteriormente,
      b.valorICMSSTAnteriormente,
      b.valorICMSProprioSubstituto,
      b.reducaoBaseICMSEfetivo,
      b.aliquotaICMSEfetivo,
      b.baseICMSEfetivo,
      b.valorICMSEfetivo,
      b.aliquotaICMSUFDestinatario,
      b.aliquotaICMSInterestadual,
      b.partilhaICMSInterestadual,
      b.baseICMSUFDestinatario,
      b.valorICMSUFDestinatario,
      b.baseICMSUFRemetente,
      b.valorICMSUFRemetente,
      b.aliquotaFCP,
      b.baseFCP,
      b.valorFCP,
      b.aliquotaFCPST,
      b.baseFCPST,
      b.valorFCPST,
      b.aliquotaFCPSTAnteriormente,
      b.baseFCPSTAnteriormente,
      b.valorFCPSTAnteriormente,
      b.aliquotaFCPUFDestinatario,
      b.baseFCPUFDestinatario,
      b.valorFCPUFDestinatario,
      b.aliquotaEstimadaImpFederais,
      b.aliquotaEstimadaImpEstaduais,
      b.aliquotaEstimadaImpMunicipais,
      b.baseEstimadaImpostos,
      b.valorEstimadoImpFederais,
      b.valorEstimadoImpEstaduais,
      b.valorEstimadoImpMunicipais,
      b.valorLiquidoItem,
      b.observacoesDigitadas,
      b.observacoes);
    v_atualizarObservacoes := 0;
    IF p_idItemReferenciado > 0 THEN
      IF p_tipoDocumentoReferenciado = 'C' THEN
        UPDATE MOPAINELCOMPRAXGRADE
        SET idItemOrcamento = r_item_idItemOrcamento
        WHERE idGradePainelCompra = p_idItemReferenciado;
      ELSIF p_tipoDocumentoReferenciado = 'F' THEN
        ADD_ORCAMENTO_ITEM_REF_CONTR (
          p_estabelecimentoAtivo,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      ELSIF p_tipoDocumentoReferenciado = 'L' THEN
        ADD_ORCAMENTO_ITEM_LISTA_GRAVA (
          p_estabelecimentoAtivo,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      ELSIF p_tipoDocumentoReferenciado = 'O' THEN
        ADD_ORCAMENTO_ITEM_REF_ORCAMEN (
          p_estabelecimentoAtivo,
          r_item_idItemOrcamento,
          p_item_quantidade,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'T' THEN
        ADD_ORCAMENTO_ITEM_TRANS_GRAVA (
          p_estabelecimentoAtivo,
          v_cab_entradaSaida,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      END IF;
    END IF;
    IF p_tempComp_nomeTempComposicao <> ' '
      AND (p_tipoDocumentoReferenciado <> 'O'
        OR p_idItemReferenciado <= 0)
    THEN
      ADD_ORCAMENTO_ITEM_COMP_TEMP (
        p_sessaoClient,
        p_estabelecimentoAtivo,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        r_item_idItemOrcamento,
        v_atualizarObservacoes,
        v_atualizarObservacoes);
    END IF;
    v_idEnderecoEstoque := 0;
    IF p_item_idEnderecoEstoque > 0 THEN
      ADD_ORCAMENTO_ITEM_ENDER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemOrcamento,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_quantidade,
        ' ',
        v_idEnderecoEstoque);
    END IF;
    IF p_item_idNumeroSerie > 0 THEN
      ADD_ORCAMENTO_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemOrcamento,
        v_idEnderecoEstoque,
        p_item_gradeProduto,
        p_item_idNumeroSerie,
        0,
        v_auxNumber);
      v_atualizarObservacoes := 1;
    END IF;
    IF p_item_atividadeProjeto > 0 THEN
      ADD_ORCAMENTO_ITEM_PROJ_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemOrcamento,
        p_item_atividadeProjeto,
        v_auxNumber);
    END IF;
    IF v_atualizarObservacoes = 1 THEN
      v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
        p_sessaoClient,
        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_413_obs_add_marca,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        'O',
        r_item_idItemOrcamento,
        p_item_gradeProduto,
        p_item_idFormulaTinta,
        p_item_personalizacao,
        p_item_idLoteEstoque,
        p_item_controleQuantidade,
        p_item_loteMultiplo,
        p_item_altura,
        p_item_largura,
        p_item_comprimento,
        p_item_quantidade,
        p_item_observacoesDigitadas);
      UPDATE MOORCAMENTOXITENS
      SET observacoes = v_observacoes
      WHERE idItemOrcamento = r_item_idItemOrcamento;
    END IF;
    IF v_etOrc_situacaoOrcamento > 40 THEN
      ADD_ORCAMENTO_ITEM_RES_ITEM (
        r_item_idItemOrcamento,
        p_estabelecimentoAtivo,
        ' ',
        v_auxVarchar);
    END IF;
    r_buffer_item_idItemOrcamento := CASE WHEN (r_buffer_item_idItemOrcamento IS NULL OR r_buffer_item_idItemOrcamento = '' OR r_buffer_item_idItemOrcamento = ' ') THEN '' ELSE RTRIM (r_buffer_item_idItemOrcamento) || ';' END || TO_CHAR (LPAD(r_item_idItemOrcamento,14,'0'));
    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;
    IF p_item_idItemOrcamento <= 0
      AND v_item_cancelado = 0
      AND p_item_atividadeServico > 0
    THEN
      SELECT habilitaAtividadePrevista
      INTO v_auxNumber
      FROM PAATIVIDADESSERVICO
      WHERE atividadeServico = p_item_atividadeServico;
      IF v_auxNumber = 1 THEN
        ADD_ORCAMENTO_ITEM_PREV_INSERE (
          p_config_64_casasDecSaidas,
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_perfilUsuarioLogado,
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_estabelecimento,
          v_cab_pessoa,
          v_munEndEst_uf,
          v_munEndPess_uf,
          r_item_idItemOrcamento,
          p_item_atividadeServico,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_tipoPreco,
          p_item_tabelaPreco,
          v_item_precoUnitario,
          v_auxNumber);
        IF v_auxNumber = 1 THEN
          SELECT
            COUNT (1) numeroAtividades,
            SUM (
              CASE
                WHEN prev.faturarAtividade = 'P'
                THEN prev.quantidade
                ELSE COALESCE ((
                  SELECT realiz.quantidade
                  FROM MOORCAMENTOXATIVIDADEREAL realiz
                  WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
                  AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
              END) quantidade,
            MIN (prev.precoUnitario) precoUnitarioMenor,
            MAX (prev.precoUnitario) precoUnitarioMaior,
            SUM (ROUND (
              CASE
                WHEN prev.faturarAtividade = 'P'
                THEN prev.quantidade
                ELSE COALESCE ((
                  SELECT realiz.quantidade
                  FROM MOORCAMENTOXATIVIDADEREAL realiz
                  WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
                  AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
              END * prev.precoUnitario, 2)) valorTotalItem
          INTO
            v_ativ_numero,
            v_ativ_quantidade,
            v_ativ_precoUnitarioMenor,
            v_ativ_precoUnitario,
            v_ativ_valorTotalItem
          FROM MOORCAMENTOXATIVIDADEPREV prev
          WHERE prev.idItemOrcamento = r_item_idItemOrcamento
          AND prev.statusAtividadeServico <> 'C'
          AND prev.faturarAtividade IN ('P','R');
          IF v_ativ_numero > 0 THEN
            IF v_ativ_numero > 1
              AND v_ativ_precoUnitarioMenor <> v_ativ_precoUnitario
              AND v_ativ_quantidade <> 0
            THEN
              v_ativ_precoUnitario := ROUND (v_ativ_valorTotalItem / v_ativ_quantidade, TO_NUMBER (p_config_64_casasDecSaidas));
            END IF;
          ELSE
            SELECT
              COUNT (1) numeroAtividades,
              SUM (COALESCE ((
                SELECT realiz.quantidade
                FROM MOORCAMENTOXATIVIDADEREAL realiz
                WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
                AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)) quantidade
            INTO
              v_ativ_numero,
              v_ativ_quantidade
            FROM MOORCAMENTOXATIVIDADEPREV prev
            JOIN PAATIVIDADESSERVICO ativ
            ON ativ.atividadeServico = prev.atividadeServico
            JOIN CAGRADESPRODUTO gradProd
            ON gradProd.gradeProduto = ativ.gradeProduto
            JOIN CAPRODUTOS prod
            ON prod.produto = gradProd.produto
            WHERE prev.idItemOrcamento = r_item_idItemOrcamento
            AND prev.statusAtividadeServico <> 'C'
            AND ativ.gradeProduto > 0
            AND prod.unidadeMedida = v_prod_unidadeMedida;
            v_ativ_precoUnitario := 0;
          END IF;
          IF v_ativ_numero > 0
            AND (v_ativ_quantidade <> p_item_quantidade
              OR v_ativ_precoUnitario <> v_item_precoUnitario)
          THEN
            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_config_413_obs_add_marca,
              0, -- p_manterFinanceiro_Retotalizar,
              'T', -- p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
              0, -- p_buscarGeraFinanceiroEstoque,
              ' ', -- p_tipoDocumentoReferenciado, 
              0, -- p_idItemReferenciado,
              0, -- p_quantidadeReferenciada
              ' ', -- p_tempComp_nomeTempComposicao,
              0, -- p_tempComp_sequencia
              ' ', -- p_mensagemAviso,
              r_calcularImpostos,
              r_item_idItemOrcamento,
              p_item_orcamento,
              p_item_pedidoCompraFornecedor,
              p_item_sequenciaPedidoCompraFo,
              p_item_ambiente,
              p_item_ambienteObservacoes,
              p_item_vinculoItemDocumento,
              p_item_atividadeServico,
              p_item_statusAtividadeServico,
              p_item_controleEntrega,
              p_item_dataEntrega,
              p_item_modeloDocumento,
              p_item_estabelecimentoOriginal,
              p_item_vendedor,
              p_item_gradeProduto,
              p_item_idFormulaTinta,
              p_item_personalizacao,
              p_item_idLoteEstoque,
              0, -- p_item_idEnderecoEstoque
              0, -- p_item_idNumeroSerie
              0, -- p_item_atividadeProjeto,
              p_item_localEstoque,
              p_item_pessoaParticipante,
              p_item_controleQuantidade,
              p_item_unidadeMedidaConversao,
              p_item_conversorQuantidade,
              p_item_loteMinimo,
              p_item_loteMultiplo,
              p_item_altura,
              p_item_largura,
              p_item_comprimento,
              CASE p_item_controleQuantidade
                WHEN 2
                THEN CASE WHEN p_item_altura = 0 OR p_item_largura = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100))), 3) END
                WHEN 3
                THEN CASE WHEN p_item_altura = 0 OR p_item_comprimento = 0 OR p_item_comprimento = 0 THEN 0 ELSE ROUND (v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100) * p_item_comprimento), 3) END
                WHEN 4
                THEN CASE WHEN p_item_conversorQuantidade = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / p_item_conversorQuantidade), 3) END
                ELSE 0
              END, -- p_item_pecas
              v_ativ_quantidade,
              CASE p_item_controleQuantidade
                WHEN 2
                THEN ROUND (CASE WHEN p_item_altura = 0 OR p_item_largura = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100))), 3) END, v_uniMedConv_casasDecimaisUnid)
                WHEN 3
                THEN ROUND (CASE WHEN p_item_altura = 0 OR p_item_comprimento = 0 OR p_item_comprimento = 0 THEN 0 ELSE ROUND (v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100) * p_item_comprimento), 3) END, v_uniMedConv_casasDecimaisUnid)
                WHEN 4
                THEN ROUND (CASE WHEN p_item_conversorQuantidade = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / p_item_conversorQuantidade), 3) END, v_uniMedConv_casasDecimaisUnid)
                ELSE v_ativ_quantidade
              END, -- p_item_quantidadeConvertida
              ROUND ((v_ativ_quantidade * v_prod_pesoLiquido), 3), -- p_item_pesoLiquido
              ROUND ((v_ativ_quantidade * v_prod_pesoBruto), 3), -- p_item_pesoBruto
              p_item_tipoPreco,
              p_item_tabelaPreco,
              p_item_precoSugestaoAPrazo,
              p_item_precoSugestaoAVista,
              p_item_precoDesconto,
              p_item_precoMinimo,
              p_item_usarPrecoAVista,
              v_ativ_precoUnitario, -- p_item_precoUnitarioBruto
              p_item_acrescimoUnitarioCompos,
              v_ativ_precoUnitario, -- p_item_precoUnitario
              p_item_percDescontoItem,
              p_item_valorDescontoItem,
              p_item_percAcrescimoItem,
              p_item_valorAcrescimoItem,
              p_item_valorFreteItem,
              p_item_valorSeguroItem,
              p_item_valorAdicFreteMarItem,
              p_item_valorDespesasAduanItem,
              p_item_observacoesDigitadas,
              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,
              p_item_operacaoFiscal,
              v_item_movimentaEstoque,
              v_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
              0, -- p_nivel,
              ' ',
              v_auxVarchar, -- r_mensagemAviso
              r_calcularImpostos,
              v_auxNumber, -- idItemOrcamento
              v_auxVarchar, -- r_buffer_item_idItemOrcamento
              v_auxNumber); -- r_valorInserido
          END IF;
        END IF;
      END IF;
    END IF;
  END IF;
END ADD_ORCAMENTO_ITEM_GRAVA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_PREV_RECALC (
  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_config_413_obs_add_marca     IN NUMBER,
  p_idItemOrcamento              IN NUMBER)
IS
  v_calcularImpostos        NUMBER;
  v_ativ_numero             NUMBER;
  v_ativ_quantidade         NUMBER;
  v_ativ_precoUnitarioMenor NUMBER;
  v_ativ_precoUnitario      NUMBER;
  v_ativ_valorTotalItem     NUMBER;
  v_auxNumber               NUMBER;
  v_auxVarchar              VARCHAR2 (32000);
BEGIN
  v_calcularImpostos := 0;
  SELECT
    COUNT (1) numeroAtividades,
    SUM (
      CASE
        WHEN prev.faturarAtividade = 'P'
        THEN prev.quantidade
        ELSE COALESCE ((
          SELECT realiz.quantidade
          FROM MOORCAMENTOXATIVIDADEREAL realiz
          WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
          AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
      END) quantidade,
    MIN (prev.precoUnitario) precoUnitarioMenor,
    MAX (prev.precoUnitario) precoUnitarioMaior,
    SUM (ROUND (
      CASE
        WHEN prev.faturarAtividade = 'P'
        THEN prev.quantidade
        ELSE COALESCE ((
          SELECT realiz.quantidade
          FROM MOORCAMENTOXATIVIDADEREAL realiz
          WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
          AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
      END * prev.precoUnitario, 2)) valorTotalItem
  INTO
    v_ativ_numero,
    v_ativ_quantidade,
    v_ativ_precoUnitarioMenor,
    v_ativ_precoUnitario,
    v_ativ_valorTotalItem
  FROM MOORCAMENTOXATIVIDADEPREV prev
  WHERE prev.idItemOrcamento = p_idItemOrcamento
  AND prev.statusAtividadeServico <> 'C'
  AND prev.faturarAtividade IN ('P','R');
  IF v_ativ_numero > 0 THEN
    IF v_ativ_numero > 1
      AND v_ativ_precoUnitarioMenor <> v_ativ_precoUnitario
      AND v_ativ_quantidade <> 0
    THEN
      v_ativ_precoUnitario := ROUND (v_ativ_valorTotalItem / v_ativ_quantidade, TO_NUMBER (p_config_64_casasDecSaidas));
    END IF;
  ELSE
    SELECT
      COUNT (1) numeroAtividades,
      SUM (COALESCE ((
        SELECT realiz.quantidade
        FROM MOORCAMENTOXATIVIDADEREAL realiz
        WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
        AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)) quantidade
    INTO
      v_ativ_numero,
      v_ativ_quantidade
    FROM MOORCAMENTOXATIVIDADEPREV prev
    JOIN MOORCAMENTOXITENS item
    ON item.idItemOrcamento = p_idItemOrcamento
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PAATIVIDADESSERVICO ativ
    ON ativ.atividadeServico = prev.atividadeServico
    JOIN CAGRADESPRODUTO gradProdAtiv
    ON gradProdAtiv.gradeProduto = ativ.gradeProduto
    JOIN CAPRODUTOS prodAtiv
    ON prodAtiv.produto = gradProdAtiv.produto
    WHERE prev.idItemOrcamento = p_idItemOrcamento
    AND prev.statusAtividadeServico <> 'C'
    AND ativ.gradeProduto > 0
    AND prodAtiv.unidadeMedida = prod.unidadeMedida;
    v_ativ_precoUnitario := 0;
  END IF;
  IF v_ativ_numero > 0 THEN
    FOR a IN (
      SELECT
        a.orcamento,
        a.pedidoCompraFornecedor,
        a.sequenciaPedidoCompraFornec,
        a.ambiente,
        a.ambienteObservacoes,
        a.vinculoItemDocumento,
        a.atividadeServico,
        a.statusAtividadeServico,
        a.controleEntrega,
        a.dataEntrega,
        a.modeloDocumento,
        a.estabelecimentoOriginal,
        a.vendedor,
        a.gradeProduto,
        a.idFormulaTinta,
        a.personalizacao,
        a.idLoteEstoque,
        a.localEstoque,
        a.pessoaParticipante,
        a.controleQuantidade,
        a.unidadeMedidaConversao,
        a.conversorQuantidade,
        a.loteMinimo,
        a.loteMultiplo,
        a.altura,
        a.largura,
        a.comprimento,
        a.quantidade,
        a.precoUnitario,
        a.tipoPreco,
        a.tabelaPreco,
        a.precoSugestaoAPrazo,
        a.precoSugestaoAVista,
        a.precoDesconto,
        a.precoMinimo,
        a.usarPrecoAVista,
        a.acrescimoUnitarioComposicao,
        a.percDescontoItem,
        a.valorDescontoItem,
        a.percAcrescimoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.observacoesDigitadas,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.operacaoFiscal,
        a.movimentaEstoque,
        a.geraFinanceiro,
        prod.pesoLiquido prod_pesoLiquido,
        prod.pesoBruto prod_pesoBruto,
        unMedConv.casasDecimaisUnidadeMedida unMedConv_casasDecimais
      FROM MOORCAMENTOXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN SIUNIDADESMEDIDA unMedConv
      ON unMedConv.unidadeMedida = a.unidadeMedidaConversao
      WHERE a.idItemOrcamento = p_idItemOrcamento)
    LOOP   
      IF v_ativ_quantidade <> a.quantidade
        OR v_ativ_precoUnitario <> a.precoUnitario
      THEN
        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_config_413_obs_add_marca,
          0, -- p_manterFinanceiro_Retotalizar,
          'T', -- p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
          0, -- p_buscarGeraFinanceiroEstoque,
          ' ', -- p_tipoDocumentoReferenciado, 
          0, -- p_idItemReferenciado,
          0, -- p_quantidadeReferenciada
          ' ', -- p_tempComp_nomeTempComposicao,
          0, -- p_tempComp_sequencia
          ' ', -- p_mensagemAviso,
          0, -- p_calcularImpostos
          p_idItemOrcamento,
          a.orcamento,
          a.pedidoCompraFornecedor,
          a.sequenciaPedidoCompraFornec,
          a.ambiente,
          a.ambienteObservacoes,
          a.vinculoItemDocumento,
          a.atividadeServico,
          a.statusAtividadeServico,
          a.controleEntrega,
          a.dataEntrega,
          a.modeloDocumento,
          a.estabelecimentoOriginal,
          a.vendedor,
          a.gradeProduto,
          a.idFormulaTinta,
          a.personalizacao,
          a.idLoteEstoque,
          0, -- p_item_idEnderecoEstoque
          0, -- p_item_idNumeroSerie
          0, -- p_item_atividadeProjeto,
          a.localEstoque,
          a.pessoaParticipante,
          a.controleQuantidade,
          a.unidadeMedidaConversao,
          a.conversorQuantidade,
          a.loteMinimo,
          a.loteMultiplo,
          a.altura,
          a.largura,
          a.comprimento,
          CASE a.controleQuantidade
            WHEN 2
            THEN ROUND (CASE WHEN a.altura = 0 OR a.largura = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / ((a.altura / 100) * (a.largura / 100))), 3) END, 6)
            WHEN 3
            THEN ROUND (CASE WHEN a.altura = 0 OR a.comprimento = 0 OR a.comprimento = 0 THEN 0 ELSE ROUND (v_ativ_quantidade / ((a.altura / 100) * (a.largura / 100) * a.comprimento), 3) END, 6)
            WHEN 4
            THEN ROUND (CASE WHEN a.conversorQuantidade = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / a.conversorQuantidade), 3) END, 6)
            ELSE 0
          END, -- p_item_pecas
          v_ativ_quantidade,
          CASE a.controleQuantidade
            WHEN 2
            THEN ROUND (CASE WHEN a.altura = 0 OR a.largura = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / ((a.altura / 100) * (a.largura / 100))), 3) END, a.unMedConv_casasDecimais)
            WHEN 3
            THEN ROUND (CASE WHEN a.altura = 0 OR a.comprimento = 0 OR a.comprimento = 0 THEN 0 ELSE ROUND (v_ativ_quantidade / ((a.altura / 100) * (a.largura / 100) * a.comprimento), 3) END, a.unMedConv_casasDecimais)
            WHEN 4
            THEN ROUND (CASE WHEN a.conversorQuantidade = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / a.conversorQuantidade), 3) END, a.unMedConv_casasDecimais)
            ELSE v_ativ_quantidade
          END, -- p_item_quantidadeConvertida
          ROUND ((v_ativ_quantidade * a.prod_pesoLiquido), 3), -- p_item_pesoLiquido
          ROUND ((v_ativ_quantidade * a.prod_pesoBruto), 3), -- p_item_pesoBruto
          a.tipoPreco,
          a.tabelaPreco,
          a.precoSugestaoAPrazo,
          a.precoSugestaoAVista,
          a.precoDesconto,
          a.precoMinimo,
          a.usarPrecoAVista,
          v_ativ_precoUnitario, -- p_item_precoUnitarioBruto
          a.acrescimoUnitarioComposicao,
          v_ativ_precoUnitario, -- p_item_precoUnitario
          a.percDescontoItem,
          a.valorDescontoItem,
          a.percAcrescimoItem,
          a.valorAcrescimoItem,
          a.valorFreteItem,
          a.valorSeguroItem,
          a.valorAdicFreteMarinhaMerItem,
          a.valorDespesasAduaneirasItem,
          a.observacoesDigitadas,
          a.valorFreteGeral,
          a.valorSeguroGeral,
          a.valorDescontoGeral,
          a.valorOutrasDespesasGeral,
          a.valorAdicFreteMarinhaMerGeral,
          a.valorDespesasAduaneirasGeral,
          a.valorDescontoPagamento,
          a.valorOutrasDespesasPagamento,
          a.valorJurosPagamento,
          a.operacaoFiscal,
          a.movimentaEstoque,
          a.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
          0, -- p_nivel,
          ' ',
          v_auxVarchar, -- r_mensagemAviso
          v_calcularImpostos,
          v_auxNumber, -- idItemOrcamento
          v_auxVarchar, -- r_buffer_idItemOrcamento
          v_auxNumber); -- r_valorInserido
        IF v_calcularImpostos = 1 THEN
          ADD_ORCAMENTO_CALC_IMP_CAB (
            p_config_64_casasDecSaidas,
            p_config_209_filtrarGrupoEcon,
            p_config_362_calcCustoPorGrade,
            a.orcamento,
            ' ', -- p_troca_tipoPagamentoFrete,
            ' '); --p_a_cab_tipoPagamentoFrete
        END IF;
      END IF;
    END LOOP;
  END IF;
END ADD_ORCAMENTO_ITEM_PREV_RECALC;

/

create or replace PROCEDURE ADD_PRE_DOC_GERA_TEMP_MARGEM (
  p_sessaoClient                 IN VARCHAR2,
  p_usuarioLogado                IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_regMarg_tipoPreco            IN CHAR,
  p_regMarg_tabelaPreco          IN VARCHAR2,
  p_regMarg_fatorMultiplicador   IN NUMBER,
  p_regMarg_tipoPrecoB           IN CHAR,
  p_regMarg_tabelaPrecoB         IN VARCHAR2,
  p_regMarg_fatorMultiplicadorB  IN NUMBER,
  p_regMarg_reduzirImpostos      IN NUMBER,
  p_regMarg_reduzirTarifaCartao  IN NUMBER,
  p_regMarg_taxaCapitacaoCustoFi IN NUMBER,
  p_regMarg_exibImagemMargemCab  IN NUMBER,
  p_regMarg_regraImagemCab       IN NUMBER,
  p_regMarg_exibImagemMargemItem IN NUMBER,
  p_regMarg_regraImagemItem      IN NUMBER,
  p_preDocumento                 IN NUMBER,
  p_cabMargem_valorTarifaCartao  IN NUMBER,
  p_cabMargem_valorMargem        IN NUMBER,
  p_idItemPreDocumento           IN NUMBER,
  p_item_ini_cancelado           IN NUMBER,
  /* Retornos */
  r_cabMargem_valorTarifaCartao  OUT NUMBER,
  r_cabMargem_valorMargem        OUT NUMBER,
  r_cabMargem_percentualMargem   OUT NUMBER,
  r_cabMargem_imagemMargem       OUT VARCHAR2)
IS
  v_cab_estabelecimento          NUMBER;
  v_cab_tipoPagamentoFrete       CHAR(1);
  v_cab_prazoMedioPonderado      NUMBER;
  v_cab_valorFreteItem           NUMBER;
  v_cab_valorSeguroItem          NUMBER;
  v_cab_valorFreteGeral          NUMBER;
  v_cab_valorSeguroGeral         NUMBER;
  v_cab_valorAdicFreteMarinTotal NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_munEndEst_uf                 CHAR(2);
  v_munEndPess_uf                CHAR(2);
  v_item_valorLiquidoSemFreteSeg NUMBER;
  v_item_valorCaptacao           NUMBER;
  v_item_valorTarifaCartao       NUMBER;
  v_item_valorImpostos           NUMBER;
  v_item_precoCusto              NUMBER;
  v_item_valorCusto              NUMBER;
  v_item_valorMargem             NUMBER;
  v_item_percentualMargem        NUMBER;
  v_item_imagemMargem            VARCHAR2(256);
BEGIN
  IF p_idItemPreDocumento = 0 THEN
    r_cabMargem_valorTarifaCartao := FUNC_ADD_TARIFA_CART_PRE_DOC (p_preDocumento);
    r_cabMargem_valorMargem := 0;
    DELETE TEMPMARGEMCONTRIBUICAO
    WHERE sessaoClient = p_sessaoClient
    AND orcamentoPredocumentoDocumento = 'P'
    AND idCabecalho = p_preDocumento;
  ELSE
    r_cabMargem_valorTarifaCartao := p_cabMargem_valorTarifaCartao;
    r_cabMargem_valorMargem := p_cabMargem_valorMargem;
    IF p_item_ini_cancelado = 0 THEN
      SELECT COALESCE (MAX (temp.valorMargem), 0)
      INTO v_item_valorMargem
      FROM MOPREDOCUMXITENS a
      JOIN TEMPMARGEMCONTRIBUICAO temp
      ON temp.sequencia = a.sequencia
      WHERE a.idItemPreDocumento = p_idItemPreDocumento
      AND temp.sessaoClient = p_sessaoClient
      AND temp.orcamentoPredocumentoDocumento = 'P'
      AND temp.idCabecalho = p_preDocumento;
      r_cabMargem_valorMargem := p_cabMargem_valorMargem - v_item_valorMargem;
    END IF;
  END IF;
  SELECT
    cab.estabelecimento,
    cab.prazoMedioPonderado,
    cab.valorFreteItem,
    cab.valorSeguroItem,
    cab.valorFreteGeral,
    cab.valorSeguroGeral,
    cab.valorAdicFreteMarinhaMerTotal,
    cab.valorDespesasAduaneirasTotal,
    cab.valorLiquidoItem,
    COALESCE((
      SELECT MAX(munEndEst.uf)
      FROM CAENDERECOSPESSOA endEst
      JOIN SIMUNICIPIOS munEndEst
      ON munEndEst.municipio = endEst.municipio
      WHERE endEst.pessoa = est.pessoaEstabelecimento
      AND endEst.ativo = 1
      AND endEst.principal = 1),'  '),
    COALESCE((
      SELECT MAX(munEndPess.uf)
      FROM CAENDERECOSPESSOA endPess
      JOIN SIMUNICIPIOS munEndPess
      ON munEndPess.municipio = endPess.municipio
      WHERE endPess.pessoa = cab.pessoa
      AND endPess.ativo = 1
      AND endPess.principal = 1),'  ')
  INTO
    v_cab_estabelecimento,
    v_cab_prazoMedioPonderado,
    v_cab_valorFreteItem,
    v_cab_valorSeguroItem,
    v_cab_valorFreteGeral,
    v_cab_valorSeguroGeral,
    v_cab_valorAdicFreteMarinTotal,
    v_cab_valorDespesasAduanTotal,
    v_cab_valorLiquidoItem,
    v_munEndEst_uf,
    v_munEndPess_uf
  FROM MOPREDOCUMENTOS cab
  JOIN PAESTABELECIMENTOS est
  ON est.estabelecimento = cab.estabelecimento
  WHERE cab.preDocumento = p_preDocumento;
  FOR a IN (
    SELECT
      a.sequencia,
      a.cancelado,
      a.modeloDocumento,
      a.gradeProduto,
      a.personalizacao,
      a.quantidade,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorRetIRRF,
      a.valorRetCSLL,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorIPIDevolucao,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMSOperacao,
      a.valorICMSDiferido,
      a.valorICMS,
      a.valorICMSDesoneracao,
      a.valorICMSST,
      a.valorICMSUFDestinatario,
      a.valorICMSUFRemetente,
      a.valorFCP,
      a.valorFCPST,
      a.valorFCPSTAnteriormente,
      a.valorFCPUFDestinatario,
      a.valorLiquidoItem
    FROM MOPREDOCUMXITENS a
    WHERE p_idItemPreDocumento = 0
    AND preDocumento = p_preDocumento
    OR p_idItemPreDocumento <> 0
    AND idItemPreDocumento = p_idItemPreDocumento)
  LOOP
    ADD_CALCULA_MARGEM_CONTRIB (
      p_usuarioLogado,
      p_perfilUsuarioLogado,
      p_config_65_casasDecEntrada,
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_regMarg_tipoPreco,
      p_regMarg_tabelaPreco,
      p_regMarg_fatorMultiplicador,
      p_regMarg_tipoPrecoB,
      p_regMarg_tabelaPrecoB,
      p_regMarg_fatorMultiplicadorB,
      p_regMarg_reduzirImpostos,
      p_regMarg_reduzirTarifaCartao,
      p_regMarg_taxaCapitacaoCustoFi,
      p_regMarg_exibImagemMargemItem,
      p_regMarg_regraImagemItem,
      v_cab_estabelecimento,
      v_cab_prazoMedioPonderado,
      v_cab_valorLiquidoItem,
      r_cabMargem_valorTarifaCartao,
      v_munEndEst_uf,
      v_munEndPess_uf,
      a.modeloDocumento,
      a.gradeProduto,
      a.personalizacao,
      a.quantidade,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorRetIRRF,
      a.valorRetCSLL,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorIPIDevolucao,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMSOperacao,
      a.valorICMSDiferido,
      a.valorICMS,
      a.valorICMSDesoneracao,
      a.valorICMSST,
      a.valorICMSUFDestinatario,
      a.valorICMSUFRemetente,
      a.valorFCP,
      a.valorFCPST,
      a.valorFCPSTAnteriormente,
      a.valorFCPUFDestinatario,
      a.valorLiquidoItem,
      /* Retornos */
      v_item_valorLiquidoSemFreteSeg,
      v_item_valorCaptacao,
      v_item_valorTarifaCartao,
      v_item_valorImpostos,
      v_item_precoCusto,
      v_item_valorCusto,
      v_item_valorMargem,
      v_item_percentualMargem);
    IF p_regMarg_exibImagemMargemItem = 1
      AND p_regMarg_regraImagemItem <> 0
    THEN
      v_item_imagemMargem :=
        FUNC_ADD_BUSCA_IMAGEM_FAIXA (
          p_regMarg_regraImagemItem,
          v_item_percentualMargem);
    ELSE
      v_item_imagemMargem := ' ';
    END IF;
    IF a.cancelado = 0 THEN
      r_cabMargem_valorMargem := r_cabMargem_valorMargem + v_item_valorMargem;
    END IF;
  MERGE INTO TEMPMARGEMCONTRIBUICAO a USING (
    SELECT
      p_sessaoClient                 sessaoClient,
      'P'                            orcamentoPredocumentoDocumento,
      p_preDocumento                 idCabecalho,
      a.sequencia                    sequencia,
      v_item_valorLiquidoSemFreteSeg valorLiquidoSemFreteSeguro,
      v_item_valorCaptacao           valorCaptacao,
      v_item_valorTarifaCartao       valorTarifaCartao,
      v_item_valorImpostos           valorImpostos,
      v_item_precoCusto              precoCusto,
      v_item_valorCusto              valorCusto,
      v_item_valorMargem             valorMargem,
      v_item_percentualMargem        percentualMargem,
      v_item_imagemMargem            imagemMargem
    FROM DUAL) b ON (
      a.sessaoClient = b.sessaoClient 
      AND a.orcamentoPredocumentoDocumento = b.orcamentoPredocumentoDocumento
      AND a.idCabecalho = b.idCabecalho
      AND a.sequencia = b.sequencia)
  WHEN MATCHED THEN UPDATE SET
    a.valorLiquidoSemFreteSeguro = b.valorLiquidoSemFreteSeguro,
    a.valorCaptacao              = b.valorCaptacao,
    a.valorTarifaCartao          = b.valorTarifaCartao,
    a.valorImpostos              = b.valorImpostos,
    a.precoCusto                 = b.precoCusto,
    a.valorCusto                 = b.valorCusto,
    a.valorMargem                = b.valorMargem,
    a.percentualMargem           = b.percentualMargem,
    a.imagemMargem               = b.imagemMargem
  WHEN NOT MATCHED THEN INSERT (
    sessaoClient,
    orcamentoPredocumentoDocumento,
    idCabecalho,
    sequencia,
    valorLiquidoSemFreteSeguro,
    valorCaptacao,
    valorTarifaCartao,
    valorImpostos,
    precoCusto,
    valorCusto,
    valorMargem,
    percentualMargem,
    imagemMargem)
  VALUES (
    b.sessaoClient,
    b.orcamentoPredocumentoDocumento,
    b.idCabecalho,
    b.sequencia,
    b.valorLiquidoSemFreteSeguro,
    b.valorCaptacao,
    b.valorTarifaCartao,
    b.valorImpostos,
    b.precoCusto,
    b.valorCusto,
    b.valorMargem,
    b.percentualMargem,
    b.imagemMargem);
  END LOOP;
  r_cabMargem_percentualMargem :=
    CASE
      WHEN v_cab_valorLiquidoItem
        - v_cab_valorFreteItem
        - v_cab_valorSeguroItem
        - v_cab_valorFreteGeral
        - v_cab_valorSeguroGeral
        - v_cab_valorAdicFreteMarinTotal
        - v_cab_valorDespesasAduanTotal = 0
      THEN 0
      ELSE ROUND ((100 * r_cabMargem_valorMargem
        / ( v_cab_valorLiquidoItem
          - v_cab_valorFreteItem
          - v_cab_valorSeguroItem
          - v_cab_valorFreteGeral
          - v_cab_valorSeguroGeral
          - v_cab_valorAdicFreteMarinTotal
          - v_cab_valorDespesasAduanTotal)), 8)
    END;
  IF p_regMarg_exibImagemMargemCab = 1
    AND p_regMarg_regraImagemCab <> 0
  THEN
    r_cabMargem_imagemMargem :=
      FUNC_ADD_BUSCA_IMAGEM_FAIXA (
        p_regMarg_regraImagemCab,
        r_cabMargem_percentualMargem);
  ELSE
    r_cabMargem_imagemMargem := ' ';
  END IF;
END ADD_PRE_DOC_GERA_TEMP_MARGEM;

/

create or replace PROCEDURE ADD_PRE_DOC_CALC_IMP_ITENS (
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_preDocumento             IN NUMBER,
  p_cab_origemDocumento          IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_devolucaoAnulacaoRetorno IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataEntradaSaida         IN DATE,
  p_cab_pessoa                   IN NUMBER,
  p_cab_localDestinoOperacao     IN CHAR,
  p_cab_indicadorConsumidorFinal IN CHAR,
  p_cab_tipoPagamentoFrete       IN CHAR,
  p_pess_indicadorInscricaoEstad IN CHAR,
  /* Retornos */
  r_cab_valorProdutos            OUT NUMBER,
  r_cab_valorServicos            OUT NUMBER,
  r_cab_valorBasePagamento       OUT NUMBER,
  r_cab_valorAVistaMinimo        OUT NUMBER,
  r_cab_valorFreteTotal          OUT NUMBER,
  r_cab_valorSeguroTotal         OUT NUMBER,
  r_cab_valorDescontoTotal       OUT NUMBER,
  r_cab_valorOutrasDespesasTotal OUT NUMBER,
  r_cab_valorAdicFreteMarinTotal OUT NUMBER,
  r_cab_valorDespesasAduanTotal  OUT NUMBER,
  r_cab_valorLiquidoItem         OUT NUMBER,
  r_cab_valorDescCustoOpTotal    OUT NUMBER,
  r_cab_valorAcrescCustoOpTotal  OUT NUMBER,
  r_cab_valorCustoOperacao       OUT NUMBER,
  r_cab_valorCMV                 OUT NUMBER,
  r_cab_valorAcrescExtempTotal   OUT NUMBER)
IS
  v_auxNumber                    NUMBER;
  v_precoUnitario                NUMBER;
  v_precoUnitarioConvertido      NUMBER;
  v_valorProdutoServico          NUMBER;
  v_valorBasePagamento           NUMBER;
  v_valorFreteTotal              NUMBER;
  v_valorSeguroTotal             NUMBER;
  v_valorDescontoTotal           NUMBER;
  v_valorOutrasDespesasTotal     NUMBER;
  v_valorAdicFreteMarinMerTotal  NUMBER;
  v_valorDespesasAduaneirasTotal NUMBER;
  v_baseISSQN                    NUMBER;
  v_valorISSQN                   NUMBER;
  v_baseRetIRRF                  NUMBER;
  v_valorRetIRRF                 NUMBER;
  v_baseRetINSS                  NUMBER;
  v_valorRetINSS                 NUMBER;
  v_baseRetPIS                   NUMBER;
  v_valorRetPIS                  NUMBER;
  v_baseRetCOFINS                NUMBER;
  v_valorRetCOFINS               NUMBER;
  v_baseRetCSLL                  NUMBER;
  v_valorRetCSLL                 NUMBER;
  v_baseRetOutros                NUMBER;
  v_valorRetOutros               NUMBER;
  v_baseII                       NUMBER;
  v_valorII                      NUMBER;
  v_baseIOF                      NUMBER;
  v_valorIOF                     NUMBER;
  v_baseIPI                      NUMBER;
  v_valorIPI                     NUMBER;
  v_basePIS                      NUMBER;
  v_valorPIS                     NUMBER;
  v_basePISST                    NUMBER;
  v_valorPISST                   NUMBER;
  v_baseCOFINS                   NUMBER;
  v_valorCOFINS                  NUMBER;
  v_baseCOFINSST                 NUMBER;
  v_valorCOFINSST                NUMBER;
  v_baseCreditoSimplesNacional   NUMBER;
  v_valorCreditoSimplesNacional  NUMBER;
  v_baseICMS                     NUMBER;
  v_valorICMSOperacao            NUMBER;
  v_valorICMSDiferido            NUMBER;
  v_valorICMS                    NUMBER;
  v_valorICMSDesoneracao         NUMBER;
  v_baseICMSST                   NUMBER;
  v_valorICMSST                  NUMBER;
  v_baseICMSSTAnteriormente      NUMBER;
  v_valorICMSSTAnteriormente     NUMBER;
  v_valorICMSProprioSubstituto   NUMBER;
  v_baseICMSEfetivo              NUMBER;
  v_valorICMSEfetivo             NUMBER;
  v_baseICMSUFDestinatario       NUMBER;
  v_valorICMSUFDestinatario      NUMBER;
  v_baseICMSUFRemetente          NUMBER;
  v_valorICMSUFRemetente         NUMBER;
  v_baseFCP                      NUMBER;
  v_valorFCP                     NUMBER;
  v_baseFCPST                    NUMBER;
  v_valorFCPST                   NUMBER;
  v_baseFCPSTAnteriormente       NUMBER;
  v_valorFCPSTAnteriormente      NUMBER;
  v_baseFCPUFDestinatario        NUMBER;
  v_valorFCPUFDestinatario       NUMBER;
  v_baseEstimadaImpostos         NUMBER;
  v_valorEstimadoImpFederais     NUMBER;
  v_valorEstimadoImpEstaduais    NUMBER;
  v_valorEstimadoImpMunicipais   NUMBER;
  v_valorLiquidoItem             NUMBER;
  v_valorDescontoCustoOpTotal    NUMBER;
  v_valorAcrescimoCustoOpTotal   NUMBER;
  v_precoCustoOperacao           NUMBER;
  v_valorCustoOperacao           NUMBER;
  v_precoCMV                     NUMBER;
  v_valorCMV                     NUMBER;
  v_valorAcrescimoExtempSubtotal NUMBER;
  v_valorAcrescimoExtempTotal    NUMBER;
BEGIN
  r_cab_valorProdutos            := 0;
  r_cab_valorServicos            := 0;
  r_cab_valorBasePagamento       := 0;
  r_cab_valorAVistaMinimo        := 0;
  r_cab_valorFreteTotal          := 0;
  r_cab_valorSeguroTotal         := 0;
  r_cab_valorDescontoTotal       := 0;
  r_cab_valorOutrasDespesasTotal := 0;
  r_cab_valorAdicFreteMarinTotal := 0;
  r_cab_valorDespesasAduanTotal  := 0;
  r_cab_valorLiquidoItem         := 0;
  r_cab_valorDescCustoOpTotal    := 0;
  r_cab_valorAcrescCustoOpTotal  := 0;
  r_cab_valorCustoOperacao       := 0;
  r_cab_valorCMV                 := 0;
  r_cab_valorAcrescExtempTotal   := 0;  
  FOR a IN (
    SELECT
      a.*,
      gradProd.produto,
      gradProd.cor,
      gradProd.tamanho,
      prod.controleEstoque,
      prod.tipoProduto,
      prod.precoPautaTabelado,
      modDoc.geraFinanceiro modDoc_geraFinanceiro,
      modDoc.diminuiDescontoPrUnit,
      modDoc.somaAcrescimosPrUnit,
      modDoc.somaFreteSeguroPrUnit,
      CASE
        WHEN EXISTS (
          SELECT 1
          FROM CAPRODUTOXCOMPOSICOESPREC compPrec
          WHERE compPrec.produto = gradProd.produto
          AND compPrec.ativo = 1)
        THEN 1
        ELSE 0
      END composicaoPreco
    FROM MOPREDOCUMXITENS a
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = a.modeloDocumento
    WHERE a.preDocumento = p_cab_preDocumento
    AND a.cancelado = 0
    ORDER BY a.sequencia)
  LOOP
    v_precoUnitario                := a.precoUnitario;
    v_precoUnitarioConvertido      := a.precoUnitarioConvertido;
    v_valorProdutoServico          := a.valorProdutoServico;
    v_valorBasePagamento           := a.valorBasePagamento;
    v_valorFreteTotal              := a.valorFreteTotal;
    v_valorSeguroTotal             := a.valorSeguroTotal;
    v_valorDescontoTotal           := a.valorDescontoTotal;
    v_valorOutrasDespesasTotal     := a.valorOutrasDespesasTotal;
    v_valorAdicFreteMarinMerTotal  := a.valorAdicFreteMarinhaMerTotal;
    v_valorDespesasAduaneirasTotal := a.valorDespesasAduaneirasTotal;
    v_baseISSQN                    := a.baseISSQN;
    v_valorISSQN                   := a.valorISSQN;
    v_baseRetIRRF                  := a.baseRetIRRF;
    v_valorRetIRRF                 := a.valorRetIRRF;
    v_baseRetINSS                  := a.baseRetINSS;
    v_valorRetINSS                 := a.valorRetINSS;
    v_baseRetPIS                   := a.baseRetPIS;
    v_valorRetPIS                  := a.valorRetPIS;
    v_baseRetCOFINS                := a.baseRetCOFINS;
    v_valorRetCOFINS               := a.valorRetCOFINS;
    v_baseRetCSLL                  := a.baseRetCSLL;
    v_valorRetCSLL                 := a.valorRetCSLL;
    v_baseRetOutros                := a.baseRetOutros;
    v_valorRetOutros               := a.valorRetOutros;
    v_baseII                       := a.baseII;
    v_valorII                      := a.valorII;
    v_baseIOF                      := a.baseIOF;
    v_valorIOF                     := a.valorIOF;
    v_baseIPI                      := a.baseIPI;
    v_valorIPI                     := a.valorIPI;
    v_basePIS                      := a.basePIS;
    v_valorPIS                     := a.valorPIS;
    v_basePISST                    := a.basePISST;
    v_valorPISST                   := a.valorPISST;
    v_baseCOFINS                   := a.baseCOFINS;
    v_valorCOFINS                  := a.valorCOFINS;
    v_baseCOFINSST                 := a.baseCOFINSST;
    v_valorCOFINSST                := a.valorCOFINSST;
    v_baseCreditoSimplesNacional   := a.baseCreditoSimplesNacional;
    v_valorCreditoSimplesNacional  := a.valorCreditoSimplesNacional;
    v_baseICMS                     := a.baseICMS;
    v_valorICMSOperacao            := a.valorICMSOperacao;
    v_valorICMSDiferido            := a.valorICMSDiferido;
    v_valorICMS                    := a.valorICMS;
    v_valorICMSDesoneracao         := a.valorICMSDesoneracao;
    v_baseICMSST                   := a.baseICMSST;
    v_valorICMSST                  := a.valorICMSST;
    v_baseICMSSTAnteriormente      := a.baseICMSSTAnteriormente;
    v_valorICMSSTAnteriormente     := a.valorICMSSTAnteriormente;
    v_valorICMSProprioSubstituto   := a.valorICMSProprioSubstituto;
    v_baseICMSEfetivo              := a.baseICMSEfetivo;
    v_valorICMSEfetivo             := a.valorICMSEfetivo;
    v_baseICMSUFDestinatario       := a.baseICMSUFDestinatario;
    v_valorICMSUFDestinatario      := a.valorICMSUFDestinatario;
    v_baseICMSUFRemetente          := a.baseICMSUFRemetente;
    v_valorICMSUFRemetente         := a.valorICMSUFRemetente;
    v_baseFCP                      := a.baseFCP;
    v_valorFCP                     := a.valorFCP;
    v_baseFCPST                    := a.baseFCPST;
    v_valorFCPST                   := a.valorFCPST;
    v_baseFCPSTAnteriormente       := a.baseFCPSTAnteriormente;
    v_valorFCPSTAnteriormente      := a.valorFCPSTAnteriormente;
    v_baseFCPUFDestinatario        := a.baseFCPUFDestinatario;
    v_valorFCPUFDestinatario       := a.valorFCPUFDestinatario;
    v_baseEstimadaImpostos         := a.baseEstimadaImpostos;
    v_valorEstimadoImpFederais     := a.valorEstimadoImpFederais;
    v_valorEstimadoImpEstaduais    := a.valorEstimadoImpEstaduais;
    v_valorEstimadoImpMunicipais   := a.valorEstimadoImpMunicipais;
    v_valorLiquidoItem             := a.valorLiquidoItem;
    v_valorDescontoCustoOpTotal    := a.valorDescontoCustoOpTotal;
    v_valorAcrescimoCustoOpTotal   := a.valorAcrescimoCustoOpTotal;
    v_precoCustoOperacao           := a.precoCustoOperacao;
    v_valorCustoOperacao           := a.valorCustoOperacao;
    v_precoCMV                     := a.precoCMV;
    v_valorCMV                     := a.valorCMV;
    v_valorAcrescimoExtempSubtotal := a.valorAcrescimoExtempSubtotal;
    v_valorAcrescimoExtempTotal    := a.valorAcrescimoExtempTotal;
    ADD_CALCULA_TOTAIS_ITEM(
      p_cab_tipoPagamentoFrete,
      a.quantidade,
      a.quantidadeConvertida,
      a.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao,
      a.precoUnitario,
      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.diminuiDescontoPrUnit,
      a.somaAcrescimosPrUnit,
      a.somaFreteSeguroPrUnit,
      a.composicaoPreco,
      /* Retornos */
      v_precoUnitario,
      v_precoUnitarioConvertido,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal);
    v_valorAcrescimoExtempSubtotal := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
      a.quantidade,
      v_precoUnitario,
      a.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo);
    v_valorAcrescimoExtempTotal := FUNC_ADD_CALC_EXTEMP_TOTAL(
      v_valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem,
      a.valorAcrescimoExtempGeral);
    ADD_CALCULA_IMPOSTOS_ITEM (
      p_config_64_casasDecSaidas,
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_cab_entradaSaida,
      p_cab_devolucaoAnulacaoRetorno,
      p_cab_estabelecimento,
      0,
      p_cab_dataEntradaSaida,
      p_cab_pessoa,
      p_cab_localDestinoOperacao,
      p_cab_indicadorConsumidorFinal,
      p_cab_tipoPagamentoFrete,
      p_pess_indicadorInscricaoEstad,
      a.personalizacao,
      a.quantidade,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal,
      a.cfop,
      1,
      a.indicadorISSQN,
      a.aliquotaISSQN,
      v_baseISSQN,
      v_valorISSQN,
      1,
      a.retencaoIRRF,
      v_baseRetIRRF,
      v_valorRetIRRF,
      1,
      a.retencaoINSS,
      v_baseRetINSS,
      v_valorRetINSS,
      1,
      a.retencaoPIS,
      v_baseRetPIS,
      v_valorRetPIS,
      1,
      a.retencaoCOFINS,
      v_baseRetCOFINS,
      v_valorRetCOFINS,
      1,
      a.retencaoCSLL,
      v_baseRetCSLL,
      v_valorRetCSLL,
      1,
      a.retencaoOutros,
      v_baseRetOutros,
      v_valorRetOutros,
      1,
      a.aliquotaII,
      v_baseII,
      v_valorII,
      1,
      a.aliquotaIOF,
      v_baseIOF,
      v_valorIOF,
      1,
      a.aliquotaIPI,
      a.valorAliquotaIPI,
      v_baseIPI,
      v_valorIPI,
      a.valorIPIDevolucao,
      1,
      a.aliquotaPIS,
      a.valorAliquotaPIS,
      v_basePIS,
      v_valorPIS,
      1,
      a.aliquotaPISST,
      a.valorAliquotaPISST,
      v_basePISST,
      v_valorPISST,
      1,
      a.aliquotaCOFINS,
      a.valorAliquotaCOFINS,
      v_baseCOFINS,
      v_valorCOFINS,
      1,
      a.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST,
      v_baseCOFINSST,
      v_valorCOFINSST,
      1,
      a.stSimplesNacional,
      a.creditoSimplesNacional,
      v_baseCreditoSimplesNacional,
      v_valorCreditoSimplesNacional,
      1,
      a.stICMS,
      a.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS,
      a.aliquotaICMS,
      a.diferimentoICMS,
      v_baseICMS,
      v_valorICMSOperacao,
      v_valorICMSDiferido,
      v_valorICMS,
      v_valorICMSDesoneracao,
      1,
      a.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST,
      a.reducaoBaseST,
      a.aliquotaICMSST,
      v_baseICMSST,
      v_valorICMSST,
      1,
      v_baseICMSSTAnteriormente,
      v_valorICMSSTAnteriormente,
      v_valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo,
      v_baseICMSEfetivo,
      v_valorICMSEfetivo,
      0,
      '  ',
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      1,
      a.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual,
      v_baseICMSUFDestinatario,
      v_valorICMSUFDestinatario,
      v_baseICMSUFRemetente,
      v_valorICMSUFRemetente,
      1,
      a.aliquotaFCP,
      v_baseFCP,
      v_valorFCP,
      a.aliquotaFCPST,
      v_baseFCPST,
      v_valorFCPST,
      a.aliquotaFCPSTAnteriormente,
      v_baseFCPSTAnteriormente,
      v_valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario,
      v_baseFCPUFDestinatario,
      v_valorFCPUFDestinatario,
      1,
      a.aliquotaEstimadaImpFederais,
      a.aliquotaEstimadaImpEstaduais,
      a.aliquotaEstimadaImpMunicipais,
      v_baseEstimadaImpostos,
      v_valorEstimadoImpFederais,
      v_valorEstimadoImpEstaduais,
      v_valorEstimadoImpMunicipais,
      a.produto,
      a.cor,
      a.tamanho,
      a.controleEstoque,
      a.tipoProduto,
      a.precoPautaTabelado,
      /* Retornos */
      v_baseISSQN,
      v_valorISSQN,
      v_baseRetIRRF,
      v_valorRetIRRF,
      v_baseRetINSS,
      v_valorRetINSS,
      v_baseRetPIS,
      v_valorRetPIS,
      v_baseRetCOFINS,
      v_valorRetCOFINS,
      v_baseRetCSLL,
      v_valorRetCSLL,
      v_baseRetOutros,
      v_valorRetOutros,
      v_baseII,
      v_valorII,
      v_baseIOF,
      v_valorIOF,
      v_baseIPI,
      v_valorIPI,
      v_basePIS,
      v_valorPIS,
      v_basePISST,
      v_valorPISST,
      v_baseCOFINS,
      v_valorCOFINS,
      v_baseCOFINSST,
      v_valorCOFINSST,
      v_baseCreditoSimplesNacional,
      v_valorCreditoSimplesNacional,
      v_baseICMS,
      v_valorICMSOperacao,
      v_valorICMSDiferido,
      v_valorICMS,
      v_valorICMSDesoneracao,
      v_baseICMSST,
      v_valorICMSST,
      v_baseICMSSTAnteriormente,
      v_valorICMSSTAnteriormente,
      v_valorICMSProprioSubstituto,
      v_baseICMSEfetivo,
      v_valorICMSEfetivo,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_baseICMSUFDestinatario,
      v_valorICMSUFDestinatario,
      v_baseICMSUFRemetente,
      v_valorICMSUFRemetente,
      v_baseFCP,
      v_valorFCP,
      v_baseFCPST,
      v_valorFCPST,
      v_baseFCPSTAnteriormente,
      v_valorFCPSTAnteriormente,
      v_baseFCPUFDestinatario,
      v_valorFCPUFDestinatario,
      v_baseEstimadaImpostos,
      v_valorEstimadoImpFederais,
      v_valorEstimadoImpEstaduais,
      v_valorEstimadoImpMunicipais);
    v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
      p_cab_origemDocumento,
      0, -- p_cab_nfFornecedor
      p_cab_tipoPagamentoFrete,
      a.geraFinanceiro,
      v_valorProdutoServico,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      a.valorIPIDevolucao,
      a.retidoISSQN,
      v_valorISSQN,
      v_valorRetIRRF,
      v_valorRetINSS,
      v_valorRetPIS,
      v_valorRetCOFINS,
      v_valorRetCSLL,
      v_valorRetOutros,
      v_valorII,
      v_valorIOF,
      v_valorIPI,
      v_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0, -- p_item_somarICMSST
      v_valorAcrescimoExtempTotal,
      a.modDoc_geraFinanceiro);
    v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
      0, -- p_cab_nfFornecedor
      p_cab_tipoPagamentoFrete,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      a.valorIPIDevolucao,
      v_valorII,
      v_valorIOF,
      v_valorIPI,
      v_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0 -- p_item_somarICMSST
      );
    ADD_CALCULA_CUSTO_CMV (
      p_cab_atualizaCustoMedio,
      p_cab_estabelecimento,
      0,
      a.modeloDocumento,
      a.quantidade,
      v_valorII,
      v_valorIOF,
      v_valorIPI,
      a.valorIPIDevolucao,
      v_valorPIS,
      v_valorPISST,
      v_valorCOFINS,
      v_valorCOFINSST,
      v_valorCreditoSimplesNacional,
      v_valorICMS,
      v_valorICMSST,
      0,
      v_valorLiquidoItem,
      a.valorDescontoCustoOpItem,
      a.valorDescontoCustoOpGeral,
      a.valorAcrescimoCustoOpItem,
      a.valorAcrescimoCustoOpGeral,
      v_valorAcrescimoExtempTotal,
      /* Retornos */
      v_valorDescontoCustoOpTotal,
      v_valorAcrescimoCustoOpTotal,
      v_precoCustoOperacao,
      v_valorCustoOperacao,
      v_precoCMV,
      v_valorCMV);
    UPDATE MOPREDOCUMXITENS SET
      precoUnitario                 = v_precoUnitario,
      precoUnitarioConvertido       = v_precoUnitarioConvertido,
      valorProdutoServico           = v_valorProdutoServico,
      valorBasePagamento            = v_valorBasePagamento,
      valorFreteTotal               = v_valorFreteTotal,
      valorSeguroTotal              = v_valorSeguroTotal,
      valorDescontoTotal            = v_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
      valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
      baseISSQN                     = v_baseISSQN,
      valorISSQN                    = v_valorISSQN,
      baseRetIRRF                   = v_baseRetIRRF,
      valorRetIRRF                  = v_valorRetIRRF,
      baseRetINSS                   = v_baseRetINSS,
      valorRetINSS                  = v_valorRetINSS,
      baseRetPIS                    = v_baseRetPIS,
      valorRetPIS                   = v_valorRetPIS,
      baseRetCOFINS                 = v_baseRetCOFINS,
      valorRetCOFINS                = v_valorRetCOFINS,
      baseRetCSLL                   = v_baseRetCSLL,
      valorRetCSLL                  = v_valorRetCSLL,
      baseRetOutros                 = v_baseRetOutros,
      valorRetOutros                = v_valorRetOutros,
      baseII                        = v_baseII,
      valorII                       = v_valorII,
      baseIOF                       = v_baseIOF,
      valorIOF                      = v_valorIOF,
      baseIPI                       = v_baseIPI,
      valorIPI                      = v_valorIPI,
      basePIS                       = v_basePIS,
      valorPIS                      = v_valorPIS,
      basePISST                     = v_basePISST,
      valorPISST                    = v_valorPISST,
      baseCOFINS                    = v_baseCOFINS,
      valorCOFINS                   = v_valorCOFINS,
      baseCOFINSST                  = v_baseCOFINSST,
      valorCOFINSST                 = v_valorCOFINSST,
      baseCreditoSimplesNacional    = v_baseCreditoSimplesNacional,
      valorCreditoSimplesNacional   = v_valorCreditoSimplesNacional,
      baseICMS                      = v_baseICMS,
      valorICMSOperacao             = v_valorICMSOperacao,
      valorICMSDiferido             = v_valorICMSDiferido,
      valorICMS                     = v_valorICMS,
      valorICMSDesoneracao          = v_valorICMSDesoneracao,
      baseICMSST                    = v_baseICMSST,
      valorICMSST                   = v_valorICMSST,
      baseICMSSTAnteriormente       = v_baseICMSSTAnteriormente,
      valorICMSSTAnteriormente      = v_valorICMSSTAnteriormente,
      valorICMSProprioSubstituto    = v_valorICMSProprioSubstituto,
      baseICMSEfetivo               = v_baseICMSEfetivo,
      valorICMSEfetivo              = v_valorICMSEfetivo,
      baseICMSUFDestinatario        = v_baseICMSUFDestinatario,
      valorICMSUFDestinatario       = v_valorICMSUFDestinatario,
      baseICMSUFRemetente           = v_baseICMSUFRemetente,
      valorICMSUFRemetente          = v_valorICMSUFRemetente,
      baseFCP                       = v_baseFCP,
      valorFCP                      = v_valorFCP,
      baseFCPST                     = v_baseFCPST,
      valorFCPST                    = v_valorFCPST,
      baseFCPSTAnteriormente        = v_baseFCPSTAnteriormente,
      valorFCPSTAnteriormente       = v_valorFCPSTAnteriormente,
      baseFCPUFDestinatario         = v_baseFCPUFDestinatario,
      valorFCPUFDestinatario        = v_valorFCPUFDestinatario,
      baseEstimadaImpostos          = v_baseEstimadaImpostos,
      valorEstimadoImpFederais      = v_valorEstimadoImpFederais,
      valorEstimadoImpEstaduais     = v_valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais    = v_valorEstimadoImpMunicipais,
      valorLiquidoItem              = v_valorLiquidoItem,
      valorDescontoCustoOpTotal     = v_valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpTotal    = v_valorAcrescimoCustoOpTotal,
      precoCustoOperacao            = v_precoCustoOperacao,
      valorCustoOperacao            = v_valorCustoOperacao,
      precoCMV                      = v_precoCMV,
      valorCMV                      = v_valorCMV,
      valorAcrescimoExtempSubtotal  = v_valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempTotal     = v_valorAcrescimoExtempTotal
    WHERE idItemPreDocumento        = a.idItemPreDocumento;
    IF a.tipoProduto = '09' THEN
      r_cab_valorServicos            := r_cab_valorServicos + v_valorProdutoServico;
    ELSE
      r_cab_valorProdutos            := r_cab_valorProdutos + v_valorProdutoServico;
    END IF;
    r_cab_valorBasePagamento       := r_cab_valorBasePagamento + v_valorBasePagamento;
    IF a.usarPrecoAVista = 1 AND a.geraFinanceiro = 1 THEN
      r_cab_valorAVistaMinimo        := r_cab_valorAVistaMinimo + v_valorProdutoServico + a.valorDescontoPagamento - a.valorOutrasDespesasPagamento - a.valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
    END IF;
    r_cab_valorFreteTotal          := r_cab_valorFreteTotal + v_valorFreteTotal;
    r_cab_valorSeguroTotal         := r_cab_valorSeguroTotal + v_valorSeguroTotal;
    r_cab_valorDescontoTotal       := r_cab_valorDescontoTotal + v_valorDescontoTotal;
    r_cab_valorOutrasDespesasTotal := r_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
    r_cab_valorAdicFreteMarinTotal := r_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
    r_cab_valorDespesasAduanTotal  := r_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
    r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem + v_valorLiquidoItem;
    r_cab_valorDescCustoOpTotal    := r_cab_valorDescCustoOpTotal + v_valorDescontoCustoOpTotal;
    r_cab_valorAcrescCustoOpTotal  := r_cab_valorAcrescCustoOpTotal + v_valorAcrescimoCustoOpTotal;
    r_cab_valorCustoOperacao       := r_cab_valorCustoOperacao + v_valorCustoOperacao;
    r_cab_valorCMV                 := r_cab_valorCMV + v_valorCMV;
    r_cab_valorAcrescExtempTotal   := r_cab_valorAcrescExtempTotal + v_valorAcrescimoExtempTotal;
  END LOOP;
END ADD_PRE_DOC_CALC_IMP_ITENS;

/

create or replace PROCEDURE ADD_PRE_DOC_CALC_IMP_CAB (
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_preDocumento             IN NUMBER,
  p_troca_tipoPagamentoFrete     IN NUMBER,
  p_a_cab_tipoPagamentoFrete     IN CHAR)
IS
  v_cab_valorProdutos            NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarinTotal NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_valorDescCustoOpTotal    NUMBER;
  v_cab_valorAcrescCustoOpTotal  NUMBER;
  v_cab_valorAcrescExtempTotal   NUMBER;
  v_calcularImpostosItem         NUMBER;
  v_habilitaControleEntrega      NUMBER;
BEGIN
  FOR a IN (
    SELECT a.*,
      pess.indicadorInscricaoEstadual,
      COALESCE((
        SELECT MIN(munEndEst.uf)
        FROM PAESTABELECIMENTOS est
        JOIN CAENDERECOSPESSOA endEst
        ON endEst.pessoa = est.pessoaEstabelecimento
        JOIN SIMUNICIPIOS munEndEst
        ON munEndEst.municipio = endEst.municipio
        WHERE est.estabelecimento = a.estabelecimento
        AND endEst.ativo = 1
        AND endEst.principal = 1),'  ') munEndEst_uf
    FROM MOPREDOCUMENTOS a
    JOIN CAPESSOAS pess
    ON pess.pessoa = a.pessoa
    WHERE a.preDocumento = p_cab_preDocumento)
  LOOP
    v_cab_valorProdutos            := a.valorProdutos;
    v_cab_valorServicos            := a.valorServicos;
    v_cab_valorBasePagamento       := a.valorBasePagamento;
    v_cab_valorAVistaMinimo        := a.valorAVistaMinimo;
    v_cab_valorFreteTotal          := a.valorFreteTotal;
    v_cab_valorSeguroTotal         := a.valorSeguroTotal;
    v_cab_valorDescontoTotal       := a.valorDescontoTotal;
    v_cab_valorOutrasDespesasTotal := a.valorOutrasDespesasTotal;
    v_cab_valorAdicFreteMarinTotal := a.valorAdicFreteMarinhaMerTotal;
    v_cab_valorDespesasAduanTotal  := a.valorDespesasAduaneirasTotal;
    v_cab_valorLiquidoItem         := a.valorLiquidoItem;
    v_cab_valorDescCustoOpTotal    := a.valorDescontoCustoOpTotal;
    v_cab_valorAcrescCustoOpTotal  := a.valorAcrescimoCustoOpTotal;
    v_cab_valorCustoOperacao       := a.valorCustoOperacao;
    v_cab_valorCMV                 := a.valorCMV;
    v_cab_valorAcrescExtempTotal   := a.valorAcrescimoExtempTotal;    
    SELECT
      CASE
        WHEN EXISTS (
          SELECT 1
          FROM MOPREDOCUMXITENS a
          JOIN MOPREDOCUMXORCAMENTOITEM docXorc
          ON docXorc.idItemPreDocumento = a.idItemPreDocumento
          JOIN MOORCAMENTOXITENS itemOrc
          ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento
          JOIN PACONTROLESENTREGA contr
          ON contr.controleEntrega = itemOrc.controleEntrega
          WHERE a.preDocumento = p_cab_preDocumento
          AND itemOrc.controleEntrega <> 0
          AND contr.habilitaFrete = 1)
        THEN 1
        ELSE 0
      END
    INTO v_habilitaControleEntrega
    FROM DUAL;
    ADD_PRE_DOC_CALC_IMP_RATEIO (
      a.preDocumento,
      p_troca_tipoPagamentoFrete,
      p_a_cab_tipoPagamentoFrete,
      a.origemDocumento,
      a.entradaSaida,
      a.devolucaoAnulacaoRetorno,
      a.atualizaCustoMedio,
      a.estabelecimento,
      a.tipoPagamentoFrete,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorDescontoGeral,
      a.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      a.impostosEditados,
      a.valorDescontoCustoOpGeral,
      a.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoExtempGeral,
      v_habilitaControleEntrega,
      /* Retornos */
      v_cab_valorProdutos,
      v_cab_valorServicos,
      v_cab_valorBasePagamento,
      v_cab_valorAVistaMinimo,
      v_cab_valorFreteTotal,
      v_cab_valorSeguroTotal,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespesasTotal,
      v_cab_valorAdicFreteMarinTotal,
      v_cab_valorDespesasAduanTotal,
      v_cab_valorLiquidoItem,
      v_cab_valorDescCustoOpTotal,
      v_cab_valorAcrescCustoOpTotal,
      v_cab_valorCustoOperacao,
      v_cab_valorCMV,
      v_cab_valorAcrescExtempTotal,
      v_calcularImpostosItem);
    IF v_calcularImpostosItem = 1 THEN
      ADD_PRE_DOC_CALC_IMP_ITENS(
        p_config_64_casasDecSaidas,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        a.preDocumento,
        a.origemDocumento,
        a.entradaSaida,
        a.devolucaoAnulacaoRetorno,
        a.atualizaCustoMedio,
        a.estabelecimento,
        a.dataEntradaSaida,
        a.pessoa,
        a.localDestinoOperacao,
        a.indicadorConsumidorFinal,
        a.tipoPagamentoFrete,
        a.indicadorInscricaoEstadual,
        /* Retornos */
        v_cab_valorProdutos,
        v_cab_valorServicos,
        v_cab_valorBasePagamento,
        v_cab_valorAVistaMinimo,
        v_cab_valorFreteTotal,
        v_cab_valorSeguroTotal,
        v_cab_valorDescontoTotal,
        v_cab_valorOutrasDespesasTotal,
        v_cab_valorAdicFreteMarinTotal,
        v_cab_valorDespesasAduanTotal,
        v_cab_valorLiquidoItem,
        v_cab_valorDescCustoOpTotal,
        v_cab_valorAcrescCustoOpTotal,
        v_cab_valorCustoOperacao,
        v_cab_valorCMV,
        v_cab_valorAcrescExtempTotal);
    END IF;
    UPDATE MOPREDOCUMENTOS SET 
      valorProdutos                 = v_cab_valorProdutos,
      valorServicos                 = v_cab_valorServicos,
      valorBasePagamento            = v_cab_valorBasePagamento,
      valorAVistaMinimo             = v_cab_valorAVistaMinimo,
      valorFreteTotal               = v_cab_valorFreteTotal,
      valorSeguroTotal              = v_cab_valorSeguroTotal,
      valorDescontoTotal            = v_cab_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarinTotal,
      valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
      valorLiquidoItem              = v_cab_valorLiquidoItem,
      valorDescontoCustoOpTotal     = v_cab_valorDescCustoOpTotal,
      valorAcrescimoCustoOpTotal    = v_cab_valorAcrescCustoOpTotal,
      valorCustoOperacao            = v_cab_valorCustoOperacao,
      valorCMV                      = v_cab_valorCMV,
      valorAcrescimoExtempTotal     = v_cab_valorAcrescExtempTotal
    WHERE preDocumento              = a.preDocumento;
  END LOOP;
END ADD_PRE_DOC_CALC_IMP_CAB;

/

create or replace PROCEDURE ADD_PRE_DOC_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_227_manterPessoaOrcam IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     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, -- D = Documento Fiscal, O = Orçamento, P, Pré-Documento, T = Transferência
  p_idItemReferenciado           IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_tempComp_nomeTempComposicao  IN VARCHAR2,
  p_tempComp_sequencia           IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemPreDocumento      IN NUMBER,
  p_item_preDocumento            IN NUMBER,
  p_item_pedidoCompraFornecedor  IN VARCHAR2,
  p_item_sequenciaPedidoCompraFo IN NUMBER,
  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_quantidadeExtemporanea  IN NUMBER,
  p_item_acrescimoUnitarioExtemp IN NUMBER,
  p_item_valorAcrescimoExtempIte IN NUMBER,
  p_item_valorDescontoCustoOpIte IN NUMBER,
  p_item_valorAcrescimoCustoOpIt 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_valorAcrescimoExtempGer IN NUMBER,
  p_item_valorDescontoCustoOpGer IN NUMBER,
  p_item_valorAcrescimoCustoOpGe IN NUMBER,
  p_item_valorDescontoPagamento  IN NUMBER,
  p_item_valorOutrasDespPagament IN NUMBER,
  p_item_valorJurosPagamento     IN NUMBER,
  p_item_percentualDevolucao     IN NUMBER,
  p_item_valorIPIDevolucao       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_idItemPreDocumento    IN VARCHAR2,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER,
  r_item_idItemPreDocumento      OUT NUMBER,
  r_buffer_idItemPreDocumento    OUT VARCHAR2,
  r_valorInserido                OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_finalidadeNota           CHAR (1);
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_documentoFiscal          NUMBER;
  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_projeto                  VARCHAR2 (60);
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  v_cab_statusPreDocumento       CHAR (1);
  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_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota 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_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_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_item_sequencia               NUMBER;
  v_item_cancelado               NUMBER;
  v_item_quantidadeDevolvidaRet  NUMBER;
  v_item_precoUnitario           NUMBER;
  v_item_precoUnitarioConvertido NUMBER;
  v_item_valorProdutoServicoBrut NUMBER;
  v_item_valorProdutoServico     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_item_valorDescontoCustoOpTot NUMBER;
  v_item_valorAcrescimoCustoOpTo NUMBER;
  v_item_precoCustoOperacao      NUMBER;
  v_item_valorCustoOperacao      NUMBER;
  v_item_precoCMV                NUMBER;
  v_item_valorCMV                NUMBER;
  v_item_valorAcrescimoExtempSub NUMBER;
  v_item_valorAcrescimoExtempTot 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_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_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  r_item_idItemPreDocumento := p_item_idItemPreDocumento;
  r_buffer_idItemPreDocumento := p_buffer_idItemPreDocumento;
  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.devolucaoAnulacaoRetorno,
    cab.finalidadeNota,
    cab.atualizaCustoMedio,
    cab.documentoFiscal,
    cab.estabelecimento,
    cab.dataEmissao,
    cab.pessoa,
    cab.enderecoEntregaPessoa,
    cab.municipioFatoGerador,
    cab.localDestinoOperacao,
    cab.indicadorConsumidorFinal,
    cab.projeto,
    cab.modalidadeFrete,
    cab.tipoPagamentoFrete,
    cab.statusPreDocumento,
    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,
    cab.valorDescontoCustoOpItem,
    cab.valorDescontoCustoOpGeral,
    cab.valorDescontoCustoOpTotal,
    cab.valorAcrescimoCustoOpItem,
    cab.valorAcrescimoCustoOpGeral,
    cab.valorAcrescimoCustoOpTotal,
    cab.valorCustoOperacao,
    cab.valorCMV,
    cab.quantidadeExtemporanea,
    cab.valorAcrescimoExtempSubtotal,
    cab.valorAcrescimoExtempItem,
    cab.valorAcrescimoExtempGeral,
    cab.valorAcrescimoExtempTotal,
    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
  INTO
    v_cab_origemDocumento,
    v_cab_tipoDocumento,
    v_cab_entradaSaida,
    v_cab_devolucaoAnulacaoRetorno,
    v_cab_finalidadeNota,
    v_cab_atualizaCustoMedio,
    v_cab_documentoFiscal,
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_pessoa,
    v_cab_enderecoEntregaPessoa,
    v_cab_municipioFatoGerador,
    v_cab_localDestinoOperacao,
    v_cab_indicadorConsumidorFinal,
    v_cab_projeto,
    v_cab_modalidadeFrete,
    v_cab_tipoPagamentoFrete,
    v_cab_statusPreDocumento,
    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_cab_valorDescontoCustoOpItem,
    v_cab_valorDescontoCustoOpGera,
    v_cab_valorDescontoCustoOpTota,
    v_cab_valorAcrescimoCustoOpIte,
    v_cab_valorAcrescimoCustoOpGer,
    v_cab_valorAcrescimoCustoOpTot,
    v_cab_valorCustoOperacao,
    v_cab_valorCMV,
    v_cab_quantidadeExtemporanea,
    v_cab_valorAcrescimoExtempSubt,
    v_cab_valorAcrescimoExtempItem,
    v_cab_valorAcrescimoExtempGera,
    v_cab_valorAcrescimoExtempTota,
    v_est_grupoFiscal,
    v_pessEst_regimeTributario,
    v_munEndEst_uf,
    v_pess_indicadorInscricaoEstad,
    v_endPess_enderecoPessoa,
    v_munEndPess_uf,
    v_munEndEntr_uf
  FROM MOPREDOCUMENTOS 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
  WHERE cab.preDocumento = p_item_preDocumento;
  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_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_item_quantidadeDevolvidaRet  := 0;
  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_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;
  IF p_manterFinanceiro_Retotalizar = 0 THEN
    SELECT COALESCE (MAX(1), 0)
    INTO v_cab_promocaoExiste
    FROM MOPREDOCUMXPROMOCOES
    WHERE preDocumento = p_item_preDocumento;
  END IF;
  IF p_item_idItemPreDocumento > 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.quantidadeDevolvidaRetornada,
        a.pesoLiquido,
        a.pesoBruto,
        a.valorProdutoServicoBruto,
        a.valorProdutoServico,
        a.valorDescontoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.quantidadeExtemporanea,
        a.valorAcrescimoExtempSubtotal,
        a.valorAcrescimoExtempItem,
        a.valorDescontoCustoOpItem,
        a.valorAcrescimoCustoOpItem,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorAcrescimoExtempGeral,
        a.valorDescontoCustoOpGeral,
        a.valorAcrescimoCustoOpGeral,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.valorFreteTotal,
        a.valorSeguroTotal,
        a.valorDescontoTotal,
        a.valorOutrasDespesasTotal,
        a.valorAdicFreteMarinhaMerTotal,
        a.valorDespesasAduaneirasTotal,
        a.valorAcrescimoExtempTotal,
        a.valorDescontoCustoOpTotal,
        a.valorAcrescimoCustoOpTotal,
        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,
        a.valorCustoOperacao,
        a.valorCMV,
        prod.tipoProduto
      FROM MOPREDOCUMXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      WHERE a.idItemPreDocumento = p_item_idItemPreDocumento)
    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_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_item_quantidadeDevolvidaRet := a.quantidadeDevolvidaRetornada;
      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 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 <> p_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;
        v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
        v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
        v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
        v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
        v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
        v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
        v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
        v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
        v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
        v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
        v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
        v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
        v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      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,
    p_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);
  v_item_valorAcrescimoExtempSub := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
    p_item_quantidade,
    v_item_precoUnitario,
    p_item_quantidadeExtemporanea,
    p_item_acrescimoUnitarioExtemp);
  v_item_valorAcrescimoExtempTot := FUNC_ADD_CALC_EXTEMP_TOTAL(
    v_item_valorAcrescimoExtempSub,
    p_item_valorAcrescimoExtempIte,
    p_item_valorAcrescimoExtempGer);
  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 = CASE WHEN v_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
      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 / ((v_combo_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 / ((v_combo_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,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_estabelecimento,
        NULL, -- p_cab_dataPrecoInicial
        TRUNC(SYSDATE), -- p_cab_dataPrecoFinal
        v_cab_pessoa,
        v_cab_projeto,
        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_PRE_DOC_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_227_manterPessoaOrcam,
        p_config_362_calcCustoPorGrade,
        p_config_378_calcularVolumes,
        p_config_413_obs_add_marca,
        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, -- D = Documento Fiscal, G = Grade DF-e, O = Orçamento, 'P', Pré-Documento, T = Transferência
        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_calcularImpostos,
        0, -- p_item_idItemPreDocumento
        p_item_preDocumento,
        p_item_pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo,
        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
        CASE
          WHEN p_item_quantidade = 0
          THEN 0
          ELSE ROUND(p_item_quantidadeExtemporanea * a.quantidade / p_item_quantidade, 2)
        END, -- p_item_quantidadeExtemporanea
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_acrescimoUnitarioExtemp
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_acrescimoUnitarioExtemp
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoExtempIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpIt
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpIt
        p_item_observacoesDigitadas,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorFreteGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_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_valorAcrescimoExtempGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpGe
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpGe
        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
        p_item_percentualDevolucao,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorIPIDevolucao
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorIPIDevolucao,
        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_idItemPreDocumento,
        /* Retornos */
        r_calcularImpostos,
        v_auxNumber, -- idItemPreDocumento
        r_buffer_idItemPreDocumento,
        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_PRE_DOC_ITEM_COMBO_RESIDUO (
        p_item_preDocumento,
        v_item_valorProdutoServico,
        p_item_valorDescontoItem,
        p_item_valorAcrescimoItem,
        v_modDoc_diminuiDescontoPrUnit,
        v_modDoc_somaAcrescimosPrUnit,
        r_buffer_idItemPreDocumento,
        r_valorInserido);
      r_calcularImpostos := 1;
    END IF;
  ELSE
    IF r_item_idItemPreDocumento <= 0 THEN
      r_item_idItemPreDocumento := FUNC_ADD_BUSCA_PROXIMO_ID ('MOPREDOCUMXITENS', 'idItemPreDocumento', 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
          OR p_item_valorAcrescimoExtempGer <> 0
          OR p_item_valorDescontoCustoOpGer <> 0
          OR p_item_valorAcrescimoCustoOpGe <> 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_PRE_DOC_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          p_item_preDocumento,
          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 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,
        p_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,
        v_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,
        v_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
        p_item_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,
      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
      v_item_valorAcrescimoExtempTot,
      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,
      p_item_valorIPIDevolucao,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      v_item_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0 -- p_item_somarICMSST
      );
    ADD_CALCULA_CUSTO_CMV (
      v_cab_atualizaCustoMedio,
      v_cab_estabelecimento,
      0, -- p_cab_nfFornecedor
      p_item_modeloDocumento,
      p_item_quantidade,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      p_item_valorIPIDevolucao,
      v_item_valorPIS,
      v_item_valorPISST,
      v_item_valorCOFINS,
      v_item_valorCOFINSST,
      v_item_valorCreditoSimplesNac,
      v_item_valorICMS,
      v_item_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      v_item_valorLiquidoItem,
      p_item_valorDescontoCustoOpIte,
      p_item_valorDescontoCustoOpGer,
      p_item_valorAcrescimoCustoOpIt,
      p_item_valorAcrescimoCustoOpGe,
      v_item_valorAcrescimoExtempTot,
      v_item_valorDescontoCustoOpTot,
      v_item_valorAcrescimoCustoOpTo,
      v_item_precoCustoOperacao,
      v_item_valorCustoOperacao,
      v_item_precoCMV,
      v_item_valorCMV);
    IF v_inserindoItem = 1 THEN
      SELECT COALESCE (MAX (sequencia),0) + 1
      INTO v_item_sequencia
      FROM MOPREDOCUMXITENS
      WHERE preDocumento = p_item_preDocumento;
      v_cab_ultimoVendedorItem := p_item_vendedor;
    END IF;
    IF v_item_cancelado = 0 THEN
      IF p_manterFinanceiro_Retotalizar <> 2 THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume + TRUNC(CASE WHEN p_item_controleQuantidade = 1 AND p_item_loteMultiplo <> 0 THEN p_item_quantidade / p_item_loteMultiplo ELSE p_item_quantidadeConvertida END,0);
        END IF;
        v_cab_pesoLiquido := v_cab_pesoLiquido + p_item_pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto + p_item_pesoBruto;
      END IF;
      v_cab_quantidade := v_cab_quantidade + p_item_quantidadeConvertida;
      IF v_prod_tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorServicos := v_cab_valorServicos + v_item_valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos + p_item_valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorProdutos := v_cab_valorProdutos + v_item_valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos + p_item_valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem + p_item_valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem + p_item_valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem + p_item_valorAdicFreteMarItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem + p_item_valorDespesasAduanItem;
      v_cab_valorFreteGeral := v_cab_valorFreteGeral + p_item_valorFreteGeral;
      v_cab_valorSeguroGeral := v_cab_valorSeguroGeral + p_item_valorSeguroGeral;
      v_cab_valorDescontoGeral := v_cab_valorDescontoGeral + v_item_valorDescontoGeral;
      v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral + p_item_valorOutrasDespesasGer;
      v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral + p_item_valorAdicFreteMarGeral;
      v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral + p_item_valorDespesasAduanGeral;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento + v_item_valorBasePagamento;
      IF p_item_usarPrecoAVista = 1
        AND v_item_geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo + v_item_valorProdutoServico - v_item_valorDescontoTotal + v_item_valorOutrasDespesasTot;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento + v_item_valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento + v_item_valorOutrasDespPagament;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento + v_item_valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal + v_item_valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal + v_item_valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal + v_item_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_item_valorOutrasDespesasTot;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal + v_item_valorAdicFreteMarTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal + v_item_valorDespesasAduanTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem + v_item_valorLiquidoItem;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem + p_item_valorDescontoCustoOpIte;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera + p_item_valorDescontoCustoOpGer;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota + v_item_valorDescontoCustoOpTot;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte + p_item_valorAcrescimoCustoOpIt;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer + p_item_valorAcrescimoCustoOpGe;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot + v_item_valorAcrescimoCustoOpTo;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao + v_item_valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV + v_item_valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea + p_item_quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt + v_item_valorAcrescimoExtempSub;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem + p_item_valorAcrescimoExtempIte;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera + p_item_valorAcrescimoExtempGer;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota + v_item_valorAcrescimoExtempTot;
    END IF;
    UPDATE MOPREDOCUMENTOS SET
      modalidadeFrete               = v_cab_modalidadeFrete,
      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,
      valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
      valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
      valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
      valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
      valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
      valorCustoOperacao            = v_cab_valorCustoOperacao,
      valorCMV                      = v_cab_valorCMV,
      quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
      valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
      valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
      valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
    WHERE preDocumento = p_item_preDocumento;
    IF p_item_idItemPreDocumento > 0 THEN
      DELETE MOPREDOCUMXCOMPOSICOESPR compDoc
      WHERE compDoc.idItemPreDocumento = p_item_idItemPreDocumento
      AND EXISTS(
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.produto = comp.produto
        WHERE comp.composicaoPreco = compDoc.composicaoPreco
        AND gradProd.gradeProduto <> p_item_gradeProduto);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      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_413_obs_add_marca,
      ' ',
      0,
      'P',
      p_item_idItemPreDocumento,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    MERGE INTO MOPREDOCUMXITENS a USING (
      SELECT
        r_item_idItemPreDocumento      idItemPreDocumento,
        p_item_preDocumento            preDocumento,
        v_item_sequencia               sequencia,
        v_item_cancelado               cancelado,
        p_item_pedidoCompraFornecedor  pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo sequenciaPedidoCompraFornec,
        p_item_modeloDocumento         modeloDocumento,
        p_item_estabelecimentoOriginal estabelecimentoOriginal,
        p_item_vendedor                vendedor,
        p_item_gradeProduto            gradeProduto,
        p_item_idFormulaTinta          idFormulaTinta,
        p_item_personalizacao          personalizacao,
        p_item_idLoteEstoque           idLoteEstoque,
        p_item_operacaoFiscal          operacaoFiscal,
        v_item_movimentaEstoque        movimentaEstoque,
        v_item_geraFinanceiro          geraFinanceiro,
        p_item_localEstoque            localEstoque,
        p_item_pessoaParticipante      pessoaParticipante,
        p_item_controleQuantidade      controleQuantidade,
        p_item_unidadeMedidaConversao  unidadeMedidaConversao,
        p_item_conversorQuantidade     conversorQuantidade,
        p_item_loteMinimo              loteMinimo,
        p_item_loteMultiplo            loteMultiplo,
        p_item_altura                  altura,
        p_item_largura                 largura,
        p_item_comprimento             comprimento,
        p_item_pecas                   pecas,
        p_item_quantidade              quantidade,
        p_item_quantidadeConvertida    quantidadeConvertida,
        v_item_quantidadeDevolvidaRet  quantidadeDevolvidaRetornada,
        p_item_percentualDevolucao     percentualDevolucao,
        p_item_pesoLiquido             pesoLiquido,
        p_item_pesoBruto               pesoBruto,
        p_item_tipoPreco               tipoPreco,
        p_item_tabelaPreco             tabelaPreco,
        p_item_precoSugestaoAPrazo     precoSugestaoAPrazo,
        p_item_precoSugestaoAVista     precoSugestaoAVista,
        p_item_precoDesconto           precoDesconto,
        p_item_precoMinimo             precoMinimo,
        p_item_usarPrecoAVista         usarPrecoAVista,
        p_item_precoUnitarioBruto      precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos acrescimoUnitarioComposicao,
        v_item_precoUnitario           precoUnitario,
        v_item_precoUnitarioConvertido precoUnitarioConvertido,
        v_item_valorProdutoServicoBrut valorProdutoServicoBruto,
        v_item_valorProdutoServico     valorProdutoServico,
        p_item_percDescontoItem        percDescontoItem,
        p_item_valorDescontoItem       valorDescontoItem,
        p_item_percAcrescimoItem       percAcrescimoItem,
        p_item_valorAcrescimoItem      valorAcrescimoItem,
        p_item_valorFreteItem          valorFreteItem,
        p_item_valorSeguroItem         valorSeguroItem,
        p_item_valorAdicFreteMarItem   valorAdicFreteMarinhaMerItem,
        p_item_valorDespesasAduanItem  valorDespesasAduaneirasItem,
        p_item_valorFreteGeral         valorFreteGeral,
        p_item_valorSeguroGeral        valorSeguroGeral,
        v_item_valorDescontoGeral      valorDescontoGeral,
        p_item_valorOutrasDespesasGer  valorOutrasDespesasGeral,
        p_item_valorAdicFreteMarGeral  valorAdicFreteMarinhaMerGeral,
        p_item_valorDespesasAduanGeral valorDespesasAduaneirasGeral,
        v_item_valorBasePagamento      valorBasePagamento,
        v_item_valorDescontoPagamento  valorDescontoPagamento,
        v_item_valorOutrasDespPagament valorOutrasDespesasPagamento,
        v_item_valorJurosPagamento     valorJurosPagamento,
        v_item_valorFreteTotal         valorFreteTotal,
        v_item_valorSeguroTotal        valorSeguroTotal,
        v_item_valorDescontoTotal      valorDescontoTotal,
        v_item_valorOutrasDespesasTot  valorOutrasDespesasTotal,
        v_item_valorAdicFreteMarTotal  valorAdicFreteMarinhaMerTotal,
        v_item_valorDespesasAduanTotal valorDespesasAduaneirasTotal,
        v_item_cfop                    cfop,
        v_item_indicadorISSQN          indicadorISSQN,
        v_item_aliquotaISSQN           aliquotaISSQN,
        v_item_retidoISSQN             retidoISSQN,
        v_item_tributadoForaMunicipio  tributadoForaMunicipio,
        v_item_incentivoFiscal         incentivoFiscal,
        v_item_listaServicos           listaServicos,
        v_item_cnae                    cnae,
        v_item_idServicoMunicipio      idServicoMunicipio,
        v_item_numeroProcessoAdministr numeroProcessoAdministrativo,
        v_item_baseISSQN               baseISSQN,
        v_item_valorISSQN              valorISSQN,
        v_item_retencaoIRRF            retencaoIRRF,
        v_item_baseRetIRRF             baseRetIRRF,
        v_item_valorRetIRRF            valorRetIRRF,
        v_item_retencaoINSS            retencaoINSS,
        v_item_baseRetINSS             baseRetINSS,
        v_item_valorRetINSS            valorRetINSS,
        v_item_retencaoPIS             retencaoPIS,
        v_item_baseRetPIS              baseRetPIS,
        v_item_valorRetPIS             valorRetPIS,
        v_item_retencaoCOFINS          retencaoCOFINS,
        v_item_baseRetCOFINS           baseRetCOFINS,
        v_item_valorRetCOFINS          valorRetCOFINS,
        v_item_retencaoCSLL            retencaoCSLL,
        v_item_baseRetCSLL             baseRetCSLL,
        v_item_valorRetCSLL            valorRetCSLL,
        v_item_retencaoOutros          retencaoOutros,
        v_item_baseRetOutros           baseRetOutros,
        v_item_valorRetOutros          valorRetOutros,
        v_item_aliquotaII              aliquotaII,
        v_item_baseII                  baseII,
        v_item_valorII                 valorII,
        v_item_aliquotaIOF             aliquotaIOF,
        v_item_baseIOF                 baseIOF,
        v_item_valorIOF                valorIOF,
        v_item_codigoEnquadramentoIPI  codigoEnquadramentoIPI,
        v_item_stIPI                   stIPI,
        v_item_aliquotaIPI             aliquotaIPI,
        v_item_valorAliquotaIPI        valorAliquotaIPI,
        v_item_baseIPI                 baseIPI,
        v_item_valorIPI                valorIPI,
        p_item_valorIPIDevolucao       valorIPIDevolucao,
        v_item_stPIS                   stPIS,
        v_item_aliquotaPIS             aliquotaPIS,
        v_item_valorAliquotaPIS        valorAliquotaPIS,
        v_item_basePIS                 basePIS,
        v_item_valorPIS                valorPIS,
        v_item_aliquotaPISST           aliquotaPISST,
        v_item_valorAliquotaPISST      valorAliquotaPISST,
        v_item_basePISST               basePISST,
        v_item_valorPISST              valorPISST,
        v_item_stCOFINS                stCOFINS,
        v_item_aliquotaCOFINS          aliquotaCOFINS,
        v_item_valorAliquotaCOFINS     valorAliquotaCOFINS,
        v_item_baseCOFINS              baseCOFINS,
        v_item_valorCOFINS             valorCOFINS,
        v_item_aliquotaCOFINSST        aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST   valorAliquotaCOFINSST,
        v_item_baseCOFINSST            baseCOFINSST,
        v_item_valorCOFINSST           valorCOFINSST,
        v_item_stSimplesNacional       stSimplesNacional,
        v_item_creditoSimplesNacional  creditoSimplesNacional,
        v_item_baseCreditoSimplesNac   baseCreditoSimplesNacional,
        v_item_valorCreditoSimplesNac  valorCreditoSimplesNacional,
        v_item_stICMS                  stICMS,
        v_item_modalBaseCalcICMS       modalidadeBaseCalcICMS,
        v_item_reducaoBaseICMS         reducaoBaseICMS,
        v_item_aliquotaICMS            aliquotaICMS,
        v_item_diferimentoICMS         diferimentoICMS,
        v_item_motivoDesoneracaoICMS   motivoDesoneracaoICMS,
        v_item_idBeneficio             idBeneficio,
        v_item_baseICMS                baseICMS,
        v_item_valorICMSOperacao       valorICMSOperacao,
        v_item_valorICMSDiferido       valorICMSDiferido,
        v_item_valorICMS               valorICMS,
        v_item_valorICMSDesoneracao    valorICMSDesoneracao,
        v_item_modalBaseCalcICMSST     modalidadeBaseCalcICMSST,
        v_item_margemValorAdicionadoST margemValorAdicionadoST,
        v_item_reducaoBaseST           reducaoBaseST,
        v_item_aliquotaICMSST          aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin aliquotaSTSuportConsFinal,
        v_item_baseICMSST              baseICMSST,
        v_item_valorICMSST             valorICMSST,
        v_item_baseICMSSTAnteriormente baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment valorICMSSTAnteriormente,
        v_item_valorICMSProprioSubstit valorICMSProprioSubstituto,
        v_item_reducaoBaseICMSEfetivo  reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo     aliquotaICMSEfetivo,
        v_item_baseICMSEfetivo         baseICMSEfetivo,
        v_item_valorICMSEfetivo        valorICMSEfetivo,
        v_item_aliquotaICMSUFDestinat  aliquotaICMSUFDestinatario,
        v_item_aliquotaICMSInterestad  aliquotaICMSInterestadual,
        v_item_partilhaICMSInterestad  partilhaICMSInterestadual,
        v_item_baseICMSUFDestinatario  baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente     baseICMSUFRemetente,
        v_item_valorICMSUFRemetente    valorICMSUFRemetente,
        v_item_aliquotaFCP             aliquotaFCP,
        v_item_baseFCP                 baseFCP,
        v_item_valorFCP                valorFCP,
        v_item_aliquotaFCPST           aliquotaFCPST,
        v_item_baseFCPST               baseFCPST,
        v_item_valorFCPST              valorFCPST,
        v_item_aliquotaFCPSTAnteriorm  aliquotaFCPSTAnteriormente,
        v_item_baseFCPSTAnteriormente  baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente valorFCPSTAnteriormente,
        v_item_aliquotaFCPUFDestinat   aliquotaFCPUFDestinatario,
        v_item_baseFCPUFDestinatario   baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario  valorFCPUFDestinatario,
        v_item_aliquotaEstImpFederais  aliquotaEstimadaImpFederais,
        v_item_aliquotaEstImpEstaduais aliquotaEstimadaImpEstaduais,
        v_item_aliquotaEstImpMunicipai aliquotaEstimadaImpMunicipais,
        v_item_baseEstimadaImpostos    baseEstimadaImpostos,
        v_item_valorEstImpFederais     valorEstimadoImpFederais,
        v_item_valorEstImpEstaduais    valorEstimadoImpEstaduais,
        v_item_valorEstImpMunicipais   valorEstimadoImpMunicipais,
        v_item_valorLiquidoItem        valorLiquidoItem,
        p_item_valorDescontoCustoOpIte valorDescontoCustoOpItem,
        p_item_valorDescontoCustoOpGer valorDescontoCustoOpGeral,
        v_item_valorDescontoCustoOpTot valorDescontoCustoOpTotal,
        p_item_valorAcrescimoCustoOpIt valorAcrescimoCustoOpItem,
        p_item_valorAcrescimoCustoOpGe valorAcrescimoCustoOpGeral,
        v_item_valorAcrescimoCustoOpTo valorAcrescimoCustoOpTotal,
        v_item_precoCustoOperacao      precoCustoOperacao,
        v_item_valorCustoOperacao      valorCustoOperacao,
        v_item_precoCMV                precoCMV,
        v_item_valorCMV                valorCMV,
        p_item_quantidadeExtemporanea  quantidadeExtemporanea,
        p_item_acrescimoUnitarioExtemp acrescimoUnitarioExtemporaneo,
        v_item_valorAcrescimoExtempSub valorAcrescimoExtempSubtotal,
        p_item_valorAcrescimoExtempIte valorAcrescimoExtempItem,
        p_item_valorAcrescimoExtempGer valorAcrescimoExtempGeral,
        v_item_valorAcrescimoExtempTot valorAcrescimoExtempTotal,
        p_item_observacoesDigitadas    observacoesDigitadas,
        v_observacoes                  observacoes
      FROM DUAL) b
    ON (a.idItemPreDocumento = b.idItemPreDocumento)
    WHEN MATCHED THEN UPDATE SET
      a.preDocumento                  = b.preDocumento,
      a.sequencia                     = b.sequencia,
      a.cancelado                     = b.cancelado,
      a.pedidoCompraFornecedor        = b.pedidoCompraFornecedor,
      a.sequenciaPedidoCompraFornec   = b.sequenciaPedidoCompraFornec,
      a.vendedor                      = b.vendedor,
      a.modeloDocumento               = b.modeloDocumento,
      a.estabelecimentoOriginal       = b.estabelecimentoOriginal,
      a.gradeProduto                  = b.gradeProduto,
      a.idFormulaTinta                = b.idFormulaTinta,
      a.personalizacao                = b.personalizacao,
      a.idLoteEstoque                 = b.idLoteEstoque,
      a.operacaoFiscal                = b.operacaoFiscal,
      a.movimentaEstoque              = b.movimentaEstoque,
      a.geraFinanceiro                = b.geraFinanceiro,
      a.localEstoque                  = b.localEstoque,
      a.pessoaParticipante            = b.pessoaParticipante,
      a.controleQuantidade            = b.controleQuantidade,
      a.unidadeMedidaConversao        = b.unidadeMedidaConversao,
      a.conversorQuantidade           = b.conversorQuantidade,
      a.loteMinimo                    = b.loteMinimo,
      a.loteMultiplo                  = b.loteMultiplo,
      a.altura                        = b.altura,
      a.largura                       = b.largura,
      a.comprimento                   = b.comprimento,
      a.pecas                         = b.pecas,
      a.quantidade                    = b.quantidade,
      a.quantidadeConvertida          = b.quantidadeConvertida,
      a.quantidadeDevolvidaRetornada  = b.quantidadeDevolvidaRetornada,
      a.percentualDevolucao           = b.percentualDevolucao,
      a.pesoLiquido                   = b.pesoLiquido,
      a.pesoBruto                     = b.pesoBruto,
      a.tipoPreco                     = b.tipoPreco,
      a.tabelaPreco                   = b.tabelaPreco,
      a.precoSugestaoAPrazo           = b.precoSugestaoAPrazo,
      a.precoSugestaoAVista           = b.precoSugestaoAVista,
      a.precoDesconto                 = b.precoDesconto,
      a.precoMinimo                   = b.precoMinimo,
      a.usarPrecoAVista               = b.usarPrecoAVista,
      a.precoUnitarioBruto            = b.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao   = b.acrescimoUnitarioComposicao,
      a.precoUnitario                 = b.precoUnitario,
      a.precoUnitarioConvertido       = b.precounitarioConvertido,
      a.valorProdutoServicoBruto      = b.valorProdutoServicoBruto,
      a.valorProdutoServico           = b.valorProdutoServico,
      a.percDescontoItem              = b.percDescontoItem,
      a.valorDescontoItem             = b.valorDescontoItem,
      a.percAcrescimoItem             = b.percAcrescimoItem,
      a.valorAcrescimoItem            = b.valorAcrescimoItem,
      a.valorFreteItem                = b.valorFreteItem,
      a.valorSeguroItem               = b.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem  = b.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem   = b.valorDespesasAduaneirasItem,
      a.valorFreteGeral               = b.valorFreteGeral,
      a.valorSeguroGeral              = b.valorSeguroGeral,
      a.valorDescontoGeral            = b.valorDescontoGeral,
      a.valorOutrasDespesasGeral      = b.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral = b.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral  = b.valorDespesasAduaneirasGeral,
      a.valorBasePagamento            = b.valorBasePagamento,
      a.valorDescontoPagamento        = b.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento  = b.valorOutrasDespesasPagamento,
      a.valorJurosPagamento           = b.valorJurosPagamento,
      a.valorFreteTotal               = b.valorFreteTotal,
      a.valorSeguroTotal              = b.valorSeguroTotal,
      a.valorDescontoTotal            = b.valorDescontoTotal,
      a.valorOutrasDespesasTotal      = b.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal = b.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal  = b.valorDespesasAduaneirasTotal,
      a.cfop                          = b.cfop,
      a.indicadorISSQN                = b.indicadorISSQN,
      a.aliquotaISSQN                 = b.aliquotaISSQN,
      a.retidoISSQN                   = b.retidoISSQN,
      a.tributadoForaMunicipio        = b.tributadoForaMunicipio,
      a.incentivoFiscal               = b.incentivoFiscal,
      a.listaServicos                 = b.listaServicos,
      a.cnae                          = b.cnae,
      a.idServicoMunicipio            = b.idServicoMunicipio,
      a.numeroProcessoAdministrativo  = b.numeroProcessoAdministrativo,
      a.baseISSQN                     = b.baseISSQN,
      a.valorISSQN                    = b.valorISSQN,
      a.retencaoIRRF                  = b.retencaoIRRF,
      a.baseRetIRRF                   = b.baseRetIRRF,
      a.valorRetIRRF                  = b.valorRetIRRF,
      a.retencaoINSS                  = b.retencaoINSS,
      a.baseRetINSS                   = b.baseRetINSS,
      a.valorRetINSS                  = b.valorRetINSS,
      a.retencaoPIS                   = b.retencaoPIS,
      a.baseRetPIS                    = b.baseRetPIS,
      a.valorRetPIS                   = b.valorRetPIS,
      a.retencaoCOFINS                = b.retencaoCOFINS,
      a.baseRetCOFINS                 = b.baseRetCOFINS,
      a.valorRetCOFINS                = b.valorRetCOFINS,
      a.retencaoCSLL                  = b.retencaoCSLL,
      a.baseRetCSLL                   = b.baseRetCSLL,
      a.valorRetCSLL                  = b.valorRetCSLL,
      a.retencaoOutros                = b.retencaoOutros,
      a.baseRetOutros                 = b.baseRetOutros,
      a.valorRetOutros                = b.valorRetOutros,
      a.aliquotaII                    = b.aliquotaII,
      a.baseII                        = b.baseII,
      a.valorII                       = b.valorII,
      a.aliquotaIOF                   = b.aliquotaIOF,
      a.baseIOF                       = b.baseIOF,
      a.valorIOF                      = b.valorIOF,
      a.codigoEnquadramentoIPI        = b.codigoEnquadramentoIPI,
      a.stIPI                         = b.stIPI,
      a.aliquotaIPI                   = b.aliquotaIPI,
      a.valorAliquotaIPI              = b.valorAliquotaIPI,
      a.baseIPI                       = b.baseIPI,
      a.valorIPI                      = b.valorIPI,
      a.valorIPIDevolucao             = b.valorIPIDevolucao,
      a.stPIS                         = b.stPIS,
      a.aliquotaPIS                   = b.aliquotaPIS,
      a.valorAliquotaPIS              = b.valorAliquotaPIS,
      a.basePIS                       = b.basePIS,
      a.valorPIS                      = b.valorPIS,
      a.aliquotaPISST                 = b.aliquotaPISST,
      a.valorAliquotaPISST            = b.valorAliquotaPISST,
      a.basePISST                     = b.basePISST,
      a.valorPISST                    = b.valorPISST,
      a.stCOFINS                      = b.stCOFINS,
      a.aliquotaCOFINS                = b.aliquotaCOFINS,
      a.valorAliquotaCOFINS           = b.valorAliquotaCOFINS,
      a.baseCOFINS                    = b.baseCOFINS,
      a.valorCOFINS                   = b.valorCOFINS,
      a.aliquotaCOFINSST              = b.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST         = b.valorAliquotaCOFINSST,
      a.baseCOFINSST                  = b.baseCOFINSST,
      a.valorCOFINSST                 = b.valorCOFINSST,
      a.stSimplesNacional             = b.stSimplesNacional,
      a.creditoSimplesNacional        = b.creditoSimplesNacional,
      a.baseCreditoSimplesNacional    = b.baseCreditoSimplesNacional,
      a.valorCreditoSimplesNacional   = b.valorCreditoSimplesNacional,
      a.stICMS                        = b.stICMS,
      a.modalidadeBaseCalcICMS        = b.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS               = b.reducaoBaseICMS,
      a.aliquotaICMS                  = b.aliquotaICMS,
      a.diferimentoICMS               = b.diferimentoICMS,
      a.motivoDesoneracaoICMS         = b.motivoDesoneracaoICMS,
      a.idBeneficio                   = b.idBeneficio,
      a.baseICMS                      = b.baseICMS,
      a.valorICMSoperacao             = b.valorICMSoperacao,
      a.valorICMSdiferido             = b.valorICMSdiferido,
      a.valorICMS                     = b.valorICMS,
      a.valorICMSdesoneracao          = b.valorICMSdesoneracao,
      a.modalidadeBaseCalcICMSST      = b.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST       = b.margemValorAdicionadoST,
      a.reducaoBaseST                 = b.reducaoBaseST,
      a.aliquotaICMSST                = b.aliquotaICMSST,
      a.aliquotaSTSuportConsFinal     = b.aliquotaSTSuportConsFinal,
      a.baseICMSST                    = b.baseICMSST,
      a.valorICMSST                   = b.valorICMSST,
      a.baseICMSSTAnteriormente       = b.baseICMSSTAnteriormente,
      a.valorICMSSTAnteriormente      = b.valorICMSSTAnteriormente,
      a.valorICMSProprioSubstituto    = b.valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo        = b.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo           = b.aliquotaICMSEfetivo,
      a.baseICMSEfetivo               = b.baseICMSEfetivo,
      a.valorICMSEfetivo              = b.valorICMSEfetivo,
      a.aliquotaICMSUFDestinatario    = b.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual     = b.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual     = b.partilhaICMSInterestadual,
      a.baseICMSUFDestinatario        = b.baseICMSUFDestinatario,
      a.valorICMSUFDestinatario       = b.valorICMSUFDestinatario,
      a.baseICMSUFRemetente           = b.baseICMSUFRemetente,
      a.valorICMSUFRemetente          = b.valorICMSUFRemetente,
      a.aliquotaFCP                   = b.aliquotaFCP,
      a.baseFCP                       = b.baseFCP,
      a.valorFCP                      = b.valorFCP,
      a.aliquotaFCPST                 = b.aliquotaFCPST,
      a.baseFCPST                     = b.baseFCPST,
      a.valorFCPST                    = b.valorFCPST,
      a.aliquotaFCPSTAnteriormente    = b.aliquotaFCPSTAnteriormente,
      a.baseFCPSTAnteriormente        = b.baseFCPSTAnteriormente,
      a.valorFCPSTAnteriormente       = b.valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario     = b.aliquotaFCPUFDestinatario,
      a.baseFCPUFDestinatario         = b.baseFCPUFDestinatario,
      a.valorFCPUFDestinatario        = b.valorFCPUFDestinatario,
      a.aliquotaestimadaimpfederais   = b.aliquotaestimadaimpfederais,
      a.aliquotaestimadaimpestaduais  = b.aliquotaestimadaimpestaduais,
      a.aliquotaestimadaimpmunicipais = b.aliquotaestimadaimpmunicipais,
      a.baseestimadaimpostos          = b.baseestimadaimpostos,
      a.valorestimadoimpfederais      = b.valorestimadoimpfederais,
      a.valorEstimadoImpEstaduais     = b.valorEstimadoImpEstaduais,
      a.valorEstimadoImpMunicipais    = b.valorEstimadoImpMunicipais,
      a.valorLiquidoItem              = b.valorLiquidoItem,
      a.valorDescontoCustoOpItem      = b.valorDescontoCustoOpItem,
      a.valorDescontoCustoOpGeral     = b.valorDescontoCustoOpGeral,
      a.valorDescontoCustoOpTotal     = b.valorDescontoCustoOpTotal,
      a.valorAcrescimoCustoOpItem     = b.valorAcrescimoCustoOpItem,
      a.valorAcrescimoCustoOpGeral    = b.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoCustoOpTotal    = b.valorAcrescimoCustoOpTotal,
      a.precoCustoOperacao            = b.precoCustoOperacao,
      a.valorCustoOperacao            = b.valorCustoOperacao,
      a.precoCMV                      = b.precoCMV,
      a.valorCMV                      = b.valorCMV,
      a.quantidadeExtemporanea        = b.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo = b.acrescimoUnitarioExtemporaneo,
      a.valorAcrescimoExtempSubtotal  = b.valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem      = b.valorAcrescimoExtempItem,
      a.valorAcrescimoExtempGeral     = b.valorAcrescimoExtempGeral,
      a.valorAcrescimoExtempTotal     = b.valorAcrescimoExtempTotal,
      a.observacoesDigitadas          = b.observacoesDigitadas,
      a.observacoes                   = b.observacoes
    WHEN NOT MATCHED THEN INSERT (
      idItemPreDocumento,
      preDocumento,
      sequencia,
      cancelado,
      pedidoCompraFornecedor,
      sequenciaPedidoCompraFornec,
      modeloDocumento,
      estabelecimentoOriginal,
      vendedor,
      gradeProduto,
      idFormulaTinta,
      personalizacao,
      idLoteEstoque,
      operacaoFiscal,
      movimentaEstoque,
      geraFinanceiro,
      localEstoque,
      pessoaParticipante,
      controleQuantidade,
      unidadeMedidaConversao,
      conversorQuantidade,
      loteMinimo,
      loteMultiplo,
      altura,
      largura,
      comprimento,
      pecas,
      quantidade,
      quantidadeConvertida,
      quantidadeDevolvidaRetornada,
      percentualDevolucao,
      pesoLiquido,
      pesoBruto,
      tipoPreco,
      tabelaPreco,
      precoSugestaoAPrazo,
      precoSugestaoAVista,
      precoDesconto,
      precoMinimo,
      usarPrecoAVista,
      precoUnitarioBruto,
      acrescimoUnitarioComposicao,
      precoUnitario,
      precoUnitarioConvertido,
      valorProdutoServicoBruto,
      valorProdutoServico,
      percDescontoItem,
      valorDescontoItem,
      percAcrescimoItem,
      valorAcrescimoItem,
      valorFreteItem,
      valorSeguroItem,
      valorAdicFreteMarinhaMerItem,
      valorDespesasAduaneirasItem,
      valorFreteGeral,
      valorSeguroGeral,
      valorDescontoGeral,
      valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral,
      valorDespesasAduaneirasGeral,
      valorBasePagamento,
      valorDescontoPagamento,
      valorOutrasDespesasPagamento,
      valorJurosPagamento,
      valorFreteTotal,
      valorSeguroTotal,
      valorDescontoTotal,
      valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal,
      valorDespesasAduaneirasTotal,
      cfop,
      indicadorISSQN,
      aliquotaISSQN,
      retidoISSQN,
      tributadoForaMunicipio,
      incentivoFiscal,
      listaServicos,
      cnae,
      idServicoMunicipio,
      numeroProcessoAdministrativo,
      baseISSQN,
      valorISSQN,
      retencaoIRRF,
      baseRetIRRF,
      valorRetIRRF,
      retencaoINSS,
      baseRetINSS,
      valorRetINSS,
      retencaoPIS,
      baseRetPIS,
      valorRetPIS,
      retencaoCOFINS,
      baseRetCOFINS,
      valorRetCOFINS,
      retencaoCSLL,
      baseRetCSLL,
      valorRetCSLL,
      retencaoOutros,
      baseRetOutros,
      valorRetOutros,
      aliquotaII,
      baseII,
      valorII,
      aliquotaIOF,
      baseIOF,
      valorIOF,
      codigoEnquadramentoIPI,
      stIPI,
      aliquotaIPI,
      valorAliquotaIPI,
      baseIPI,
      valorIPI,
      valorIPIDevolucao,
      stPIS,
      aliquotaPIS,
      valorAliquotaPIS,
      basePIS,
      valorPIS,
      aliquotaPISST,
      valorAliquotaPISST,
      basePISST,
      valorPISST,
      stCOFINS,
      aliquotaCOFINS,
      valorAliquotaCOFINS,
      baseCOFINS,
      valorCOFINS,
      aliquotaCOFINSST,
      valorAliquotaCOFINSST,
      baseCOFINSST,
      valorCOFINSST,
      stSimplesNacional,
      creditoSimplesNacional,
      baseCreditoSimplesNacional,
      valorCreditoSimplesNacional,
      stICMS,
      modalidadeBaseCalcICMS,
      reducaoBaseICMS,
      aliquotaICMS,
      diferimentoICMS,
      motivoDesoneracaoICMS,
      idBeneficio,
      baseICMS,
      valorICMSOperacao,
      valorICMSDiferido,
      valorICMS,
      valorICMSDesoneracao,
      modalidadeBaseCalcICMSST,
      margemValorAdicionadoST,
      reducaoBaseST,
      aliquotaICMSST,
      aliquotaSTSuportConsFinal,
      baseICMSST,
      valorICMSST,
      baseICMSSTAnteriormente,
      valorICMSSTAnteriormente,
      valorICMSProprioSubstituto,
      reducaoBaseICMSEfetivo,
      aliquotaICMSEfetivo,
      baseICMSEfetivo,
      valorICMSEfetivo,
      aliquotaICMSUFDestinatario,
      aliquotaICMSInterestadual,
      partilhaICMSInterestadual,
      baseICMSUFDestinatario,
      valorICMSUFDestinatario,
      baseICMSUFRemetente,
      valorICMSUFRemetente,
      aliquotaFCP,
      baseFCP,
      valorFCP,
      aliquotaFCPST,
      baseFCPST,
      valorFCPST,
      aliquotaFCPSTAnteriormente,
      baseFCPSTAnteriormente,
      valorFCPSTAnteriormente,
      aliquotaFCPUFDestinatario,
      baseFCPUFDestinatario,
      valorFCPUFDestinatario,
      aliquotaEstimadaImpFederais,
      aliquotaEstimadaImpEstaduais,
      aliquotaEstimadaImpMunicipais,
      baseEstimadaImpostos,
      valorEstimadoImpFederais,
      valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais,
      valorLiquidoItem,
      valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral,
      valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpItem,
      valorAcrescimoCustoOpGeral,
      valorAcrescimoCustoOpTotal,
      precoCustoOperacao,
      valorCustoOperacao,
      precoCMV,
      valorCMV,
      quantidadeExtemporanea,
      acrescimoUnitarioExtemporaneo,
      valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral,
      valorAcrescimoExtempTotal,
      observacoesDigitadas,
      observacoes)
    VALUES (
      b.idItemPreDocumento,
      b.preDocumento,
      b.sequencia,
      b.cancelado,
      b.pedidoCompraFornecedor,
      b.sequenciaPedidoCompraFornec,
      b.modeloDocumento,
      b.estabelecimentoOriginal,
      b.vendedor,
      b.gradeProduto,
      b.idFormulaTinta,
      b.personalizacao,
      b.idLoteEstoque,
      b.operacaoFiscal,
      b.movimentaEstoque,
      b.geraFinanceiro,
      b.localEstoque,
      b.pessoaParticipante,
      b.controleQuantidade,
      b.unidadeMedidaConversao,
      b.conversorQuantidade,
      b.loteMinimo,
      b.loteMultiplo,
      b.altura,
      b.largura,
      b.comprimento,
      b.pecas,
      b.quantidade,
      b.quantidadeConvertida,
      b.quantidadeDevolvidaRetornada,
      b.percentualDevolucao,
      b.pesoLiquido,
      b.pesoBruto,
      b.tipoPreco,
      b.tabelaPreco,
      b.precoSugestaoAPrazo,
      b.precoSugestaoAVista,
      b.precoDesconto,
      b.precoMinimo,
      b.usarPrecoAVista,
      b.precoUnitarioBruto,
      b.acrescimoUnitarioComposicao,
      b.precoUnitario,
      b.precoUnitarioConvertido,
      b.valorProdutoServicoBruto,
      b.valorProdutoServico,
      b.percDescontoItem,
      b.valorDescontoItem,
      b.percAcrescimoItem,
      b.valorAcrescimoItem,
      b.valorFreteItem,
      b.valorSeguroItem,
      b.valorAdicFreteMarinhaMerItem,
      b.valorDespesasAduaneirasItem,
      b.valorFreteGeral,
      b.valorSeguroGeral,
      b.valorDescontoGeral,
      b.valorOutrasDespesasGeral,
      b.valorAdicFreteMarinhaMerGeral,
      b.valorDespesasAduaneirasGeral,
      b.valorBasePagamento,
      b.valorDescontoPagamento,
      b.valorOutrasDespesasPagamento,
      b.valorJurosPagamento,
      b.valorFreteTotal,
      b.valorSeguroTotal,
      b.valorDescontoTotal,
      b.valorOutrasDespesasTotal,
      b.valorAdicFreteMarinhaMerTotal,
      b.valorDespesasAduaneirasTotal,
      b.cfop,
      b.indicadorISSQN,
      b.aliquotaISSQN,
      b.retidoISSQN,
      b.tributadoForaMunicipio,
      b.incentivoFiscal,
      b.listaServicos,
      b.cnae,
      b.idServicoMunicipio,
      b.numeroProcessoAdministrativo,
      b.baseISSQN,
      b.valorISSQN,
      b.retencaoIRRF,
      b.baseRetIRRF,
      b.valorRetIRRF,
      b.retencaoINSS,
      b.baseRetINSS,
      b.valorRetINSS,
      b.retencaoPIS,
      b.baseRetPIS,
      b.valorRetPIS,
      b.retencaoCOFINS,
      b.baseRetCOFINS,
      b.valorRetCOFINS,
      b.retencaoCSLL,
      b.baseRetCSLL,
      b.valorRetCSLL,
      b.retencaoOutros,
      b.baseRetOutros,
      b.valorRetOutros,
      b.aliquotaII,
      b.baseII,
      b.valorII,
      b.aliquotaIOF,
      b.baseIOF,
      b.valorIOF,
      b.codigoEnquadramentoIPI,
      b.stIPI,
      b.aliquotaIPI,
      b.valorAliquotaIPI,
      b.baseIPI,
      b.valorIPI,
      b.valorIPIDevolucao,
      b.stPIS,
      b.aliquotaPIS,
      b.valorAliquotaPIS,
      b.basePIS,
      b.valorPIS,
      b.aliquotaPISST,
      b.valorAliquotaPISST,
      b.basePISST,
      b.valorPISST,
      b.stCOFINS,
      b.aliquotaCOFINS,
      b.valorAliquotaCOFINS,
      b.baseCOFINS,
      b.valorCOFINS,
      b.aliquotaCOFINSST,
      b.valorAliquotaCOFINSST,
      b.baseCOFINSST,
      b.valorCOFINSST,
      b.stSimplesNacional,
      b.creditoSimplesNacional,
      b.baseCreditoSimplesNacional,
      b.valorCreditoSimplesNacional,
      b.stICMS,
      b.modalidadeBaseCalcICMS,
      b.reducaoBaseICMS,
      b.aliquotaICMS,
      b.diferimentoICMS,
      b.motivoDesoneracaoICMS,
      b.idBeneficio,
      b.baseICMS,
      b.valorICMSOperacao,
      b.valorICMSDiferido,
      b.valorICMS,
      b.valorICMSDesoneracao,
      b.modalidadeBaseCalcICMSST,
      b.margemValorAdicionadoST,
      b.reducaoBaseST,
      b.aliquotaICMSST,
      b.aliquotaSTSuportConsFinal,
      b.baseICMSST,
      b.valorICMSST,
      b.baseICMSSTAnteriormente,
      b.valorICMSSTAnteriormente,
      b.valorICMSProprioSubstituto,
      b.reducaoBaseICMSEfetivo,
      b.aliquotaICMSEfetivo,
      b.baseICMSEfetivo,
      b.valorICMSEfetivo,
      b.aliquotaICMSUFDestinatario,
      b.aliquotaICMSInterestadual,
      b.partilhaICMSInterestadual,
      b.baseICMSUFDestinatario,
      b.valorICMSUFDestinatario,
      b.baseICMSUFRemetente,
      b.valorICMSUFRemetente,
      b.aliquotaFCP,
      b.baseFCP,
      b.valorFCP,
      b.aliquotaFCPST,
      b.baseFCPST,
      b.valorFCPST,
      b.aliquotaFCPSTAnteriormente,
      b.baseFCPSTAnteriormente,
      b.valorFCPSTAnteriormente,
      b.aliquotaFCPUFDestinatario,
      b.baseFCPUFDestinatario,
      b.valorFCPUFDestinatario,
      b.aliquotaEstimadaImpFederais,
      b.aliquotaEstimadaImpEstaduais,
      b.aliquotaEstimadaImpMunicipais,
      b.baseEstimadaImpostos,
      b.valorEstimadoImpFederais,
      b.valorEstimadoImpEstaduais,
      b.valorEstimadoImpMunicipais,
      b.valorLiquidoItem,
      b.valorDescontoCustoOpItem,
      b.valorDescontoCustoOpGeral,
      b.valorDescontoCustoOpTotal,
      b.valorAcrescimoCustoOpItem,
      b.valorAcrescimoCustoOpGeral,
      b.valorAcrescimoCustoOpTotal,
      b.precoCustoOperacao,
      b.valorCustoOperacao,
      b.precoCMV,
      b.valorCMV,
      b.quantidadeExtemporanea,
      b.acrescimoUnitarioExtemporaneo,
      b.valorAcrescimoExtempSubtotal,
      b.valorAcrescimoExtempItem,
      b.valorAcrescimoExtempGeral,
      b.valorAcrescimoExtempTotal,
      b.observacoesDigitadas,
      b.observacoes);
    v_atualizarObservacoes := 0;
    IF p_idItemReferenciado > 0 THEN
      IF p_tipoDocumentoReferenciado IN ('D','P') THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV(
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_devolucaoAnulacaoRetorno,
          'P',
          r_item_idItemPreDocumento,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          p_tipoDocumentoReferenciado,
          p_idItemReferenciado);
      END IF;
      IF p_tipoDocumentoReferenciado = 'D' THEN
        ADD_PRE_DOC_ITEM_REF_DOC_FIS (
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_preDocumento,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemPreDocumento,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'O' THEN
        ADD_PRE_DOC_ITEM_REF_ORCAMEN (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_preDocumento,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemPreDocumento,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'P' THEN
        ADD_PRE_DOC_ITEM_REF_PRE_DOC (
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_preDocumento,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemPreDocumento,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'T' THEN
        ADD_PRE_DOC_ITEM_TRANS_GRAVA (
          p_estabelecimentoAtivo,
          v_cab_entradaSaida,
          p_idItemReferenciado,
          r_item_idItemPreDocumento,
          p_quantidadeReferenciada);
      END IF;
    END IF;
    IF p_tempComp_nomeTempComposicao <> ' '
      AND (NOT (p_tipoDocumentoReferenciado IN ('D','O','P'))
        OR p_idItemReferenciado <= 0)
    THEN
      ADD_PRE_DOC_ITEM_COMP_TEMP (
        p_sessaoClient,
        p_estabelecimentoAtivo,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        r_item_idItemPreDocumento,
        v_atualizarObservacoes,
        v_atualizarObservacoes);
    END IF;
    v_idEnderecoEstoque := 0;
    IF p_item_idEnderecoEstoque > 0 THEN
      ADD_PRE_DOC_ITEM_ENDER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemPreDocumento,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_quantidade,
        ' ',
        v_idEnderecoEstoque);
    END IF;
    IF p_item_idNumeroSerie > 0 THEN
      ADD_PRE_DOC_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemPreDocumento,
        v_idEnderecoEstoque,
        p_item_gradeProduto,
        p_item_idNumeroSerie,
        0,
        v_auxNumber);
      v_atualizarObservacoes := 1;
    END IF;
    IF v_atualizarObservacoes = 1 THEN
      v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
        p_sessaoClient,
        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_413_obs_add_marca,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        'P',
        r_item_idItemPreDocumento,
        p_item_gradeProduto,
        p_item_idFormulaTinta,
        p_item_personalizacao,
        p_item_idLoteEstoque,
        p_item_controleQuantidade,
        p_item_loteMultiplo,
        p_item_altura,
        p_item_largura,
        p_item_comprimento,
        p_item_quantidade,
        p_item_observacoesDigitadas);
      UPDATE MOPREDOCUMXITENS
      SET observacoes = v_observacoes
      WHERE idItemPreDocumento = r_item_idItemPreDocumento;
    END IF;
    IF v_cab_statusPreDocumento = 'A' THEN
      ADD_PRE_DOC_ITEM_EST_ATUALIZA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_item_idItemPreDocumento,
        p_estabelecimentoAtivo);
      ADD_PRE_DOC_ITEM_FIL_ATUALIZA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_item_idItemPreDocumento,
        p_estabelecimentoAtivo);
    END IF;
    r_buffer_idItemPreDocumento := CASE WHEN (r_buffer_idItemPreDocumento IS NULL OR r_buffer_idItemPreDocumento = '' OR r_buffer_idItemPreDocumento = ' ') THEN '' ELSE RTRIM (r_buffer_idItemPreDocumento) || ';' END || TO_CHAR (LPAD(r_item_idItemPreDocumento,14,'0'));
    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;
  END IF;
END ADD_PRE_DOC_ITEM_GRAVA;

/

create or replace PROCEDURE ADD_DOC_FISC_GERA_TEMP_MARGEM (
  p_sessaoClient                 IN VARCHAR2,
  p_usuarioLogado                IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_regMarg_tipoPreco            IN CHAR,
  p_regMarg_tabelaPreco          IN VARCHAR2,
  p_regMarg_fatorMultiplicador   IN NUMBER,
  p_regMarg_tipoPrecoB           IN CHAR,
  p_regMarg_tabelaPrecoB         IN VARCHAR2,
  p_regMarg_fatorMultiplicadorB  IN NUMBER,
  p_regMarg_reduzirImpostos      IN NUMBER,
  p_regMarg_reduzirTarifaCartao  IN NUMBER,
  p_regMarg_taxaCapitacaoCustoFi IN NUMBER,
  p_regMarg_exibImagemMargemCab  IN NUMBER,
  p_regMarg_regraImagemCab       IN NUMBER,
  p_regMarg_exibImagemMargemItem IN NUMBER,
  p_regMarg_regraImagemItem      IN NUMBER,
  p_idDocumentoFiscal            IN NUMBER,
  p_cabMargem_valorTarifaCartao  IN NUMBER,
  p_cabMargem_valorMargem        IN NUMBER,
  p_idItemDocFiscal              IN NUMBER,
  p_item_ini_cancelado           IN NUMBER,
  /* Retornos */
  r_cabMargem_valorTarifaCartao  OUT NUMBER,
  r_cabMargem_valorMargem        OUT NUMBER,
  r_cabMargem_percentualMargem   OUT NUMBER,
  r_cabMargem_imagemMargem       OUT VARCHAR2)
IS
  v_cab_estabelecimento          NUMBER;
  v_cab_tipoPagamentoFrete       CHAR(1);
  v_cab_prazoMedioPonderado      NUMBER;
  v_cab_valorFreteItem           NUMBER;
  v_cab_valorSeguroItem          NUMBER;
  v_cab_valorFreteGeral          NUMBER;
  v_cab_valorSeguroGeral         NUMBER;
  v_cab_valorAdicFreteMarinTotal NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_munEndEst_uf                 CHAR(2);
  v_munEndPess_uf                CHAR(2);
  v_item_valorLiquidoSemFreteSeg NUMBER;
  v_item_valorCaptacao           NUMBER;
  v_item_valorTarifaCartao       NUMBER;
  v_item_valorImpostos           NUMBER;
  v_item_precoCusto              NUMBER;
  v_item_valorCusto              NUMBER;
  v_item_valorMargem             NUMBER;
  v_item_percentualMargem        NUMBER;
  v_item_imagemMargem            VARCHAR2(256);
BEGIN
  IF p_idItemDocFiscal = 0 THEN
    r_cabMargem_valorTarifaCartao := FUNC_ADD_TARIFA_CART_DOC_FISC (p_idDocumentoFiscal);
    r_cabMargem_valorMargem := 0;
    DELETE TEMPMARGEMCONTRIBUICAO
    WHERE sessaoClient = p_sessaoClient
    AND orcamentoPredocumentoDocumento = 'D'
    AND idCabecalho = p_idDocumentoFiscal;
  ELSE
    r_cabMargem_valorTarifaCartao := p_cabMargem_valorTarifaCartao;
    r_cabMargem_valorMargem := p_cabMargem_valorMargem;
    IF p_item_ini_cancelado = 0 THEN
      SELECT COALESCE (MAX (temp.valorMargem), 0)
      INTO v_item_valorMargem
      FROM MODOCFISCALXITENS a
      JOIN TEMPMARGEMCONTRIBUICAO temp
      ON temp.sequencia = a.sequencia
      WHERE a.idItemDocFiscal = p_idItemDocFiscal
      AND temp.sessaoClient = p_sessaoClient
      AND temp.orcamentoPredocumentoDocumento = 'D'
      AND temp.idCabecalho = p_idDocumentoFiscal;
      r_cabMargem_valorMargem := p_cabMargem_valorMargem - v_item_valorMargem;
    END IF;
  END IF;
  SELECT
    cab.estabelecimento,
    cab.prazoMedioPonderado,
    cab.valorFreteItem,
    cab.valorSeguroItem,
    cab.valorFreteGeral,
    cab.valorSeguroGeral,
    cab.valorAdicFreteMarinhaMerTotal,
    cab.valorDespesasAduaneirasTotal,
    cab.valorLiquidoItem,
    COALESCE((
      SELECT MAX(munEndEst.uf)
      FROM CAENDERECOSPESSOA endEst
      JOIN SIMUNICIPIOS munEndEst
      ON munEndEst.municipio = endEst.municipio
      WHERE endEst.pessoa = est.pessoaEstabelecimento
      AND endEst.ativo = 1
      AND endEst.principal = 1),'  '),
    COALESCE((
      SELECT MAX(munEndPess.uf)
      FROM CAENDERECOSPESSOA endPess
      JOIN SIMUNICIPIOS munEndPess
      ON munEndPess.municipio = endPess.municipio
      WHERE endPess.pessoa = cab.pessoa
      AND endPess.ativo = 1
      AND endPess.principal = 1),'  ')
  INTO
    v_cab_estabelecimento,
    v_cab_prazoMedioPonderado,
    v_cab_valorFreteItem,
    v_cab_valorSeguroItem,
    v_cab_valorFreteGeral,
    v_cab_valorSeguroGeral,
    v_cab_valorAdicFreteMarinTotal,
    v_cab_valorDespesasAduanTotal,
    v_cab_valorLiquidoItem,
    v_munEndEst_uf,
    v_munEndPess_uf
  FROM MODOCUMENTOSFISCAIS cab
  JOIN PAESTABELECIMENTOS est
  ON est.estabelecimento = cab.estabelecimento
  WHERE cab.idDocumentoFiscal = p_idDocumentoFiscal;
  FOR a IN (
    SELECT
      a.sequencia,
      a.cancelado,
      a.modeloDocumento,
      a.gradeProduto,
      a.personalizacao,
      a.quantidade,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorRetIRRF,
      a.valorRetCSLL,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorIPIDevolucao,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMSOperacao,
      a.valorICMSDiferido,
      a.valorICMS,
      a.valorICMSDesoneracao,
      a.valorICMSST,
      a.valorICMSUFDestinatario,
      a.valorICMSUFRemetente,
      a.valorFCP,
      a.valorFCPST,
      a.valorFCPSTAnteriormente,
      a.valorFCPUFDestinatario,
      a.valorLiquidoItem
    FROM MODOCFISCALXITENS a
    WHERE p_idItemDocFiscal = 0
    AND idDocumentoFiscal = p_idDocumentoFiscal
    OR p_idItemDocFiscal <> 0
    AND idItemDocFiscal = p_idItemDocFiscal)
  LOOP
    ADD_CALCULA_MARGEM_CONTRIB (
      p_usuarioLogado,
      p_perfilUsuarioLogado,
      p_config_65_casasDecEntrada,
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_regMarg_tipoPreco,
      p_regMarg_tabelaPreco,
      p_regMarg_fatorMultiplicador,
      p_regMarg_tipoPrecoB,
      p_regMarg_tabelaPrecoB,
      p_regMarg_fatorMultiplicadorB,
      p_regMarg_reduzirImpostos,
      p_regMarg_reduzirTarifaCartao,
      p_regMarg_taxaCapitacaoCustoFi,
      p_regMarg_exibImagemMargemItem,
      p_regMarg_regraImagemItem,
      v_cab_estabelecimento,
      v_cab_prazoMedioPonderado,
      v_cab_valorLiquidoItem,
      r_cabMargem_valorTarifaCartao,
      v_munEndEst_uf,
      v_munEndPess_uf,
      a.modeloDocumento,
      a.gradeProduto,
      a.personalizacao,
      a.quantidade,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorRetIRRF,
      a.valorRetCSLL,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorIPIDevolucao,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMSOperacao,
      a.valorICMSDiferido,
      a.valorICMS,
      a.valorICMSDesoneracao,
      a.valorICMSST,
      a.valorICMSUFDestinatario,
      a.valorICMSUFRemetente,
      a.valorFCP,
      a.valorFCPST,
      a.valorFCPSTAnteriormente,
      a.valorFCPUFDestinatario,
      a.valorLiquidoItem,
      /* Retornos */
      v_item_valorLiquidoSemFreteSeg,
      v_item_valorCaptacao,
      v_item_valorTarifaCartao,
      v_item_valorImpostos,
      v_item_precoCusto,
      v_item_valorCusto,
      v_item_valorMargem,
      v_item_percentualMargem);
    IF p_regMarg_exibImagemMargemItem = 1
      AND p_regMarg_regraImagemItem <> 0
    THEN
      v_item_imagemMargem :=
        FUNC_ADD_BUSCA_IMAGEM_FAIXA (
          p_regMarg_regraImagemItem,
          v_item_percentualMargem);
    ELSE
      v_item_imagemMargem := ' ';
    END IF;
    IF a.cancelado = 0 THEN
      r_cabMargem_valorMargem := r_cabMargem_valorMargem + v_item_valorMargem;
    END IF;
  MERGE INTO TEMPMARGEMCONTRIBUICAO a USING (
    SELECT
      p_sessaoClient                 sessaoClient,
      'D'                            orcamentoPredocumentoDocumento,
      p_idDocumentoFiscal            idCabecalho,
      a.sequencia                    sequencia,
      v_item_valorLiquidoSemFreteSeg valorLiquidoSemFreteSeguro,
      v_item_valorCaptacao           valorCaptacao,
      v_item_valorTarifaCartao       valorTarifaCartao,
      v_item_valorImpostos           valorImpostos,
      v_item_precoCusto              precoCusto,
      v_item_valorCusto              valorCusto,
      v_item_valorMargem             valorMargem,
      v_item_percentualMargem        percentualMargem,
      v_item_imagemMargem            imagemMargem
    FROM DUAL) b ON (
      a.sessaoClient = b.sessaoClient 
      AND a.orcamentoPredocumentoDocumento = b.orcamentoPredocumentoDocumento
      AND a.idCabecalho = b.idCabecalho
      AND a.sequencia = b.sequencia)
  WHEN MATCHED THEN UPDATE SET
    a.valorLiquidoSemFreteSeguro = b.valorLiquidoSemFreteSeguro,
    a.valorCaptacao              = b.valorCaptacao,
    a.valorTarifaCartao          = b.valorTarifaCartao,
    a.valorImpostos              = b.valorImpostos,
    a.precoCusto                 = b.precoCusto,
    a.valorCusto                 = b.valorCusto,
    a.valorMargem                = b.valorMargem,
    a.percentualMargem           = b.percentualMargem,
    a.imagemMargem               = b.imagemMargem
  WHEN NOT MATCHED THEN INSERT (
    sessaoClient,
    orcamentoPredocumentoDocumento,
    idCabecalho,
    sequencia,
    valorLiquidoSemFreteSeguro,
    valorCaptacao,
    valorTarifaCartao,
    valorImpostos,
    precoCusto,
    valorCusto,
    valorMargem,
    percentualMargem,
    imagemMargem)
  VALUES (
    b.sessaoClient,
    b.orcamentoPredocumentoDocumento,
    b.idCabecalho,
    b.sequencia,
    b.valorLiquidoSemFreteSeguro,
    b.valorCaptacao,
    b.valorTarifaCartao,
    b.valorImpostos,
    b.precoCusto,
    b.valorCusto,
    b.valorMargem,
    b.percentualMargem,
    b.imagemMargem);
  END LOOP;
  r_cabMargem_percentualMargem :=
    CASE
      WHEN v_cab_valorLiquidoItem
        - v_cab_valorFreteItem
        - v_cab_valorSeguroItem
        - v_cab_valorFreteGeral
        - v_cab_valorSeguroGeral
        - v_cab_valorAdicFreteMarinTotal
        - v_cab_valorDespesasAduanTotal = 0
      THEN 0
      ELSE ROUND ((100 * r_cabMargem_valorMargem
        / ( v_cab_valorLiquidoItem
          - v_cab_valorFreteItem
          - v_cab_valorSeguroItem
          - v_cab_valorFreteGeral
          - v_cab_valorSeguroGeral
          - v_cab_valorAdicFreteMarinTotal
          - v_cab_valorDespesasAduanTotal)), 8)
    END;
  IF p_regMarg_exibImagemMargemCab = 1
    AND p_regMarg_regraImagemCab <> 0
  THEN
    r_cabMargem_imagemMargem :=
      FUNC_ADD_BUSCA_IMAGEM_FAIXA (
        p_regMarg_regraImagemCab,
        r_cabMargem_percentualMargem);
  ELSE
    r_cabMargem_imagemMargem := ' ';
  END IF;
END ADD_DOC_FISC_GERA_TEMP_MARGEM;

/

create or replace PROCEDURE ADD_DOC_FISC_CALC_IMP_ITENS (
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_idDocumentoFiscal        IN NUMBER,
  p_cab_origemDocumento          IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_devolucaoAnulacaoRetorno IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_nfFornecedor             IN NUMBER,
  p_cab_dataEntradaSaida         IN DATE,
  p_cab_pessoa                   IN NUMBER,
  p_cab_localDestinoOperacao     IN CHAR,
  p_cab_indicadorConsumidorFinal IN CHAR,
  p_cab_tipoPagamentoFrete       IN CHAR,
  p_pess_indicadorInscricaoEstad IN CHAR,
  /* Retornos */
  r_cab_valorProdutos            OUT NUMBER,
  r_cab_valorServicos            OUT NUMBER,
  r_cab_valorBasePagamento       OUT NUMBER,
  r_cab_valorAVistaMinimo        OUT NUMBER,
  r_cab_valorFreteTotal          OUT NUMBER,
  r_cab_valorSeguroTotal         OUT NUMBER,
  r_cab_valorDescontoTotal       OUT NUMBER,
  r_cab_valorOutrasDespesasTotal OUT NUMBER,
  r_cab_valorAdicFreteMarinTotal OUT NUMBER,
  r_cab_valorDespesasAduanTotal  OUT NUMBER,
  r_cab_valorLiquidoItem         OUT NUMBER,
  r_cab_valorDescCustoOpTotal    OUT NUMBER,
  r_cab_valorAcrescCustoOpTotal  OUT NUMBER,
  r_cab_valorCustoOperacao       OUT NUMBER,
  r_cab_valorCMV                 OUT NUMBER,
  r_cab_valorAcrescExtempTotal   OUT NUMBER)
IS
  v_auxNumber                    NUMBER;
  v_precoUnitario                NUMBER;
  v_precoUnitarioConvertido      NUMBER;
  v_valorProdutoServico          NUMBER;
  v_valorBasePagamento           NUMBER;
  v_valorFreteTotal              NUMBER;
  v_valorSeguroTotal             NUMBER;
  v_valorDescontoTotal           NUMBER;
  v_valorOutrasDespesasTotal     NUMBER;
  v_valorAdicFreteMarinMerTotal  NUMBER;
  v_valorDespesasAduaneirasTotal NUMBER;
  v_baseISSQN                    NUMBER;
  v_valorISSQN                   NUMBER;
  v_baseRetIRRF                  NUMBER;
  v_valorRetIRRF                 NUMBER;
  v_baseRetINSS                  NUMBER;
  v_valorRetINSS                 NUMBER;
  v_baseRetPIS                   NUMBER;
  v_valorRetPIS                  NUMBER;
  v_baseRetCOFINS                NUMBER;
  v_valorRetCOFINS               NUMBER;
  v_baseRetCSLL                  NUMBER;
  v_valorRetCSLL                 NUMBER;
  v_baseRetOutros                NUMBER;
  v_valorRetOutros               NUMBER;
  v_baseII                       NUMBER;
  v_valorII                      NUMBER;
  v_baseIOF                      NUMBER;
  v_valorIOF                     NUMBER;
  v_baseIPI                      NUMBER;
  v_valorIPI                     NUMBER;
  v_basePIS                      NUMBER;
  v_valorPIS                     NUMBER;
  v_basePISST                    NUMBER;
  v_valorPISST                   NUMBER;
  v_baseCOFINS                   NUMBER;
  v_valorCOFINS                  NUMBER;
  v_baseCOFINSST                 NUMBER;
  v_valorCOFINSST                NUMBER;
  v_baseCreditoSimplesNacional   NUMBER;
  v_valorCreditoSimplesNacional  NUMBER;
  v_baseICMS                     NUMBER;
  v_valorICMSOperacao            NUMBER;
  v_valorICMSDiferido            NUMBER;
  v_valorICMS                    NUMBER;
  v_valorICMSDesoneracao         NUMBER;
  v_baseICMSST                   NUMBER;
  v_valorICMSST                  NUMBER;
  v_baseICMSSTAnteriormente      NUMBER;
  v_valorICMSSTAnteriormente     NUMBER;
  v_valorICMSProprioSubstituto   NUMBER;
  v_baseICMSEfetivo              NUMBER;
  v_valorICMSEfetivo             NUMBER;
  v_baseICMSEscrituracao         NUMBER;
  v_valorICMSEscrituracao        NUMBER;
  v_valorICMSDesonEscrituracao   NUMBER;
  v_baseICMSSTEscrituracao       NUMBER;
  v_valorICMSSTEscrituracao      NUMBER;
  v_baseICMSUFDestinatario       NUMBER;
  v_valorICMSUFDestinatario      NUMBER;
  v_baseICMSUFRemetente          NUMBER;
  v_valorICMSUFRemetente         NUMBER;
  v_baseFCP                      NUMBER;
  v_valorFCP                     NUMBER;
  v_baseFCPST                    NUMBER;
  v_valorFCPST                   NUMBER;
  v_baseFCPSTAnteriormente       NUMBER;
  v_valorFCPSTAnteriormente      NUMBER;
  v_baseFCPUFDestinatario        NUMBER;
  v_valorFCPUFDestinatario       NUMBER;
  v_baseEstimadaImpostos         NUMBER;
  v_valorEstimadoImpFederais     NUMBER;
  v_valorEstimadoImpEstaduais    NUMBER;
  v_valorEstimadoImpMunicipais   NUMBER;
  v_valorLiquidoItem             NUMBER;
  v_valorDescontoCustoOpTotal    NUMBER;
  v_valorAcrescimoCustoOpTotal   NUMBER;
  v_precoCustoOperacao           NUMBER;
  v_valorCustoOperacao           NUMBER;
  v_precoCMV                     NUMBER;
  v_valorCMV                     NUMBER;
  v_valorAcrescimoExtempSubtotal NUMBER;
  v_valorAcrescimoExtempTotal    NUMBER;
BEGIN  
  r_cab_valorProdutos            := 0;
  r_cab_valorServicos            := 0;
  r_cab_valorBasePagamento       := 0;
  r_cab_valorAVistaMinimo        := 0;
  r_cab_valorFreteTotal          := 0;
  r_cab_valorSeguroTotal         := 0;
  r_cab_valorDescontoTotal       := 0;
  r_cab_valorOutrasDespesasTotal := 0;
  r_cab_valorAdicFreteMarinTotal := 0;
  r_cab_valorDespesasAduanTotal  := 0;
  r_cab_valorLiquidoItem         := 0;
  r_cab_valorDescCustoOpTotal    := 0;
  r_cab_valorAcrescCustoOpTotal  := 0;
  r_cab_valorCustoOperacao       := 0;
  r_cab_valorCMV                 := 0;
  r_cab_valorAcrescExtempTotal   := 0;
  FOR a IN (
    SELECT
      a.*,
      gradProd.produto,
      gradProd.cor,
      gradProd.tamanho,
      prod.controleEstoque,
      prod.tipoProduto,
      prod.precoPautaTabelado,
      modDoc.geraFinanceiro modDoc_geraFinanceiro,
      modDoc.diminuiDescontoPrUnit,
      modDoc.somaAcrescimosPrUnit,
      modDoc.somaFreteSeguroPrUnit,
      CASE
        WHEN EXISTS (
          SELECT 1
          FROM CAPRODUTOXCOMPOSICOESPREC compPrec
          WHERE compPrec.produto = gradProd.produto
          AND compPrec.ativo = 1)
        THEN 1
        ELSE 0
      END composicaoPreco
    FROM MODOCFISCALXITENS a
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = a.modeloDocumento
    WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
    AND a.cancelado = 0
    ORDER BY a.sequencia)
  LOOP
    v_precoUnitario                := a.precoUnitario;
    v_precoUnitarioConvertido      := a.precoUnitarioConvertido;
    v_valorProdutoServico          := a.valorProdutoServico;
    v_valorBasePagamento           := a.valorBasePagamento;
    v_valorFreteTotal              := a.valorFreteTotal;
    v_valorSeguroTotal             := a.valorSeguroTotal;
    v_valorDescontoTotal           := a.valorDescontoTotal;
    v_valorOutrasDespesasTotal     := a.valorOutrasDespesasTotal;
    v_valorAdicFreteMarinMerTotal  := a.valorAdicFreteMarinhaMerTotal;
    v_valorDespesasAduaneirasTotal := a.valorDespesasAduaneirasTotal;
    v_baseISSQN                    := a.baseISSQN;
    v_valorISSQN                   := a.valorISSQN;
    v_baseRetIRRF                  := a.baseRetIRRF;
    v_valorRetIRRF                 := a.valorRetIRRF;
    v_baseRetINSS                  := a.baseRetINSS;
    v_valorRetINSS                 := a.valorRetINSS;
    v_baseRetPIS                   := a.baseRetPIS;
    v_valorRetPIS                  := a.valorRetPIS;
    v_baseRetCOFINS                := a.baseRetCOFINS;
    v_valorRetCOFINS               := a.valorRetCOFINS;
    v_baseRetCSLL                  := a.baseRetCSLL;
    v_valorRetCSLL                 := a.valorRetCSLL;
    v_baseRetOutros                := a.baseRetOutros;
    v_valorRetOutros               := a.valorRetOutros;
    v_baseII                       := a.baseII;
    v_valorII                      := a.valorII;
    v_baseIOF                      := a.baseIOF;
    v_valorIOF                     := a.valorIOF;
    v_baseIPI                      := a.baseIPI;
    v_valorIPI                     := a.valorIPI;
    v_basePIS                      := a.basePIS;
    v_valorPIS                     := a.valorPIS;
    v_basePISST                    := a.basePISST;
    v_valorPISST                   := a.valorPISST;
    v_baseCOFINS                   := a.baseCOFINS;
    v_valorCOFINS                  := a.valorCOFINS;
    v_baseCOFINSST                 := a.baseCOFINSST;
    v_valorCOFINSST                := a.valorCOFINSST;
    v_baseCreditoSimplesNacional   := a.baseCreditoSimplesNacional;
    v_valorCreditoSimplesNacional  := a.valorCreditoSimplesNacional;
    v_baseICMS                     := a.baseICMS;
    v_valorICMSOperacao            := a.valorICMSOperacao;
    v_valorICMSDiferido            := a.valorICMSDiferido;
    v_valorICMS                    := a.valorICMS;
    v_valorICMSDesoneracao         := a.valorICMSDesoneracao;
    v_baseICMSST                   := a.baseICMSST;
    v_valorICMSST                  := a.valorICMSST;
    v_baseICMSSTAnteriormente      := a.baseICMSSTAnteriormente;
    v_valorICMSSTAnteriormente     := a.valorICMSSTAnteriormente;
    v_valorICMSProprioSubstituto   := a.valorICMSProprioSubstituto;
    v_baseICMSEfetivo              := a.baseICMSEfetivo;
    v_valorICMSEfetivo             := a.valorICMSEfetivo;
    v_baseICMSEscrituracao         := a.baseICMSEscrituracao;
    v_valorICMSEscrituracao        := a.valorICMSEscrituracao;
    v_valorICMSDesonEscrituracao   := a.valorICMSDesonEscrituracao;
    v_baseICMSSTEscrituracao       := a.baseICMSSTEscrituracao;
    v_valorICMSSTEscrituracao      := a.valorICMSSTEscrituracao;
    v_baseICMSUFDestinatario       := a.baseICMSUFDestinatario;
    v_valorICMSUFDestinatario      := a.valorICMSUFDestinatario;
    v_baseICMSUFRemetente          := a.baseICMSUFRemetente;
    v_valorICMSUFRemetente         := a.valorICMSUFRemetente;
    v_baseFCP                      := a.baseFCP;
    v_valorFCP                     := a.valorFCP;
    v_baseFCPST                    := a.baseFCPST;
    v_valorFCPST                   := a.valorFCPST;
    v_baseFCPSTAnteriormente       := a.baseFCPSTAnteriormente;
    v_valorFCPSTAnteriormente      := a.valorFCPSTAnteriormente;
    v_baseFCPUFDestinatario        := a.baseFCPUFDestinatario;
    v_valorFCPUFDestinatario       := a.valorFCPUFDestinatario;
    v_baseEstimadaImpostos         := a.baseEstimadaImpostos;
    v_valorEstimadoImpFederais     := a.valorEstimadoImpFederais;
    v_valorEstimadoImpEstaduais    := a.valorEstimadoImpEstaduais;
    v_valorEstimadoImpMunicipais   := a.valorEstimadoImpMunicipais;
    v_valorLiquidoItem             := a.valorLiquidoItem;
    v_valorDescontoCustoOpTotal    := a.valorDescontoCustoOpTotal;
    v_valorAcrescimoCustoOpTotal   := a.valorAcrescimoCustoOpTotal;
    v_precoCustoOperacao           := a.precoCustoOperacao;
    v_valorCustoOperacao           := a.valorCustoOperacao;
    v_precoCMV                     := a.precoCMV;
    v_valorCMV                     := a.valorCMV;
    v_valorAcrescimoExtempSubtotal := a.valorAcrescimoExtempSubtotal;
    v_valorAcrescimoExtempTotal    := a.valorAcrescimoExtempTotal;
    ADD_CALCULA_TOTAIS_ITEM(
      p_cab_tipoPagamentoFrete,
      a.quantidade,
      a.quantidadeConvertida,
      a.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao,
      a.precoUnitario,
      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.diminuiDescontoPrUnit,
      a.somaAcrescimosPrUnit,
      a.somaFreteSeguroPrUnit,
      a.composicaoPreco,
      /* Retornos */
      v_precoUnitario,
      v_precoUnitarioConvertido,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal);
    v_valorAcrescimoExtempSubtotal := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
      a.quantidade,
      v_precoUnitario,
      a.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo);
    v_valorAcrescimoExtempTotal := FUNC_ADD_CALC_EXTEMP_TOTAL(
      v_valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem,
      a.valorAcrescimoExtempGeral);
    ADD_CALCULA_IMPOSTOS_ITEM (
      p_config_64_casasDecSaidas,
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_cab_entradaSaida,
      p_cab_devolucaoAnulacaoRetorno,
      p_cab_estabelecimento,
      p_cab_nfFornecedor,
      p_cab_dataEntradaSaida,
      p_cab_pessoa,
      p_cab_localDestinoOperacao,
      p_cab_indicadorConsumidorFinal,
      p_cab_tipoPagamentoFrete,
      p_pess_indicadorInscricaoEstad,
      a.personalizacao,
      a.quantidade,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal,
      a.cfop,
      1,
      a.indicadorISSQN,
      a.aliquotaISSQN,
      v_baseISSQN,
      v_valorISSQN,
      1,
      a.retencaoIRRF,
      v_baseRetIRRF,
      v_valorRetIRRF,
      1,
      a.retencaoINSS,
      v_baseRetINSS,
      v_valorRetINSS,
      1,
      a.retencaoPIS,
      v_baseRetPIS,
      v_valorRetPIS,
      1,
      a.retencaoCOFINS,
      v_baseRetCOFINS,
      v_valorRetCOFINS,
      1,
      a.retencaoCSLL,
      v_baseRetCSLL,
      v_valorRetCSLL,
      1,
      a.retencaoOutros,
      v_baseRetOutros,
      v_valorRetOutros,
      1,
      a.aliquotaII,
      v_baseII,
      v_valorII,
      1,
      a.aliquotaIOF,
      v_baseIOF,
      v_valorIOF,
      1,
      a.aliquotaIPI,
      a.valorAliquotaIPI,
      v_baseIPI,
      v_valorIPI,
      a.valorIPIDevolucao,
      1,
      a.aliquotaPIS,
      a.valorAliquotaPIS,
      v_basePIS,
      v_valorPIS,
      1,
      a.aliquotaPISST,
      a.valorAliquotaPISST,
      v_basePISST,
      v_valorPISST,
      1,
      a.aliquotaCOFINS,
      a.valorAliquotaCOFINS,
      v_baseCOFINS,
      v_valorCOFINS,
      1,
      a.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST,
      v_baseCOFINSST,
      v_valorCOFINSST,
      1,
      a.stSimplesNacional,
      a.creditoSimplesNacional,
      v_baseCreditoSimplesNacional,
      v_valorCreditoSimplesNacional,
      1,
      a.stICMS,
      a.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS,
      a.aliquotaICMS,
      a.diferimentoICMS,
      v_baseICMS,
      v_valorICMSOperacao,
      v_valorICMSDiferido,
      v_valorICMS,
      v_valorICMSDesoneracao,
      1,
      a.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST,
      a.reducaoBaseST,
      a.aliquotaICMSST,
      v_baseICMSST,
      v_valorICMSST,
      1,
      v_baseICMSSTAnteriormente,
      v_valorICMSSTAnteriormente,
      v_valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo,
      v_baseICMSEfetivo,
      v_valorICMSEfetivo,
      1,
      a.stICMSEscrituracao,
      a.reducaoBaseICMSEscrituracao,
      a.aliquotaICMSEscrituracao,
      a.diferimentoICMSEscrituracao,
      v_baseICMSEscrituracao,
      v_valorICMSEscrituracao,
      v_valorICMSDesonEscrituracao,
      1,
      a.margemValorAdicSTEscrituracao,
      a.reducaoBaseSTEscrituracao,
      a.aliquotaICMSSTEscrituracao,
      v_baseICMSSTEscrituracao,
      v_valorICMSSTEscrituracao,
      1,
      a.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual,
      v_baseICMSUFDestinatario,
      v_valorICMSUFDestinatario,
      v_baseICMSUFRemetente,
      v_valorICMSUFRemetente,
      1,
      a.aliquotaFCP,
      v_baseFCP,
      v_valorFCP,
      a.aliquotaFCPST,
      v_baseFCPST,
      v_valorFCPST,
      a.aliquotaFCPSTAnteriormente,
      v_baseFCPSTAnteriormente,
      v_valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario,
      v_baseFCPUFDestinatario,
      v_valorFCPUFDestinatario,
      1,
      a.aliquotaEstimadaImpFederais,
      a.aliquotaEstimadaImpEstaduais,
      a.aliquotaEstimadaImpMunicipais,
      v_baseEstimadaImpostos,
      v_valorEstimadoImpFederais,
      v_valorEstimadoImpEstaduais,
      v_valorEstimadoImpMunicipais,
      a.produto,
      a.cor,
      a.tamanho,
      a.controleEstoque,
      a.tipoProduto,
      a.precoPautaTabelado,
      /* Retornos */
      v_baseISSQN,
      v_valorISSQN,
      v_baseRetIRRF,
      v_valorRetIRRF,
      v_baseRetINSS,
      v_valorRetINSS,
      v_baseRetPIS,
      v_valorRetPIS,
      v_baseRetCOFINS,
      v_valorRetCOFINS,
      v_baseRetCSLL,
      v_valorRetCSLL,
      v_baseRetOutros,
      v_valorRetOutros,
      v_baseII,
      v_valorII,
      v_baseIOF,
      v_valorIOF,
      v_baseIPI,
      v_valorIPI,
      v_basePIS,
      v_valorPIS,
      v_basePISST,
      v_valorPISST,
      v_baseCOFINS,
      v_valorCOFINS,
      v_baseCOFINSST,
      v_valorCOFINSST,
      v_baseCreditoSimplesNacional,
      v_valorCreditoSimplesNacional,
      v_baseICMS,
      v_valorICMSOperacao,
      v_valorICMSDiferido,
      v_valorICMS,
      v_valorICMSDesoneracao,
      v_baseICMSST,
      v_valorICMSST,
      v_baseICMSSTAnteriormente,
      v_valorICMSSTAnteriormente,
      v_valorICMSProprioSubstituto,
      v_baseICMSEfetivo,
      v_valorICMSEfetivo,
      v_baseICMSEscrituracao,
      v_valorICMSEscrituracao,
      v_valorICMSDesonEscrituracao,
      v_baseICMSSTEscrituracao,
      v_valorICMSSTEscrituracao,
      v_baseICMSUFDestinatario,
      v_valorICMSUFDestinatario,
      v_baseICMSUFRemetente,
      v_valorICMSUFRemetente,
      v_baseFCP,
      v_valorFCP,
      v_baseFCPST,
      v_valorFCPST,
      v_baseFCPSTAnteriormente,
      v_valorFCPSTAnteriormente,
      v_baseFCPUFDestinatario,
      v_valorFCPUFDestinatario,
      v_baseEstimadaImpostos,
      v_valorEstimadoImpFederais,
      v_valorEstimadoImpEstaduais,
      v_valorEstimadoImpMunicipais);    
    v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
      p_cab_origemDocumento,
      p_cab_nfFornecedor,
      p_cab_tipoPagamentoFrete,
      a.geraFinanceiro,
      v_valorProdutoServico,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      a.valorIPIDevolucao,
      a.retidoISSQN,
      v_valorISSQN,
      v_valorRetIRRF,
      v_valorRetINSS,
      v_valorRetPIS,
      v_valorRetCOFINS,
      v_valorRetCSLL,
      v_valorRetOutros,
      v_valorII,
      v_valorIOF,
      v_valorIPI,
      v_valorICMSST,
      v_valorICMSSTEscrituracao,
      a.somarICMSST,
      v_valorAcrescimoExtempTotal,
      a.modDoc_geraFinanceiro);
    v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
      p_cab_nfFornecedor,
      p_cab_tipoPagamentoFrete,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      a.valorIPIDevolucao,
      v_valorII,
      v_valorIOF,
      v_valorIPI,
      v_valorICMSST,
      v_valorICMSSTEscrituracao,
      a.somarICMSST);
    ADD_CALCULA_CUSTO_CMV (
      p_cab_atualizaCustoMedio,
      p_cab_estabelecimento,
      p_cab_nfFornecedor,
      a.modeloDocumento,
      a.quantidade,
      v_valorII,
      v_valorIOF,
      v_valorIPI,
      a.valorIPIDevolucao,
      v_valorPIS,
      v_valorPISST,
      v_valorCOFINS,
      v_valorCOFINSST,
      v_valorCreditoSimplesNacional,
      v_valorICMS,
      v_valorICMSST,
      v_valorICMSSTEscrituracao,
      v_valorLiquidoItem,
      a.valorDescontoCustoOpItem,
      a.valorDescontoCustoOpGeral,
      a.valorAcrescimoCustoOpItem,
      a.valorAcrescimoCustoOpGeral,
      v_valorAcrescimoExtempTotal,
      /* Retornos */
      v_valorDescontoCustoOpTotal,
      v_valorAcrescimoCustoOpTotal,
      v_precoCustoOperacao,
      v_valorCustoOperacao,
      v_precoCMV,
      v_valorCMV);
    UPDATE MODOCFISCALXITENS SET
      precoUnitario                 = v_precoUnitario,
      precoUnitarioConvertido       = v_precoUnitarioConvertido,
      valorProdutoServico           = v_valorProdutoServico,
      valorBasePagamento            = v_valorBasePagamento,
      valorFreteTotal               = v_valorFreteTotal,
      valorSeguroTotal              = v_valorSeguroTotal,
      valorDescontoTotal            = v_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
      valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
      baseISSQN                     = v_baseISSQN,
      valorISSQN                    = v_valorISSQN,
      baseRetIRRF                   = v_baseRetIRRF,
      valorRetIRRF                  = v_valorRetIRRF,
      baseRetINSS                   = v_baseRetINSS,
      valorRetINSS                  = v_valorRetINSS,
      baseRetPIS                    = v_baseRetPIS,
      valorRetPIS                   = v_valorRetPIS,
      baseRetCOFINS                 = v_baseRetCOFINS,
      valorRetCOFINS                = v_valorRetCOFINS,
      baseRetCSLL                   = v_baseRetCSLL,
      valorRetCSLL                  = v_valorRetCSLL,
      baseRetOutros                 = v_baseRetOutros,
      valorRetOutros                = v_valorRetOutros,
      baseII                        = v_baseII,
      valorII                       = v_valorII,
      baseIOF                       = v_baseIOF,
      valorIOF                      = v_valorIOF,
      baseIPI                       = v_baseIPI,
      valorIPI                      = v_valorIPI,
      basePIS                       = v_basePIS,
      valorPIS                      = v_valorPIS,
      basePISST                     = v_basePISST,
      valorPISST                    = v_valorPISST,
      baseCOFINS                    = v_baseCOFINS,
      valorCOFINS                   = v_valorCOFINS,
      baseCOFINSST                  = v_baseCOFINSST,
      valorCOFINSST                 = v_valorCOFINSST,
      baseCreditoSimplesNacional    = v_baseCreditoSimplesNacional,
      valorCreditoSimplesNacional   = v_valorCreditoSimplesNacional,
      baseICMS                      = v_baseICMS,
      valorICMSOperacao             = v_valorICMSOperacao,
      valorICMSDiferido             = v_valorICMSDiferido,
      valorICMS                     = v_valorICMS,
      valorICMSDesoneracao          = v_valorICMSDesoneracao,
      baseICMSST                    = v_baseICMSST,
      valorICMSST                   = v_valorICMSST,
      baseICMSSTAnteriormente       = v_baseICMSSTAnteriormente,
      valorICMSSTAnteriormente      = v_valorICMSSTAnteriormente,
      valorICMSProprioSubstituto    = v_valorICMSProprioSubstituto,
      baseICMSEfetivo               = v_baseICMSEfetivo,
      valorICMSEfetivo              = v_valorICMSEfetivo,
      baseICMSEscrituracao          = v_baseICMSEscrituracao,
      valorICMSEscrituracao         = v_valorICMSEscrituracao,
      valorICMSDesonEscrituracao    = v_valorICMSDesonEscrituracao,
      baseICMSSTEscrituracao        = v_baseICMSSTEscrituracao,
      valorICMSSTEscrituracao       = v_valorICMSSTEscrituracao,
      baseICMSUFDestinatario        = v_baseICMSUFDestinatario,
      valorICMSUFDestinatario       = v_valorICMSUFDestinatario,
      baseICMSUFRemetente           = v_baseICMSUFRemetente,
      valorICMSUFRemetente          = v_valorICMSUFRemetente,
      baseFCP                       = v_baseFCP,
      valorFCP                      = v_valorFCP,
      baseFCPST                     = v_baseFCPST,
      valorFCPST                    = v_valorFCPST,
      baseFCPSTAnteriormente        = v_baseFCPSTAnteriormente,
      valorFCPSTAnteriormente       = v_valorFCPSTAnteriormente,
      baseFCPUFDestinatario         = v_baseFCPUFDestinatario,
      valorFCPUFDestinatario        = v_valorFCPUFDestinatario,
      baseEstimadaImpostos          = v_baseEstimadaImpostos,
      valorEstimadoImpFederais      = v_valorEstimadoImpFederais,
      valorEstimadoImpEstaduais     = v_valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais    = v_valorEstimadoImpMunicipais,
      valorLiquidoItem              = v_valorLiquidoItem,
      valorDescontoCustoOpTotal     = v_valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpTotal    = v_valorAcrescimoCustoOpTotal,
      precoCustoOperacao            = v_precoCustoOperacao,
      valorCustoOperacao            = v_valorCustoOperacao,
      precoCMV                      = v_precoCMV,
      valorCMV                      = v_valorCMV,
      valorAcrescimoExtempSubtotal  = v_valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempTotal     = v_valorAcrescimoExtempTotal
    WHERE idItemDocFiscal           = a.idItemDocFiscal;
    IF a.tipoProduto = '09' THEN
      r_cab_valorServicos            := r_cab_valorServicos + v_valorProdutoServico;
    ELSE
      r_cab_valorProdutos            := r_cab_valorProdutos + v_valorProdutoServico;
    END IF;
    r_cab_valorBasePagamento       := r_cab_valorBasePagamento + v_valorBasePagamento;
    IF a.usarPrecoAVista = 1 AND a.geraFinanceiro = 1 THEN
      r_cab_valorAVistaMinimo        := r_cab_valorAVistaMinimo + v_valorProdutoServico + a.valorDescontoPagamento - a.valorOutrasDespesasPagamento - a.valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
    END IF;
    r_cab_valorFreteTotal          := r_cab_valorFreteTotal + v_valorFreteTotal;
    r_cab_valorSeguroTotal         := r_cab_valorSeguroTotal + v_valorSeguroTotal;
    r_cab_valorDescontoTotal       := r_cab_valorDescontoTotal + v_valorDescontoTotal;
    r_cab_valorOutrasDespesasTotal := r_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
    r_cab_valorAdicFreteMarinTotal := r_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
    r_cab_valorDespesasAduanTotal  := r_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
    r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem + v_valorLiquidoItem;
    r_cab_valorDescCustoOpTotal    := r_cab_valorDescCustoOpTotal + v_valorDescontoCustoOpTotal;
    r_cab_valorAcrescCustoOpTotal  := r_cab_valorAcrescCustoOpTotal + v_valorAcrescimoCustoOpTotal;
    r_cab_valorCustoOperacao       := r_cab_valorCustoOperacao + v_valorCustoOperacao;
    r_cab_valorCMV                 := r_cab_valorCMV + v_valorCMV;
    r_cab_valorAcrescExtempTotal   := r_cab_valorAcrescExtempTotal + v_valorAcrescimoExtempTotal;
  END LOOP;
END ADD_DOC_FISC_CALC_IMP_ITENS;

/

create or replace PROCEDURE ADD_DOC_FISC_CALC_IMP_CAB (
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_idDocumentoFiscal        IN NUMBER,
  p_troca_tipoPagamentoFrete     IN NUMBER,
  p_a_cab_tipoPagamentoFrete     IN CHAR)
IS
  v_cab_valorProdutos            NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarinTotal NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_valorDescCustoOpTotal    NUMBER;
  v_cab_valorAcrescCustoOpTotal  NUMBER;
  v_cab_valorAcrescExtempTotal   NUMBER;
  v_calcularImpostosItem         NUMBER;
  v_habilitaControleEntrega      NUMBER;
BEGIN
  FOR a IN (
    SELECT a.*,
      pess.indicadorInscricaoEstadual,
      COALESCE((
        SELECT MIN(munEndEst.uf)
        FROM PAESTABELECIMENTOS est
        JOIN CAENDERECOSPESSOA endEst
        ON endEst.pessoa = est.pessoaEstabelecimento
        JOIN SIMUNICIPIOS munEndEst
        ON munEndEst.municipio = endEst.municipio
        WHERE est.estabelecimento = a.estabelecimento
        AND endEst.ativo = 1
        AND endEst.principal = 1),'  ') munEndEst_uf
    FROM MODOCUMENTOSFISCAIS a
    JOIN CAPESSOAS pess
    ON pess.pessoa = a.pessoa
    WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal)
  LOOP
    v_cab_valorProdutos            := a.valorProdutos;
    v_cab_valorServicos            := a.valorServicos;
    v_cab_valorBasePagamento       := a.valorBasePagamento;
    v_cab_valorAVistaMinimo        := a.valorAVistaMinimo;
    v_cab_valorFreteTotal          := a.valorFreteTotal;
    v_cab_valorSeguroTotal         := a.valorSeguroTotal;
    v_cab_valorDescontoTotal       := a.valorDescontoTotal;
    v_cab_valorOutrasDespesasTotal := a.valorOutrasDespesasTotal;
    v_cab_valorAdicFreteMarinTotal := a.valorAdicFreteMarinhaMerTotal;
    v_cab_valorDespesasAduanTotal  := a.valorDespesasAduaneirasTotal;
    v_cab_valorLiquidoItem         := a.valorLiquidoItem;
    v_cab_valorDescCustoOpTotal    := a.valorDescontoCustoOpTotal;
    v_cab_valorAcrescCustoOpTotal  := a.valorAcrescimoCustoOpTotal;
    v_cab_valorCustoOperacao       := a.valorCustoOperacao;
    v_cab_valorCMV                 := a.valorCMV;
    v_cab_valorAcrescExtempTotal   := a.valorAcrescimoExtempTotal;
    SELECT
      CASE
        WHEN EXISTS (
          SELECT 1
          FROM MODOCFISCALXITENS a
          JOIN MODOCFISCALXORCAMENTOITEM docXorc
          ON docXorc.idItemDocFiscal = a.idItemDocFiscal
          JOIN MOORCAMENTOXITENS itemOrc
          ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento
          JOIN PACONTROLESENTREGA contr
          ON contr.controleEntrega = itemOrc.controleEntrega
          WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
          AND itemOrc.controleEntrega <> 0
          AND contr.habilitaFrete = 1)
        THEN 1
        ELSE 0
      END
    INTO v_habilitaControleEntrega
    FROM DUAL;
    ADD_DOC_FISC_CALC_IMP_RATEIO (
      a.idDocumentoFiscal,
      p_troca_tipoPagamentoFrete,
      p_a_cab_tipoPagamentoFrete,
      a.origemDocumento,
      a.entradaSaida,
      a.devolucaoAnulacaoRetorno,
      a.atualizaCustoMedio,
      a.estabelecimento,
      a.nfFornecedor,
      a.tipoPagamentoFrete,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorDescontoGeral,
      a.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      a.impostosEditados,
      a.valorDescontoCustoOpGeral,
      a.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoExtempGeral,
      v_habilitaControleEntrega,
      /* Retornos */
      v_cab_valorProdutos,
      v_cab_valorServicos,
      v_cab_valorBasePagamento,
      v_cab_valorAVistaMinimo,
      v_cab_valorFreteTotal,
      v_cab_valorSeguroTotal,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespesasTotal,
      v_cab_valorAdicFreteMarinTotal,
      v_cab_valorDespesasAduanTotal,
      v_cab_valorLiquidoItem,
      v_cab_valorDescCustoOpTotal,
      v_cab_valorAcrescCustoOpTotal,
      v_cab_valorCustoOperacao,
      v_cab_valorCMV,
      v_cab_valorAcrescExtempTotal,
      v_calcularImpostosItem);
    IF v_calcularImpostosItem = 1 THEN
      ADD_DOC_FISC_CALC_IMP_ITENS (
        p_config_64_casasDecSaidas,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        a.idDocumentoFiscal,
        a.origemDocumento,
        a.entradaSaida,
        a.devolucaoAnulacaoRetorno,
        a.atualizaCustoMedio,
        a.estabelecimento,
        a.nfFornecedor,
        a.dataEntradaSaida,
        a.pessoa,
        a.localDestinoOperacao,
        a.indicadorConsumidorFinal,
        a.tipoPagamentoFrete,
        a.indicadorInscricaoEstadual,
        /* Retornos */
        v_cab_valorProdutos,
        v_cab_valorServicos,
        v_cab_valorBasePagamento,
        v_cab_valorAVistaMinimo,
        v_cab_valorFreteTotal,
        v_cab_valorSeguroTotal,
        v_cab_valorDescontoTotal,
        v_cab_valorOutrasDespesasTotal,
        v_cab_valorAdicFreteMarinTotal,
        v_cab_valorDespesasAduanTotal,
        v_cab_valorLiquidoItem,
        v_cab_valorDescCustoOpTotal,
        v_cab_valorAcrescCustoOpTotal,
        v_cab_valorCustoOperacao,
        v_cab_valorCMV,
        v_cab_valorAcrescExtempTotal);
    END IF;
    UPDATE MODOCUMENTOSFISCAIS SET 
      valorProdutos                 = v_cab_valorProdutos,
      valorServicos                 = v_cab_valorServicos,
      valorBasePagamento            = v_cab_valorBasePagamento,
      valorAVistaMinimo             = v_cab_valorAVistaMinimo,
      valorFreteTotal               = v_cab_valorFreteTotal,
      valorSeguroTotal              = v_cab_valorSeguroTotal,
      valorDescontoTotal            = v_cab_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarinTotal,
      valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
      valorLiquidoItem              = v_cab_valorLiquidoItem,
      valorDescontoCustoOpTotal     = v_cab_valorDescCustoOpTotal,
      valorAcrescimoCustoOpTotal    = v_cab_valorAcrescCustoOpTotal,
      valorCustoOperacao            = v_cab_valorCustoOperacao,
      valorCMV                      = v_cab_valorCMV,
      valorAcrescimoExtempTotal     = v_cab_valorAcrescExtempTotal
    WHERE idDocumentoFiscal         = a.idDocumentoFiscal;
  END LOOP;
END ADD_DOC_FISC_CALC_IMP_CAB;

/

create or replace PROCEDURE ADD_DOC_FISC_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_227_manterPessoaOrcam IN NUMBER,
  p_config_230_etapaPedComprParc IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     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, -- B = Balanço, D = Documento Fiscal, G = Grade DF-e, O = Orçamento, P, Pré-Documento, T = Transferência
  p_idItemReferenciado           IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_tempComp_nomeTempComposicao  IN VARCHAR2,
  p_tempComp_sequencia           IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_idDocumentoFiscal       IN NUMBER,
  p_item_pedidoCompraFornecedor  IN VARCHAR2,
  p_item_sequenciaPedidoCompraFo IN NUMBER,
  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_quantidadeExtemporanea  IN NUMBER,
  p_item_acrescimoUnitarioExtemp IN NUMBER,
  p_item_valorAcrescimoExtempIte IN NUMBER,
  p_item_valorDescontoCustoOpIte IN NUMBER,
  p_item_valorAcrescimoCustoOpIt 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_valorAcrescimoExtempGer IN NUMBER,
  p_item_valorDescontoCustoOpGer IN NUMBER,
  p_item_valorAcrescimoCustoOpGe IN NUMBER,
  p_item_valorDescontoPagamento  IN NUMBER,
  p_item_valorOutrasDespPagament IN NUMBER,
  p_item_valorJurosPagamento     IN NUMBER,
  p_item_percentualDevolucao     IN NUMBER,
  p_item_valorIPIDevolucao       IN NUMBER,
  p_item_operacaoFiscal          IN NUMBER,
  p_item_movimentaEstoque        IN NUMBER,
  p_item_movimentaEstoqueFiscal  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_stICMSEscrituracao      IN CHAR,
  p_item_reducaoBaseICMSEscritur IN NUMBER,
  p_item_aliquotaICMSEscrituraca IN NUMBER,
  p_item_diferimentoICMSEscritur IN NUMBER,
  p_item_margemValorAdicSTEscrit IN NUMBER,
  p_item_reducaoBaseSTEscriturac IN NUMBER,
  p_item_aliquotaICMSSTEscritura IN NUMBER,
  p_item_somarICMSST             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_baseICMSEscrituracao    IN NUMBER,
  p_item_valorICMSEscrituracao   IN NUMBER,
  p_item_valorICMSDesonEscritura IN NUMBER,
  p_item_baseICMSSTEscrituracao  IN NUMBER,
  p_item_valorICMSSTEscrituracao 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_idItemDocFiscal       IN VARCHAR2,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER,
  r_item_idItemDocFiscal         OUT NUMBER,
  r_buffer_idItemDocFiscal       OUT VARCHAR2,
  r_valorInserido                OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_finalidadeNota           CHAR (1);
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_nfFornecedor             NUMBER;
  v_cab_documentoFiscal          NUMBER;
  v_cab_estabelecimento          NUMBER;
  v_cab_dataEmissao              DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_vendaConsumidor          NUMBER;
  v_cab_enderecoEntregaPessoa    NUMBER;
  v_cab_municipioFatoGerador     NUMBER;
  v_cab_localDestinoOperacao     CHAR (1);
  v_cab_indicadorConsumidorFinal CHAR (1);
  v_cab_projeto                  VARCHAR2 (60);
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  v_cab_situacaoDocumentoFiscal  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_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota 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_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_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_item_sequencia               NUMBER;
  v_item_cancelado               NUMBER;
  v_item_quantidadeDevolvidaRet  NUMBER;
  v_item_precoUnitario           NUMBER;
  v_item_precoUnitarioConvertido NUMBER;
  v_item_valorProdutoServicoBrut NUMBER;
  v_item_valorProdutoServico     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_movimentaEstoqueFiscal  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_stICMSEscrituracao      CHAR (2);
  v_item_reducaoBaseICMSEscritur NUMBER;
  v_item_aliquotaICMSEscrituraca NUMBER;
  v_item_diferimentoICMSEscritur NUMBER;
  v_item_margemValorAdicSTEscrit NUMBER;
  v_item_reducaoBaseSTEscriturac NUMBER;
  v_item_aliquotaICMSSTEscritura NUMBER;
  v_item_somarICMSST             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_baseICMSEscrituracao    NUMBER;
  v_item_valorICMSEscrituracao   NUMBER;
  v_item_valorICMSDesonEscritura NUMBER;
  v_item_baseICMSSTEscrituracao  NUMBER;
  v_item_valorICMSSTEscrituracao 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_item_valorDescontoCustoOpTot NUMBER;
  v_item_valorAcrescimoCustoOpTo NUMBER;
  v_item_precoCustoOperacao      NUMBER;
  v_item_valorCustoOperacao      NUMBER;
  v_item_precoCMV                NUMBER;
  v_item_valorCMV                NUMBER;
  v_item_valorAcrescimoExtempSub NUMBER;
  v_item_valorAcrescimoExtempTot 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_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_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  r_item_idItemDocFiscal := p_item_idItemDocFiscal;
  r_buffer_idItemDocFiscal := p_buffer_idItemDocFiscal;
  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.devolucaoAnulacaoRetorno,
    cab.finalidadeNota,
    cab.atualizaCustoMedio,
    cab.nfFornecedor,
    cab.documentoFiscal,
    cab.estabelecimento,
    cab.dataEmissao,
    cab.pessoa,
    cab.vendaConsumidor,
    cab.enderecoEntregaPessoa,
    cab.municipioFatoGerador,
    cab.localDestinoOperacao,
    cab.indicadorConsumidorFinal,
    cab.projeto,
    cab.modalidadeFrete,
    cab.tipoPagamentoFrete,
    cab.situacaoDocumentoFiscal,
    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,
    cab.valorDescontoCustoOpItem,
    cab.valorDescontoCustoOpGeral,
    cab.valorDescontoCustoOpTotal,
    cab.valorAcrescimoCustoOpItem,
    cab.valorAcrescimoCustoOpGeral,
    cab.valorAcrescimoCustoOpTotal,
    cab.valorCustoOperacao,
    cab.valorCMV,
    cab.quantidadeExtemporanea,
    cab.valorAcrescimoExtempSubtotal,
    cab.valorAcrescimoExtempItem,
    cab.valorAcrescimoExtempGeral,
    cab.valorAcrescimoExtempTotal,
    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
  INTO
    v_cab_origemDocumento,
    v_cab_tipoDocumento,
    v_cab_entradaSaida,
    v_cab_devolucaoAnulacaoRetorno,
    v_cab_finalidadeNota,
    v_cab_atualizaCustoMedio,
    v_cab_nfFornecedor,
    v_cab_documentoFiscal,
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_pessoa,
    v_cab_vendaConsumidor,
    v_cab_enderecoEntregaPessoa,
    v_cab_municipioFatoGerador,
    v_cab_localDestinoOperacao,
    v_cab_indicadorConsumidorFinal,
    v_cab_projeto,
    v_cab_modalidadeFrete,
    v_cab_tipoPagamentoFrete,
    v_cab_situacaoDocumentoFiscal,
    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_cab_valorDescontoCustoOpItem,
    v_cab_valorDescontoCustoOpGera,
    v_cab_valorDescontoCustoOpTota,
    v_cab_valorAcrescimoCustoOpIte,
    v_cab_valorAcrescimoCustoOpGer,
    v_cab_valorAcrescimoCustoOpTot,
    v_cab_valorCustoOperacao,
    v_cab_valorCMV,
    v_cab_quantidadeExtemporanea,
    v_cab_valorAcrescimoExtempSubt,
    v_cab_valorAcrescimoExtempItem,
    v_cab_valorAcrescimoExtempGera,
    v_cab_valorAcrescimoExtempTota,
    v_est_grupoFiscal,
    v_pessEst_regimeTributario,
    v_munEndEst_uf,
    v_pess_indicadorInscricaoEstad,
    v_endPess_enderecoPessoa,
    v_munEndPess_uf,
    v_munEndEntr_uf
  FROM MODOCUMENTOSFISCAIS 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
  WHERE cab.idDocumentoFiscal = p_item_idDocumentoFiscal;
  v_ini_cab_valorFreteItem := v_cab_valorFreteItem;
  v_ini_cab_valorFreteGeral := v_cab_valorFreteGeral;
  SELECT
    diminuiDescontoPrUnit,
    somaAcrescimosPrUnit,
    somaFreteSeguroPrUnit
  INTO
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit
  FROM PAMODELOSDOCUMENTO
  WHERE modeloDocumento = p_item_modeloDocumento;
  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_valorFreteTotal          := 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_item_quantidadeDevolvidaRet  := 0;
  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_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_movimentaEstoqueFiscal  := p_item_movimentaEstoqueFiscal;
  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_stICMSEscrituracao      := p_item_stICMSEscrituracao;
  v_item_reducaoBaseICMSEscritur := p_item_reducaoBaseICMSEscritur;
  v_item_aliquotaICMSEscrituraca := p_item_aliquotaICMSEscrituraca;
  v_item_diferimentoICMSEscritur := p_item_diferimentoICMSEscritur;
  v_item_margemValorAdicSTEscrit := p_item_margemValorAdicSTEscrit;
  v_item_reducaoBaseSTEscriturac := p_item_reducaoBaseSTEscriturac;
  v_item_aliquotaICMSSTEscritura := p_item_aliquotaICMSSTEscritura;
  v_item_somarICMSST             := p_item_somarICMSST;
  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_baseICMSEscrituracao    := p_item_baseICMSEscrituracao;
  v_item_valorICMSEscrituracao   := p_item_valorICMSEscrituracao;
  v_item_valorICMSDesonEscritura := p_item_valorICMSDesonEscritura;
  v_item_baseICMSSTEscrituracao  := p_item_baseICMSSTEscrituracao;
  v_item_valorICMSSTEscrituracao := p_item_valorICMSSTEscrituracao;
  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;
  IF p_manterFinanceiro_Retotalizar = 0 THEN
    SELECT COALESCE (MAX(1), 0)
    INTO v_cab_promocaoExiste
    FROM MODOCFISCALXPROMOCOES
    WHERE idDocumentoFiscal = p_item_idDocumentoFiscal;
  END IF;
  IF p_item_idItemDocFiscal > 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.quantidadeDevolvidaRetornada,
        a.pesoLiquido,
        a.pesoBruto,
        a.valorProdutoServicoBruto,
        a.valorProdutoServico,
        a.valorDescontoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.quantidadeExtemporanea,
        a.valorAcrescimoExtempSubtotal,
        a.valorAcrescimoExtempItem,
        a.valorDescontoCustoOpItem,
        a.valorAcrescimoCustoOpItem,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorAcrescimoExtempGeral,
        a.valorDescontoCustoOpGeral,
        a.valorAcrescimoCustoOpGeral,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.valorFreteTotal,
        a.valorSeguroTotal,
        a.valorDescontoTotal,
        a.valorOutrasDespesasTotal,
        a.valorAdicFreteMarinhaMerTotal,
        a.valorDespesasAduaneirasTotal,
        a.valorAcrescimoExtempTotal,
        a.valorDescontoCustoOpTotal,
        a.valorAcrescimoCustoOpTotal,
        a.operacaoFiscal,
        a.movimentaEstoque,
        a.movimentaEstoqueFiscal,
        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.stICMSEscrituracao,
        a.reducaoBaseICMSEscrituracao,
        a.aliquotaICMSEscrituracao,
        a.diferimentoICMSEscrituracao,
        a.margemValorAdicSTEscrituracao,
        a.reducaoBaseSTEscrituracao,
        a.aliquotaICMSSTEscrituracao,
        a.somarICMSST,
        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.baseICMSEscrituracao,
        a.valorICMSEscrituracao,
        a.valorICMSDesonEscrituracao,
        a.baseICMSSTEscrituracao,
        a.valorICMSSTEscrituracao,
        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,
        a.valorCustoOperacao,
        a.valorCMV,
        prod.tipoProduto
      FROM MODOCFISCALXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      WHERE a.idItemDocFiscal = p_item_idItemDocFiscal)
    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_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_item_quantidadeDevolvidaRet := a.quantidadeDevolvidaRetornada;
      IF p_buscarAliquotas_CalcularImp ='T'
      THEN
        v_item_movimentaEstoque        := a.movimentaEstoque;
        v_item_movimentaEstoqueFiscal  := a.movimentaEstoqueFiscal;
        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_stICMSEscrituracao      := a.stICMSEscrituracao;
        v_item_reducaoBaseICMSEscritur := a.reducaoBaseICMSEscrituracao;
        v_item_aliquotaICMSEscrituraca := a.aliquotaICMSEscrituracao;
        v_item_diferimentoICMSEscritur := a.diferimentoICMSEscrituracao;
        v_item_margemValorAdicSTEscrit := a.margemValorAdicSTEscrituracao;
        v_item_reducaoBaseSTEscriturac := a.reducaoBaseSTEscrituracao;
        v_item_aliquotaICMSSTEscritura := a.aliquotaICMSSTEscrituracao;
        v_item_somarICMSST             := a.somarICMSST;
        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_baseICMSEscrituracao    := a.baseICMSEscrituracao;
        v_item_valorICMSEscrituracao   := a.valorICMSEscrituracao;
        v_item_valorICMSDesonEscritura := a.valorICMSDesonEscrituracao;
        v_item_baseICMSSTEscrituracao  := a.baseICMSSTEscrituracao;
        v_item_valorICMSSTEscrituracao := a.valorICMSSTEscrituracao;
        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 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 <> p_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;
        v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
        v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
        v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
        v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
        v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
        v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
        v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
        v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
        v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
        v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
        v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
        v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
        v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      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,
    p_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);
  v_item_valorAcrescimoExtempSub := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
    p_item_quantidade,
    v_item_precoUnitario,
    p_item_quantidadeExtemporanea,
    p_item_acrescimoUnitarioExtemp);
  v_item_valorAcrescimoExtempTot := FUNC_ADD_CALC_EXTEMP_TOTAL(
    v_item_valorAcrescimoExtempSub,
    p_item_valorAcrescimoExtempIte,
    p_item_valorAcrescimoExtempGer);
  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,
        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 = CASE WHEN v_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
      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 / ((v_combo_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 / ((v_combo_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,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_estabelecimento,
        NULL, -- p_cab_dataPrecoInicial
        TRUNC (SYSDATE), -- p_cab_dataPrecoFinal
        v_cab_pessoa,
        v_cab_projeto,
        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_DOC_FISC_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_227_manterPessoaOrcam,
        p_config_230_etapaPedComprParc,
        p_config_362_calcCustoPorGrade,
        p_config_378_calcularVolumes,
        p_config_413_obs_add_marca,
        p_manterFinanceiro_Retotalizar,
        'S', -- p_buscarAliquotas_CalcularImp
        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_calcularImpostos,
        0, -- p_item_idItemDocFiscal
        p_item_idDocumentoFiscal,
        p_item_pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo,
        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
        CASE
          WHEN p_item_quantidade = 0
          THEN 0
          ELSE ROUND(p_item_quantidadeExtemporanea * a.quantidade / p_item_quantidade, 2)
        END, -- p_item_quantidadeExtemporanea
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_acrescimoUnitarioExtemp
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_acrescimoUnitarioExtemp
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoExtempIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpIt
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpIt
        p_item_observacoesDigitadas,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorFreteGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_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_valorAcrescimoExtempGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpGe
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpGe
        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
        p_item_percentualDevolucao,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorIPIDevolucao
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorIPIDevolucao,
        v_combo_operacaoFiscal,
        p_item_movimentaEstoque,
        p_item_movimentaEstoqueFiscal,
        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
        '  ', -- p_item_stICMSEscrituracao
        0, -- p_item_reducaoBaseICMSEscritur
        0, -- p_item_aliquotaICMSEscrituraca
        0, -- p_item_diferimentoICMSEscritur
        0, -- p_item_margemValorAdicSTEscrit
        0, -- p_item_reducaoBaseSTEscriturac
        0, -- p_item_aliquotaICMSSTEscritura
        0, -- p_item_somarICMSST
        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_baseICMSEscrituracao
        0, -- p_item_valorICMSEscrituracao
        0, -- p_item_valorICMSDesonEscritura
        0, -- p_item_baseICMSSTEscrituracao
        0, -- p_item_valorICMSSTEscrituracao
        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_idItemDocFiscal,
        /* Retornos */
        r_calcularImpostos,
        v_auxNumber, -- r_item_idItemDocFiscal
        r_buffer_idItemDocFiscal,
        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_DOC_FISC_ITEM_COMBO_RESID (
        p_item_idDocumentoFiscal,
        v_item_valorProdutoServico,
        p_item_valorDescontoItem,
        p_item_valorAcrescimoItem,
        v_modDoc_diminuiDescontoPrUnit,
        v_modDoc_somaAcrescimosPrUnit,
        r_buffer_idItemDocFiscal,
        r_valorInserido);
      r_calcularImpostos := 1;
    END IF;
  ELSE
    IF r_item_idItemDocFiscal <= 0 THEN
      r_item_idItemDocFiscal := FUNC_ADD_BUSCA_PROXIMO_ID ('MODOCFISCALXITENS', 'idItemDocFiscal', 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
          OR p_item_valorAcrescimoExtempGer <> 0
          OR p_item_valorDescontoCustoOpGer <> 0
          OR p_item_valorAcrescimoCustoOpGe <> 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_DOC_FISC_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          p_item_idDocumentoFiscal,
          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 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,
        p_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,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_finalidadeNota,
        v_cab_estabelecimento,
        v_cab_nfFornecedor,
        SYSDATE, -- p_cab_dataEmissao
        v_cab_pessoa,
        v_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,
        p_item_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
        1, -- 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_item_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_item_stICMSEscrituracao,
        v_item_reducaoBaseICMSEscritur,
        v_item_aliquotaICMSEscrituraca,
        v_item_diferimentoICMSEscritur,
        v_item_margemValorAdicSTEscrit,
        v_item_reducaoBaseSTEscriturac,
        v_item_aliquotaICMSSTEscritura,
        v_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,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_estabelecimento,
        v_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
        p_item_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
        1, -- p_calcularICMSEscrituracao
        v_item_stICMSEscrituracao,
        v_item_reducaoBaseICMSEscritur,
        v_item_aliquotaICMSEscrituraca,
        v_item_diferimentoICMSEscritur,
        0, -- p_baseICMSEscrituracao
        0, -- p_valorICMSEscrituracao
        0, -- p_valorICMSDesonEscrituracao
        1, -- p_calcularICMSSTEscrituracao
        v_item_margemValorAdicSTEscrit,
        v_item_reducaoBaseSTEscriturac,
        v_item_aliquotaICMSSTEscritura,
        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_item_baseICMSEscrituracao,
        v_item_valorICMSEscrituracao,
        v_item_valorICMSDesonEscritura,
        v_item_baseICMSSTEscrituracao,
        v_item_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,
      v_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,
      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,
      v_item_valorICMSSTEscrituracao,
      v_item_somarICMSST,
      v_item_valorAcrescimoExtempTot,
      v_modDoc_geraFinanceiro);
    v_item_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
      v_cab_nfFornecedor,
      v_cab_tipoPagamentoFrete,
      v_item_valorProdutoServico,
      v_item_valorFreteTotal,
      v_item_valorSeguroTotal,
      v_item_valorDescontoTotal,
      v_item_valorOutrasDespesasTot,
      p_item_valorIPIDevolucao,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      v_item_valorICMSST,
      v_item_valorICMSSTEscrituracao,
      v_item_somarICMSST);
    ADD_CALCULA_CUSTO_CMV (
      v_cab_atualizaCustoMedio,
      v_cab_estabelecimento,
      v_cab_nfFornecedor,
      p_item_modeloDocumento,
      p_item_quantidade,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      p_item_valorIPIDevolucao,
      v_item_valorPIS,
      v_item_valorPISST,
      v_item_valorCOFINS,
      v_item_valorCOFINSST,
      v_item_valorCreditoSimplesNac,
      v_item_valorICMS,
      v_item_valorICMSST,
      v_item_valorICMSSTEscrituracao,
      v_item_valorLiquidoItem,
      p_item_valorDescontoCustoOpIte,
      p_item_valorDescontoCustoOpGer,
      p_item_valorAcrescimoCustoOpIt,
      p_item_valorAcrescimoCustoOpGe,
      v_item_valorAcrescimoExtempTot,
      v_item_valorDescontoCustoOpTot,
      v_item_valorAcrescimoCustoOpTo,
      v_item_precoCustoOperacao,
      v_item_valorCustoOperacao,
      v_item_precoCMV,
      v_item_valorCMV);
    IF v_inserindoItem = 1 THEN
      SELECT COALESCE (MAX (sequencia),0) + 1
      INTO v_item_sequencia
      FROM MODOCFISCALXITENS
      WHERE idDocumentoFiscal = p_item_idDocumentoFiscal;
      v_cab_ultimoVendedorItem := p_item_vendedor;
    END IF;
    IF v_item_cancelado = 0 THEN
      IF p_manterFinanceiro_Retotalizar <> 2 THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume + TRUNC(CASE WHEN p_item_controleQuantidade = 1 AND p_item_loteMultiplo <> 0 THEN p_item_quantidade / p_item_loteMultiplo ELSE p_item_quantidadeConvertida END,0);
        END IF;
        v_cab_pesoLiquido := v_cab_pesoLiquido + p_item_pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto + p_item_pesoBruto;
      END IF;
      v_cab_quantidade := v_cab_quantidade + p_item_quantidadeConvertida;
      IF v_prod_tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorServicos := v_cab_valorServicos + v_item_valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos + p_item_valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorProdutos := v_cab_valorProdutos + v_item_valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos + p_item_valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem + p_item_valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem + p_item_valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem + p_item_valorAdicFreteMarItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem + p_item_valorDespesasAduanItem;
      v_cab_valorFreteGeral := v_cab_valorFreteGeral + p_item_valorFreteGeral;
      v_cab_valorSeguroGeral := v_cab_valorSeguroGeral + p_item_valorSeguroGeral;
      v_cab_valorDescontoGeral := v_cab_valorDescontoGeral + v_item_valorDescontoGeral;
      v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral + p_item_valorOutrasDespesasGer;
      v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral + p_item_valorAdicFreteMarGeral;
      v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral + p_item_valorDespesasAduanGeral;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento + v_item_valorBasePagamento;
      IF p_item_usarPrecoAVista = 1
        AND v_item_geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo + v_item_valorProdutoServico - v_item_valorDescontoTotal + v_item_valorOutrasDespesasTot;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento + v_item_valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento + v_item_valorOutrasDespPagament;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento + v_item_valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal + v_item_valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal + v_item_valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal + v_item_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_item_valorOutrasDespesasTot;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal + v_item_valorAdicFreteMarTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal + v_item_valorDespesasAduanTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem + v_item_valorLiquidoItem;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem + p_item_valorDescontoCustoOpIte;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera + p_item_valorDescontoCustoOpGer;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota + v_item_valorDescontoCustoOpTot;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte + p_item_valorAcrescimoCustoOpIt;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer + p_item_valorAcrescimoCustoOpGe;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot + v_item_valorAcrescimoCustoOpTo;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao + v_item_valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV + v_item_valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea + p_item_quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt + v_item_valorAcrescimoExtempSub;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem + p_item_valorAcrescimoExtempIte;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera + p_item_valorAcrescimoExtempGer;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota + v_item_valorAcrescimoExtempTot;
    END IF;
    UPDATE MODOCUMENTOSFISCAIS SET
      modalidadeFrete               = v_cab_modalidadeFrete,
      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,
      valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
      valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
      valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
      valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
      valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
      valorCustoOperacao            = v_cab_valorCustoOperacao,
      valorCMV                      = v_cab_valorCMV,
      quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
      valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
      valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
      valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
    WHERE idDocumentoFiscal = p_item_idDocumentoFiscal;
    IF p_item_idItemDocFiscal > 0 THEN
      DELETE MODOCFISCALXCOMPOSICOESPR compDoc
      WHERE compDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND EXISTS(
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.produto = comp.produto
        WHERE comp.composicaoPreco = compDoc.composicaoPreco
        AND gradProd.gradeProduto <> p_item_gradeProduto);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      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_413_obs_add_marca,
      ' ',
      0,
      'D',
      p_item_idItemDocFiscal,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    MERGE INTO MODOCFISCALXITENS a USING (
      SELECT
        r_item_idItemDocFiscal         idItemDocFiscal,
        p_item_idDocumentoFiscal       idDocumentoFiscal,
        v_item_sequencia               sequencia,
        v_item_cancelado               cancelado,
        p_item_pedidoCompraFornecedor  pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo sequenciaPedidoCompraFornec,
        p_item_modeloDocumento         modeloDocumento,
        p_item_estabelecimentoOriginal estabelecimentoOriginal,
        p_item_vendedor                vendedor,
        p_item_gradeProduto            gradeProduto,
        p_item_idFormulaTinta          idFormulaTinta,
        p_item_personalizacao          personalizacao,
        p_item_idLoteEstoque           idLoteEstoque,
        p_item_operacaoFiscal          operacaoFiscal,
        v_item_movimentaEstoque        movimentaEstoque,
        v_item_movimentaEstoqueFiscal  movimentaEstoqueFiscal,
        v_item_geraFinanceiro          geraFinanceiro,
        p_item_localEstoque            localEstoque,
        p_item_pessoaParticipante      pessoaParticipante,
        p_item_controleQuantidade      controleQuantidade,
        p_item_unidadeMedidaConversao  unidadeMedidaConversao,
        p_item_conversorQuantidade     conversorQuantidade,
        p_item_loteMinimo              loteMinimo,
        p_item_loteMultiplo            loteMultiplo,
        p_item_altura                  altura,
        p_item_largura                 largura,
        p_item_comprimento             comprimento,
        p_item_pecas                   pecas,
        p_item_quantidade              quantidade,
        p_item_quantidadeConvertida    quantidadeConvertida,
        v_item_quantidadeDevolvidaRet  quantidadeDevolvidaRetornada,
        p_item_percentualDevolucao     percentualDevolucao,
        p_item_pesoLiquido             pesoLiquido,
        p_item_pesoBruto               pesoBruto,
        p_item_tipoPreco               tipoPreco,
        p_item_tabelaPreco             tabelaPreco,
        p_item_precoSugestaoAPrazo     precoSugestaoAPrazo,
        p_item_precoSugestaoAVista     precoSugestaoAVista,
        p_item_precoDesconto           precoDesconto,
        p_item_precoMinimo             precoMinimo,
        p_item_usarPrecoAVista         usarPrecoAVista,
        p_item_precoUnitarioBruto      precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos acrescimoUnitarioComposicao,
        v_item_precoUnitario           precoUnitario,
        v_item_precoUnitarioConvertido precoUnitarioConvertido,
        v_item_valorProdutoServicoBrut valorProdutoServicoBruto,
        v_item_valorProdutoServico     valorProdutoServico,
        p_item_percDescontoItem        percDescontoItem,
        p_item_valorDescontoItem       valorDescontoItem,
        p_item_percAcrescimoItem       percAcrescimoItem,
        p_item_valorAcrescimoItem      valorAcrescimoItem,
        p_item_valorFreteItem          valorFreteItem,
        p_item_valorSeguroItem         valorSeguroItem,
        p_item_valorAdicFreteMarItem   valorAdicFreteMarinhaMerItem,
        p_item_valorDespesasAduanItem  valorDespesasAduaneirasItem,
        p_item_valorFreteGeral         valorFreteGeral,
        p_item_valorSeguroGeral        valorSeguroGeral,
        v_item_valorDescontoGeral      valorDescontoGeral,
        p_item_valorOutrasDespesasGer  valorOutrasDespesasGeral,
        p_item_valorAdicFreteMarGeral  valorAdicFreteMarinhaMerGeral,
        p_item_valorDespesasAduanGeral valorDespesasAduaneirasGeral,
        v_item_valorBasePagamento      valorBasePagamento,
        v_item_valorDescontoPagamento  valorDescontoPagamento,
        v_item_valorOutrasDespPagament valorOutrasDespesasPagamento,
        v_item_valorJurosPagamento     valorJurosPagamento,
        v_item_valorFreteTotal         valorFreteTotal,
        v_item_valorSeguroTotal        valorSeguroTotal,
        v_item_valorDescontoTotal      valorDescontoTotal,
        v_item_valorOutrasDespesasTot  valorOutrasDespesasTotal,
        v_item_valorAdicFreteMarTotal  valorAdicFreteMarinhaMerTotal,
        v_item_valorDespesasAduanTotal valorDespesasAduaneirasTotal,
        v_item_cfop                    cfop,
        v_item_indicadorISSQN          indicadorISSQN,
        v_item_aliquotaISSQN           aliquotaISSQN,
        v_item_retidoISSQN             retidoISSQN,
        v_item_tributadoForaMunicipio  tributadoForaMunicipio,
        v_item_incentivoFiscal         incentivoFiscal,
        v_item_listaServicos           listaServicos,
        v_item_cnae                    cnae,
        v_item_idServicoMunicipio      idServicoMunicipio,
        v_item_numeroProcessoAdministr numeroProcessoAdministrativo,
        v_item_baseISSQN               baseISSQN,
        v_item_valorISSQN              valorISSQN,
        v_item_retencaoIRRF            retencaoIRRF,
        v_item_baseRetIRRF             baseRetIRRF,
        v_item_valorRetIRRF            valorRetIRRF,
        v_item_retencaoINSS            retencaoINSS,
        v_item_baseRetINSS             baseRetINSS,
        v_item_valorRetINSS            valorRetINSS,
        v_item_retencaoPIS             retencaoPIS,
        v_item_baseRetPIS              baseRetPIS,
        v_item_valorRetPIS             valorRetPIS,
        v_item_retencaoCOFINS          retencaoCOFINS,
        v_item_baseRetCOFINS           baseRetCOFINS,
        v_item_valorRetCOFINS          valorRetCOFINS,
        v_item_retencaoCSLL            retencaoCSLL,
        v_item_baseRetCSLL             baseRetCSLL,
        v_item_valorRetCSLL            valorRetCSLL,
        v_item_retencaoOutros          retencaoOutros,
        v_item_baseRetOutros           baseRetOutros,
        v_item_valorRetOutros          valorRetOutros,
        v_item_aliquotaII              aliquotaII,
        v_item_baseII                  baseII,
        v_item_valorII                 valorII,
        v_item_aliquotaIOF             aliquotaIOF,
        v_item_baseIOF                 baseIOF,
        v_item_valorIOF                valorIOF,
        v_item_codigoEnquadramentoIPI  codigoEnquadramentoIPI,
        v_item_stIPI                   stIPI,
        v_item_aliquotaIPI             aliquotaIPI,
        v_item_valorAliquotaIPI        valorAliquotaIPI,
        v_item_baseIPI                 baseIPI,
        v_item_valorIPI                valorIPI,
        p_item_valorIPIDevolucao       valorIPIDevolucao,
        v_item_stPIS                   stPIS,
        v_item_aliquotaPIS             aliquotaPIS,
        v_item_valorAliquotaPIS        valorAliquotaPIS,
        v_item_basePIS                 basePIS,
        v_item_valorPIS                valorPIS,
        v_item_aliquotaPISST           aliquotaPISST,
        v_item_valorAliquotaPISST      valorAliquotaPISST,
        v_item_basePISST               basePISST,
        v_item_valorPISST              valorPISST,
        v_item_stCOFINS                stCOFINS,
        v_item_aliquotaCOFINS          aliquotaCOFINS,
        v_item_valorAliquotaCOFINS     valorAliquotaCOFINS,
        v_item_baseCOFINS              baseCOFINS,
        v_item_valorCOFINS             valorCOFINS,
        v_item_aliquotaCOFINSST        aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST   valorAliquotaCOFINSST,
        v_item_baseCOFINSST            baseCOFINSST,
        v_item_valorCOFINSST           valorCOFINSST,
        v_item_stSimplesNacional       stSimplesNacional,
        v_item_creditoSimplesNacional  creditoSimplesNacional,
        v_item_baseCreditoSimplesNac   baseCreditoSimplesNacional,
        v_item_valorCreditoSimplesNac  valorCreditoSimplesNacional,
        v_item_stICMS                  stICMS,
        v_item_modalBaseCalcICMS       modalidadeBaseCalcICMS,
        v_item_reducaoBaseICMS         reducaoBaseICMS,
        v_item_aliquotaICMS            aliquotaICMS,
        v_item_diferimentoICMS         diferimentoICMS,
        v_item_motivoDesoneracaoICMS   motivoDesoneracaoICMS,
        v_item_idBeneficio             idBeneficio,
        v_item_baseICMS                baseICMS,
        v_item_valorICMSOperacao       valorICMSOperacao,
        v_item_valorICMSDiferido       valorICMSDiferido,
        v_item_valorICMS               valorICMS,
        v_item_valorICMSDesoneracao    valorICMSDesoneracao,
        v_item_modalBaseCalcICMSST     modalidadeBaseCalcICMSST,
        v_item_margemValorAdicionadoST margemValorAdicionadoST,
        v_item_reducaoBaseST           reducaoBaseST,
        v_item_aliquotaICMSST          aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin aliquotaSTSuportConsFinal,
        v_item_baseICMSST              baseICMSST,
        v_item_valorICMSST             valorICMSST,
        v_item_baseICMSSTAnteriormente baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment valorICMSSTAnteriormente,
        v_item_valorICMSProprioSubstit valorICMSProprioSubstituto,
        v_item_reducaoBaseICMSEfetivo  reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo     aliquotaICMSEfetivo,
        v_item_baseICMSEfetivo         baseICMSEfetivo,
        v_item_valorICMSEfetivo        valorICMSEfetivo,
        v_item_stICMSEscrituracao      stICMSEscrituracao,
        v_item_reducaoBaseICMSEscritur reducaoBaseICMSEscrituracao,
        v_item_aliquotaICMSEscrituraca aliquotaICMSEscrituracao,
        v_item_diferimentoICMSEscritur diferimentoICMSEscrituracao,
        v_item_baseICMSEscrituracao    baseICMSEscrituracao,
        v_item_valorICMSEscrituracao   valorICMSEscrituracao,
        v_item_valorICMSDesonEscritura valorICMSDesonEscrituracao,
        v_item_margemValorAdicSTEscrit margemValorAdicSTEscrituracao,
        v_item_reducaoBaseSTEscriturac reducaoBaseSTEscrituracao,
        v_item_aliquotaICMSSTEscritura aliquotaICMSSTEscrituracao,
        v_item_baseICMSSTEscrituracao  baseICMSSTEscrituracao,
        v_item_valorICMSSTEscrituracao valorICMSSTEscrituracao,
        v_item_somarICMSST             somarICMSST,
        v_item_aliquotaICMSUFDestinat  aliquotaICMSUFDestinatario,
        v_item_aliquotaICMSInterestad  aliquotaICMSInterestadual,
        v_item_partilhaICMSInterestad  partilhaICMSInterestadual,
        v_item_baseICMSUFDestinatario  baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente     baseICMSUFRemetente,
        v_item_valorICMSUFRemetente    valorICMSUFRemetente,
        v_item_aliquotaFCP             aliquotaFCP,
        v_item_baseFCP                 baseFCP,
        v_item_valorFCP                valorFCP,
        v_item_aliquotaFCPST           aliquotaFCPST,
        v_item_baseFCPST               baseFCPST,
        v_item_valorFCPST              valorFCPST,
        v_item_aliquotaFCPSTAnteriorm  aliquotaFCPSTAnteriormente,
        v_item_baseFCPSTAnteriormente  baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente valorFCPSTAnteriormente,
        v_item_aliquotaFCPUFDestinat   aliquotaFCPUFDestinatario,
        v_item_baseFCPUFDestinatario   baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario  valorFCPUFDestinatario,
        v_item_aliquotaEstImpFederais  aliquotaEstimadaImpFederais,
        v_item_aliquotaEstImpEstaduais aliquotaEstimadaImpEstaduais,
        v_item_aliquotaEstImpMunicipai aliquotaEstimadaImpMunicipais,
        v_item_baseEstimadaImpostos    baseEstimadaImpostos,
        v_item_valorEstImpFederais     valorEstimadoImpFederais,
        v_item_valorEstImpEstaduais    valorEstimadoImpEstaduais,
        v_item_valorEstImpMunicipais   valorEstimadoImpMunicipais,
        v_item_valorLiquidoItem        valorLiquidoItem,
        p_item_valorDescontoCustoOpIte valorDescontoCustoOpItem,
        p_item_valorDescontoCustoOpGer valorDescontoCustoOpGeral,
        v_item_valorDescontoCustoOpTot valorDescontoCustoOpTotal,
        p_item_valorAcrescimoCustoOpIt valorAcrescimoCustoOpItem,
        p_item_valorAcrescimoCustoOpGe valorAcrescimoCustoOpGeral,
        v_item_valorAcrescimoCustoOpTo valorAcrescimoCustoOpTotal,
        v_item_precoCustoOperacao      precoCustoOperacao,
        v_item_valorCustoOperacao      valorCustoOperacao,
        v_item_precoCMV                precoCMV,
        v_item_valorCMV                valorCMV,
        p_item_quantidadeExtemporanea  quantidadeExtemporanea,
        p_item_acrescimoUnitarioExtemp acrescimoUnitarioExtemporaneo,
        v_item_valorAcrescimoExtempSub valorAcrescimoExtempSubtotal,
        p_item_valorAcrescimoExtempIte valorAcrescimoExtempItem,
        p_item_valorAcrescimoExtempGer valorAcrescimoExtempGeral,
        v_item_valorAcrescimoExtempTot valorAcrescimoExtempTotal,
        p_item_observacoesDigitadas    observacoesDigitadas,
        v_observacoes                  observacoes
      FROM DUAL) b
    ON (a.idItemDocFiscal = b.idItemDocFiscal)
    WHEN MATCHED THEN UPDATE SET
      a.idDocumentoFiscal             = b.idDocumentoFiscal,
      a.sequencia                     = b.sequencia,
      a.cancelado                     = b.cancelado,
      a.pedidoCompraFornecedor        = b.pedidoCompraFornecedor,
      a.sequenciaPedidoCompraFornec   = b.sequenciaPedidoCompraFornec,
      a.vendedor                      = b.vendedor,
      a.modeloDocumento               = b.modeloDocumento,
      a.estabelecimentoOriginal       = b.estabelecimentoOriginal,
      a.gradeProduto                  = b.gradeProduto,
      a.idFormulaTinta                = b.idFormulaTinta,
      a.personalizacao                = b.personalizacao,
      a.idLoteEstoque                 = b.idLoteEstoque,
      a.operacaoFiscal                = b.operacaoFiscal,
      a.movimentaEstoque              = b.movimentaEstoque,
      a.movimentaEstoqueFiscal        = b.movimentaEstoqueFiscal,
      a.geraFinanceiro                = b.geraFinanceiro,
      a.localEstoque                  = b.localEstoque,
      a.pessoaParticipante            = b.pessoaParticipante,
      a.controleQuantidade            = b.controleQuantidade,
      a.unidadeMedidaConversao        = b.unidadeMedidaConversao,
      a.conversorQuantidade           = b.conversorQuantidade,
      a.loteMinimo                    = b.loteMinimo,
      a.loteMultiplo                  = b.loteMultiplo,
      a.altura                        = b.altura,
      a.largura                       = b.largura,
      a.comprimento                   = b.comprimento,
      a.pecas                         = b.pecas,
      a.quantidade                    = b.quantidade,
      a.quantidadeConvertida          = b.quantidadeConvertida,
      a.quantidadeDevolvidaRetornada  = b.quantidadeDevolvidaRetornada,
      a.percentualDevolucao           = b.percentualDevolucao,
      a.pesoLiquido                   = b.pesoLiquido,
      a.pesoBruto                     = b.pesoBruto,
      a.tipoPreco                     = b.tipoPreco,
      a.tabelaPreco                   = b.tabelaPreco,
      a.precoSugestaoAPrazo           = b.precoSugestaoAPrazo,
      a.precoSugestaoAVista           = b.precoSugestaoAVista,
      a.precoDesconto                 = b.precoDesconto,
      a.precoMinimo                   = b.precoMinimo,
      a.usarPrecoAVista               = b.usarPrecoAVista,
      a.precoUnitarioBruto            = b.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao   = b.acrescimoUnitarioComposicao,
      a.precoUnitario                 = b.precoUnitario,
      a.precoUnitarioConvertido       = b.precounitarioConvertido,
      a.valorProdutoServicoBruto      = b.valorProdutoServicoBruto,
      a.valorProdutoServico           = b.valorProdutoServico,
      a.percDescontoItem              = b.percDescontoItem,
      a.valorDescontoItem             = b.valorDescontoItem,
      a.percAcrescimoItem             = b.percAcrescimoItem,
      a.valorAcrescimoItem            = b.valorAcrescimoItem,
      a.valorFreteItem                = b.valorFreteItem,
      a.valorSeguroItem               = b.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem  = b.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem   = b.valorDespesasAduaneirasItem,
      a.valorFreteGeral               = b.valorFreteGeral,
      a.valorSeguroGeral              = b.valorSeguroGeral,
      a.valorDescontoGeral            = b.valorDescontoGeral,
      a.valorOutrasDespesasGeral      = b.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral = b.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral  = b.valorDespesasAduaneirasGeral,
      a.valorBasePagamento            = b.valorBasePagamento,
      a.valorDescontoPagamento        = b.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento  = b.valorOutrasDespesasPagamento,
      a.valorJurosPagamento           = b.valorJurosPagamento,
      a.valorFreteTotal               = b.valorFreteTotal,
      a.valorSeguroTotal              = b.valorSeguroTotal,
      a.valorDescontoTotal            = b.valorDescontoTotal,
      a.valorOutrasDespesasTotal      = b.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal = b.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal  = b.valorDespesasAduaneirasTotal,
      a.cfop                          = b.cfop,
      a.indicadorISSQN                = b.indicadorISSQN,
      a.aliquotaISSQN                 = b.aliquotaISSQN,
      a.retidoISSQN                   = b.retidoISSQN,
      a.tributadoForaMunicipio        = b.tributadoForaMunicipio,
      a.incentivoFiscal               = b.incentivoFiscal,
      a.listaServicos                 = b.listaServicos,
      a.cnae                          = b.cnae,
      a.idServicoMunicipio            = b.idServicoMunicipio,
      a.numeroProcessoAdministrativo  = b.numeroProcessoAdministrativo,
      a.baseISSQN                     = b.baseISSQN,
      a.valorISSQN                    = b.valorISSQN,
      a.retencaoIRRF                  = b.retencaoIRRF,
      a.baseRetIRRF                   = b.baseRetIRRF,
      a.valorRetIRRF                  = b.valorRetIRRF,
      a.retencaoINSS                  = b.retencaoINSS,
      a.baseRetINSS                   = b.baseRetINSS,
      a.valorRetINSS                  = b.valorRetINSS,
      a.retencaoPIS                   = b.retencaoPIS,
      a.baseRetPIS                    = b.baseRetPIS,
      a.valorRetPIS                   = b.valorRetPIS,
      a.retencaoCOFINS                = b.retencaoCOFINS,
      a.baseRetCOFINS                 = b.baseRetCOFINS,
      a.valorRetCOFINS                = b.valorRetCOFINS,
      a.retencaoCSLL                  = b.retencaoCSLL,
      a.baseRetCSLL                   = b.baseRetCSLL,
      a.valorRetCSLL                  = b.valorRetCSLL,
      a.retencaoOutros                = b.retencaoOutros,
      a.baseRetOutros                 = b.baseRetOutros,
      a.valorRetOutros                = b.valorRetOutros,
      a.aliquotaII                    = b.aliquotaII,
      a.baseII                        = b.baseII,
      a.valorII                       = b.valorII,
      a.aliquotaIOF                   = b.aliquotaIOF,
      a.baseIOF                       = b.baseIOF,
      a.valorIOF                      = b.valorIOF,
      a.codigoEnquadramentoIPI        = b.codigoEnquadramentoIPI,
      a.stIPI                         = b.stIPI,
      a.aliquotaIPI                   = b.aliquotaIPI,
      a.valorAliquotaIPI              = b.valorAliquotaIPI,
      a.baseIPI                       = b.baseIPI,
      a.valorIPI                      = b.valorIPI,
      a.valorIPIDevolucao             = b.valorIPIDevolucao,
      a.stPIS                         = b.stPIS,
      a.aliquotaPIS                   = b.aliquotaPIS,
      a.valorAliquotaPIS              = b.valorAliquotaPIS,
      a.basePIS                       = b.basePIS,
      a.valorPIS                      = b.valorPIS,
      a.aliquotaPISST                 = b.aliquotaPISST,
      a.valorAliquotaPISST            = b.valorAliquotaPISST,
      a.basePISST                     = b.basePISST,
      a.valorPISST                    = b.valorPISST,
      a.stCOFINS                      = b.stCOFINS,
      a.aliquotaCOFINS                = b.aliquotaCOFINS,
      a.valorAliquotaCOFINS           = b.valorAliquotaCOFINS,
      a.baseCOFINS                    = b.baseCOFINS,
      a.valorCOFINS                   = b.valorCOFINS,
      a.aliquotaCOFINSST              = b.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST         = b.valorAliquotaCOFINSST,
      a.baseCOFINSST                  = b.baseCOFINSST,
      a.valorCOFINSST                 = b.valorCOFINSST,
      a.stSimplesNacional             = b.stSimplesNacional,
      a.creditoSimplesNacional        = b.creditoSimplesNacional,
      a.baseCreditoSimplesNacional    = b.baseCreditoSimplesNacional,
      a.valorCreditoSimplesNacional   = b.valorCreditoSimplesNacional,
      a.stICMS                        = b.stICMS,
      a.modalidadeBaseCalcICMS        = b.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS               = b.reducaoBaseICMS,
      a.aliquotaICMS                  = b.aliquotaICMS,
      a.diferimentoICMS               = b.diferimentoICMS,
      a.motivoDesoneracaoICMS         = b.motivoDesoneracaoICMS,
      a.idBeneficio                   = b.idBeneficio,
      a.baseICMS                      = b.baseICMS,
      a.valorICMSoperacao             = b.valorICMSoperacao,
      a.valorICMSdiferido             = b.valorICMSdiferido,
      a.valorICMS                     = b.valorICMS,
      a.valorICMSdesoneracao          = b.valorICMSdesoneracao,
      a.modalidadeBaseCalcICMSST      = b.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST       = b.margemValorAdicionadoST,
      a.reducaoBaseST                 = b.reducaoBaseST,
      a.aliquotaICMSST                = b.aliquotaICMSST,
      a.aliquotaSTSuportConsFinal     = b.aliquotaSTSuportConsFinal,
      a.baseICMSST                    = b.baseICMSST,
      a.valorICMSST                   = b.valorICMSST,
      a.baseICMSSTAnteriormente       = b.baseICMSSTAnteriormente,
      a.valorICMSSTAnteriormente      = b.valorICMSSTAnteriormente,
      a.valorICMSProprioSubstituto    = b.valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo        = b.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo           = b.aliquotaICMSEfetivo,
      a.baseICMSEfetivo               = b.baseICMSEfetivo,
      a.valorICMSEfetivo              = b.valorICMSEfetivo,
      a.stICMSEscrituracao            = b.stICMSEscrituracao,
      a.reducaoBaseICMSEscrituracao   = b.reducaoBaseICMSEscrituracao,
      a.aliquotaICMSEscrituracao      = b.aliquotaICMSEscrituracao,
      a.diferimentoICMSEscrituracao   = b.diferimentoICMSEscrituracao,
      a.baseICMSEscrituracao          = b.baseICMSEscrituracao,
      a.valorICMSEscrituracao         = b.valorICMSEscrituracao,
      a.valorICMSDesonEscrituracao    = b.valorICMSDesonEscrituracao,
      a.margemValorAdicSTEscrituracao = b.margemValorAdicSTEscrituracao,
      a.reducaoBaseSTEscrituracao     = b.reducaoBaseSTEscrituracao,
      a.aliquotaICMSSTEscrituracao    = b.aliquotaICMSSTEscrituracao,
      a.baseICMSSTEscrituracao        = b.baseICMSSTEscrituracao,
      a.valorICMSSTEscrituracao       = b.valorICMSSTEscrituracao,
      a.somarICMSST                   = b.somarICMSST,
      a.aliquotaICMSUFDestinatario    = b.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual     = b.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual     = b.partilhaICMSInterestadual,
      a.baseICMSUFDestinatario        = b.baseICMSUFDestinatario,
      a.valorICMSUFDestinatario       = b.valorICMSUFDestinatario,
      a.baseICMSUFRemetente           = b.baseICMSUFRemetente,
      a.valorICMSUFRemetente          = b.valorICMSUFRemetente,
      a.aliquotaFCP                   = b.aliquotaFCP,
      a.baseFCP                       = b.baseFCP,
      a.valorFCP                      = b.valorFCP,
      a.aliquotaFCPST                 = b.aliquotaFCPST,
      a.baseFCPST                     = b.baseFCPST,
      a.valorFCPST                    = b.valorFCPST,
      a.aliquotaFCPSTAnteriormente    = b.aliquotaFCPSTAnteriormente,
      a.baseFCPSTAnteriormente        = b.baseFCPSTAnteriormente,
      a.valorFCPSTAnteriormente       = b.valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario     = b.aliquotaFCPUFDestinatario,
      a.baseFCPUFDestinatario         = b.baseFCPUFDestinatario,
      a.valorFCPUFDestinatario        = b.valorFCPUFDestinatario,
      a.aliquotaestimadaimpfederais   = b.aliquotaestimadaimpfederais,
      a.aliquotaestimadaimpestaduais  = b.aliquotaestimadaimpestaduais,
      a.aliquotaestimadaimpmunicipais = b.aliquotaestimadaimpmunicipais,
      a.baseestimadaimpostos          = b.baseestimadaimpostos,
      a.valorestimadoimpfederais      = b.valorestimadoimpfederais,
      a.valorEstimadoImpEstaduais     = b.valorEstimadoImpEstaduais,
      a.valorEstimadoImpMunicipais    = b.valorEstimadoImpMunicipais,
      a.valorLiquidoItem              = b.valorLiquidoItem,
      a.valorDescontoCustoOpItem      = b.valorDescontoCustoOpItem,
      a.valorDescontoCustoOpGeral     = b.valorDescontoCustoOpGeral,
      a.valorDescontoCustoOpTotal     = b.valorDescontoCustoOpTotal,
      a.valorAcrescimoCustoOpItem     = b.valorAcrescimoCustoOpItem,
      a.valorAcrescimoCustoOpGeral    = b.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoCustoOpTotal    = b.valorAcrescimoCustoOpTotal,
      a.precoCustoOperacao            = b.precoCustoOperacao,
      a.valorCustoOperacao            = b.valorCustoOperacao,
      a.precoCMV                      = b.precoCMV,
      a.valorCMV                      = b.valorCMV,
      a.quantidadeExtemporanea        = b.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo = b.acrescimoUnitarioExtemporaneo,
      a.valorAcrescimoExtempSubtotal  = b.valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem      = b.valorAcrescimoExtempItem,
      a.valorAcrescimoExtempGeral     = b.valorAcrescimoExtempGeral,
      a.valorAcrescimoExtempTotal     = b.valorAcrescimoExtempTotal,
      a.observacoesDigitadas          = b.observacoesDigitadas,
      a.observacoes                   = b.observacoes
    WHEN NOT MATCHED THEN INSERT (
      idItemDocFiscal,
      idDocumentoFiscal,
      sequencia,
      cancelado,
      pedidoCompraFornecedor,
      sequenciaPedidoCompraFornec,
      modeloDocumento,
      estabelecimentoOriginal,
      vendedor,
      gradeProduto,
      idFormulaTinta,
      personalizacao,
      idLoteEstoque,
      operacaoFiscal,
      movimentaEstoque,
      movimentaEstoqueFiscal,
      geraFinanceiro,
      localEstoque,
      pessoaParticipante,
      controleQuantidade,
      unidadeMedidaConversao,
      conversorQuantidade,
      loteMinimo,
      loteMultiplo,
      altura,
      largura,
      comprimento,
      pecas,
      quantidade,
      quantidadeConvertida,
      quantidadeDevolvidaRetornada,
      percentualDevolucao,
      pesoLiquido,
      pesoBruto,
      tipoPreco,
      tabelaPreco,
      precoSugestaoAPrazo,
      precoSugestaoAVista,
      precoDesconto,
      precoMinimo,
      usarPrecoAVista,
      precoUnitarioBruto,
      acrescimoUnitarioComposicao,
      precoUnitario,
      precoUnitarioConvertido,
      valorProdutoServicoBruto,
      valorProdutoServico,
      percDescontoItem,
      valorDescontoItem,
      percAcrescimoItem,
      valorAcrescimoItem,
      valorFreteItem,
      valorSeguroItem,
      valorAdicFreteMarinhaMerItem,
      valorDespesasAduaneirasItem,
      valorFreteGeral,
      valorSeguroGeral,
      valorDescontoGeral,
      valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral,
      valorDespesasAduaneirasGeral,
      valorBasePagamento,
      valorDescontoPagamento,
      valorOutrasDespesasPagamento,
      valorJurosPagamento,
      valorFreteTotal,
      valorSeguroTotal,
      valorDescontoTotal,
      valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal,
      valorDespesasAduaneirasTotal,
      cfop,
      indicadorISSQN,
      aliquotaISSQN,
      retidoISSQN,
      tributadoForaMunicipio,
      incentivoFiscal,
      listaServicos,
      cnae,
      idServicoMunicipio,
      numeroProcessoAdministrativo,
      baseISSQN,
      valorISSQN,
      retencaoIRRF,
      baseRetIRRF,
      valorRetIRRF,
      retencaoINSS,
      baseRetINSS,
      valorRetINSS,
      retencaoPIS,
      baseRetPIS,
      valorRetPIS,
      retencaoCOFINS,
      baseRetCOFINS,
      valorRetCOFINS,
      retencaoCSLL,
      baseRetCSLL,
      valorRetCSLL,
      retencaoOutros,
      baseRetOutros,
      valorRetOutros,
      aliquotaII,
      baseII,
      valorII,
      aliquotaIOF,
      baseIOF,
      valorIOF,
      codigoEnquadramentoIPI,
      stIPI,
      aliquotaIPI,
      valorAliquotaIPI,
      baseIPI,
      valorIPI,
      valorIPIDevolucao,
      stPIS,
      aliquotaPIS,
      valorAliquotaPIS,
      basePIS,
      valorPIS,
      aliquotaPISST,
      valorAliquotaPISST,
      basePISST,
      valorPISST,
      stCOFINS,
      aliquotaCOFINS,
      valorAliquotaCOFINS,
      baseCOFINS,
      valorCOFINS,
      aliquotaCOFINSST,
      valorAliquotaCOFINSST,
      baseCOFINSST,
      valorCOFINSST,
      stSimplesNacional,
      creditoSimplesNacional,
      baseCreditoSimplesNacional,
      valorCreditoSimplesNacional,
      stICMS,
      modalidadeBaseCalcICMS,
      reducaoBaseICMS,
      aliquotaICMS,
      diferimentoICMS,
      motivoDesoneracaoICMS,
      idBeneficio,
      baseICMS,
      valorICMSOperacao,
      valorICMSDiferido,
      valorICMS,
      valorICMSDesoneracao,
      modalidadeBaseCalcICMSST,
      margemValorAdicionadoST,
      reducaoBaseST,
      aliquotaICMSST,
      aliquotaSTSuportConsFinal,
      baseICMSST,
      valorICMSST,
      baseICMSSTAnteriormente,
      valorICMSSTAnteriormente,
      valorICMSProprioSubstituto,
      reducaoBaseICMSEfetivo,
      aliquotaICMSEfetivo,
      baseICMSEfetivo,
      valorICMSEfetivo,
      stICMSEscrituracao,
      reducaoBaseICMSEscrituracao,
      aliquotaICMSEscrituracao,
      diferimentoICMSEscrituracao,
      baseICMSEscrituracao,
      valorICMSEscrituracao,
      valorICMSDesonEscrituracao,
      margemValorAdicSTEscrituracao,
      reducaoBaseSTEscrituracao,
      aliquotaICMSSTEscrituracao,
      baseICMSSTEscrituracao,
      valorICMSSTEscrituracao,
      somarICMSST,
      aliquotaICMSUFDestinatario,
      aliquotaICMSInterestadual,
      partilhaICMSInterestadual,
      baseICMSUFDestinatario,
      valorICMSUFDestinatario,
      baseICMSUFRemetente,
      valorICMSUFRemetente,
      aliquotaFCP,
      baseFCP,
      valorFCP,
      aliquotaFCPST,
      baseFCPST,
      valorFCPST,
      aliquotaFCPSTAnteriormente,
      baseFCPSTAnteriormente,
      valorFCPSTAnteriormente,
      aliquotaFCPUFDestinatario,
      baseFCPUFDestinatario,
      valorFCPUFDestinatario,
      aliquotaEstimadaImpFederais,
      aliquotaEstimadaImpEstaduais,
      aliquotaEstimadaImpMunicipais,
      baseEstimadaImpostos,
      valorEstimadoImpFederais,
      valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais,
      valorLiquidoItem,
      valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral,
      valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpItem,
      valorAcrescimoCustoOpGeral,
      valorAcrescimoCustoOpTotal,
      precoCustoOperacao,
      valorCustoOperacao,
      precoCMV,
      valorCMV,
      quantidadeExtemporanea,
      acrescimoUnitarioExtemporaneo,
      valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral,
      valorAcrescimoExtempTotal,
      observacoesDigitadas,
      observacoes)
    VALUES (
      b.idItemDocFiscal,
      b.idDocumentoFiscal,
      b.sequencia,
      b.cancelado,
      b.pedidoCompraFornecedor,
      b.sequenciaPedidoCompraFornec,
      b.modeloDocumento,
      b.estabelecimentoOriginal,
      b.vendedor,
      b.gradeProduto,
      b.idFormulaTinta,
      b.personalizacao,
      b.idLoteEstoque,
      b.operacaoFiscal,
      b.movimentaEstoque,
      b.movimentaEstoqueFiscal,
      b.geraFinanceiro,
      b.localEstoque,
      b.pessoaParticipante,
      b.controleQuantidade,
      b.unidadeMedidaConversao,
      b.conversorQuantidade,
      b.loteMinimo,
      b.loteMultiplo,
      b.altura,
      b.largura,
      b.comprimento,
      b.pecas,
      b.quantidade,
      b.quantidadeConvertida,
      b.quantidadeDevolvidaRetornada,
      b.percentualDevolucao,
      b.pesoLiquido,
      b.pesoBruto,
      b.tipoPreco,
      b.tabelaPreco,
      b.precoSugestaoAPrazo,
      b.precoSugestaoAVista,
      b.precoDesconto,
      b.precoMinimo,
      b.usarPrecoAVista,
      b.precoUnitarioBruto,
      b.acrescimoUnitarioComposicao,
      b.precoUnitario,
      b.precoUnitarioConvertido,
      b.valorProdutoServicoBruto,
      b.valorProdutoServico,
      b.percDescontoItem,
      b.valorDescontoItem,
      b.percAcrescimoItem,
      b.valorAcrescimoItem,
      b.valorFreteItem,
      b.valorSeguroItem,
      b.valorAdicFreteMarinhaMerItem,
      b.valorDespesasAduaneirasItem,
      b.valorFreteGeral,
      b.valorSeguroGeral,
      b.valorDescontoGeral,
      b.valorOutrasDespesasGeral,
      b.valorAdicFreteMarinhaMerGeral,
      b.valorDespesasAduaneirasGeral,
      b.valorBasePagamento,
      b.valorDescontoPagamento,
      b.valorOutrasDespesasPagamento,
      b.valorJurosPagamento,
      b.valorFreteTotal,
      b.valorSeguroTotal,
      b.valorDescontoTotal,
      b.valorOutrasDespesasTotal,
      b.valorAdicFreteMarinhaMerTotal,
      b.valorDespesasAduaneirasTotal,
      b.cfop,
      b.indicadorISSQN,
      b.aliquotaISSQN,
      b.retidoISSQN,
      b.tributadoForaMunicipio,
      b.incentivoFiscal,
      b.listaServicos,
      b.cnae,
      b.idServicoMunicipio,
      b.numeroProcessoAdministrativo,
      b.baseISSQN,
      b.valorISSQN,
      b.retencaoIRRF,
      b.baseRetIRRF,
      b.valorRetIRRF,
      b.retencaoINSS,
      b.baseRetINSS,
      b.valorRetINSS,
      b.retencaoPIS,
      b.baseRetPIS,
      b.valorRetPIS,
      b.retencaoCOFINS,
      b.baseRetCOFINS,
      b.valorRetCOFINS,
      b.retencaoCSLL,
      b.baseRetCSLL,
      b.valorRetCSLL,
      b.retencaoOutros,
      b.baseRetOutros,
      b.valorRetOutros,
      b.aliquotaII,
      b.baseII,
      b.valorII,
      b.aliquotaIOF,
      b.baseIOF,
      b.valorIOF,
      b.codigoEnquadramentoIPI,
      b.stIPI,
      b.aliquotaIPI,
      b.valorAliquotaIPI,
      b.baseIPI,
      b.valorIPI,
      b.valorIPIDevolucao,
      b.stPIS,
      b.aliquotaPIS,
      b.valorAliquotaPIS,
      b.basePIS,
      b.valorPIS,
      b.aliquotaPISST,
      b.valorAliquotaPISST,
      b.basePISST,
      b.valorPISST,
      b.stCOFINS,
      b.aliquotaCOFINS,
      b.valorAliquotaCOFINS,
      b.baseCOFINS,
      b.valorCOFINS,
      b.aliquotaCOFINSST,
      b.valorAliquotaCOFINSST,
      b.baseCOFINSST,
      b.valorCOFINSST,
      b.stSimplesNacional,
      b.creditoSimplesNacional,
      b.baseCreditoSimplesNacional,
      b.valorCreditoSimplesNacional,
      b.stICMS,
      b.modalidadeBaseCalcICMS,
      b.reducaoBaseICMS,
      b.aliquotaICMS,
      b.diferimentoICMS,
      b.motivoDesoneracaoICMS,
      b.idBeneficio,
      b.baseICMS,
      b.valorICMSOperacao,
      b.valorICMSDiferido,
      b.valorICMS,
      b.valorICMSDesoneracao,
      b.modalidadeBaseCalcICMSST,
      b.margemValorAdicionadoST,
      b.reducaoBaseST,
      b.aliquotaICMSST,
      b.aliquotaSTSuportConsFinal,
      b.baseICMSST,
      b.valorICMSST,
      b.baseICMSSTAnteriormente,
      b.valorICMSSTAnteriormente,
      b.valorICMSProprioSubstituto,
      b.reducaoBaseICMSEfetivo,
      b.aliquotaICMSEfetivo,
      b.baseICMSEfetivo,
      b.valorICMSEfetivo,
      b.stICMSEscrituracao,
      b.reducaoBaseICMSEscrituracao,
      b.aliquotaICMSEscrituracao,
      b.diferimentoICMSEscrituracao,
      b.baseICMSEscrituracao,
      b.valorICMSEscrituracao,
      b.valorICMSDesonEscrituracao,
      b.margemValorAdicSTEscrituracao,
      b.reducaoBaseSTEscrituracao,
      b.aliquotaICMSSTEscrituracao,
      b.baseICMSSTEscrituracao,
      b.valorICMSSTEscrituracao,
      b.somarICMSST,
      b.aliquotaICMSUFDestinatario,
      b.aliquotaICMSInterestadual,
      b.partilhaICMSInterestadual,
      b.baseICMSUFDestinatario,
      b.valorICMSUFDestinatario,
      b.baseICMSUFRemetente,
      b.valorICMSUFRemetente,
      b.aliquotaFCP,
      b.baseFCP,
      b.valorFCP,
      b.aliquotaFCPST,
      b.baseFCPST,
      b.valorFCPST,
      b.aliquotaFCPSTAnteriormente,
      b.baseFCPSTAnteriormente,
      b.valorFCPSTAnteriormente,
      b.aliquotaFCPUFDestinatario,
      b.baseFCPUFDestinatario,
      b.valorFCPUFDestinatario,
      b.aliquotaEstimadaImpFederais,
      b.aliquotaEstimadaImpEstaduais,
      b.aliquotaEstimadaImpMunicipais,
      b.baseEstimadaImpostos,
      b.valorEstimadoImpFederais,
      b.valorEstimadoImpEstaduais,
      b.valorEstimadoImpMunicipais,
      b.valorLiquidoItem,
      b.valorDescontoCustoOpItem,
      b.valorDescontoCustoOpGeral,
      b.valorDescontoCustoOpTotal,
      b.valorAcrescimoCustoOpItem,
      b.valorAcrescimoCustoOpGeral,
      b.valorAcrescimoCustoOpTotal,
      b.precoCustoOperacao,
      b.valorCustoOperacao,
      b.precoCMV,
      b.valorCMV,
      b.quantidadeExtemporanea,
      b.acrescimoUnitarioExtemporaneo,
      b.valorAcrescimoExtempSubtotal,
      b.valorAcrescimoExtempItem,
      b.valorAcrescimoExtempGeral,
      b.valorAcrescimoExtempTotal,
      b.observacoesDigitadas,
      b.observacoes);
    v_atualizarObservacoes := 0;
    IF p_idItemReferenciado > 0 THEN
      IF p_tipoDocumentoReferenciado IN ('D','P') THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV(
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_devolucaoAnulacaoRetorno,
          'D',
          r_item_idItemDocFiscal,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          p_tipoDocumentoReferenciado,
          p_idItemReferenciado);
      END IF;
      IF p_tipoDocumentoReferenciado = 'B' THEN
        ADD_DOC_FISC_ITEM_BALANC_GRAVA (
          p_estabelecimentoAtivo,
          p_idItemReferenciado,
          r_item_idItemDocFiscal);
      ELSIF p_tipoDocumentoReferenciado = 'D' THEN
        ADD_DOC_FISC_ITEM_REF_DOC_FIS (
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'G' THEN
        ADD_DOC_FISC_ITEM_REF_DFE_GRAD (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_person_190_modeloFrete,
          p_config_227_manterPessoaOrcam,
          p_config_230_etapaPedComprParc,
          p_config_378_calcularVolumes,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'O' THEN
        ADD_DOC_FISC_ITEM_REF_ORCAMEN (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'P' THEN
        ADD_DOC_FISC_ITEM_REF_PRE_DOC (
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'T' THEN
        ADD_DOC_FISC_ITEM_TRANS_GRAVA (
          p_estabelecimentoAtivo,
          v_cab_entradaSaida,
          p_idItemReferenciado,
          r_item_idItemDocFiscal,
          p_quantidadeReferenciada);
      END IF;
    END IF;
    IF p_tempComp_nomeTempComposicao <> ' '
      AND (NOT (p_tipoDocumentoReferenciado IN ('D','O','P'))
        OR p_idItemReferenciado <= 0)
    THEN
      ADD_DOC_FISC_ITEM_COMP_TEMP (
        p_sessaoClient,
        p_estabelecimentoAtivo,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        r_item_idItemDocFiscal,
        v_atualizarObservacoes,
        v_atualizarObservacoes);
    END IF;
    v_idEnderecoEstoque := 0;
    IF p_item_idEnderecoEstoque > 0 THEN
      ADD_DOC_FISC_ITEM_ENDER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemDocFiscal,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_quantidade,
        ' ',
        v_idEnderecoEstoque);
    END IF;
    IF p_item_idNumeroSerie > 0 THEN
      ADD_DOC_FISC_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemDocFiscal,
        v_idEnderecoEstoque,
        p_item_gradeProduto,
        p_item_idNumeroSerie,
        0,
        v_auxNumber);
      v_atualizarObservacoes := 1;
    END IF;
    IF v_atualizarObservacoes = 1 THEN
      v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
        p_sessaoClient,
        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_413_obs_add_marca,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        'D',
        r_item_idItemDocFiscal,
        p_item_gradeProduto,
        p_item_idFormulaTinta,
        p_item_personalizacao,
        p_item_idLoteEstoque,
        p_item_controleQuantidade,
        p_item_loteMultiplo,
        p_item_altura,
        p_item_largura,
        p_item_comprimento,
        p_item_quantidade,
        p_item_observacoesDigitadas);
      UPDATE MODOCFISCALXITENS
      SET observacoes = v_observacoes
      WHERE idItemDocFiscal = r_item_idItemDocFiscal;
    END IF;
    IF v_cab_situacaoDocumentoFiscal > 20 THEN
      ADD_DOC_FISC_ITEM_EST_ATUALIZA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_item_idItemDocFiscal,
        p_estabelecimentoAtivo);
      ADD_DOC_FISC_ITEM_FIL_ATUALIZA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_item_idItemDocFiscal,
        p_estabelecimentoAtivo);
    END IF;
    r_buffer_idItemDocFiscal := CASE WHEN (r_buffer_idItemDocFiscal IS NULL OR r_buffer_idItemDocFiscal = '' OR r_buffer_idItemDocFiscal = ' ') THEN '' ELSE RTRIM (r_buffer_idItemDocFiscal) || ';' END || TO_CHAR (LPAD(r_item_idItemDocFiscal,14,'0'));
    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;
  END IF;
END ADD_DOC_FISC_ITEM_GRAVA;

/

create or replace FUNCTION FUNC_ADD_GERA_XML_ENVIO (
  p_idDocumentoFiscal      IN NUMBER,
  p_seqLoteWebServiceEnvio IN NUMBER,
  p_loteWebService         IN VARCHAR)
  RETURN CLOB
/*  
  Todas as alterações realizadas estão comentadas como CK
  1º Efetuada alteração na exigilidadeISSqn que estava fixa como 3 e foi aplicado para utlizar o IndicadorISSqn do item da nota fiscal
*/  
IS
  v_xml                         CLOB;
  v_tecnologiaNFSe              NUMBER;
  v_versaoNFSe                  VARCHAR(20);
  v_estab_nomeRazaoSocial       VARCHAR(60);
  v_estab_indicadorPessoa       CHAR(1);
  v_estab_cnpjCpfIdEstrangeiro  VARCHAR(20);
  v_estab_inscricaoMunicipal    VARCHAR(15);
  v_estab_municipio             NUMBER;
  v_estab_pais                  VARCHAR(4);
  v_estab_uf                    CHAR(2);
  v_regimeEspecialTributacao    CHAR (1);
  v_indicadorIssqn              CHAR (1);
  v_optanteSimplesNacional      NUMBER;
  v_incentivadorCultural        NUMBER;
  v_incentivoFiscal             NUMBER;
  v_intermediario               NUMBER;
  v_pess_nomeRazaoSocial        VARCHAR(60);
  v_pess_apelidoFantasia        VARCHAR(60);
  v_pess_indicadorPessoa        CHAR(1);
  v_pess_cnpjCpfIdEstrangeiro   VARCHAR(20);
  v_pess_inscricaoEstadual      VARCHAR(14);
  v_pess_inscricaoMunicipal     VARCHAR(15);
  v_pess_logradouro             VARCHAR(60);
  v_pess_numero                 VARCHAR(60);
  v_pess_complemento            VARCHAR(60);
  v_pess_bairroDistrito         VARCHAR(60);
  v_pess_municipio              NUMBER;
  v_pess_cep                    NUMBER;
  v_pess_pais                   VARCHAR(4);
  v_pess_uf                     CHAR(2);
  v_pess_observacoesEndereco    VARCHAR(4000);
  v_pess_fone                   VARCHAR(14);
  v_pess_email                  VARCHAR(60);
  v_interm_nomeRazaoSocial      VARCHAR(60);
  v_interm_indicadorPessoa      CHAR(1);
  v_interm_cnpjCpfIdEstrangeiro VARCHAR(20);
  v_interm_inscricaoMunicipal   VARCHAR(15);
  v_municipioFatoGerador        NUMBER;
  v_documentoFiscal             VARCHAR(15);
  v_serieFiscal                 VARCHAR(4);
  v_dataEmissao                 DATE;
  v_dataCompetencia             DATE;
  v_baseCalculoCrs              NUMBER;
  v_valorServicos               NUMBER;
  v_valorDeducoes               NUMBER;
  v_valorPis                    NUMBER;
  v_valorCofins                 NUMBER;
  v_valorInss                   NUMBER;
  v_valorIrrf                   NUMBER;
  v_valorCsll                   NUMBER;
  v_valorOutrasRetencoes        NUMBER;
  v_valorIssqn                  NUMBER;
  v_aliquotaIssqn               NUMBER;
  v_percentualCargaTributariaFe NUMBER;
  v_valorCargaTributariaFederal NUMBER;
  v_percentualCargaTributariaEs NUMBER;
  v_valorCargaTributariaEstad   NUMBER;
  v_percentualCargaTributariaMu NUMBER;
  v_valorCargaTributariaMunicip NUMBER;
  v_valorDescontoTotal          NUMBER;
  v_valorOutrasDespesasTotal    NUMBER;
  v_valorDescontoCondicionado   NUMBER;
  v_irrfIndenizacao             NUMBER;
  v_issRetido                   NUMBER;
  v_tributadoForaMunicipio      NUMBER;
  v_responsavelRetencao         NUMBER;
  v_listaServicos               NUMBER;
  v_cnae                        NUMBER;
  v_produtoImpresso             VARCHAR(60);
  v_quantidade                  NUMBER;
  v_precoUnitario               NUMBER;
  v_codigoTributacaoMunicipio   VARCHAR(60);
  v_discriminacao               VARCHAR(4000);
  v_numeroProcesso              VARCHAR(60);
  v_codigoObra                  VARCHAR(60);
  v_art                         VARCHAR(60);
  v_outrasInformacoes           VARCHAR(4000);
  v_formaPagamento              NUMBER;
  v_numeroParcelas              NUMBER;

BEGIN
  -- NÃO DESENVOLVIDO
  v_baseCalculoCrs              := 0;
  v_valorDeducoes               := 0;
  v_valorDescontoCondicionado   := 0;
  v_irrfIndenizacao             := 0;
  v_responsavelRetencao         := 0;
  v_formaPagamento              := 0;
  v_numeroParcelas              := 0;

  -- DOCUMENTO
  SELECT
    CASE
      WHEN munEst.versaoNFSe = '1.00'
      THEN TO_CHAR (a.dataEmissao, 'YYYY') || LPAD (a.documentoFiscal, 11, '0')
      ELSE TO_CHAR (a.documentoFiscal)
    END,
    a.serieFiscal,
    a.dataEmissao,
    a.municipioFatoGerador,
    a.valorServicos,
    a.valorDescontoTotal,
    a.valorOutrasDespesasTotal,
    COALESCE (SUBSTR( TRIM(
      COALESCE ((SELECT LISTAGG(UPPER(infCompl.descInformacaoComplementar), ' ')
        WITHIN GROUP (ORDER BY infCompl.sequencia)
        FROM MODOCFISCALXINFOCOMPLEMEN infCompl
        WHERE infCompl.idDocumentoFiscal = a.idDocumentoFiscal
        AND infCompl.geradoPeloSistema = 1
        AND infCompl.descInformacaoComplementar <> ' '),
        ' ')),1,4000),' '),
    COALESCE (docXServ.dataCompetencia, a.dataEmissao),
    FUNC_ADD_REMOVE_CARACT_ESPEC (obra.codigoObra),
    FUNC_ADD_REMOVE_CARACT_ESPEC (obra.art),
    FUNC_ADD_REMOVE_CARACT_ESPEC (pessEst.nomeRazaoSocial),
    pessEst.indicadorPessoa,
    CASE
      WHEN pessEst.cnpjCpfIdEstrangeiro <> ' '
      THEN pessEst.cnpjCpfIdEstrangeiro
      WHEN pessEst.indicadorPessoa = 'J'
      THEN '00000000000000'
      ELSE '00000000000'
    END,
    FUNC_ADD_REMOVE_CARACT_ESPEC (pessEst.inscricaoMunicipal),
    CASE WHEN pessEst.regimeTributario IN ('1', '2') THEN 1 ELSE 2 END,
    endEst.municipio,
    endEst.pais,
    munEst.uf,
    munEst.tecnologiaNFSe,
    munEst.versaoNFSe,
    COALESCE (estXnfse.regimeEspecialTributacao, ' '),
    CASE WHEN estXnfse.incentivadorCultural = 1 THEN 1 ELSE 2 END,
    COALESCE (docXServ.intermediario, 0),
    CASE WHEN a.pessoa = 0 THEN ' ' ELSE FUNC_ADD_REMOVE_CARACT_ESPEC (pess.nomeRazaoSocial) END,
    CASE WHEN a.pessoa = 0 THEN ' ' ELSE FUNC_ADD_REMOVE_CARACT_ESPEC (pess.apelidoFantasia) END,
    pess.indicadorPessoa,
    CASE
      WHEN pess.cnpjCpfIdEstrangeiro <> ' '
      THEN pess.cnpjCpfIdEstrangeiro
      WHEN pess.indicadorPessoa = 'J'
      THEN '00000000000000'
      ELSE '00000000000'
    END,
    FUNC_ADD_REMOVE_CARACT_ESPEC (pess.inscricaoEstadual),
    FUNC_ADD_REMOVE_CARACT_ESPEC (pess.inscricaoMunicipal),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endPess.logradouro),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endPess.numero),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endPess.complemento),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endPess.bairroDistrito),
    FUNC_ADD_REMOVE_CARACT_ESPEC (endPess.municipio),
    endPess.cep,
    endPess.pais,
    munPess.uf,
    FUNC_ADD_REMOVE_CARACT_ESPEC (endPess.observacoes),
    fonPess.fone,
    emailPess.email,
    CASE WHEN COALESCE (docXServ.intermediario, 0) = 0 THEN ' ' ELSE FUNC_ADD_REMOVE_CARACT_ESPEC (interm.nomeRazaoSocial) END,
    interm.indicadorPessoa,
    CASE
      WHEN interm.cnpjCpfIdEstrangeiro <> ' '
      THEN interm.cnpjCpfIdEstrangeiro
      WHEN interm.indicadorPessoa = 'J'
      THEN '00000000000000'
      ELSE '00000000000'
    END,
    FUNC_ADD_REMOVE_CARACT_ESPEC (interm.inscricaoMunicipal)
  INTO
    v_documentoFiscal,
    v_serieFiscal,
    v_dataEmissao,
    v_municipioFatoGerador,
    v_valorServicos,
    v_valorDescontoTotal,
    v_valorOutrasDespesasTotal,
    v_outrasInformacoes,
    v_dataCompetencia,
    v_codigoObra,
    v_art,
    v_estab_nomeRazaoSocial,
    v_estab_indicadorPessoa,
    v_estab_cnpjCpfIdEstrangeiro,
    v_estab_inscricaoMunicipal,
    v_optanteSimplesNacional,
    v_estab_municipio,
    v_estab_pais,
    v_estab_uf,
    v_tecnologiaNFSe,
    v_versaoNFSe,
    v_regimeEspecialTributacao,
    v_incentivadorCultural,
    v_intermediario,
    v_pess_nomeRazaoSocial,
    v_pess_apelidoFantasia,
    v_pess_indicadorPessoa,
    v_pess_cnpjCpfIdEstrangeiro,
    v_pess_inscricaoEstadual,
    v_pess_inscricaoMunicipal,
    v_pess_logradouro,
    v_pess_numero,
    v_pess_complemento,
    v_pess_bairroDistrito,
    v_pess_municipio,
    v_pess_cep,
    v_pess_pais,
    v_pess_uf,
    v_pess_observacoesEndereco,
    v_pess_fone,
    v_pess_email,
    v_interm_nomeRazaoSocial,
    v_interm_indicadorPessoa,
    v_interm_cnpjCpfIdEstrangeiro,
    v_interm_inscricaoMunicipal
  FROM MODOCUMENTOSFISCAIS a
  LEFT JOIN MODOCFISCALXSERVICO docXServ
  ON docXServ.idDocumentoFiscal = a.idDocumentoFiscal
  JOIN PAOBRAS obra
  ON obra.idObra = COALESCE (docXServ.idObra, 0)
  JOIN PAESTABELECIMENTOS est
  ON est.estabelecimento = a.estabelecimento
  LEFT JOIN PAESTABELECIMENTOXNFSE estXnfse
  ON estXnfse.estabelecimento = a.estabelecimento
  JOIN CAPESSOAS pessEst
  ON pessEst.pessoa = est.pessoaEstabelecimento
  JOIN CAENDERECOSPESSOA endEst
  ON endEst.enderecoPessoa = COALESCE ((
    SELECT MAX (end.enderecoPessoa)
    FROM CAENDERECOSPESSOA end
    WHERE end.pessoa = est.pessoaEstabelecimento
    AND end.ativo = 1
    AND end.principal = 1), 0)
  JOIN SIMUNICIPIOS munEst
  ON munEst.municipio = endEst.municipio
  JOIN CAPESSOAS pess
  ON pess.pessoa = a.pessoa
  JOIN CAENDERECOSPESSOA endPess
  ON endPess.enderecoPessoa = COALESCE ((
    SELECT MAX (end.enderecoPessoa)
    FROM CAENDERECOSPESSOA end
    WHERE end.pessoa = a.pessoa
    AND end.ativo = 1
    AND end.principal = 1), 0)
  JOIN SIMUNICIPIOS munPess
  ON munPess.municipio = endPess.municipio
  JOIN CAFONESPESSOA fonPess
  ON fonPess.idFonePessoa = COALESCE ((
    SELECT MAX (fon.idFonePessoa)
    FROM CAFONESPESSOA fon
    WHERE fon.pessoa = a.pessoa
    AND fon.ativo = 1
    AND fon.principal = 1), 0)
  JOIN CAEMAILSPESSOA emailPess
  ON emailPess.idEmailPessoa = COALESCE ((
    SELECT MAX (email.idEmailPessoa)
    FROM CAEMAILSPESSOA email
    WHERE email.pessoa = a.pessoa
    AND email.ativo = 1
    AND email.principal = 1), 0)
  JOIN CAPESSOAS interm
  ON interm.pessoa = COALESCE (docXServ.intermediario, 0)
  WHERE a.idDocumentoFiscal = p_idDocumentoFiscal;

  -- ITENS
  SELECT
    COALESCE (MAX (gradProd.produtoImpresso), ' '),
    COALESCE (SUM (a.quantidade), 0),
    COALESCE (MAX (a.precoUnitario), 0),
    COALESCE (MAX (a.indicadorIssqn), ' '),
    COALESCE (SUM (a.valorIssqn), 0),
    COALESCE (MAX (a.aliquotaIssqn), 0),
    CASE WHEN COALESCE (MAX (a.retidoIssqn), 0) = 1 THEN 1 ELSE 2 END,
    CASE WHEN COALESCE (MAX (a.tributadoForaMunicipio), 0) = 1 THEN 1 ELSE 2 END,
    CASE WHEN COALESCE (MAX (a.incentivoFiscal), 0) = 1 THEN 1 ELSE 2 END,
    COALESCE (MAX (a.listaServicos), 0),
    COALESCE (MAX (a.cnae), 0),
    COALESCE (MAX (servMun.codigoServicoMunicipio), ' '),
    COALESCE (MAX (a.numeroProcessoAdministrativo), ' '),
    COALESCE (SUM (a.valorRetInss), 0),
    COALESCE (SUM (a.valorRetIrrf), 0),
    COALESCE (SUM (a.valorRetPis), 0),
    COALESCE (SUM (a.valorRetCofins), 0),
    COALESCE (SUM (a.valorRetCsll), 0),
    COALESCE (SUM (a.valorRetOutros), 0),
    COALESCE (MAX (a.aliquotaEstimadaImpFederais), 0),
    COALESCE (SUM (a.valorEstimadoImpFederais), 0),
    COALESCE (MAX (a.aliquotaEstimadaImpEstaduais), 0),
    COALESCE (SUM (a.valorEstimadoImpEstaduais), 0),
    COALESCE (MAX (a.aliquotaEstimadaImpMunicipais), 0),
    COALESCE (SUM (a.valorEstimadoImpMunicipais), 0),
    FUNC_ADD_REMOVE_CARACT_ESPEC (COALESCE (MAX (
      CASE
        WHEN a.quantidadeConvertida = 1
          OR v_tecnologiaNFSe = 2
        THEN ''
        ELSE TO_CHAR(a.quantidadeConvertida)
          || ' '
          || a.unidadeMedidaConversao
          || ' X '
      END
      || TRIM (TRIM (gradProd.descricaoImpressa
      || ' '
      || a.observacoes)
      || CASE
           WHEN v_versaoNFSe = '1.00'
           THEN ' |||| Trib. Aprox.: R$ ' || TO_CHAR (a.valorEstimadoImpFederais, 'FM9999999999990D00') || ' Federal e R$ ' || TO_CHAR (a.valorEstimadoImpMunicipais, 'FM9999999999990D00') || ' Municipal'
           ELSE ''
         END)), ' '))
  INTO
    v_produtoImpresso,
    v_quantidade,
    v_precoUnitario,
    v_indicadorIssqn,
    v_valorIssqn,
    v_aliquotaIssqn,
    v_issRetido,
    v_tributadoForaMunicipio,
    v_incentivoFiscal,
    v_listaServicos,
    v_cnae,
    v_codigoTributacaoMunicipio,
    v_numeroProcesso,
    v_valorInss,
    v_valorIrrf,
    v_valorPis,
    v_valorCofins,
    v_valorCsll,
    v_valorOutrasRetencoes,
    v_percentualCargaTributariaFe,
    v_valorCargaTributariaFederal,
    v_percentualCargaTributariaEs,
    v_valorCargaTributariaEstad,
    v_percentualCargaTributariaMu,
    v_valorCargaTributariaMunicip,
    v_discriminacao
  FROM MODOCFISCALXITENS a
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = a.gradeProduto
  JOIN CAPRODUTOS prod
  ON prod.produto = gradProd.produto
  JOIN PASERVICOSMUNICIPIOS servMun
  ON servMun.idServicoMunicipio = a.idServicoMunicipio
  WHERE a.idDocumentoFiscal = p_idDocumentoFiscal
  AND a.cancelado = 0;

  IF v_tecnologiaNFSe = 2 THEN
    -- NFS-e
    v_xml := '<nfse id="rps_' || v_documentoFiscal || '">'
  || '<rps>'
    || FUNC_ADD_TAG_XML ('nro_recibo_provisorio', v_documentoFiscal)
    || FUNC_ADD_TAG_XML ('serie_recibo_provisorio', v_serieFiscal)
    || FUNC_ADD_TAG_XML ('data_emissao_recibo_provisorio', CASE WHEN v_dataEmissao IS NULL THEN '00/00/0000' ELSE TO_CHAR (v_dataEmissao, 'DD/MM/YYYY') END)
    || FUNC_ADD_TAG_XML ('hora_emissao_recibo_provisorio', CASE WHEN v_dataEmissao IS NULL THEN '00:00:00' ELSE TO_CHAR (v_dataEmissao, 'HH24:MI:SS') END)
  || '</rps>';

    -- NF
    v_xml := v_xml
  || '<nf>'
    || FUNC_ADD_TAG_XML ('valor_total', TO_CHAR (v_valorServicos - v_valorDescontoTotal + v_valorOutrasDespesasTotal, 'FM9999999999990D00'))
    || FUNC_ADD_TAG_XML ('valor_desconto', TO_CHAR (v_valorDescontoCondicionado, 'FM9999999999990D00'))
    || FUNC_ADD_TAG_XML ('valor_ir', TO_CHAR (v_valorIrrf, 'FM9999999999990D00'))
    || FUNC_ADD_TAG_XML ('valor_inss', TO_CHAR (v_valorInss, 'FM9999999999990D00'))
    || FUNC_ADD_TAG_XML ('valor_contribuicao_social', TO_CHAR (v_valorCsll, 'FM9999999999990D00'))
    || '<valor_rps>0,00</valor_rps>'
    || FUNC_ADD_TAG_XML ('valor_pis', TO_CHAR (v_valorPis, 'FM9999999999990D00'))
    || FUNC_ADD_TAG_XML ('valor_cofins', TO_CHAR (v_valorCofins, 'FM9999999999990D00'))
    || FUNC_ADD_TAG_XML ('observacao', v_outrasInformacoes)
  || '</nf>';

    -- Prestador
    v_xml := v_xml
  || '<prestador>'
    || FUNC_ADD_TAG_XML ('cpfcnpj', v_estab_cnpjCpfIdEstrangeiro)
    || FUNC_ADD_TAG_XML ('cidade', TO_CHAR (v_estab_municipio))
  || '</prestador>';

    -- Tomador (Cliente)
    v_xml := v_xml
  || '<tomador>'
    || FUNC_ADD_TAG_XML ('tipo', v_pess_indicadorPessoa)
    || FUNC_ADD_TAG_XML ('cpfcnpj', v_pess_cnpjCpfIdEstrangeiro)
    || FUNC_ADD_TAG_XML ('ie', v_pess_inscricaoEstadual)
    || FUNC_ADD_TAG_XML ('nome_razao_social', v_pess_nomeRazaoSocial)
    || FUNC_ADD_TAG_XML ('sobrenome_nome_fantasia', v_pess_apelidoFantasia)
    || FUNC_ADD_TAG_XML ('logradouro', v_pess_logradouro)
    || FUNC_ADD_TAG_XML ('email', v_pess_email)
    || FUNC_ADD_TAG_XML ('numero_residencia', v_pess_numero)
    || FUNC_ADD_TAG_XML ('complemento', v_pess_complemento)
    || FUNC_ADD_TAG_XML ('ponto_referencia', v_pess_observacoesEndereco)
    || FUNC_ADD_TAG_XML ('bairro', v_pess_bairroDistrito)
    || FUNC_ADD_TAG_XML ('cidade', TO_CHAR (v_pess_municipio))
    || FUNC_ADD_TAG_XML ('cep', TO_CHAR (v_pess_cep))
    || '<ddd_fone_comercial/>'
    || FUNC_ADD_TAG_XML ('fone_comercial', v_pess_fone)
    || '<ddd_fone_residencial/>'
    || '<fone_residencial/>'
    || '<ddd_fax/>'
    || '<fone_fax/>'
  || '</tomador>';

    -- Itens
    v_xml := v_xml
  || '<itens>'
    || '<lista>'
      || FUNC_ADD_TAG_XML ('codigo_local_prestacao_servico', TO_CHAR (v_municipioFatoGerador))
      || FUNC_ADD_TAG_XML ('codigo_item_lista_servico', TO_CHAR (v_listaServicos))
      || FUNC_ADD_TAG_XML ('descritivo', v_discriminacao)
      || FUNC_ADD_TAG_XML ('aliquota_item_lista_servico', TO_CHAR (v_aliquotaIssqn, 'FM9999999999990D00'))
      || FUNC_ADD_TAG_XML ('situacao_tributaria', '0')
      || FUNC_ADD_TAG_XML ('valor_tributavel', TO_CHAR (v_valorServicos - v_valorDescontoTotal + v_valorOutrasDespesasTotal, 'FM9999999999990D00'))
      || FUNC_ADD_TAG_XML ('valor_deducao', TO_CHAR (v_valorDeducoes, 'FM9999999999990D00'))
      || FUNC_ADD_TAG_XML ('valor_issrf', CASE WHEN v_issRetido = 1 THEN  TO_CHAR (v_valorIssqn, 'FM9999999999990D00') ELSE '0,00' END)
      || FUNC_ADD_TAG_XML ('tributa_municipio_prestador', CASE WHEN v_tributadoForaMunicipio = 1 THEN 'N' ELSE 'S' END)
      || '<unidade_codigo/>'
      || FUNC_ADD_TAG_XML ('unidade_quantidade', TO_CHAR (v_quantidade, 'FM9999999999990D00'))
      || FUNC_ADD_TAG_XML ('unidade_valor_unitario', TO_CHAR (v_precoUnitario - (v_valorDescontoTotal / v_quantidade) + (v_valorOutrasDespesasTotal / v_quantidade), 'FM9999999999990D00'))
    || '</lista>'
  || '</itens>'
  -- Assinar Aqui
|| '</nfse>';

  ELSIF v_versaoNFSe = '1.00' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsEnvio xmlns="http://www.abrasf.org.br/nfse.xsd">'
      || '<LoteRps Id="lote" versao="1.00">'
        || FUNC_ADD_TAG_XML ('NumeroLote', p_loteWebService)
        || FUNC_ADD_TAG_XML (CASE WHEN v_estab_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_estab_cnpjCpfIdEstrangeiro)
        || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
        || FUNC_ADD_TAG_XML ('QuantidadeRps', '1')
        || '<ListaRps>'
          || '<Rps>'
            || '<InfRps Id="rps:' || v_documentoFiscal || TRIM(v_serieFiscal) || '">'
              || '<IdentificacaoRps>'
                || FUNC_ADD_TAG_XML ('Numero', v_documentoFiscal)
                || FUNC_ADD_TAG_XML ('Serie', v_serieFiscal)
                || FUNC_ADD_TAG_XML ('Tipo', '1')
              || '</IdentificacaoRps>'
              || FUNC_ADD_TAG_XML ('DataEmissao', CASE WHEN v_dataEmissao IS NULL THEN '0000-00-00T00:00:00' ELSE TO_CHAR (v_dataEmissao, 'YYYY-MM-DD') || 'T' || TO_CHAR (v_dataEmissao, 'HH24:MI:SS') END)
              || FUNC_ADD_TAG_XML ('NaturezaOperacao', v_indicadorIssqn)
              || CASE WHEN v_regimeEspecialTributacao = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('RegimeEspecialTributacao', v_regimeEspecialTributacao) END
              || FUNC_ADD_TAG_XML ('OptanteSimplesNacional', TO_CHAR (v_optanteSimplesNacional))
              || FUNC_ADD_TAG_XML ('IncentivadorCultural', TO_CHAR (v_incentivadorCultural))
              || FUNC_ADD_TAG_XML ('Status', '1');

    -- Serviço
    v_xml := v_xml
              || '<Servico>'
                || '<Valores>'
                  || FUNC_ADD_TAG_XML ('ValorServicos', REPLACE (TO_CHAR (v_valorServicos + v_valorOutrasDespesasTotal, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorDeducoes', REPLACE (TO_CHAR (v_valorDeducoes, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorPis', REPLACE (TO_CHAR (v_valorPis, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorCofins', REPLACE (TO_CHAR (v_valorCofins, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorInss', REPLACE (TO_CHAR (v_valorInss, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorIr', REPLACE (TO_CHAR (v_valorIrrf, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorCsll', REPLACE (TO_CHAR (v_valorCsll, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('IssRetido', TO_CHAR (v_issRetido))
                  || FUNC_ADD_TAG_XML ('ValorIss', REPLACE (TO_CHAR (v_valorIssqn, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('OutrasRetencoes', REPLACE (TO_CHAR (v_valorOutrasRetencoes, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('Aliquota', REPLACE (TO_CHAR (v_aliquotaIssqn, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('DescontoIncondicionado', REPLACE (TO_CHAR (v_valorDescontoTotal, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('DescontoCondicionado', REPLACE (TO_CHAR (v_valorDescontoCondicionado, 'FM9999999999990D00'), ',', '.'))
                || '</Valores>'
                || FUNC_ADD_TAG_XML ('ItemListaServico', SUBSTR (LPAD (v_listaServicos,4,'0'),1,2) || '.' || SUBSTR (LPAD (v_listaServicos,4,'0'),3,2))
                || FUNC_ADD_TAG_XML ('CodigoTributacaoMunicipio', v_codigoTributacaoMunicipio)
                || FUNC_ADD_TAG_XML ('Discriminacao', v_discriminacao)
                || FUNC_ADD_TAG_XML ('CodigoMunicipio', TO_CHAR (v_estab_municipio))
              || '</Servico>';

  -- Prestador (Estabelecimento)
  v_xml := v_xml
              || '<Prestador>'
                || FUNC_ADD_TAG_XML (CASE WHEN v_estab_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END , v_estab_cnpjCpfIdEstrangeiro)
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
              || '</Prestador>';

    -- Tomador (Cliente)
    v_xml := v_xml
              || '<Tomador>'
                || '<IdentificacaoTomador>'
                  || '<CpfCnpj>'
                    || FUNC_ADD_TAG_XML (CASE WHEN v_pess_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_pess_cnpjCpfIdEstrangeiro)
                  || '</CpfCnpj>'
                  || CASE WHEN v_pess_inscricaoMunicipal = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_pess_inscricaoMunicipal) END
                || '</IdentificacaoTomador>'
                || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
                || '<Endereco>'
                  || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
                  || CASE WHEN v_pess_numero = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Numero', v_pess_numero) END
                  || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Complemento', v_pess_complemento) END
                  || CASE WHEN v_pess_bairroDistrito = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Bairro', v_pess_bairroDistrito) END
                  || FUNC_ADD_TAG_XML ('CodigoMunicipio', TO_CHAR (v_pess_municipio))
                  || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
                  || FUNC_ADD_TAG_XML ('Cep', TO_CHAR (v_pess_cep))
                || '</Endereco>'
              || '</Tomador>';

    -- Intermediário
    IF v_intermediario > 0 THEN
      v_xml := v_xml
              || '<IntermediarioServico>'
                || FUNC_ADD_TAG_XML ('RazaoSocial', v_interm_nomeRazaoSocial)
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
              || '</IntermediarioServico>';
    END IF;

    -- Construção Civil
    IF v_codigoObra <> ' ' THEN
      v_xml := v_xml
              || '<ConstrucaoCivil>'
                || FUNC_ADD_TAG_XML ('CodigoObra', v_codigoObra)
                || FUNC_ADD_TAG_XML ('Art', v_art)
              || '</ConstrucaoCivil>';
    END IF;

    -- Outros
    v_xml := v_xml
            || '</InfRps>'
            -- Assinar aqui
          || '</Rps>'
        || '</ListaRps>'
      || '</LoteRps>'
      -- Assinar aqui
    || '</EnviarLoteRpsEnvio>';
  ELSIF v_versaoNFSe = '2.03' THEN
    -- NFS-e
    v_xml := '<EnviarLoteRpsEnvio>'
  || '<LoteRps Id="'
  || CASE WHEN v_dataEmissao IS NULL THEN '00000000' ELSE TO_CHAR (v_dataEmissao, 'YYYYMMDD') END
  || LPAD (p_loteWebService, 4, '0')
  || '" versao="2.03">'
    || FUNC_ADD_TAG_XML ('NumeroLote', p_loteWebService)
    || '<CpfCnpj>'
      || FUNC_ADD_TAG_XML (CASE WHEN v_estab_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_estab_cnpjCpfIdEstrangeiro)
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || '<QuantidadeRps>1</QuantidadeRps>'
    || '<ListaRps>'
      || '<Rps>'
        || '<InfDeclaracaoPrestacaoServico>'
          || '<Rps>'
            || '<IdentificacaoRps>'
              || FUNC_ADD_TAG_XML ('Numero', v_documentoFiscal)
              || FUNC_ADD_TAG_XML ('Serie', '0')
              || FUNC_ADD_TAG_XML ('Tipo', '1')
            || '</IdentificacaoRps>'
            || FUNC_ADD_TAG_XML ('DataEmissao', CASE WHEN v_dataEmissao IS NULL THEN '0000-00-00' ELSE TO_CHAR (v_dataEmissao, 'YYYY-MM-DD') END)
            || FUNC_ADD_TAG_XML ('Status', '1')
          || '</Rps>'
          || FUNC_ADD_TAG_XML ('Competencia', CASE WHEN v_dataCompetencia IS NULL THEN '0000-00-00' ELSE TO_CHAR (v_dataCompetencia, 'YYYY-MM-DD') END);

    -- Serviço
    v_xml := v_xml
          || '<Servico>'
            || '<Valores>'
              || FUNC_ADD_TAG_XML ('ValorServicos', REPLACE (TO_CHAR (v_valorServicos + v_valorOutrasDespesasTotal, 'FM9999999999990D00'), ',', '.'))
              || FUNC_ADD_TAG_XML ('ValorDeducoes', REPLACE (TO_CHAR (v_valorDeducoes, 'FM9999999999990D00'), ',', '.'))
              || FUNC_ADD_TAG_XML ('ValorPis', REPLACE (TO_CHAR (v_valorPis, 'FM9999999999990D00'), ',', '.'))
              || FUNC_ADD_TAG_XML ('ValorCofins', REPLACE (TO_CHAR (v_valorCofins, 'FM9999999999990D00'), ',', '.'))
              || FUNC_ADD_TAG_XML ('ValorInss', REPLACE (TO_CHAR (v_valorInss, 'FM9999999999990D00'), ',', '.'))
              || FUNC_ADD_TAG_XML ('ValorIr', REPLACE (TO_CHAR (v_valorIrrf, 'FM9999999999990D00'), ',', '.'))
              || FUNC_ADD_TAG_XML ('ValorCsll', REPLACE (TO_CHAR (v_valorCsll, 'FM9999999999990D00'), ',', '.'))
              || FUNC_ADD_TAG_XML ('OutrasRetencoes', REPLACE (TO_CHAR (v_valorOutrasRetencoes, 'FM9999999999990D00'), ',', '.'))
              || FUNC_ADD_TAG_XML ('ValorIss', REPLACE (TO_CHAR (v_valorIssqn, 'FM9999999999990D00'), ',', '.'))
              || FUNC_ADD_TAG_XML ('DescontoCondicionado', REPLACE (TO_CHAR (v_valorDescontoCondicionado, 'FM9999999999990D00'), ',', '.'))
            || '</Valores>'
            || FUNC_ADD_TAG_XML ('IssRetido', TO_CHAR (v_issRetido))
            || FUNC_ADD_TAG_XML ('ItemListaServico', SUBSTR (LPAD (v_listaServicos, 4, '0'), 1, 2) || '.' || SUBSTR (LPAD (v_listaServicos, 4, '0'), 3, 2))
            || FUNC_ADD_TAG_XML ('CodigoCnae', LPAD (v_cnae, 7, '0'))
            || FUNC_ADD_TAG_XML ('CodigoTributacaoMunicipio', v_codigoTributacaoMunicipio)
            || FUNC_ADD_TAG_XML ('Discriminacao', v_discriminacao)
            || FUNC_ADD_TAG_XML ('CodigoMunicipio', TO_CHAR (v_estab_municipio))
            || FUNC_ADD_TAG_XML ('CodigoPais', v_estab_pais)
            || FUNC_ADD_TAG_XML ('ExigibilidadeISS', v_indicadorIssqn)
            || FUNC_ADD_TAG_XML ('MunicipioIncidencia', TO_CHAR (v_municipioFatoGerador))
          || '</Servico>';

    -- Prestador
    v_xml := v_xml
          || '<Prestador>'
            || '<CpfCnpj>'
              || FUNC_ADD_TAG_XML (CASE WHEN v_estab_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END , v_estab_cnpjCpfIdEstrangeiro)
            || '</CpfCnpj>'
            || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
          || '</Prestador>';

    -- Tomador
    v_xml := v_xml
          || '<Tomador>'
            || '<IdentificacaoTomador>'
              || '<CpfCnpj>'
                || FUNC_ADD_TAG_XML (CASE WHEN v_pess_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_pess_cnpjCpfIdEstrangeiro)
              || '</CpfCnpj>'
            || '</IdentificacaoTomador>'
            || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
            || '<Endereco>'
              || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
              || CASE WHEN v_pess_numero = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Numero', v_pess_numero) END
              || CASE WHEN v_pess_complemento = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Complemento', v_pess_complemento) END
              || CASE WHEN v_pess_bairroDistrito = ' ' THEN '' ELSE FUNC_ADD_TAG_XML ('Bairro', v_pess_bairroDistrito) END
              || FUNC_ADD_TAG_XML ('CodigoMunicipio', TO_CHAR (v_pess_municipio))
              || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
              || FUNC_ADD_TAG_XML ('Cep', TO_CHAR (v_pess_cep))
            || '</Endereco>'
            || '<Contato>'
            || '</Contato>'
          || '</Tomador>';
    -- Outros
    v_xml := v_xml
          || FUNC_ADD_TAG_XML ('OptanteSimplesNacional', TO_CHAR (v_optanteSimplesNacional))
          || FUNC_ADD_TAG_XML ('IncentivoFiscal', TO_CHAR (v_incentivoFiscal))
        || '</InfDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
  -- Assinar aqui
|| '</EnviarLoteRpsEnvio>';
  ELSE
    -- NFS-e
    v_xml := '<EnviarLoteRpsSincronoEnvio xmlns="http://www.abrasf.org.br/nfse.xsd">'
  || '<LoteRps Id="1'
  || TO_CHAR (v_dataEmissao, 'YYYY')
  || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
  || LPAD (p_seqLoteWebServiceEnvio, 14, '0')
  || '" versao="20.01">'
    || FUNC_ADD_TAG_XML ('NumeroLote', p_loteWebService)
    || '<CpfCnpj>'
      || FUNC_ADD_TAG_XML (CASE WHEN v_estab_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_estab_cnpjCpfIdEstrangeiro)
    || '</CpfCnpj>'
    || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
    || FUNC_ADD_TAG_XML ('QuantidadeRps', '1')
    || '<ListaRps>'
      || '<Rps>'
        || '<tcDeclaracaoPrestacaoServico>'
          || '<InfDeclaracaoPrestacaoServico Id="1'
            || CASE WHEN v_estab_indicadorPessoa = 'J' THEN '1' ELSE '2' END || SUBSTR ('00000000000000' || TRIM (v_estab_cnpjCpfIdEstrangeiro), -14)
            || LPAD (p_loteWebService, 14, '0')
            || '">'          
            || '<Rps>'
              || '<IdentificacaoRps>'
                || FUNC_ADD_TAG_XML ('Numero', v_documentoFiscal)
                || FUNC_ADD_TAG_XML ('Serie', 'UNICA')
                || FUNC_ADD_TAG_XML ('Tipo', '1')
              || '</IdentificacaoRps>'
              || FUNC_ADD_TAG_XML ('DataEmissao', CASE WHEN v_dataEmissao IS NULL THEN '0000-00-00T00:00:00' ELSE TO_CHAR (v_dataEmissao, 'YYYY-MM-DD') || 'T' || TO_CHAR (v_dataEmissao, 'HH24:MI:SS') END)
              || FUNC_ADD_TAG_XML ('Status', '1')
            || '</Rps>'
            || FUNC_ADD_TAG_XML ('Competencia', CASE WHEN v_dataCompetencia IS NULL THEN '0000-00-00T00:00:00' ELSE TO_CHAR (v_dataCompetencia, 'YYYY-MM-DD') || 'T' || TO_CHAR (v_dataCompetencia, 'HH24:MI:SS') END)
            || FUNC_ADD_TAG_XML ('IdCidade', TO_CHAR (v_estab_municipio));

    -- Serviço
    v_xml := v_xml
            || '<Servico>'
              || '<tcDadosServico>'
                || '<Valores>'
                  || FUNC_ADD_TAG_XML ('BaseCalculoCRS', REPLACE (TO_CHAR (v_baseCalculoCrs, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorServicos', REPLACE (TO_CHAR (v_valorServicos + v_valorOutrasDespesasTotal, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorDeducoes', REPLACE (TO_CHAR (v_valorDeducoes, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorPis', REPLACE (TO_CHAR (v_valorPis, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorCofins', REPLACE (TO_CHAR (v_valorCofins, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorInss', REPLACE (TO_CHAR (v_valorInss, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorIr', REPLACE (TO_CHAR (v_valorIrrf, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorCsll', REPLACE (TO_CHAR (v_valorCsll, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('OutrasRetencoes', REPLACE (TO_CHAR (v_valorOutrasRetencoes, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('ValorIss', REPLACE (TO_CHAR (v_valorIssqn, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('Aliquota', REPLACE (TO_CHAR (v_aliquotaIssqn, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('DescontoIncondicionado', REPLACE (TO_CHAR (v_valorDescontoTotal, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('DescontoCondicionado', REPLACE (TO_CHAR (v_valorDescontoCondicionado, 'FM9999999999990D00'), ',', '.'))
                  || FUNC_ADD_TAG_XML ('IrrfIndenizacao', TO_CHAR (v_irrfIndenizacao))
                || '</Valores>'
                || FUNC_ADD_TAG_XML ('IssRetido', TO_CHAR (v_issRetido))
                || FUNC_ADD_TAG_XML ('ResponsavelRetencao', TO_CHAR (v_responsavelRetencao))
                || FUNC_ADD_TAG_XML ('ItemListaServico', SUBSTR (LPAD (v_listaServicos, 4, '0'), 1, 2) || '.' || SUBSTR (LPAD (v_listaServicos, 4, '0'), 3, 2))
                || FUNC_ADD_TAG_XML ('CodigoCnae', LPAD (v_cnae, 7, '0'))
                || FUNC_ADD_TAG_XML ('CodigoTributacaoMunicipio', v_codigoTributacaoMunicipio)
                || FUNC_ADD_TAG_XML ('Discriminacao', v_discriminacao)
                || FUNC_ADD_TAG_XML ('CodigoMunicipio', TO_CHAR (v_estab_municipio))
                || FUNC_ADD_TAG_XML ('CodigoPais', v_estab_pais)
                || FUNC_ADD_TAG_XML ('ExigibilidadeISS', v_indicadorIssqn)
                || FUNC_ADD_TAG_XML ('MunicipioIncidencia', TO_CHAR (v_municipioFatoGerador))
                || FUNC_ADD_TAG_XML ('NumeroProcesso', v_numeroProcesso)
              || '</tcDadosServico>'
            || '</Servico>';

    -- Prestador (Estabelecimento)
    v_xml := v_xml
            || '<Prestador>'
              || '<CpfCnpj>'
                || FUNC_ADD_TAG_XML (CASE WHEN v_estab_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END , v_estab_cnpjCpfIdEstrangeiro)
              || '</CpfCnpj>'
              || FUNC_ADD_TAG_XML ('RazaoSocial', v_estab_nomeRazaoSocial)
              || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_estab_inscricaoMunicipal)
            || '</Prestador>';

    -- Tomador (Cliente)
    v_xml := v_xml
            || '<Tomador>'
              || '<IdentificacaoTomador>'
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (CASE WHEN v_pess_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_pess_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_pess_inscricaoMunicipal)
              || '</IdentificacaoTomador>'
              || FUNC_ADD_TAG_XML ('RazaoSocial', v_pess_nomeRazaoSocial)
              || '<Endereco>'
                || FUNC_ADD_TAG_XML ('Endereco', v_pess_logradouro)
                || FUNC_ADD_TAG_XML ('Numero', v_pess_numero)
                || FUNC_ADD_TAG_XML ('Complemento', v_pess_complemento)
                || FUNC_ADD_TAG_XML ('Bairro', v_pess_bairroDistrito)
                || FUNC_ADD_TAG_XML ('CodigoMunicipio', TO_CHAR (v_pess_municipio))
                || FUNC_ADD_TAG_XML ('Uf', v_pess_uf)
                || FUNC_ADD_TAG_XML ('CodigoPais', v_pess_pais)
                || FUNC_ADD_TAG_XML ('Cep', TO_CHAR (v_pess_cep))
              || '</Endereco>'
              || '<Contato>'
                || FUNC_ADD_TAG_XML ('Telefone', v_pess_fone)
                || FUNC_ADD_TAG_XML ('Email', v_pess_email)
              || '</Contato>'
            || '</Tomador>';

    IF v_intermediario <> 0 THEN
      -- Intermediário
      v_xml := v_xml
            || '<Intermediario>'
              || '<IdentificacaoIntermediario>'
                || '<CpfCnpj>'
                  || FUNC_ADD_TAG_XML (CASE WHEN v_interm_indicadorPessoa = 'J' THEN 'Cnpj' ELSE 'Cpf' END, v_interm_cnpjCpfIdEstrangeiro)
                || '</CpfCnpj>'
                || FUNC_ADD_TAG_XML ('InscricaoMunicipal', v_interm_inscricaoMunicipal)
              || '</IdentificacaoIntermediario>'
              || FUNC_ADD_TAG_XML ('RazaoSocial', v_interm_nomeRazaoSocial)
            || '</Intermediario>';
    END IF;

    -- Construção Civil
    v_xml := v_xml
            || '<ConstrucaoCivil>'
              || FUNC_ADD_TAG_XML ('CodigoObra', v_codigoObra)
              || FUNC_ADD_TAG_XML ('Art', v_art)
            || '</ConstrucaoCivil>';

    -- Outros
    v_xml := v_xml
            || FUNC_ADD_TAG_XML ('RegimeEspecialTributacao', v_regimeEspecialTributacao)
            || FUNC_ADD_TAG_XML ('NaturezaOperacao', v_indicadorIssqn)
            || FUNC_ADD_TAG_XML ('OptanteSimplesNacional', TO_CHAR (v_optanteSimplesNacional))
            || FUNC_ADD_TAG_XML ('IncentivoFiscal', TO_CHAR (v_incentivoFiscal))
            || FUNC_ADD_TAG_XML ('PercentualCargaTributaria', TO_CHAR (v_percentualCargaTributariaFe))
            || FUNC_ADD_TAG_XML ('ValorCargaTributaria', TO_CHAR (v_valorCargaTributariaFederal))
            || FUNC_ADD_TAG_XML ('PercentualCargaTributariaEstadual', TO_CHAR (v_percentualCargaTributariaEs))
            || FUNC_ADD_TAG_XML ('ValorCargaTributariaEstadual', TO_CHAR (v_valorCargaTributariaEstad))
            || FUNC_ADD_TAG_XML ('PercentualCargaTributariaMunicipal', TO_CHAR (v_percentualCargaTributariaMu))
            || FUNC_ADD_TAG_XML ('ValorCargaTributariaMunicipal', TO_CHAR (v_valorCargaTributariaMunicip))
            || FUNC_ADD_TAG_XML ('OutrasInformacoes', v_outrasInformacoes)
            || FUNC_ADD_TAG_XML ('SiglaUF', v_estab_uf)
            || FUNC_ADD_TAG_XML ('IdCidade', TO_CHAR (v_estab_municipio))
            || FUNC_ADD_TAG_XML ('FormaPagamento', v_formaPagamento)
--                    <!--identificação da forma de pagamento-->
--                        <!--0-Não identificada-->
--                        <!--1-A Vista-->
--                        <!--2-Apresentação-->
--                        <!--3-A Prazo-->
--                        <!--4-Cartão de Débito-->
--                        <!--5-Cartão de Crédito-->
            || FUNC_ADD_TAG_XML ('NumeroParcelas', v_numeroParcelas)
--                    <!--Caso não houver parcelamento informar o 0 e não colocar as tags abaixo-->
--            || '<Parcelamento>'
--              || '<Parcelas>'
--                || '<tcParcela>'
--                  || '<Numero>1</Numero>'
--                  || '<Valor>20.00</Valor>'
--                  || '<DataVencimento>2019-05-02T00:00:00</DataVencimento>'
--                || '</tcParcela>'
--                || '<tcParcela>'
--                  || '<Numero>2</Numero>'
--                  || '<Valor>20.00</Valor>'
--                  || '<DataVencimento>2019-06-02T00:00:00</DataVencimento>'
--                || '</tcParcela>'
--              || '</Parcelas>'
--            || '</Parcelamento>'
          || '</InfDeclaracaoPrestacaoServico>'
        -- Assinar aqui
        || '</tcDeclaracaoPrestacaoServico>'
      || '</Rps>'
    || '</ListaRps>'
  || '</LoteRps>'
|| '</EnviarLoteRpsSincronoEnvio>';

  END IF;
  RETURN v_xml;
END;

/

INSERT INTO SITECNOLOGIASNFSE (tecnologiaNFSe, descricao, ativo, solicitaLogon, observacoes) values (3, 'INFISC', 1, 1, ' ');

COMMIT;

UPDATE SIMUNICIPIOS SET tecnologianfse = 3, versaonfse = '2.03' where municipio = 4304606;

COMMIT;

DELETE SISERVICOSNFSE  WHERE id IN (4304606000, 4304606010, 4304606020, 4304606100);

COMMIT;

INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4304606000, 4304606, 'EnviarLoteRps', 'https://canoas-homol.infisc.com.br/services/nfse/ws/Servicos', 'https://nfse.canoas.rs.gov.br/services/nfse/ws/Servicos', ' ', '<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns=\"http://nfse.abrasf.org.br\"><soapenv:Header/><soapenv:Body><RecepcionarLoteRpsSincrono><nfseCabecMsg><cabecalho xmlns=\"http://nfse.abrasf.org.br\" versao=\"2.03\"><versaoDados>2.03</versaoDados></cabecalho></nfseCabecMsg><nfseDadosMsg>', '</nfseDadosMsg></RecepcionarLoteRpsSincrono></soapenv:Body></soapenv:Envelope>', 'EnviarLoteRpsSincronoResposta', ' ', ' ');
INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4304606010, 4304606, 'ConsultarSituacaoLoteRps', 'https://canoas-homol.infisc.com.br/services/nfse/ws/Servicos', 'https://nfse.canoas.rs.gov.br/services/nfse/ws/Servicos', ' ', ' ', ' ', ' ', ' ', ' ');
INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4304606020, 4304606, 'ConsultarLoteRps', 'https://canoas-homol.infisc.com.br/services/nfse/ws/Servicos', 'https://nfse.canoas.rs.gov.br/services/nfse/ws/Servicos', ' ', '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://nfse.abrasf.org.br"><soapenv:Header/><soapenv:Body><ConsultarLoteRps><nfseCabecMsg><cabecalho xmlns="http://nfse.abrasf.org.br" versao="2.03"><versaoDados>2.03</versaoDados></cabecalho></nfseCabecMsg><nfseDadosMsg><ConsultarLoteRpsEnvio>', '</ConsultarLoteRpsEnvio></nfseDadosMsg></ConsultarLoteRps></soapenv:Body></soapenv:Envelope>', 'ConsultarLoteRpsResposta', ' ', ' ');
INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4304606100, 4304606, 'CancelarNfse', 'https://canoas-homol.infisc.com.br/services/nfse/ws/Servicos', 'https://nfse.canoas.rs.gov.br/services/nfse/ws/Servicos', ' ', '<soapenv:Envelope xmlns="http://ws.pc.gif.com.br/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><cancelarNotaFiscal>', '</cancelarNotaFiscal></soapenv:Body></soapenv:Envelope>', 'resCancelaNFSe', ' ', ' ');

COMMIT;

UPDATE SIMUNICIPIOS SET tecnologianfse = 2, versaonfse = '2.04' where municipio = 4309100;

COMMIT;

DELETE SISERVICOSNFSE  WHERE id IN (4309100000, 4309100010, 4309100020, 4309100100);

COMMIT;

INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4309100000, 4309100, 'EnviarLoteRps', ' ', ' https://gramado.atende.net:7443/?pg=services' || '&' || 'service=WNENotaFiscalEletronicaNfe', ' ', ' ', ' ', 'EnviarLoteRpsResposta', ' ', ' ');
INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4309100010, 4309100, 'ConsultarSituacaoLoteRps', ' ', ' https://gramado.atende.net:7443/?pg=services' || '&' || 'service=WNENotaFiscalEletronicaNfe', ' ', ' ', ' ', 'ConsultarSituacaoLoteRpsResposta', '<ConsultarSituacaoLoteRpsEnvio xmlns="http://www.abrasf.org.br/nfse.xsd"><Prestador><Cnpj><!$MG_cnpj></Cnpj><InscricaoMunicipal><!$MG_inscricaoMunicipal></InscricaoMunicipal></Prestador><Protocolo><!$MG_protocolo></Protocolo></ConsultarSituacaoLoteRpsEnvio>', ' ');
INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4309100020, 4309100, 'ConsultarLoteRps', ' ', ' https://gramado.atende.net:7443/?pg=services' || '&' || 'service=WNENotaFiscalEletronicaNfe', ' ', ' ', ' ', 'ConsultarLoteRpsResposta', '<ConsultarLoteRpsEnvio xmlns="http://www.abrasf.org.br/nfse.xsd"><Prestador><Cnpj><!$MG_cnpj></Cnpj><InscricaoMunicipal><!$MG_inscricaoMunicipal></InscricaoMunicipal></Prestador><Protocolo><!$MG_protocolo></Protocolo></ConsultarLoteRpsEnvio>', ' ');
INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4309100100, 4309100, 'CancelarNfse', ' ', ' https://gramado.atende.net:7443/?pg=services' || '&' || 'service=WNENotaFiscalEletronicaNfe', ' ', ' ', ' ', 'CancelarNfseResposta', '<solicitacao_cancelamento><prestador><cpfcnpj><!$MG_cnpj></cpfcnpj><cidade><!$MG_codigoMunicipio></cidade></prestador><documentos><nfse><numero><!$MG_numeroNFSe></numero><serie><!$MG_serieFiscal></serie><observacao><!$MG_motivoCancelamento></observacao></nfse></documentos></solicitacao_cancelamento>', ' ');

COMMIT;

UPDATE SIMUNICIPIOS SET tecnologianfse = 3, versaonfse = '2.03' where municipio = 4304606;

COMMIT;

DELETE SISERVICOSNFSE  WHERE id IN (4304606000, 4304606010, 4304606020, 4304606100);

COMMIT;

INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4304606000, 4304606, 'EnviarLoteRps', 'https://canoas-homol.infisc.com.br/services/nfse/ws/Servicos', 'https://nfse.canoas.rs.gov.br/services/nfse/ws/Servicos', ' ', '<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns=\"http://nfse.abrasf.org.br\"><soapenv:Header/><soapenv:Body><RecepcionarLoteRpsSincrono><nfseCabecMsg><cabecalho xmlns=\"http://nfse.abrasf.org.br\" versao=\"2.03\"><versaoDados>2.03</versaoDados></cabecalho></nfseCabecMsg><nfseDadosMsg>', '</nfseDadosMsg></RecepcionarLoteRpsSincrono></soapenv:Body></soapenv:Envelope>', 'EnviarLoteRpsSincronoResposta', ' ', ' ');
INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4304606010, 4304606, 'ConsultarSituacaoLoteRps', 'https://canoas-homol.infisc.com.br/services/nfse/ws/Servicos', 'https://nfse.canoas.rs.gov.br/services/nfse/ws/Servicos', ' ', ' ', ' ', ' ', ' ', ' ');
INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4304606020, 4304606, 'ConsultarLoteRps', 'https://canoas-homol.infisc.com.br/services/nfse/ws/Servicos', 'https://nfse.canoas.rs.gov.br/services/nfse/ws/Servicos', ' ', '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://nfse.abrasf.org.br"><soapenv:Header/><soapenv:Body><ConsultarLoteRps><nfseCabecMsg><cabecalho xmlns="http://nfse.abrasf.org.br" versao="2.03"><versaoDados>2.03</versaoDados></cabecalho></nfseCabecMsg><nfseDadosMsg><ConsultarLoteRpsEnvio>', '</ConsultarLoteRpsEnvio></nfseDadosMsg></ConsultarLoteRps></soapenv:Body></soapenv:Envelope>', 'ConsultarLoteRpsResposta', ' ', ' ');
INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4304606100, 4304606, 'CancelarNfse', 'https://canoas-homol.infisc.com.br/services/nfse/ws/Servicos', 'https://nfse.canoas.rs.gov.br/services/nfse/ws/Servicos', ' ', '<soapenv:Envelope xmlns="http://ws.pc.gif.com.br/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><cancelarNotaFiscal>', '</cancelarNotaFiscal></soapenv:Body></soapenv:Envelope>', 'resCancelaNFSe', ' ', ' ');

COMMIT;

UPDATE SIVERSOESSISTEMA SET dataLiberacaoVersao = TO_DATE ('03/06/2024', 'DD/MM/YYYY'), dataAtualizacaoVersao =  SYSDATE, observacoes = 'BETA 12' WHERE idVersaoSistema = 2024001002;

COMMIT;

-- FIM BETA 12 - 03/6/24

CREATE TABLE MOHISTORICOCRM_2401 AS SELECT * FROM MOHISTORICOCRM;
CREATE INDEX MOHISTORICOCRM_2401_K2 ON MOHISTORICOCRM_2401 (pessoa, listaCRM, dataInicio);

DROP TABLE MOHISTORICOCRM;

DELETE SITABELASSISTEMA WHERE tabelaSistema = 'MOHISTORICOCRM';

COMMIT;

-- MOCRMS
CREATE TABLE MOCRMS
  (
    idCRM                   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    descricao               VARCHAR (256) DEFAULT ' ' NOT NULL,
    listaCRM                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    estabelecimento         NUMERIC (4,0) DEFAULT 0 NOT NULL,
    pessoa                  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    usuario                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    tipoAcaoCRM             NUMERIC (4,0) DEFAULT 0 NOT NULL,
    situacaoCRM             CHAR (1) DEFAULT ' ' NOT NULL,
    dataInicio              DATE,
    dataTermino             DATE,
    dataProximoContato      DATE,
    horaProximoContatoFinal CHAR(6),
    observacoes             VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MOCRMS ADD CONSTRAINT MOCRMS_PK1 PRIMARY KEY (idCRM);
CREATE INDEX MOCRMS_K2 ON MOCRMS (descricao);
CREATE INDEX MOCRMS_K3 ON MOCRMS (listaCRM);
CREATE INDEX MOCRMS_K4 ON MOCRMS (estabelecimento);
CREATE INDEX MOCRMS_K5 ON MOCRMS (pessoa);
CREATE INDEX MOCRMS_K6 ON MOCRMS (usuario);
CREATE INDEX MOCRMS_K7 ON MOCRMS (tipoAcaoCRM);
CREATE INDEX MOCRMS_K8 ON MOCRMS (situacaoCRM);
CREATE INDEX MOCRMS_K9 ON MOCRMS (dataInicio);
CREATE INDEX MOCRMS_K10 ON MOCRMS (dataTermino);
CREATE INDEX MOCRMS_K11 ON MOCRMS (dataProximoContato);
ALTER TABLE MOCRMS ADD CONSTRAINT MOCRMS_FK1 FOREIGN KEY (listaCRM) REFERENCES PALISTASCRM (listaCRM);
ALTER TABLE MOCRMS ADD CONSTRAINT MOCRMS_FK2 FOREIGN KEY (estabelecimento) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE MOCRMS ADD CONSTRAINT MOCRMS_FK3 FOREIGN KEY (pessoa) REFERENCES CAPESSOAS (pessoa);
ALTER TABLE MOCRMS ADD CONSTRAINT MOCRMS_FK4 FOREIGN KEY (usuario) REFERENCES CAUSUARIOS (usuario);
ALTER TABLE MOCRMS ADD CONSTRAINT MOCRMS_FK5 FOREIGN KEY (tipoAcaoCRM) REFERENCES PATIPOSACOESCRM (tipoAcaoCRM);
ALTER TABLE MOCRMS ADD CONSTRAINT MOCRMS_FK6 FOREIGN KEY (situacaoCRM) REFERENCES SISITUACOESCRM (situacaoCRM);

INSERT INTO MOCRMS (idCRM, descricao, listaCRM, estabelecimento, pessoa, usuario, tipoAcaoCRM, situacaoCRM, dataInicio, dataTermino, dataProximoContato, horaProximoContatoFinal, observacoes) VALUES (0, ' ', 0, 0, 0, 0, 0, ' ', NULL, NULL, NULL, NULL, ' ');

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MOCRMS', 'CRM', 1, 50502, 'MO', 'idCRM', 'N', 14, 'descricao', 1, ' ', 0, 100002, ' ', ' ', 1, 1, ' ');

COMMIT;

-- MOCRMXHISTORICO
CREATE TABLE MOCRMXHISTORICO
  (
    id                      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idCRM                   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    usuario                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    tipoAcaoCRM             NUMERIC (4,0) DEFAULT 0 NOT NULL,
    situacaoCRM             CHAR (1) DEFAULT ' ' NOT NULL,
    dataInicio              DATE,
    dataTermino             DATE,
    dataProximoContato      DATE,
    horaProximoContatoFinal CHAR(6),
    observacoes             VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MOCRMXHISTORICO ADD CONSTRAINT MOCRMXHISTORICO_PK1 PRIMARY KEY (id);
CREATE INDEX MOCRMXHISTORICO_K2 ON MOCRMXHISTORICO (idCRM, dataInicio);
CREATE INDEX MOCRMXHISTORICO_K3 ON MOCRMXHISTORICO (idCRM);
CREATE INDEX MOCRMXHISTORICO_K4 ON MOCRMXHISTORICO (usuario);
CREATE INDEX MOCRMXHISTORICO_K5 ON MOCRMXHISTORICO (tipoAcaoCRM);
CREATE INDEX MOCRMXHISTORICO_K6 ON MOCRMXHISTORICO (situacaoCRM);
ALTER TABLE MOCRMXHISTORICO ADD CONSTRAINT MOCRMXHISTORICO_FK1 FOREIGN KEY (idCRM) REFERENCES MOCRMS (idCRM);
ALTER TABLE MOCRMXHISTORICO ADD CONSTRAINT MOCRMXHISTORICO_FK2 FOREIGN KEY (usuario) REFERENCES CAUSUARIOS (usuario);
ALTER TABLE MOCRMXHISTORICO ADD CONSTRAINT MOCRMXHISTORICO_FK3 FOREIGN KEY (tipoAcaoCRM) REFERENCES PATIPOSACOESCRM (tipoAcaoCRM);
ALTER TABLE MOCRMXHISTORICO ADD CONSTRAINT MOCRMXHISTORICO_FK4 FOREIGN KEY (situacaoCRM) REFERENCES SISITUACOESCRM (situacaoCRM);

INSERT INTO MOCRMXHISTORICO (id, idCRM, usuario, tipoAcaoCRM, situacaoCRM, dataInicio, dataTermino, dataProximoContato, horaProximoContatoFinal, observacoes) VALUES (0, 0, 0, 0, ' ', NULL, NULL, NULL, NULL, ' ');

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MOCRMXHISTORICO', 'CRM X HISTORICO', 1, 50502, 'MO', 'id', 'N', 14, ' ', 1, ' ', 0, 100002, ' ', ' ', 1, 1, ' ');

COMMIT;

-- MOCRMXORCAMENTOS
CREATE TABLE MOCRMXORCAMENTOS
  (
    id        NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idCRM     NUMERIC (14,0) DEFAULT 0 NOT NULL,
    orcamento NUMERIC (14,0) DEFAULT 0 NOT NULL
  );
ALTER TABLE MOCRMXORCAMENTOS ADD CONSTRAINT MOCRMXORCAMENTOS_PK1 PRIMARY KEY (id);
CREATE UNIQUE INDEX MOCRMXORCAMENTOS_K2 ON MOCRMXORCAMENTOS (idCRM, orcamento);
CREATE INDEX MOCRMXORCAMENTOS_K3 ON MOCRMXORCAMENTOS (idCRM);
CREATE INDEX MOCRMXORCAMENTOS_K4 ON MOCRMXORCAMENTOS (orcamento);
ALTER TABLE MOCRMXORCAMENTOS ADD CONSTRAINT MOCRMXORCAMENTOS_FK1 FOREIGN KEY (idCRM) REFERENCES MOCRMS (idCRM);
ALTER TABLE MOCRMXORCAMENTOS ADD CONSTRAINT MOCRMXORCAMENTOS_FK2 FOREIGN KEY (orcamento) REFERENCES MOORCAMENTOS (orcamento);

INSERT INTO MOCRMXORCAMENTOS (id, idCRM, orcamento) VALUES (0, 0, 0);

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MOCRMXORCAMENTOS', 'CRM X ORCAMENTOS', 1, 50502, 'MO', 'id', 'N', 14, ' ', 1, ' ', 0, 100002, ' ', ' ', 1, 1, ' ');

COMMIT;

DECLARE
  v_idCRM NUMBER;
BEGIN
  FOR a IN (
    SELECT
      a.listaCRM,
      a.estabelecimento,
      a.pessoa,
      a.usuario,
      a.tipoAcaoCRM,
      a.situacaoCRM,
      ( SELECT MIN (c.dataInicio)
        FROM MOHISTORICOCRM_2401 c
        WHERE c.idHistoricoCRM > 0
        AND c.pessoa = a.pessoa
        AND c.listaCRM  = a.listaCRM
        AND c.dataInicio IS NOT NULL) dataInicio,
      a.dataTermino,
      a.dataProximoContato,
      a.horaProximoContatoFinal,
      a.observacoes
    FROM (
      SELECT
        ROW_NUMBER() OVER (
          PARTITION BY
            a.pessoa,
            a.listaCRM
          ORDER BY
            a.pessoa,
            a.listaCRM,
            b.ordenacao,
            a.dataInicio DESC,
            a.dataTermino DESC,
            a.idHistoricoCRM DESC) ordenacao,
        a.listaCRM,
        a.estabelecimento,
        a.pessoa,
        a.usuario,
        a.tipoAcaoCRM,
        a.situacaoCRM,
        a.dataTermino,
        a.dataProximoContato,
        a.horaProximoContatoFinal,
        a.observacoes
      FROM MOHISTORICOCRM_2401 a
      JOIN SISITUACOESCRM b
      ON b.situacaoCRM = a.situacaoCRM
      WHERE a.idHistoricoCRM > 0) a
    WHERE a.ordenacao = 1)
  LOOP
    v_idCRM := FUNC_ADD_BUSCA_PROXIMO_ID (
      'MOCRMS',
      'idCRM',
      14,
      1,
      NULL);
    INSERT INTO MOCRMS (
      idCRM,
      descricao,
      listaCRM,
      estabelecimento,
      pessoa,
      usuario,
      tipoAcaoCRM,
      situacaoCRM,
      dataInicio,
      dataTermino,
      dataProximoContato,
      horaProximoContatoFinal,
      observacoes)
    VALUES (
      v_idCRM,
      ' ',
      a.listaCRM,
      a.estabelecimento,
      a.pessoa,
      a.usuario,
      a.tipoAcaoCRM,
      a.situacaoCRM,
      a.dataInicio,
      a.dataTermino,
      a.dataProximoContato,
      a.horaProximoContatoFinal,
      a.observacoes);
    FOR b IN (
      SELECT
        b.usuario,
        b.tipoAcaoCRM,
        b.situacaoCRM,
        b.dataInicio,
        b.dataTermino,
        b.dataProximoContato,
        b.horaProximoContatoFinal,
        b.observacoes
      FROM MOHISTORICOCRM_2401 b
      WHERE b.idHistoricoCRM > 0
      AND b.pessoa = a.pessoa
      AND b.listaCRM  = a.listaCRM
      ORDER BY
        b.dataInicio,
        b.dataTermino,
        b.idHistoricoCRM)
    LOOP
      INSERT INTO MOCRMXHISTORICO (
        id,
        idCRM,
        usuario,
        tipoAcaoCRM,
        situacaoCRM,
        dataInicio,
        dataTermino,
        dataProximoContato,
        horaProximoContatoFinal,
        observacoes)
      VALUES (
        FUNC_ADD_BUSCA_PROXIMO_ID (
          'MOCRMXHISTORICO',
          'id',
          14,
          1,
          NULL),
        v_idCRM,
        b.usuario,
        b.tipoAcaoCRM,
        b.situacaoCRM,
        b.dataInicio,
        b.dataTermino,
        b.dataProximoContato,
        b.horaProximoContatoFinal,
        b.observacoes);
    END LOOP;
    COMMIT;
  END LOOP;
END;

/

CREATE TABLE PAATIVIDADESSERVICO_0401B AS SELECT * FROM PAATIVIDADESSERVICO;

ALTER TABLE PAATIVIDADEOSXPREVISTA DROP CONSTRAINT PAATIVIDADEOSXPREVISTA_FK1;
ALTER TABLE PAATIVIDADEOSXPREVISTA DROP CONSTRAINT PAATIVIDADEOSXPREVISTA_FK2;
ALTER TABLE PAATIVIDADEPREVISTAXREAL DROP CONSTRAINT PAATIVIDADEPREVISTAXREAL_FK1;
ALTER TABLE PAATIVIDADEPREVISTAXREAL DROP CONSTRAINT PAATIVIDADEPREVISTAXREAL_FK2;
ALTER TABLE PAATIVIDADESERVXCHECKLIST DROP CONSTRAINT PAATIVIDADESERVXCHECKLIST_FK1;
ALTER TABLE MOORCAMENTOXITENS DROP CONSTRAINT MOORCAMENTOXITENS_FK4;
ALTER TABLE MOORCAMENTOXATIVIDADEPREV DROP CONSTRAINT MOORCAMENTOXATIVIDADEPREV_FK2;
ALTER TABLE MOORCAMENTOXATIVIDADEREAL DROP CONSTRAINT MOORCAMENTOXATIVIDADEREAL_FK2;

DROP TABLE PAATIVIDADESSERVICO;

-- PAATIVIDADESSERVICO
CREATE TABLE PAATIVIDADESSERVICO
  (
    atividadeServico           NUMERIC (4,0) DEFAULT 0 NOT NULL,
    descricao                  VARCHAR (120) DEFAULT ' ' NOT NULL,
    ativo                      NUMERIC (1,0) DEFAULT 0 NOT NULL,
    tipoServico                NUMERIC (4,0) DEFAULT 0 NOT NULL,
    gradeProduto               NUMERIC (14,0) DEFAULT 0 NOT NULL,
    validoAtividadeOs          NUMERIC (1,0) DEFAULT 0 NOT NULL,
    validoPrevisto             NUMERIC (1,0) DEFAULT 0 NOT NULL,
    validoRealizado            NUMERIC (1,0) DEFAULT 0 NOT NULL,
    habilitaAtividadePrevista  NUMERIC (1,0) DEFAULT 0 NOT NULL,
    selecionaAtividadePrevista NUMERIC (1,0) DEFAULT 0 NOT NULL,
    externo                    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    restrito                   NUMERIC (1,0) DEFAULT 0 NOT NULL,
    enviarEmail                CHAR (1) DEFAULT ' ' NOT NULL,
    enviarWhatsApp             CHAR (1) DEFAULT ' ' NOT NULL,
    observacoes                VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PAATIVIDADESSERVICO ADD CONSTRAINT PAATIVIDADESSERVICO_PK1 PRIMARY KEY (atividadeServico);
CREATE INDEX PAATIVIDADESSERVICO_K2 ON PAATIVIDADESSERVICO (descricao);
ALTER TABLE PAATIVIDADESSERVICO ADD CONSTRAINT PAATIVIDADESSERVICO_FK1 FOREIGN KEY (tipoServico) REFERENCES PATIPOSSERVICO (tipoServico);
ALTER TABLE PAATIVIDADESSERVICO ADD CONSTRAINT PAATIVIDADESSERVICO_FK2 FOREIGN KEY (gradeProduto) REFERENCES CAGRADESPRODUTO (gradeProduto);
ALTER TABLE PAATIVIDADESSERVICO ADD CONSTRAINT PAATIVIDADESSERVICO_FK3 FOREIGN KEY (enviarEmail) REFERENCES SISIMNAOPERGUNTAR (simNaoPerguntar);
ALTER TABLE PAATIVIDADESSERVICO ADD CONSTRAINT PAATIVIDADESSERVICO_FK4 FOREIGN KEY (enviarWhatsApp) REFERENCES SISIMNAOPERGUNTAR (simNaoPerguntar);

INSERT INTO PAATIVIDADESSERVICO (atividadeServico, descricao, ativo, tipoServico, gradeProduto, validoAtividadeOs, validoPrevisto, validoRealizado, habilitaAtividadePrevista, selecionaAtividadePrevista, externo, restrito, enviarEmail, enviarWhatsApp, observacoes) VALUES (0, 'SELECIONE', 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, ' ', ' ', ' ');
INSERT INTO PAATIVIDADESSERVICO (atividadeServico, descricao, ativo, tipoServico, gradeProduto, validoAtividadeOs, validoPrevisto, validoRealizado, habilitaAtividadePrevista, selecionaAtividadePrevista, externo, restrito, enviarEmail, enviarWhatsApp, observacoes) SELECT atividadeServico, descricao, ativo, tipoServico, gradeProduto, validoAtividadeOs, validoPrevisto, validoRealizado, habilitaAtividadePrevista, 0, externo, restrito, 'N', 'N', observacoes FROM PAATIVIDADESSERVICO_0401B WHERE atividadeServico > 0;

COMMIT;

ALTER TABLE PAATIVIDADEOSXPREVISTA ADD CONSTRAINT PAATIVIDADEOSXPREVISTA_FK1 FOREIGN KEY (atividadeServicoOs) REFERENCES PAATIVIDADESSERVICO (atividadeServico);
ALTER TABLE PAATIVIDADEOSXPREVISTA ADD CONSTRAINT PAATIVIDADEOSXPREVISTA_FK2 FOREIGN KEY (atividadeServicoPrevista) REFERENCES PAATIVIDADESSERVICO (atividadeServico);
ALTER TABLE PAATIVIDADEPREVISTAXREAL ADD CONSTRAINT PAATIVIDADEPREVISTAXREAL_FK1 FOREIGN KEY (atividadeServicoPrevista) REFERENCES PAATIVIDADESSERVICO (atividadeServico);
ALTER TABLE PAATIVIDADEPREVISTAXREAL ADD CONSTRAINT PAATIVIDADEPREVISTAXREAL_FK2 FOREIGN KEY (atividadeServicoRealizada) REFERENCES PAATIVIDADESSERVICO (atividadeServico);
ALTER TABLE PAATIVIDADESERVXCHECKLIST ADD CONSTRAINT PAATIVIDADESERVXCHECKLIST_FK1 FOREIGN KEY (atividadeServico) REFERENCES PAATIVIDADESSERVICO (atividadeServico);
ALTER TABLE MOORCAMENTOXITENS ADD CONSTRAINT MOORCAMENTOXITENS_FK4 FOREIGN KEY (atividadeServico) REFERENCES PAATIVIDADESSERVICO (atividadeServico);
ALTER TABLE MOORCAMENTOXATIVIDADEPREV ADD CONSTRAINT MOORCAMENTOXATIVIDADEPREV_FK2 FOREIGN KEY (atividadeServico) REFERENCES PAATIVIDADESSERVICO (atividadeServico);
ALTER TABLE MOORCAMENTOXATIVIDADEREAL ADD CONSTRAINT MOORCAMENTOXATIVIDADEREAL_FK2 FOREIGN KEY (atividadeServico) REFERENCES PAATIVIDADESSERVICO (atividadeServico);

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

/

create or replace PROCEDURE ADD_TROCA_GRADEPRODUTO(
    p_gradeProdutoDe   IN NUMBER,
    p_gradeProdutoPara IN NUMBER)
IS
BEGIN
  UPDATE CAGRADEPRODUTOXPESSOAS a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT (EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXPESSOAS b
    WHERE b.gradeProduto = p_gradeProdutoPara
    AND b.pessoa = a.pessoa
    AND b.codigoProduto = a.codigoProduto));
  DELETE CAGRADEPRODUTOXPESSOAS
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXLOTESESTOQ a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT (EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXLOTESESTOQ b
    WHERE b.gradeProduto = p_gradeProdutoPara
    AND b.loteEstoque = a.loteEstoque));
  UPDATE CAGRADEPRODUTOXLOTESESTOQ
  SET ativo = 0
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXENDERECOS a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT (EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXENDERECOS b
    WHERE b.gradeProduto = p_gradeProdutoPara
    AND b.idLoteEstoque = a.idLoteEstoque
    AND b.idEnderecoEstoque = a.idEnderecoEstoque));
  DELETE CAGRADEPRODUTOXENDERECOS
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXNUMEROSSER a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT (EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXNUMEROSSER b
    WHERE b.gradeProduto = p_gradeProdutoPara
    AND b.numeroSerie = a.numeroSerie));
  UPDATE CAGRADEPRODUTOXNUMEROSSER
  SET ativo = 0
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXKITSCOMBOS a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT (EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXKITSCOMBOS b
    WHERE b.gradeProduto = p_gradeProdutoPara
    AND b.gradeProdutoFilho = a.gradeProdutoFilho));
  UPDATE CAGRADEPRODUTOXKITSCOMBOS
  SET ativo = 0
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXKITSCOMBOS a
  SET a.gradeProdutoFilho = p_gradeProdutoPara
  WHERE a.gradeProdutoFilho = p_gradeProdutoDe
  AND NOT (EXISTS (
    SELECT 1
    FROM CAGRADEPRODUTOXKITSCOMBOS b
    WHERE b.gradeProdutoFilho = p_gradeProdutoPara
    AND b.gradeProduto = a.gradeProduto));
  UPDATE CAGRADEPRODUTOXKITSCOMBOS
  SET ativo = 0
  WHERE gradeProdutoFilho = p_gradeProdutoDe;
  UPDATE CAGRADEPRODUTOXKITSCOMBOS
  SET ativo = 0
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAPRODUTOXCOMPOSICOESPREC
  SET gradeProdutoEstoque = p_gradeProdutoPara
  WHERE gradeProdutoEstoque = p_gradeProdutoDe;
  UPDATE PAPRODUTOSLINHASTINTAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CABASESTINTAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CACOLORANTESTINTAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE PAATIVIDADESSERVICO
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE PAPROJETOS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOORCAMENTOXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOORCAMENTOXNUMEROSSERIE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOORCAMENTOXBLOQUEIOSEST
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOLISTAEVENTOXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOCONTRATOXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOPREDOCUMXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOPREDOCUMXNUMEROSSERIE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOPREDOCUMXBLOQUEIOSEST
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCFISCALXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCFISCALXPRODUTOFILHO
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCFISCALXNUMEROSSERIE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODISTRIBUICAODFEXGRADE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOSEPARACAOXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOSEPARACAOXNUMEROSSERIE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOSEPARACAOXBLOQUEIOSEST
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOINVENTARIOESTOQUEXITENS a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT (EXISTS (
    SELECT 1
    FROM MOINVENTARIOESTOQUEXITENS b
    WHERE b.inventarioEstoque = a.inventarioEstoque
    AND b.gradeProduto = p_gradeProdutoPara
    AND b.indicadorPropriedadePosseItem = a.indicadorPropriedadePosseItem
    AND b.pessoaParticipante = a.pessoaParticipante
    AND b.localEstoque = a.localEstoque
    AND b.personalizacao = a.personalizacao
    AND b.idLoteEstoque = a.idLoteEstoque
    AND b.idEnderecoEstoque = a.idEnderecoEstoque
    AND b.idNumeroSerie = a.idNumeroSerie));
  DELETE MOINVENTARIOESTOQUEXITENS
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOINVENTARIOESTOQUEXFISC a
  SET a.gradeProduto = p_gradeProdutoPara
  WHERE a.gradeProduto = p_gradeProdutoDe
  AND NOT (EXISTS (
    SELECT 1
    FROM MOINVENTARIOESTOQUEXFISC b
    WHERE b.inventarioEstoque = a.inventarioEstoque
    AND b.gradeProduto = p_gradeProdutoPara
    AND b.indicadorPropriedadePosseItem = a.indicadorPropriedadePosseItem
    AND b.pessoaParticipante = a.pessoaParticipante));
  DELETE MOINVENTARIOESTOQUEXFISC
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOESTOQUES
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCTROCAXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOBALANCOXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOBALANCOXDIVERGENCIA
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCUMENTOTRANSFXITENS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCTRANSFXNUMEROSSERIE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCTRANSFXBLOQUEIOSEST
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOORCAMENTOXCONFERENCIAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOPREDOCUMXCONFERENCIAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCFISCALXCONFERENCIAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MODOCTRANSFXCONFERENCIAS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOCONSERTOS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MORESERVASESTOQUE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOPAINELCOMPRAXGRADE
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOMOTIVOSBLOQUEIOS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE MOINGRESSOS
  SET gradeProduto = p_gradeProdutoPara
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAGRADESPRODUTO
  SET ativo = 0
  WHERE gradeProduto = p_gradeProdutoDe;
  UPDATE CAPRODUTOS a
  SET a.ativo = 0
  WHERE EXISTS (
    SELECT 1
    FROM CAGRADESPRODUTO b
    WHERE b.produto = a.produto
    AND b.gradeProduto = p_gradeProdutoDe)
  AND NOT (EXISTS (
    SELECT 1
    FROM CAGRADESPRODUTO b
    WHERE b.produto = a.produto
    AND b.ativo = 1));
END ADD_TROCA_GRADEPRODUTO;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_REF_ORCAMEN (
  p_estabelecimentoAtivo        IN NUMBER,
  p_cab_tipoDocumento           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,
    CASE WHEN p_quantidadeReferenciada > 0 THEN p_quantidadeReferenciada ELSE p_item_quantidade END,
    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);
  IF p_cab_tipoDocumento = 103 THEN
    UPDATE MOORCAMENTOXITENS
    SET quantidadeSaldo = quantidadeSaldo - p_quantidadeReferenciada
    WHERE idItemOrcamento = p_idItemOrcamentoReferenciado;
  END IF;
  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_PREV_INSERE (
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_munEndEst_uf                 IN CHAR,
  p_munEndPess_uf                 IN CHAR,
  p_item_idItemOrcamento         IN NUMBER,
  p_item_atividadeServico        IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_tipoPreco               IN CHAR,
  p_item_tabelaPreco             IN VARCHAR,
  p_item_precoUnitario           IN NUMBER,
  p_ativ_selecionaAtividadePrev  IN NUMBER,
  p_idAtividadesPrevistasSelec   IN VARCHAR2,
  /* Retornos */
  r_inseriuAtividadePrevista     OUT NUMBER)
IS
  v_sequenciaAtividade      NUMBER;
  v_tecnico                 NUMBER;
  v_checklist               NUMBER;
  v_auxNumber               NUMBER;
BEGIN
  r_inseriuAtividadePrevista := 0;
  v_sequenciaAtividade := 0;
  SELECT COALESCE (MAX (tecnico), 0)
  INTO v_tecnico
  FROM CATECNICOS
  WHERE tecnico = p_usuarioLogado
  AND ativo = 1;
  FOR a IN (
    SELECT
      a.atividadeServicoPrevista,
      a.tecnico,
      a.faturarAtividade,
      a.etapaAtividade,
      a.observacoes,
      COALESCE ((
        SELECT MAX (b.checklist)
        FROM (
          SELECT
            b.atividadeServico,
            b.checklist,
            ROW_NUMBER() OVER (
              PARTITION BY b.atividadeServico
              ORDER BY
                b.atividadeServico,
                b.ordenacao,
                b.id) ordenacao
          FROM PAATIVIDADESERVXCHECKLIST b
          WHERE b.ativo = 1) b
        WHERE b.atividadeServico = a.atividadeServicoPrevista
        AND b.ordenacao = 1), 0) checklist,
      CASE ativ.gradeProduto
        WHEN 0
        THEN 0
        WHEN p_item_gradeProduto
        THEN p_item_precoUnitario
        ELSE FUNC_ADD_BUSCA_PRECO (
          p_config_64_casasDecSaidas,
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_perfilUsuarioLogado,
          p_usuarioLogado,
          p_cab_estabelecimento,
          SYSDATE, -- p_cab_dataPrecoFinal
          p_cab_pessoa,
          p_munEndEst_uf,
          p_munEndPess_uf,
          p_item_vendedor,
          0, -- p_item_idFormulaTinta
          0, -- p_item_personalizacao
          gradProd.produto,
          gradProd.cor,
          gradProd.tamanho,
          prod.controleEstoque,
          p_item_tipoPreco,
          p_item_tabelaPreco)
      END precoUnitario
    FROM PAATIVIDADEOSXPREVISTA a
    JOIN PAATIVIDADESSERVICO ativ
    ON ativ.atividadeServico = a.atividadeServicoPrevista
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = ativ.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE a.id > 0
    AND (p_ativ_selecionaAtividadePrev = 0
      AND a.atividadeServicoOs = p_item_atividadeServico
      AND a.ativo = 1
      AND a.sugestao = 1
      OR p_ativ_selecionaAtividadePrev = 1
      AND INSTR (',' || TRIM (p_idAtividadesPrevistasSelec) || ',', ',' || TO_CHAR (a.id) || ',') > 0)
    ORDER BY
      a.atividadeServicoOs,
      a.ordenacao,
      a.id)
  LOOP
    r_inseriuAtividadePrevista := 1;
    v_sequenciaAtividade := v_sequenciaAtividade + 1;  
    ADD_ORCAMENTO_ITEM_PREV_GRAVA (
      p_estabelecimentoAtivo,
      0,
      p_item_idItemOrcamento,
      v_sequenciaAtividade,
      a.atividadeServicoPrevista,
      ' ',
      CASE WHEN v_sequenciaAtividade = 1 AND a.tecnico = 0 THEN v_tecnico ELSE a.tecnico END,
      a.faturarAtividade,
      a.checklist,
      a.etapaAtividade,
      CASE WHEN v_sequenciaAtividade = 1 THEN CASE WHEN CASE WHEN a.tecnico = 0 THEN v_tecnico ELSE a.tecnico END = p_usuarioLogado THEN 'I' ELSE 'P' END ELSE 'A' END,
      CASE WHEN v_sequenciaAtividade = 1 THEN SYSDATE ELSE NULL END,
      CASE WHEN v_sequenciaAtividade = 1 THEN SYSDATE ELSE NULL END,
      0,
      a.precoUnitario,
      a.observacoes,
      1,
      CASE WHEN v_sequenciaAtividade = 1 AND CASE WHEN a.tecnico = 0 THEN v_tecnico ELSE a.tecnico END = p_usuarioLogado THEN 1 ELSE 0 END,
      0,
      CASE WHEN v_sequenciaAtividade = 1 AND CASE WHEN a.tecnico = 0 THEN v_tecnico ELSE a.tecnico END = p_usuarioLogado THEN SYSDATE ELSE NULL END,
      NULL,
      0,
      /* Retornos */
      v_auxNumber,
      v_auxNumber);
  END LOOP;
  IF r_inseriuAtividadePrevista = 0
    AND p_ativ_selecionaAtividadePrev = 0
  THEN
    SELECT COALESCE (MAX (validoPrevisto), 0)
    INTO v_auxNumber
    FROM PAATIVIDADESSERVICO
    WHERE atividadeServico = p_item_atividadeServico;
    IF v_auxNumber = 1 THEN
      SELECT COALESCE (MAX (c.checklist),0)
      INTO v_checklist
      FROM (
        SELECT
          b.checklist,
          ROW_NUMBER() OVER (
            ORDER BY
              b.ordenacao,
              b.id) ordenacao
        FROM PAATIVIDADESERVXCHECKLIST b
        WHERE b.atividadeServico = p_item_atividadeServico
        AND b.ativo = 1) c
      WHERE c.ordenacao = 1;
      r_inseriuAtividadePrevista := 1;
      ADD_ORCAMENTO_ITEM_PREV_GRAVA (
        p_estabelecimentoAtivo,
        0,
        p_item_idItemOrcamento,
        1,
        p_item_atividadeServico,
        ' ',
        v_tecnico,
        'N',
        v_checklist,
        0,
        'P',
        SYSDATE,
        SYSDATE,
        0,
        p_item_precoUnitario,
        ' ',
        1,
        0,
        0,
        NULL,
        NULL,
        0,
        /* Retornos */
        v_auxNumber,
        v_auxNumber);
    END IF;
  END IF;
END ADD_ORCAMENTO_ITEM_PREV_INSERE;

/

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_config_413_obs_add_marca     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, 'F' Fatura Contrato, 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_atividadeProjeto        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_idAtividadesPrevistasSelec   IN VARCHAR2,
  p_nivel                        IN NUMBER,
  p_buffer_item_idItemOrcamento  IN VARCHAR2,
  /* Retornos */
  r_mensagemAviso                OUT VARCHAR,
  r_calcularImpostos             OUT NUMBER,
  r_item_idItemOrcamento         OUT NUMBER,
  r_buffer_item_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_projeto                  VARCHAR2 (60);
  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_unidadeMedida           VARCHAR2(6);
  v_prod_controleEstoque         NUMBER;
  v_prod_pesoLiquido             NUMBER;
  v_prod_pesoBruto               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_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_ativ_selecionaAtividadePrev  NUMBER;
  v_ativ_numero                  NUMBER;
  v_ativ_quantidade              NUMBER;
  v_ativ_precoUnitarioMenor      NUMBER;
  v_ativ_precoUnitario           NUMBER;
  v_ativ_valorTotalItem          NUMBER;
  v_ativ_geraFinanceiro          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_item_idItemOrcamento := p_buffer_item_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.projeto,
    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_projeto,
    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.unidadeMedida,
    prod.controleEstoque,
    prod.pesoLiquido,
    prod.pesoBruto,
    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_unidadeMedida,
    v_prod_controleEstoque,
    v_prod_pesoLiquido,
    v_prod_pesoBruto,
    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
        IF p_buscarGeraFinanceiroEstoque = 1 THEN
          v_item_movimentaEstoque        := a.movimentaEstoque;
          v_item_geraFinanceiro          := a.geraFinanceiro;
        END IF;
        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 / ((v_combo_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 / ((v_combo_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_cab_projeto,
        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_config_413_obs_add_marca,
        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_atividadeProjeto,
        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_idAtividadesPrevistasSelec
        p_nivel + 1, -- p_nivel,
        r_buffer_item_idItemOrcamento,
        r_mensagemAviso,
        r_calcularImpostos,
        v_auxNumber, -- idItemOrcamento
        r_buffer_item_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_item_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
      SELECT COALESCE (MAX (sequencia),0) + 1
      INTO v_item_sequencia
      FROM MOORCAMENTOXITENS
      WHERE orcamento = p_item_orcamento;
      v_cab_ultimoVendedorItem := p_item_vendedor;
    END IF;
    IF v_item_cancelado = 0 THEN
      IF p_manterFinanceiro_Retotalizar <> 2 THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume + TRUNC(CASE WHEN p_item_controleQuantidade = 1 AND p_item_loteMultiplo <> 0 THEN p_item_quantidade / p_item_loteMultiplo ELSE p_item_quantidadeConvertida END,0);
        END IF;
        v_cab_pesoLiquido := v_cab_pesoLiquido + p_item_pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto + p_item_pesoBruto;
      END IF;
      v_cab_quantidade := v_cab_quantidade + p_item_quantidadeConvertida;
      IF v_prod_tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorServicos := v_cab_valorServicos + v_item_valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos + p_item_valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorProdutos := v_cab_valorProdutos + v_item_valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos + p_item_valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem + p_item_valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem + p_item_valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem + p_item_valorAdicFreteMarItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem + p_item_valorDespesasAduanItem;
      v_cab_valorFreteGeral := v_cab_valorFreteGeral + v_item_valorFreteGeral;
      v_cab_valorSeguroGeral := v_cab_valorSeguroGeral + p_item_valorSeguroGeral;
      v_cab_valorDescontoGeral := v_cab_valorDescontoGeral + v_item_valorDescontoGeral;
      v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral + p_item_valorOutrasDespesasGer;
      v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral + p_item_valorAdicFreteMarGeral;
      v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral + p_item_valorDespesasAduanGeral;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento + v_item_valorBasePagamento;
      IF p_item_usarPrecoAVista = 1
        AND v_item_geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo + v_item_valorProdutoServico - v_item_valorDescontoTotal + v_item_valorOutrasDespesasTot;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento + v_item_valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento + v_item_valorOutrasDespPagament;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento + v_item_valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal + v_item_valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal + v_item_valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal + v_item_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_item_valorOutrasDespesasTot;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal + v_item_valorAdicFreteMarTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal + v_item_valorDespesasAduanTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem + v_item_valorLiquidoItem;
    ELSE
      v_item_quantidadeSaldo := 0;
    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 = p_item_orcamento;
    IF p_item_idItemOrcamento > 0 THEN
      DELETE MOORCAMENTOXCOMPOSICOESPR compDoc
      WHERE compDoc.idItemOrcamento = p_item_idItemOrcamento
      AND EXISTS(
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.produto = comp.produto
        WHERE comp.composicaoPreco = compDoc.composicaoPreco
        AND gradProd.gradeProduto <> p_item_gradeProduto);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      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_413_obs_add_marca,
      ' ',
      0,
      'O',
      p_item_idItemOrcamento,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    MERGE INTO MOORCAMENTOXITENS a USING (
      SELECT
        r_item_idItemOrcamento         idItemOrcamento,
        p_item_orcamento               orcamento,
        v_item_sequencia               sequencia,
        v_item_cancelado               cancelado,
        p_item_pedidoCompraFornecedor  pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo sequenciaPedidoCompraFornec,
        p_item_ambiente                ambiente,
        p_item_ambienteObservacoes     ambienteObservacoes,
        p_item_modeloDocumento         modeloDocumento,
        p_item_estabelecimentoOriginal estabelecimentoOriginal,
        p_item_vendedor                vendedor,
        p_item_gradeProduto            gradeProduto,
        p_item_atividadeServico        atividadeServico,
        p_item_statusAtividadeServico  statusAtividadeServico,
        p_item_idFormulaTinta          idFormulaTinta,
        p_item_personalizacao          personalizacao,
        p_item_idLoteEstoque           idLoteEstoque,
        p_item_vinculoItemDocumento    vinculoItemDocumento,
        p_item_operacaoFiscal          operacaoFiscal,
        v_item_movimentaEstoque        movimentaEstoque,
        v_item_geraFinanceiro          geraFinanceiro,
        p_item_localEstoque            localEstoque,
        p_item_pessoaParticipante      pessoaParticipante,
        p_item_dataEntrega             dataEntrega,
        p_item_controleQuantidade      controleQuantidade,
        p_item_unidadeMedidaConversao  unidadeMedidaConversao,
        p_item_conversorQuantidade     conversorQuantidade,
        p_item_loteMinimo              loteMinimo,
        p_item_loteMultiplo            loteMultiplo,
        p_item_altura                  altura,
        p_item_largura                 largura,
        p_item_comprimento             comprimento,
        p_item_pecas                   pecas,
        p_item_quantidade              quantidade,
        p_item_quantidadeConvertida    quantidadeConvertida,
        v_item_quantidadeSaldo         quantidadeSaldo,
        p_item_controleEntrega         controleEntrega,
        p_item_pesoLiquido             pesoLiquido,
        p_item_pesoBruto               pesoBruto,
        p_item_tipoPreco               tipoPreco,
        p_item_tabelaPreco             tabelaPreco,
        p_item_precoSugestaoAPrazo     precoSugestaoAPrazo,
        p_item_precoSugestaoAVista     precoSugestaoAVista,
        p_item_precoDesconto           precoDesconto,
        p_item_precoMinimo             precoMinimo,
        p_item_usarPrecoAVista         usarPrecoAVista,
        p_item_precoUnitarioBruto      precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos acrescimoUnitarioComposicao,
        v_item_precoUnitario           precoUnitario,
        v_item_precoUnitarioConvertido precoUnitarioConvertido,
        v_item_valorProdutoServicoBrut valorProdutoServicoBruto,
        v_item_valorProdutoServico     valorProdutoServico,
        p_item_percDescontoItem        percDescontoItem,
        p_item_valorDescontoItem       valorDescontoItem,
        p_item_percAcrescimoItem       percAcrescimoItem,
        p_item_valorAcrescimoItem      valorAcrescimoItem,
        p_item_valorFreteItem          valorFreteItem,
        p_item_valorSeguroItem         valorSeguroItem,
        p_item_valorAdicFreteMarItem   valorAdicFreteMarinhaMerItem,
        p_item_valorDespesasAduanItem  valorDespesasAduaneirasItem,
        v_item_valorFreteGeral         valorFreteGeral,
        p_item_valorSeguroGeral        valorSeguroGeral,
        v_item_valorDescontoGeral      valorDescontoGeral,
        p_item_valorOutrasDespesasGer  valorOutrasDespesasGeral,
        p_item_valorAdicFreteMarGeral  valorAdicFreteMarinhaMerGeral,
        p_item_valorDespesasAduanGeral valorDespesasAduaneirasGeral,
        v_item_valorBasePagamento      valorBasePagamento,
        v_item_valorDescontoPagamento  valorDescontoPagamento,
        v_item_valorOutrasDespPagament valorOutrasDespesasPagamento,
        v_item_valorJurosPagamento     valorJurosPagamento,
        v_item_valorFreteTotal         valorFreteTotal,
        v_item_valorSeguroTotal        valorSeguroTotal,
        v_item_valorDescontoTotal      valorDescontoTotal,
        v_item_valorOutrasDespesasTot  valorOutrasDespesasTotal,
        v_item_valorAdicFreteMarTotal  valorAdicFreteMarinhaMerTotal,
        v_item_valorDespesasAduanTotal valorDespesasAduaneirasTotal,
        v_item_cfop                    cfop,
        v_item_indicadorISSQN          indicadorISSQN,
        v_item_aliquotaISSQN           aliquotaISSQN,
        v_item_retidoISSQN             retidoISSQN,
        v_item_tributadoForaMunicipio  tributadoForaMunicipio,
        v_item_incentivoFiscal         incentivoFiscal,
        v_item_listaServicos           listaServicos,
        v_item_cnae                    cnae,
        v_item_idServicoMunicipio      idServicoMunicipio,
        v_item_numeroProcessoAdministr numeroProcessoAdministrativo,
        v_item_baseISSQN               baseISSQN,
        v_item_valorISSQN              valorISSQN,
        v_item_retencaoIRRF            retencaoIRRF,
        v_item_baseRetIRRF             baseRetIRRF,
        v_item_valorRetIRRF            valorRetIRRF,
        v_item_retencaoINSS            retencaoINSS,
        v_item_baseRetINSS             baseRetINSS,
        v_item_valorRetINSS            valorRetINSS,
        v_item_retencaoPIS             retencaoPIS,
        v_item_baseRetPIS              baseRetPIS,
        v_item_valorRetPIS             valorRetPIS,
        v_item_retencaoCOFINS          retencaoCOFINS,
        v_item_baseRetCOFINS           baseRetCOFINS,
        v_item_valorRetCOFINS          valorRetCOFINS,
        v_item_retencaoCSLL            retencaoCSLL,
        v_item_baseRetCSLL             baseRetCSLL,
        v_item_valorRetCSLL            valorRetCSLL,
        v_item_retencaoOutros          retencaoOutros,
        v_item_baseRetOutros           baseRetOutros,
        v_item_valorRetOutros          valorRetOutros,
        v_item_aliquotaII              aliquotaII,
        v_item_baseII                  baseII,
        v_item_valorII                 valorII,
        v_item_aliquotaIOF             aliquotaIOF,
        v_item_baseIOF                 baseIOF,
        v_item_valorIOF                valorIOF,
        v_item_codigoEnquadramentoIPI  codigoEnquadramentoIPI,
        v_item_stIPI                   stIPI,
        v_item_aliquotaIPI             aliquotaIPI,
        v_item_valorAliquotaIPI        valorAliquotaIPI,
        v_item_baseIPI                 baseIPI,
        v_item_valorIPI                valorIPI,
        v_item_stPIS                   stPIS,
        v_item_aliquotaPIS             aliquotaPIS,
        v_item_valorAliquotaPIS        valorAliquotaPIS,
        v_item_basePIS                 basePIS,
        v_item_valorPIS                valorPIS,
        v_item_aliquotaPISST           aliquotaPISST,
        v_item_valorAliquotaPISST      valorAliquotaPISST,
        v_item_basePISST               basePISST,
        v_item_valorPISST              valorPISST,
        v_item_stCOFINS                stCOFINS,
        v_item_aliquotaCOFINS          aliquotaCOFINS,
        v_item_valorAliquotaCOFINS     valorAliquotaCOFINS,
        v_item_baseCOFINS              baseCOFINS,
        v_item_valorCOFINS             valorCOFINS,
        v_item_aliquotaCOFINSST        aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST   valorAliquotaCOFINSST,
        v_item_baseCOFINSST            baseCOFINSST,
        v_item_valorCOFINSST           valorCOFINSST,
        v_item_stSimplesNacional       stSimplesNacional,
        v_item_creditoSimplesNacional  creditoSimplesNacional,
        v_item_baseCreditoSimplesNac   baseCreditoSimplesNacional,
        v_item_valorCreditoSimplesNac  valorCreditoSimplesNacional,
        v_item_stICMS                  stICMS,
        v_item_modalBaseCalcICMS       modalidadeBaseCalcICMS,
        v_item_reducaoBaseICMS         reducaoBaseICMS,
        v_item_aliquotaICMS            aliquotaICMS,
        v_item_diferimentoICMS         diferimentoICMS,
        v_item_motivoDesoneracaoICMS   motivoDesoneracaoICMS,
        v_item_idBeneficio             idBeneficio,
        v_item_baseICMS                baseICMS,
        v_item_valorICMSOperacao       valorICMSOperacao,
        v_item_valorICMSDiferido       valorICMSDiferido,
        v_item_valorICMS               valorICMS,
        v_item_valorICMSDesoneracao    valorICMSDesoneracao,
        v_item_modalBaseCalcICMSST     modalidadeBaseCalcICMSST,
        v_item_margemValorAdicionadoST margemValorAdicionadoST,
        v_item_reducaoBaseST           reducaoBaseST,
        v_item_aliquotaICMSST          aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin aliquotaSTSuportConsFinal,
        v_item_baseICMSST              baseICMSST,
        v_item_valorICMSST             valorICMSST,
        v_item_baseICMSSTAnteriormente baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment valorICMSSTAnteriormente,
        v_item_valorICMSProprioSubstit valorICMSProprioSubstituto,
        v_item_reducaoBaseICMSEfetivo  reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo     aliquotaICMSEfetivo,
        v_item_baseICMSEfetivo         baseICMSEfetivo,
        v_item_valorICMSEfetivo        valorICMSEfetivo,
        v_item_aliquotaICMSUFDestinat  aliquotaICMSUFDestinatario,
        v_item_aliquotaICMSInterestad  aliquotaICMSInterestadual,
        v_item_partilhaICMSInterestad  partilhaICMSInterestadual,
        v_item_baseICMSUFDestinatario  baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente     baseICMSUFRemetente,
        v_item_valorICMSUFRemetente    valorICMSUFRemetente,
        v_item_aliquotaFCP             aliquotaFCP,
        v_item_baseFCP                 baseFCP,
        v_item_valorFCP                valorFCP,
        v_item_aliquotaFCPST           aliquotaFCPST,
        v_item_baseFCPST               baseFCPST,
        v_item_valorFCPST              valorFCPST,
        v_item_aliquotaFCPSTAnteriorm  aliquotaFCPSTAnteriormente,
        v_item_baseFCPSTAnteriormente  baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente valorFCPSTAnteriormente,
        v_item_aliquotaFCPUFDestinat   aliquotaFCPUFDestinatario,
        v_item_baseFCPUFDestinatario   baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario  valorFCPUFDestinatario,
        v_item_aliquotaEstImpFederais  aliquotaEstimadaImpFederais,
        v_item_aliquotaEstImpEstaduais aliquotaEstimadaImpEstaduais,
        v_item_aliquotaEstImpMunicipai aliquotaEstimadaImpMunicipais,
        v_item_baseEstimadaImpostos    baseEstimadaImpostos,
        v_item_valorEstImpFederais     valorEstimadoImpFederais,
        v_item_valorEstImpEstaduais    valorEstimadoImpEstaduais,
        v_item_valorEstImpMunicipais   valorEstimadoImpMunicipais,
        v_item_valorLiquidoItem        valorLiquidoItem,
        p_item_observacoesDigitadas    observacoesDigitadas,
        v_observacoes                  observacoes
      FROM DUAL) b
    ON (a.idItemOrcamento = b.idItemOrcamento)
    WHEN MATCHED THEN UPDATE SET
      a.orcamento                     = b.orcamento,
      a.sequencia                     = b.sequencia,
      a.cancelado                     = b.cancelado,
      a.pedidoCompraFornecedor        = b.pedidoCompraFornecedor,
      a.sequenciaPedidoCompraFornec   = b.sequenciaPedidoCompraFornec,
      a.ambiente                      = b.ambiente,
      a.ambienteObservacoes           = b.ambienteObservacoes,
      a.vendedor                      = b.vendedor,
      a.modeloDocumento               = b.modeloDocumento,
      a.estabelecimentoOriginal       = b.estabelecimentoOriginal,
      a.gradeProduto                  = b.gradeProduto,
      a.atividadeServico              = b.atividadeServico,
      a.statusAtividadeServico        = b.statusAtividadeServico,
      a.idFormulaTinta                = b.idFormulaTinta,
      a.personalizacao                = b.personalizacao,
      a.idLoteEstoque                 = b.idLoteEstoque,
      a.vinculoItemDocumento          = b.vinculoItemDocumento,
      a.operacaoFiscal                = b.operacaoFiscal,
      a.movimentaEstoque              = b.movimentaEstoque,
      a.geraFinanceiro                = b.geraFinanceiro,
      a.localEstoque                  = b.localEstoque,
      a.pessoaParticipante            = b.pessoaParticipante,
      a.dataEntrega                   = b.dataEntrega,
      a.controleQuantidade            = b.controleQuantidade,
      a.unidadeMedidaConversao        = b.unidadeMedidaConversao,
      a.conversorQuantidade           = b.conversorQuantidade,
      a.loteMinimo                    = b.loteMinimo,
      a.loteMultiplo                  = b.loteMultiplo,
      a.altura                        = b.altura,
      a.largura                       = b.largura,
      a.comprimento                   = b.comprimento,
      a.pecas                         = b.pecas,
      a.quantidade                    = b.quantidade,
      a.quantidadeConvertida          = b.quantidadeConvertida,
      a.quantidadeSaldo               = b.quantidadeSaldo,
      a.controleEntrega               = b.controleEntrega,
      a.pesoLiquido                   = b.pesoLiquido,
      a.pesoBruto                     = b.pesoBruto,
      a.tipoPreco                     = b.tipoPreco,
      a.tabelaPreco                   = b.tabelaPreco,
      a.precoSugestaoAPrazo           = b.precoSugestaoAPrazo,
      a.precoSugestaoAVista           = b.precoSugestaoAVista,
      a.precoDesconto                 = b.precoDesconto,
      a.precoMinimo                   = b.precoMinimo,
      a.usarPrecoAVista               = b.usarPrecoAVista,
      a.precoUnitarioBruto            = b.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao   = b.acrescimoUnitarioComposicao,
      a.precoUnitario                 = b.precoUnitario,
      a.precoUnitarioConvertido       = b.precounitarioConvertido,
      a.valorProdutoServicoBruto      = b.valorProdutoServicoBruto,
      a.valorProdutoServico           = b.valorProdutoServico,
      a.percDescontoItem              = b.percDescontoItem,
      a.valorDescontoItem             = b.valorDescontoItem,
      a.percAcrescimoItem             = b.percAcrescimoItem,
      a.valorAcrescimoItem            = b.valorAcrescimoItem,
      a.valorFreteItem                = b.valorFreteItem,
      a.valorSeguroItem               = b.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem  = b.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem   = b.valorDespesasAduaneirasItem,
      a.valorFreteGeral               = b.valorFreteGeral,
      a.valorSeguroGeral              = b.valorSeguroGeral,
      a.valorDescontoGeral            = b.valorDescontoGeral,
      a.valorOutrasDespesasGeral      = b.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral = b.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral  = b.valorDespesasAduaneirasGeral,
      a.valorBasePagamento            = b.valorBasePagamento,
      a.valorDescontoPagamento        = b.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento  = b.valorOutrasDespesasPagamento,
      a.valorJurosPagamento           = b.valorJurosPagamento,
      a.valorFreteTotal               = b.valorFreteTotal,
      a.valorSeguroTotal              = b.valorSeguroTotal,
      a.valorDescontoTotal            = b.valorDescontoTotal,
      a.valorOutrasDespesasTotal      = b.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal = b.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal  = b.valorDespesasAduaneirasTotal,
      a.cfop                          = b.cfop,
      a.indicadorISSQN                = b.indicadorISSQN,
      a.aliquotaISSQN                 = b.aliquotaISSQN,
      a.baseISSQN                     = b.baseISSQN,
      a.valorISSQN                    = b.valorISSQN,
      a.retidoISSQN                   = b.retidoISSQN,
      a.tributadoForaMunicipio        = b.tributadoForaMunicipio,
      a.incentivoFiscal               = b.incentivoFiscal,
      a.listaServicos                 = b.listaServicos,
      a.cnae                          = b.cnae,
      a.idServicoMunicipio            = b.idServicoMunicipio,
      a.numeroProcessoAdministrativo  = b.numeroProcessoAdministrativo,
      a.retencaoIRRF                  = b.retencaoIRRF,
      a.baseRetIRRF                   = b.baseRetIRRF,
      a.valorRetIRRF                  = b.valorRetIRRF,
      a.retencaoINSS                  = b.retencaoINSS,
      a.baseRetINSS                   = b.baseRetINSS,
      a.valorRetINSS                  = b.valorRetINSS,
      a.retencaoPIS                   = b.retencaoPIS,
      a.baseRetPIS                    = b.baseRetPIS,
      a.valorRetPIS                   = b.valorRetPIS,
      a.retencaoCOFINS                = b.retencaoCOFINS,
      a.baseRetCOFINS                 = b.baseRetCOFINS,
      a.valorRetCOFINS                = b.valorRetCOFINS,
      a.retencaoCSLL                  = b.retencaoCSLL,
      a.baseRetCSLL                   = b.baseRetCSLL,
      a.valorRetCSLL                  = b.valorRetCSLL,
      a.retencaoOutros                = b.retencaoOutros,
      a.baseRetOutros                 = b.baseRetOutros,
      a.valorRetOutros                = b.valorRetOutros,
      a.aliquotaII                    = b.aliquotaII,
      a.baseII                        = b.baseII,
      a.valorII                       = b.valorII,
      a.aliquotaIOF                   = b.aliquotaIOF,
      a.baseIOF                       = b.baseIOF,
      a.valorIOF                      = b.valorIOF,
      a.codigoEnquadramentoIPI        = b.codigoEnquadramentoIPI,
      a.stIPI                         = b.stIPI,
      a.aliquotaIPI                   = b.aliquotaIPI,
      a.valorAliquotaIPI              = b.valorAliquotaIPI,
      a.baseIPI                       = b.baseIPI,
      a.valorIPI                      = b.valorIPI,
      a.stPIS                         = b.stPIS,
      a.aliquotaPIS                   = b.aliquotaPIS,
      a.valorAliquotaPIS              = b.valorAliquotaPIS,
      a.basePIS                       = b.basePIS,
      a.valorPIS                      = b.valorPIS,
      a.aliquotaPISST                 = b.aliquotaPISST,
      a.valorAliquotaPISST            = b.valorAliquotaPISST,
      a.basePISST                     = b.basePISST,
      a.valorPISST                    = b.valorPISST,
      a.stCOFINS                      = b.stCOFINS,
      a.aliquotaCOFINS                = b.aliquotaCOFINS,
      a.valorAliquotaCOFINS           = b.valorAliquotaCOFINS,
      a.baseCOFINS                    = b.baseCOFINS,
      a.valorCOFINS                   = b.valorCOFINS,
      a.aliquotaCOFINSST              = b.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST         = b.valorAliquotaCOFINSST,
      a.baseCOFINSST                  = b.baseCOFINSST,
      a.valorCOFINSST                 = b.valorCOFINSST,
      a.stSimplesNacional             = b.stSimplesNacional,
      a.creditoSimplesNacional        = b.creditoSimplesNacional,
      a.baseCreditoSimplesNacional    = b.baseCreditoSimplesNacional,
      a.valorCreditoSimplesNacional   = b.valorCreditoSimplesNacional,
      a.stICMS                        = b.stICMS,
      a.modalidadeBaseCalcICMS        = b.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS               = b.reducaoBaseICMS,
      a.aliquotaICMS                  = b.aliquotaICMS,
      a.diferimentoICMS               = b.diferimentoICMS,
      a.motivoDesoneracaoICMS         = b.motivoDesoneracaoICMS,
      a.idBeneficio                   = b.idBeneficio,
      a.baseICMS                      = b.baseICMS,
      a.valorICMSoperacao             = b.valorICMSoperacao,
      a.valorICMSdiferido             = b.valorICMSdiferido,
      a.valorICMS                     = b.valorICMS,
      a.valorICMSdesoneracao          = b.valorICMSdesoneracao,
      a.modalidadeBaseCalcICMSST      = b.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST       = b.margemValorAdicionadoST,
      a.reducaoBaseST                 = b.reducaoBaseST,
      a.aliquotaICMSST                = b.aliquotaICMSST,
      a.aliquotaSTSuportConsFinal     = b.aliquotaSTSuportConsFinal,
      a.baseICMSST                    = b.baseICMSST,
      a.valorICMSST                   = b.valorICMSST,
      a.baseICMSSTAnteriormente       = b.baseICMSSTAnteriormente,
      a.valorICMSSTAnteriormente      = b.valorICMSSTAnteriormente,
      a.valorICMSProprioSubstituto    = b.valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo        = b.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo           = b.aliquotaICMSEfetivo,
      a.baseICMSEfetivo               = b.baseICMSEfetivo,
      a.valorICMSEfetivo              = b.valorICMSEfetivo,
      a.aliquotaICMSUFDestinatario    = b.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual     = b.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual     = b.partilhaICMSInterestadual,
      a.baseICMSUFDestinatario        = b.baseICMSUFDestinatario,
      a.valorICMSUFDestinatario       = b.valorICMSUFDestinatario,
      a.baseICMSUFRemetente           = b.baseICMSUFRemetente,
      a.valorICMSUFRemetente          = b.valorICMSUFRemetente,
      a.aliquotaFCP                   = b.aliquotaFCP,
      a.baseFCP                       = b.baseFCP,
      a.valorFCP                      = b.valorFCP,
      a.aliquotaFCPST                 = b.aliquotaFCPST,
      a.baseFCPST                     = b.baseFCPST,
      a.valorFCPST                    = b.valorFCPST,
      a.aliquotaFCPSTAnteriormente    = b.aliquotaFCPSTAnteriormente,
      a.baseFCPSTAnteriormente        = b.baseFCPSTAnteriormente,
      a.valorFCPSTAnteriormente       = b.valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario     = b.aliquotaFCPUFDestinatario,
      a.baseFCPUFDestinatario         = b.baseFCPUFDestinatario,
      a.valorFCPUFDestinatario        = b.valorFCPUFDestinatario,
      a.aliquotaestimadaimpfederais   = b.aliquotaestimadaimpfederais,
      a.aliquotaestimadaimpestaduais  = b.aliquotaestimadaimpestaduais,
      a.aliquotaestimadaimpmunicipais = b.aliquotaestimadaimpmunicipais,
      a.baseestimadaimpostos          = b.baseestimadaimpostos,
      a.valorestimadoimpfederais      = b.valorestimadoimpfederais,
      a.valorEstimadoImpEstaduais     = b.valorEstimadoImpEstaduais,
      a.valorEstimadoImpMunicipais    = b.valorEstimadoImpMunicipais,
      a.valorLiquidoItem              = b.valorLiquidoItem,
      a.observacoesDigitadas          = b.observacoesDigitadas,
      a.observacoes                   = b.observacoes
    WHEN NOT MATCHED THEN INSERT (
      idItemOrcamento,
      orcamento,
      sequencia,
      cancelado,
      pedidoCompraFornecedor,
      sequenciaPedidoCompraFornec,
      ambiente,
      ambienteObservacoes,
      modeloDocumento,
      estabelecimentoOriginal,
      vendedor,
      gradeProduto,
      atividadeServico,
      statusAtividadeServico,
      idFormulaTinta,
      personalizacao,
      idLoteEstoque,
      vinculoItemDocumento,
      operacaoFiscal,
      movimentaEstoque,
      geraFinanceiro,
      localEstoque,
      pessoaParticipante,
      dataEntrega,
      controleQuantidade,
      unidadeMedidaConversao,
      conversorQuantidade,
      loteMinimo,
      loteMultiplo,
      altura,
      largura,
      comprimento,
      pecas,
      quantidade,
      quantidadeConvertida,
      quantidadeSaldo,
      controleEntrega,
      pesoLiquido,
      pesoBruto,
      tipoPreco,
      tabelaPreco,
      precoSugestaoAPrazo,
      precoSugestaoAVista,
      precoDesconto,
      precoMinimo,
      usarPrecoAVista,
      precoUnitarioBruto,
      acrescimoUnitarioComposicao,
      precoUnitario,
      precoUnitarioConvertido,
      valorProdutoServicoBruto,
      valorProdutoServico,
      percDescontoItem,
      valorDescontoItem,
      percAcrescimoItem,
      valorAcrescimoItem,
      valorFreteItem,
      valorSeguroItem,
      valorAdicFreteMarinhaMerItem,
      valorDespesasAduaneirasItem,
      valorFreteGeral,
      valorSeguroGeral,
      valorDescontoGeral,
      valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral,
      valorDespesasAduaneirasGeral,
      valorBasePagamento,
      valorDescontoPagamento,
      valorOutrasDespesasPagamento,
      valorJurosPagamento,
      valorFreteTotal,
      valorSeguroTotal,
      valorDescontoTotal,
      valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal,
      valorDespesasAduaneirasTotal,
      cfop,
      indicadorISSQN,
      aliquotaISSQN,
      retidoISSQN,
      tributadoForaMunicipio,
      incentivoFiscal,
      listaServicos,
      cnae,
      idServicoMunicipio,
      numeroProcessoAdministrativo,
      baseISSQN,
      valorISSQN,
      retencaoIRRF,
      baseRetIRRF,
      valorRetIRRF,
      retencaoINSS,
      baseRetINSS,
      valorRetINSS,
      retencaoPIS,
      baseRetPIS,
      valorRetPIS,
      retencaoCOFINS,
      baseRetCOFINS,
      valorRetCOFINS,
      retencaoCSLL,
      baseRetCSLL,
      valorRetCSLL,
      retencaoOutros,
      baseRetOutros,
      valorRetOutros,
      aliquotaII,
      baseII,
      valorII,
      aliquotaIOF,
      baseIOF,
      valorIOF,
      codigoEnquadramentoIPI,
      stIPI,
      aliquotaIPI,
      valorAliquotaIPI,
      baseIPI,
      valorIPI,
      stPIS,
      aliquotaPIS,
      valorAliquotaPIS,
      basePIS,
      valorPIS,
      aliquotaPISST,
      valorAliquotaPISST,
      basePISST,
      valorPISST,
      stCOFINS,
      aliquotaCOFINS,
      valorAliquotaCOFINS,
      baseCOFINS,
      valorCOFINS,
      aliquotaCOFINSST,
      valorAliquotaCOFINSST,
      baseCOFINSST,
      valorCOFINSST,
      stSimplesNacional,
      creditoSimplesNacional,
      baseCreditoSimplesNacional,
      valorCreditoSimplesNacional,
      stICMS,
      modalidadeBaseCalcICMS,
      reducaoBaseICMS,
      aliquotaICMS,
      diferimentoICMS,
      motivoDesoneracaoICMS,
      idBeneficio,
      baseICMS,
      valorICMSOperacao,
      valorICMSDiferido,
      valorICMS,
      valorICMSDesoneracao,
      modalidadeBaseCalcICMSST,
      margemValorAdicionadoST,
      reducaoBaseST,
      aliquotaICMSST,
      aliquotaSTSuportConsFinal,
      baseICMSST,
      valorICMSST,
      baseICMSSTAnteriormente,
      valorICMSSTAnteriormente,
      valorICMSProprioSubstituto,
      reducaoBaseICMSEfetivo,
      aliquotaICMSEfetivo,
      baseICMSEfetivo,
      valorICMSEfetivo,
      aliquotaICMSUFDestinatario,
      aliquotaICMSInterestadual,
      partilhaICMSInterestadual,
      baseICMSUFDestinatario,
      valorICMSUFDestinatario,
      baseICMSUFRemetente,
      valorICMSUFRemetente,
      aliquotaFCP,
      baseFCP,
      valorFCP,
      aliquotaFCPST,
      baseFCPST,
      valorFCPST,
      aliquotaFCPSTAnteriormente,
      baseFCPSTAnteriormente,
      valorFCPSTAnteriormente,
      aliquotaFCPUFDestinatario,
      baseFCPUFDestinatario,
      valorFCPUFDestinatario,
      aliquotaEstimadaImpFederais,
      aliquotaEstimadaImpEstaduais,
      aliquotaEstimadaImpMunicipais,
      baseEstimadaImpostos,
      valorEstimadoImpFederais,
      valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais,
      valorLiquidoItem,
      observacoesDigitadas,
      observacoes)
    VALUES (
      b.idItemOrcamento,
      b.orcamento,
      b.sequencia,
      b.cancelado,
      b.pedidoCompraFornecedor,
      b.sequenciaPedidoCompraFornec,
      b.ambiente,
      b.ambienteObservacoes,
      b.modeloDocumento,
      b.estabelecimentoOriginal,
      b.vendedor,
      b.gradeProduto,
      b.atividadeServico,
      b.statusAtividadeServico,
      b.idFormulaTinta,
      b.personalizacao,
      b.idLoteEstoque,
      b.vinculoItemDocumento,
      b.operacaoFiscal,
      b.movimentaEstoque,
      b.geraFinanceiro,
      b.localEstoque,
      b.pessoaParticipante,
      b.dataEntrega,
      b.controleQuantidade,
      b.unidadeMedidaConversao,
      b.conversorQuantidade,
      b.loteMinimo,
      b.loteMultiplo,
      b.altura,
      b.largura,
      b.comprimento,
      b.pecas,
      b.quantidade,
      b.quantidadeConvertida,
      b.quantidadeSaldo,
      b.controleEntrega,
      b.pesoLiquido,
      b.pesoBruto,
      b.tipoPreco,
      b.tabelaPreco,
      b.precoSugestaoAPrazo,
      b.precoSugestaoAVista,
      b.precoDesconto,
      b.precoMinimo,
      b.usarPrecoAVista,
      b.precoUnitarioBruto,
      b.acrescimoUnitarioComposicao,
      b.precoUnitario,
      b.precoUnitarioConvertido,
      b.valorProdutoServicoBruto,
      b.valorProdutoServico,
      b.percDescontoItem,
      b.valorDescontoItem,
      b.percAcrescimoItem,
      b.valorAcrescimoItem,
      b.valorFreteItem,
      b.valorSeguroItem,
      b.valorAdicFreteMarinhaMerItem,
      b.valorDespesasAduaneirasItem,
      b.valorFreteGeral,
      b.valorSeguroGeral,
      b.valorDescontoGeral,
      b.valorOutrasDespesasGeral,
      b.valorAdicFreteMarinhaMerGeral,
      b.valorDespesasAduaneirasGeral,
      b.valorBasePagamento,
      b.valorDescontoPagamento,
      b.valorOutrasDespesasPagamento,
      b.valorJurosPagamento,
      b.valorFreteTotal,
      b.valorSeguroTotal,
      b.valorDescontoTotal,
      b.valorOutrasDespesasTotal,
      b.valorAdicFreteMarinhaMerTotal,
      b.valorDespesasAduaneirasTotal,
      b.cfop,
      b.indicadorISSQN,
      b.aliquotaISSQN,
      b.retidoISSQN,
      b.tributadoForaMunicipio,
      b.incentivoFiscal,
      b.listaServicos,
      b.cnae,
      b.idServicoMunicipio,
      b.numeroProcessoAdministrativo,
      b.baseISSQN,
      b.valorISSQN,
      b.retencaoIRRF,
      b.baseRetIRRF,
      b.valorRetIRRF,
      b.retencaoINSS,
      b.baseRetINSS,
      b.valorRetINSS,
      b.retencaoPIS,
      b.baseRetPIS,
      b.valorRetPIS,
      b.retencaoCOFINS,
      b.baseRetCOFINS,
      b.valorRetCOFINS,
      b.retencaoCSLL,
      b.baseRetCSLL,
      b.valorRetCSLL,
      b.retencaoOutros,
      b.baseRetOutros,
      b.valorRetOutros,
      b.aliquotaII,
      b.baseII,
      b.valorII,
      b.aliquotaIOF,
      b.baseIOF,
      b.valorIOF,
      b.codigoEnquadramentoIPI,
      b.stIPI,
      b.aliquotaIPI,
      b.valorAliquotaIPI,
      b.baseIPI,
      b.valorIPI,
      b.stPIS,
      b.aliquotaPIS,
      b.valorAliquotaPIS,
      b.basePIS,
      b.valorPIS,
      b.aliquotaPISST,
      b.valorAliquotaPISST,
      b.basePISST,
      b.valorPISST,
      b.stCOFINS,
      b.aliquotaCOFINS,
      b.valorAliquotaCOFINS,
      b.baseCOFINS,
      b.valorCOFINS,
      b.aliquotaCOFINSST,
      b.valorAliquotaCOFINSST,
      b.baseCOFINSST,
      b.valorCOFINSST,
      b.stSimplesNacional,
      b.creditoSimplesNacional,
      b.baseCreditoSimplesNacional,
      b.valorCreditoSimplesNacional,
      b.stICMS,
      b.modalidadeBaseCalcICMS,
      b.reducaoBaseICMS,
      b.aliquotaICMS,
      b.diferimentoICMS,
      b.motivoDesoneracaoICMS,
      b.idBeneficio,
      b.baseICMS,
      b.valorICMSOperacao,
      b.valorICMSDiferido,
      b.valorICMS,
      b.valorICMSDesoneracao,
      b.modalidadeBaseCalcICMSST,
      b.margemValorAdicionadoST,
      b.reducaoBaseST,
      b.aliquotaICMSST,
      b.aliquotaSTSuportConsFinal,
      b.baseICMSST,
      b.valorICMSST,
      b.baseICMSSTAnteriormente,
      b.valorICMSSTAnteriormente,
      b.valorICMSProprioSubstituto,
      b.reducaoBaseICMSEfetivo,
      b.aliquotaICMSEfetivo,
      b.baseICMSEfetivo,
      b.valorICMSEfetivo,
      b.aliquotaICMSUFDestinatario,
      b.aliquotaICMSInterestadual,
      b.partilhaICMSInterestadual,
      b.baseICMSUFDestinatario,
      b.valorICMSUFDestinatario,
      b.baseICMSUFRemetente,
      b.valorICMSUFRemetente,
      b.aliquotaFCP,
      b.baseFCP,
      b.valorFCP,
      b.aliquotaFCPST,
      b.baseFCPST,
      b.valorFCPST,
      b.aliquotaFCPSTAnteriormente,
      b.baseFCPSTAnteriormente,
      b.valorFCPSTAnteriormente,
      b.aliquotaFCPUFDestinatario,
      b.baseFCPUFDestinatario,
      b.valorFCPUFDestinatario,
      b.aliquotaEstimadaImpFederais,
      b.aliquotaEstimadaImpEstaduais,
      b.aliquotaEstimadaImpMunicipais,
      b.baseEstimadaImpostos,
      b.valorEstimadoImpFederais,
      b.valorEstimadoImpEstaduais,
      b.valorEstimadoImpMunicipais,
      b.valorLiquidoItem,
      b.observacoesDigitadas,
      b.observacoes);
    v_atualizarObservacoes := 0;
    IF p_idItemReferenciado > 0 THEN
      IF p_tipoDocumentoReferenciado = 'C' THEN
        UPDATE MOPAINELCOMPRAXGRADE
        SET idItemOrcamento = r_item_idItemOrcamento
        WHERE idGradePainelCompra = p_idItemReferenciado;
      ELSIF p_tipoDocumentoReferenciado = 'F' THEN
        ADD_ORCAMENTO_ITEM_REF_CONTR (
          p_estabelecimentoAtivo,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      ELSIF p_tipoDocumentoReferenciado = 'L' THEN
        ADD_ORCAMENTO_ITEM_LISTA_GRAVA (
          p_estabelecimentoAtivo,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      ELSIF p_tipoDocumentoReferenciado = 'O' THEN
        ADD_ORCAMENTO_ITEM_REF_ORCAMEN (
          p_estabelecimentoAtivo,
          v_cab_tipoDocumento,
          r_item_idItemOrcamento,
          p_item_quantidade,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'T' THEN
        ADD_ORCAMENTO_ITEM_TRANS_GRAVA (
          p_estabelecimentoAtivo,
          v_cab_entradaSaida,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      END IF;
    END IF;
    IF p_tempComp_nomeTempComposicao <> ' '
      AND (p_tipoDocumentoReferenciado <> 'O'
        OR p_idItemReferenciado <= 0)
    THEN
      ADD_ORCAMENTO_ITEM_COMP_TEMP (
        p_sessaoClient,
        p_estabelecimentoAtivo,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        r_item_idItemOrcamento,
        v_atualizarObservacoes,
        v_atualizarObservacoes);
    END IF;
    v_idEnderecoEstoque := 0;
    IF p_item_idEnderecoEstoque > 0 THEN
      ADD_ORCAMENTO_ITEM_ENDER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemOrcamento,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_quantidade,
        ' ',
        v_idEnderecoEstoque);
    END IF;
    IF p_item_idNumeroSerie > 0 THEN
      ADD_ORCAMENTO_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemOrcamento,
        v_idEnderecoEstoque,
        p_item_gradeProduto,
        p_item_idNumeroSerie,
        0,
        v_auxNumber);
      v_atualizarObservacoes := 1;
    END IF;
    IF p_item_atividadeProjeto > 0 THEN
      ADD_ORCAMENTO_ITEM_PROJ_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemOrcamento,
        p_item_atividadeProjeto,
        v_auxNumber);
    END IF;
    IF v_atualizarObservacoes = 1 THEN
      v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
        p_sessaoClient,
        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_413_obs_add_marca,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        'O',
        r_item_idItemOrcamento,
        p_item_gradeProduto,
        p_item_idFormulaTinta,
        p_item_personalizacao,
        p_item_idLoteEstoque,
        p_item_controleQuantidade,
        p_item_loteMultiplo,
        p_item_altura,
        p_item_largura,
        p_item_comprimento,
        p_item_quantidade,
        p_item_observacoesDigitadas);
      UPDATE MOORCAMENTOXITENS
      SET observacoes = v_observacoes
      WHERE idItemOrcamento = r_item_idItemOrcamento;
    END IF;
    IF v_etOrc_situacaoOrcamento > 40 THEN
      ADD_ORCAMENTO_ITEM_RES_ITEM (
        r_item_idItemOrcamento,
        p_estabelecimentoAtivo,
        ' ',
        v_auxVarchar);
    END IF;
    r_buffer_item_idItemOrcamento := CASE WHEN (r_buffer_item_idItemOrcamento IS NULL OR r_buffer_item_idItemOrcamento = '' OR r_buffer_item_idItemOrcamento = ' ') THEN '' ELSE RTRIM (r_buffer_item_idItemOrcamento) || ';' END || TO_CHAR (LPAD(r_item_idItemOrcamento,14,'0'));
    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;
    IF p_item_idItemOrcamento <= 0
      AND v_item_cancelado = 0
      AND p_item_atividadeServico > 0
    THEN
      SELECT
        habilitaAtividadePrevista,
        selecionaAtividadePrevista
      INTO
        v_auxNumber,
        v_ativ_selecionaAtividadePrev
      FROM PAATIVIDADESSERVICO
      WHERE atividadeServico = p_item_atividadeServico;
      IF v_auxNumber = 1 THEN
        ADD_ORCAMENTO_ITEM_PREV_INSERE (
          p_config_64_casasDecSaidas,
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_perfilUsuarioLogado,
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_estabelecimento,
          v_cab_pessoa,
          v_munEndEst_uf,
          v_munEndPess_uf,
          r_item_idItemOrcamento,
          p_item_atividadeServico,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_tipoPreco,
          p_item_tabelaPreco,
          v_item_precoUnitario,
          v_ativ_selecionaAtividadePrev,
          p_idAtividadesPrevistasSelec,
          v_auxNumber);
        IF v_auxNumber = 1 THEN
          SELECT
            COUNT (1) numeroAtividades,
            SUM (
              CASE
                WHEN prev.faturarAtividade = 'P'
                THEN prev.quantidade
                ELSE COALESCE ((
                  SELECT realiz.quantidade
                  FROM MOORCAMENTOXATIVIDADEREAL realiz
                  WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
                  AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
              END) quantidade,
            MIN (prev.precoUnitario) precoUnitarioMenor,
            MAX (prev.precoUnitario) precoUnitarioMaior,
            SUM (ROUND (
              CASE
                WHEN prev.faturarAtividade = 'P'
                THEN prev.quantidade
                ELSE COALESCE ((
                  SELECT realiz.quantidade
                  FROM MOORCAMENTOXATIVIDADEREAL realiz
                  WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
                  AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
              END * prev.precoUnitario, 2)) valorTotalItem
          INTO
            v_ativ_numero,
            v_ativ_quantidade,
            v_ativ_precoUnitarioMenor,
            v_ativ_precoUnitario,
            v_ativ_valorTotalItem
          FROM MOORCAMENTOXATIVIDADEPREV prev
          WHERE prev.idItemOrcamento = r_item_idItemOrcamento
          AND prev.statusAtividadeServico <> 'C'
          AND prev.faturarAtividade IN ('P','R');
          IF v_ativ_numero > 0 THEN
            v_ativ_geraFinanceiro := 1;
            IF v_ativ_numero > 1
              AND v_ativ_precoUnitarioMenor <> v_ativ_precoUnitario
              AND v_ativ_quantidade <> 0
            THEN
              v_ativ_precoUnitario := ROUND (v_ativ_valorTotalItem / v_ativ_quantidade, TO_NUMBER (p_config_64_casasDecSaidas));
            END IF;
          ELSE
            SELECT
              COUNT (1) numeroAtividades,
              SUM (COALESCE ((
                SELECT realiz.quantidade
                FROM MOORCAMENTOXATIVIDADEREAL realiz
                WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
                AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)) quantidade,
              MIN (prev.precoUnitario) precoUnitarioMenor,
              MAX (prev.precoUnitario) precoUnitarioMaior,
              SUM (ROUND (COALESCE ((
                SELECT realiz.quantidade
                FROM MOORCAMENTOXATIVIDADEREAL realiz
                WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
                AND realiz.statusAtividadeServico <> 'C'), prev.quantidade) * prev.precoUnitario, 2)) valorTotalItem
            INTO
              v_ativ_numero,
              v_ativ_quantidade,
              v_ativ_precoUnitarioMenor,
              v_ativ_precoUnitario,
              v_ativ_valorTotalItem
            FROM MOORCAMENTOXATIVIDADEPREV prev
            JOIN PAATIVIDADESSERVICO ativ
            ON ativ.atividadeServico = prev.atividadeServico
            JOIN CAGRADESPRODUTO gradProd
            ON gradProd.gradeProduto = ativ.gradeProduto
            JOIN CAPRODUTOS prod
            ON prod.produto = gradProd.produto
            WHERE prev.idItemOrcamento = r_item_idItemOrcamento
            AND prev.statusAtividadeServico <> 'C'
            AND ativ.gradeProduto > 0
            AND prod.unidadeMedida = v_prod_unidadeMedida;
            IF v_ativ_numero > 0 THEN
              v_ativ_geraFinanceiro := 0;
              IF v_ativ_numero > 1
                AND v_ativ_precoUnitarioMenor <> v_ativ_precoUnitario
                AND v_ativ_quantidade <> 0
              THEN
                v_ativ_precoUnitario := ROUND (v_ativ_valorTotalItem / v_ativ_quantidade, TO_NUMBER (p_config_64_casasDecSaidas));
              END IF;
            END IF;
          END IF;
          IF v_ativ_numero > 0
            AND (v_ativ_quantidade <> p_item_quantidade
              OR v_ativ_precoUnitario <> v_item_precoUnitario
              OR v_ativ_geraFinanceiro <> v_item_geraFinanceiro)
          THEN
            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_config_413_obs_add_marca,
              0, -- p_manterFinanceiro_Retotalizar,
              'T', -- p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
              0, -- p_buscarGeraFinanceiroEstoque,
              ' ', -- p_tipoDocumentoReferenciado, 
              0, -- p_idItemReferenciado,
              0, -- p_quantidadeReferenciada
              ' ', -- p_tempComp_nomeTempComposicao,
              0, -- p_tempComp_sequencia
              ' ', -- p_mensagemAviso,
              r_calcularImpostos,
              r_item_idItemOrcamento,
              p_item_orcamento,
              p_item_pedidoCompraFornecedor,
              p_item_sequenciaPedidoCompraFo,
              p_item_ambiente,
              p_item_ambienteObservacoes,
              p_item_vinculoItemDocumento,
              p_item_atividadeServico,
              p_item_statusAtividadeServico,
              p_item_controleEntrega,
              p_item_dataEntrega,
              p_item_modeloDocumento,
              p_item_estabelecimentoOriginal,
              p_item_vendedor,
              p_item_gradeProduto,
              p_item_idFormulaTinta,
              p_item_personalizacao,
              p_item_idLoteEstoque,
              0, -- p_item_idEnderecoEstoque
              0, -- p_item_idNumeroSerie
              0, -- p_item_atividadeProjeto,
              p_item_localEstoque,
              p_item_pessoaParticipante,
              p_item_controleQuantidade,
              p_item_unidadeMedidaConversao,
              p_item_conversorQuantidade,
              p_item_loteMinimo,
              p_item_loteMultiplo,
              p_item_altura,
              p_item_largura,
              p_item_comprimento,
              CASE p_item_controleQuantidade
                WHEN 2
                THEN CASE WHEN p_item_altura = 0 OR p_item_largura = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100))), 3) END
                WHEN 3
                THEN CASE WHEN p_item_altura = 0 OR p_item_comprimento = 0 OR p_item_comprimento = 0 THEN 0 ELSE ROUND (v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100) * p_item_comprimento), 3) END
                WHEN 4
                THEN CASE WHEN p_item_conversorQuantidade = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / p_item_conversorQuantidade), 3) END
                ELSE 0
              END, -- p_item_pecas
              v_ativ_quantidade,
              CASE p_item_controleQuantidade
                WHEN 2
                THEN ROUND (CASE WHEN p_item_altura = 0 OR p_item_largura = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100))), 3) END, v_uniMedConv_casasDecimaisUnid)
                WHEN 3
                THEN ROUND (CASE WHEN p_item_altura = 0 OR p_item_comprimento = 0 OR p_item_comprimento = 0 THEN 0 ELSE ROUND (v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100) * p_item_comprimento), 3) END, v_uniMedConv_casasDecimaisUnid)
                WHEN 4
                THEN ROUND (CASE WHEN p_item_conversorQuantidade = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / p_item_conversorQuantidade), 3) END, v_uniMedConv_casasDecimaisUnid)
                ELSE v_ativ_quantidade
              END, -- p_item_quantidadeConvertida
              ROUND ((v_ativ_quantidade * v_prod_pesoLiquido), 3), -- p_item_pesoLiquido
              ROUND ((v_ativ_quantidade * v_prod_pesoBruto), 3), -- p_item_pesoBruto
              p_item_tipoPreco,
              p_item_tabelaPreco,
              p_item_precoSugestaoAPrazo,
              p_item_precoSugestaoAVista,
              p_item_precoDesconto,
              p_item_precoMinimo,
              p_item_usarPrecoAVista,
              v_ativ_precoUnitario, -- p_item_precoUnitarioBruto
              p_item_acrescimoUnitarioCompos,
              v_ativ_precoUnitario, -- p_item_precoUnitario
              p_item_percDescontoItem,
              p_item_valorDescontoItem,
              p_item_percAcrescimoItem,
              p_item_valorAcrescimoItem,
              p_item_valorFreteItem,
              p_item_valorSeguroItem,
              p_item_valorAdicFreteMarItem,
              p_item_valorDespesasAduanItem,
              p_item_observacoesDigitadas,
              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,
              p_item_operacaoFiscal,
              v_item_movimentaEstoque,
              v_ativ_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_idAtividadesPrevistasSelec
              0, -- p_nivel,
              ' ',
              v_auxVarchar, -- r_mensagemAviso
              r_calcularImpostos,
              v_auxNumber, -- idItemOrcamento
              v_auxVarchar, -- r_buffer_item_idItemOrcamento
              v_auxNumber); -- r_valorInserido
          END IF;
        END IF;
      END IF;
    END IF;
  END IF;
END ADD_ORCAMENTO_ITEM_GRAVA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_PREV_RECALC (
  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_config_413_obs_add_marca     IN NUMBER,
  p_idItemOrcamento              IN NUMBER)
IS
  v_calcularImpostos        NUMBER;
  v_ativ_numero             NUMBER;
  v_ativ_quantidade         NUMBER;
  v_ativ_precoUnitarioMenor NUMBER;
  v_ativ_precoUnitario      NUMBER;
  v_ativ_valorTotalItem     NUMBER;
  v_ativ_geraFinanceiro     NUMBER;
  v_auxNumber               NUMBER;
  v_auxVarchar              VARCHAR2 (32000);
BEGIN
  v_calcularImpostos := 0;
  SELECT
    COUNT (1) numeroAtividades,
    SUM (
      CASE
        WHEN prev.faturarAtividade = 'P'
        THEN prev.quantidade
        ELSE COALESCE ((
          SELECT realiz.quantidade
          FROM MOORCAMENTOXATIVIDADEREAL realiz
          WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
          AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
      END) quantidade,
    MIN (prev.precoUnitario) precoUnitarioMenor,
    MAX (prev.precoUnitario) precoUnitarioMaior,
    SUM (ROUND (
      CASE
        WHEN prev.faturarAtividade = 'P'
        THEN prev.quantidade
        ELSE COALESCE ((
          SELECT realiz.quantidade
          FROM MOORCAMENTOXATIVIDADEREAL realiz
          WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
          AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
      END * prev.precoUnitario, 2)) valorTotalItem
  INTO
    v_ativ_numero,
    v_ativ_quantidade,
    v_ativ_precoUnitarioMenor,
    v_ativ_precoUnitario,
    v_ativ_valorTotalItem
  FROM MOORCAMENTOXATIVIDADEPREV prev
  WHERE prev.idItemOrcamento = p_idItemOrcamento
  AND prev.statusAtividadeServico <> 'C'
  AND prev.faturarAtividade IN ('P','R');
  IF v_ativ_numero > 0 THEN
    v_ativ_geraFinanceiro := 1;
    IF v_ativ_numero > 1
      AND v_ativ_precoUnitarioMenor <> v_ativ_precoUnitario
      AND v_ativ_quantidade <> 0
    THEN
      v_ativ_precoUnitario := ROUND (v_ativ_valorTotalItem / v_ativ_quantidade, TO_NUMBER (p_config_64_casasDecSaidas));
    END IF;
  ELSE
    SELECT
      COUNT (1) numeroAtividades,
      SUM (COALESCE ((
        SELECT realiz.quantidade
        FROM MOORCAMENTOXATIVIDADEREAL realiz
        WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
        AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)) quantidade,
        MIN (prev.precoUnitario) precoUnitarioMenor,
        MAX (prev.precoUnitario) precoUnitarioMaior,
        SUM (ROUND (COALESCE ((
          SELECT realiz.quantidade
          FROM MOORCAMENTOXATIVIDADEREAL realiz
          WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
          AND realiz.statusAtividadeServico <> 'C'), prev.quantidade) * prev.precoUnitario, 2)) valorTotalItem
    INTO
      v_ativ_numero,
      v_ativ_quantidade,
      v_ativ_precoUnitarioMenor,
      v_ativ_precoUnitario,
      v_ativ_valorTotalItem
    FROM MOORCAMENTOXATIVIDADEPREV prev
    JOIN MOORCAMENTOXITENS item
    ON item.idItemOrcamento = p_idItemOrcamento
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PAATIVIDADESSERVICO ativ
    ON ativ.atividadeServico = prev.atividadeServico
    JOIN CAGRADESPRODUTO gradProdAtiv
    ON gradProdAtiv.gradeProduto = ativ.gradeProduto
    JOIN CAPRODUTOS prodAtiv
    ON prodAtiv.produto = gradProdAtiv.produto
    WHERE prev.idItemOrcamento = p_idItemOrcamento
    AND prev.statusAtividadeServico <> 'C'
    AND ativ.gradeProduto > 0
    AND prodAtiv.unidadeMedida = prod.unidadeMedida;
    IF v_ativ_numero > 0 THEN
      v_ativ_geraFinanceiro := 0;
      IF v_ativ_numero > 1
        AND v_ativ_precoUnitarioMenor <> v_ativ_precoUnitario
        AND v_ativ_quantidade <> 0
      THEN
        v_ativ_precoUnitario := ROUND (v_ativ_valorTotalItem / v_ativ_quantidade, TO_NUMBER (p_config_64_casasDecSaidas));
      END IF;
    END IF;
  END IF;
  IF v_ativ_numero > 0 THEN
    FOR a IN (
      SELECT
        a.orcamento,
        a.pedidoCompraFornecedor,
        a.sequenciaPedidoCompraFornec,
        a.ambiente,
        a.ambienteObservacoes,
        a.vinculoItemDocumento,
        a.atividadeServico,
        a.statusAtividadeServico,
        a.controleEntrega,
        a.dataEntrega,
        a.modeloDocumento,
        a.estabelecimentoOriginal,
        a.vendedor,
        a.gradeProduto,
        a.idFormulaTinta,
        a.personalizacao,
        a.idLoteEstoque,
        a.localEstoque,
        a.pessoaParticipante,
        a.controleQuantidade,
        a.unidadeMedidaConversao,
        a.conversorQuantidade,
        a.loteMinimo,
        a.loteMultiplo,
        a.altura,
        a.largura,
        a.comprimento,
        a.quantidade,
        a.precoUnitario,
        a.tipoPreco,
        a.tabelaPreco,
        a.precoSugestaoAPrazo,
        a.precoSugestaoAVista,
        a.precoDesconto,
        a.precoMinimo,
        a.usarPrecoAVista,
        a.acrescimoUnitarioComposicao,
        a.percDescontoItem,
        a.valorDescontoItem,
        a.percAcrescimoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.observacoesDigitadas,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.operacaoFiscal,
        a.movimentaEstoque,
        a.geraFinanceiro,
        prod.pesoLiquido prod_pesoLiquido,
        prod.pesoBruto prod_pesoBruto,
        unMedConv.casasDecimaisUnidadeMedida unMedConv_casasDecimais
      FROM MOORCAMENTOXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN SIUNIDADESMEDIDA unMedConv
      ON unMedConv.unidadeMedida = a.unidadeMedidaConversao
      WHERE a.idItemOrcamento = p_idItemOrcamento)
    LOOP   
      IF v_ativ_quantidade <> a.quantidade
        OR v_ativ_precoUnitario <> a.precoUnitario
        OR v_ativ_geraFinanceiro <> a.geraFinanceiro
      THEN
        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_config_413_obs_add_marca,
          0, -- p_manterFinanceiro_Retotalizar,
          'T', -- p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
          0, -- p_buscarGeraFinanceiroEstoque,
          ' ', -- p_tipoDocumentoReferenciado, 
          0, -- p_idItemReferenciado,
          0, -- p_quantidadeReferenciada
          ' ', -- p_tempComp_nomeTempComposicao,
          0, -- p_tempComp_sequencia
          ' ', -- p_mensagemAviso,
          0, -- p_calcularImpostos
          p_idItemOrcamento,
          a.orcamento,
          a.pedidoCompraFornecedor,
          a.sequenciaPedidoCompraFornec,
          a.ambiente,
          a.ambienteObservacoes,
          a.vinculoItemDocumento,
          a.atividadeServico,
          a.statusAtividadeServico,
          a.controleEntrega,
          a.dataEntrega,
          a.modeloDocumento,
          a.estabelecimentoOriginal,
          a.vendedor,
          a.gradeProduto,
          a.idFormulaTinta,
          a.personalizacao,
          a.idLoteEstoque,
          0, -- p_item_idEnderecoEstoque
          0, -- p_item_idNumeroSerie
          0, -- p_item_atividadeProjeto,
          a.localEstoque,
          a.pessoaParticipante,
          a.controleQuantidade,
          a.unidadeMedidaConversao,
          a.conversorQuantidade,
          a.loteMinimo,
          a.loteMultiplo,
          a.altura,
          a.largura,
          a.comprimento,
          CASE a.controleQuantidade
            WHEN 2
            THEN ROUND (CASE WHEN a.altura = 0 OR a.largura = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / ((a.altura / 100) * (a.largura / 100))), 3) END, 6)
            WHEN 3
            THEN ROUND (CASE WHEN a.altura = 0 OR a.comprimento = 0 OR a.comprimento = 0 THEN 0 ELSE ROUND (v_ativ_quantidade / ((a.altura / 100) * (a.largura / 100) * a.comprimento), 3) END, 6)
            WHEN 4
            THEN ROUND (CASE WHEN a.conversorQuantidade = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / a.conversorQuantidade), 3) END, 6)
            ELSE 0
          END, -- p_item_pecas
          v_ativ_quantidade,
          CASE a.controleQuantidade
            WHEN 2
            THEN ROUND (CASE WHEN a.altura = 0 OR a.largura = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / ((a.altura / 100) * (a.largura / 100))), 3) END, a.unMedConv_casasDecimais)
            WHEN 3
            THEN ROUND (CASE WHEN a.altura = 0 OR a.comprimento = 0 OR a.comprimento = 0 THEN 0 ELSE ROUND (v_ativ_quantidade / ((a.altura / 100) * (a.largura / 100) * a.comprimento), 3) END, a.unMedConv_casasDecimais)
            WHEN 4
            THEN ROUND (CASE WHEN a.conversorQuantidade = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / a.conversorQuantidade), 3) END, a.unMedConv_casasDecimais)
            ELSE v_ativ_quantidade
          END, -- p_item_quantidadeConvertida
          ROUND ((v_ativ_quantidade * a.prod_pesoLiquido), 3), -- p_item_pesoLiquido
          ROUND ((v_ativ_quantidade * a.prod_pesoBruto), 3), -- p_item_pesoBruto
          a.tipoPreco,
          a.tabelaPreco,
          a.precoSugestaoAPrazo,
          a.precoSugestaoAVista,
          a.precoDesconto,
          a.precoMinimo,
          a.usarPrecoAVista,
          v_ativ_precoUnitario, -- p_item_precoUnitarioBruto
          a.acrescimoUnitarioComposicao,
          v_ativ_precoUnitario, -- p_item_precoUnitario
          a.percDescontoItem,
          a.valorDescontoItem,
          a.percAcrescimoItem,
          a.valorAcrescimoItem,
          a.valorFreteItem,
          a.valorSeguroItem,
          a.valorAdicFreteMarinhaMerItem,
          a.valorDespesasAduaneirasItem,
          a.observacoesDigitadas,
          a.valorFreteGeral,
          a.valorSeguroGeral,
          a.valorDescontoGeral,
          a.valorOutrasDespesasGeral,
          a.valorAdicFreteMarinhaMerGeral,
          a.valorDespesasAduaneirasGeral,
          a.valorDescontoPagamento,
          a.valorOutrasDespesasPagamento,
          a.valorJurosPagamento,
          a.operacaoFiscal,
          a.movimentaEstoque,
          v_ativ_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_idAtividadesPrevistasSelec
          0, -- p_nivel,
          ' ',
          v_auxVarchar, -- r_mensagemAviso
          v_calcularImpostos,
          v_auxNumber, -- idItemOrcamento
          v_auxVarchar, -- r_buffer_idItemOrcamento
          v_auxNumber); -- r_valorInserido
        IF v_calcularImpostos = 1 THEN
          ADD_ORCAMENTO_CALC_IMP_CAB (
            p_config_64_casasDecSaidas,
            p_config_209_filtrarGrupoEcon,
            p_config_362_calcCustoPorGrade,
            a.orcamento,
            ' ', -- p_troca_tipoPagamentoFrete,
            ' '); --p_a_cab_tipoPagamentoFrete
        END IF;
      END IF;
    END LOOP;
  END IF;
END ADD_ORCAMENTO_ITEM_PREV_RECALC;

/

create or replace PROCEDURE ADD_CRM_ATUALIZA_CFE_HISTORICO (
  p_idCRM IN NUMBER)
IS
  v_historicoExiste NUMBER;
BEGIN
  v_historicoExiste := 0;
  FOR a IN (
    SELECT
      a.usuario,
      a.tipoAcaoCRM,
      a.situacaoCRM,
      ( SELECT MIN (c.dataInicio)
        FROM MOCRMXHISTORICO c
        WHERE c.idCRM = p_idCRM
        AND c.dataInicio IS NOT NULL) dataInicio,
      a.dataTermino,
      a.dataProximoContato,
      a.horaProximoContatoFinal,
      a.observacoes
    FROM (
      SELECT
        ROW_NUMBER() OVER (
          ORDER BY
            b.ordenacao,
            a.dataInicio DESC,
            a.dataTermino DESC,
            a.id DESC) ordenacao,
        a.usuario,
        a.tipoAcaoCRM,
        a.situacaoCRM,
        a.dataTermino,
        a.dataProximoContato,
        a.horaProximoContatoFinal,
        a.observacoes
      FROM MOCRMXHISTORICO a
      JOIN SISITUACOESCRM b
      ON b.situacaoCRM = a.situacaoCRM
      WHERE a.idCRM = p_idCRM) a
    WHERE a.ordenacao = 1)
  LOOP
    UPDATE MOCRMS b SET
      b.usuario                 = a.usuario,
      b.tipoAcaoCRM             = a.tipoAcaoCRM,
      b.situacaoCRM             = a.situacaoCRM,
      b.dataInicio              = a.dataInicio,
      b.dataTermino             = a.dataTermino,
      b.dataProximoContato      = a.dataProximoContato,
      b.horaProximoContatoFinal = a.horaProximoContatoFinal,
      b.observacoes             = a.observacoes
    WHERE b.idCRM = p_idCRM;
    v_historicoExiste := 1;
  END LOOP;
  IF v_historicoExiste = 0 THEN
    DELETE MOCRMXORCAMENTOS
    WHERE idCRM = p_idCRM;
    DELETE MOCRMS
    WHERE idCRM = p_idCRM;
  END IF;
END ADD_CRM_ATUALIZA_CFE_HISTORICO;

/

create or replace PROCEDURE ADD_CRM_HISTORICO_EXCLUI (
  p_id IN NUMBER)
IS
  v_idCRM NUMBER;
BEGIN
  SELECT COALESCE (MAX (idCRM), 0)
  INTO v_idCRM
  FROM MOCRMXHISTORICO
  WHERE id = p_id;
  DELETE MOCRMXHISTORICO
  WHERE id = p_id;
  IF v_idCRM > 0 THEN
    ADD_CRM_ATUALIZA_CFE_HISTORICO (v_idCRM);
  END IF;
END ADD_CRM_HISTORICO_EXCLUI;

/

create or replace PROCEDURE ADD_CRM_HISTORICO_GRAVA (
  p_estabelecimentoAtivo    IN NUMBER,
  p_id                      IN NUMBER,
  p_idCRM                   IN NUMBER,
  p_descricao               IN VARCHAR,
  p_listaCRM                IN NUMBER,
  p_estabelecimento         IN NUMBER,
  p_pessoa                  IN NUMBER,
  p_usuario                 IN NUMBER,
  p_tipoAcaoCRM             IN NUMBER,
  p_situacaoCRM             IN CHAR,
  p_dataInicio              IN DATE,
  p_dataTermino             IN DATE,
  p_dataProximoContato      IN DATE,
  p_horaProximoContatoFinal IN CHAR,
  p_observacoes             IN VARCHAR,
  /* Retornos */
  r_id                      OUT NUMBER,
  r_idCRM                   OUT NUMBER)
IS
BEGIN
  IF p_idCRM > 0 THEN
    r_idCRM := p_idCRM;
  ELSE
    r_idCRM := FUNC_ADD_BUSCA_PROXIMO_ID (
      'MOCRMS',
      'idCRM',
      14,
      p_estabelecimentoAtivo,
      NULL);
  END IF;
  IF p_id > 0 THEN
    r_id := p_id;
  ELSE
    r_id := FUNC_ADD_BUSCA_PROXIMO_ID (
      'MOCRMXHISTORICO',
      'id',
      14,
      p_estabelecimentoAtivo,
      NULL);
  END IF;
  MERGE INTO MOCRMS a USING (
    SELECT
      r_idCRM                   idCRM,
      p_descricao               descricao,
      p_listaCRM                listaCRM,
      p_estabelecimento         estabelecimento,
      p_pessoa                  pessoa,
      p_usuario                 usuario,
      p_tipoAcaoCRM             tipoAcaoCRM,
      p_situacaoCRM             situacaoCRM,
      p_dataInicio              dataInicio,
      p_dataTermino             dataTermino,
      p_dataProximoContato      dataProximoContato,
      p_horaProximoContatoFinal horaProximoContatoFinal,
      p_observacoes             observacoes
    FROM DUAL) b
  ON (a.idCRM = b.idCRM)
  WHEN MATCHED THEN UPDATE SET
    a.descricao       = b.descricao,
    a.listaCRM        = b.listaCRM,
    a.estabelecimento = b.estabelecimento,
    a.pessoa          = b.pessoa
  WHEN NOT MATCHED THEN INSERT (
    idCRM,
    descricao,
    listaCRM,
    estabelecimento,
    pessoa,
    usuario,
    tipoAcaoCRM,
    situacaoCRM,
    dataInicio,
    dataTermino,
    dataProximoContato,
    horaProximoContatoFinal,
    observacoes)
  VALUES (
    b.idCRM,
    b.descricao,
    b.listaCRM,
    b.estabelecimento,
    b.pessoa,
    b.usuario,
    b.tipoAcaoCRM,
    b.situacaoCRM,
    b.dataInicio,
    b.dataTermino,
    b.dataProximoContato,
    b.horaProximoContatoFinal,
    b.observacoes);
  MERGE INTO MOCRMXHISTORICO a USING (
    SELECT
      r_id                      id,
      r_idCRM                   idCRM,
      p_usuario                 usuario,
      p_tipoAcaoCRM             tipoAcaoCRM,
      p_situacaoCRM             situacaoCRM,
      p_dataInicio              dataInicio,
      p_dataTermino             dataTermino,
      p_dataProximoContato      dataProximoContato,
      p_horaProximoContatoFinal horaProximoContatoFinal,
      p_observacoes             observacoes
    FROM DUAL) b
  ON (a.id = b.id)
  WHEN MATCHED THEN UPDATE SET
    a.idCRM                   = b.idCRM,
    a.usuario                 = b.usuario,
    a.tipoAcaoCRM             = b.tipoAcaoCRM,
    a.situacaoCRM             = b.situacaoCRM,
    a.dataInicio              = b.dataInicio,
    a.dataTermino             = b.dataTermino,
    a.dataProximoContato      = b.dataProximoContato,
    a.horaProximoContatoFinal = b.horaProximoContatoFinal,
    a.observacoes             = b.observacoes
  WHEN NOT MATCHED THEN INSERT (
    id,
    idCRM,
    usuario,
    tipoAcaoCRM,
    situacaoCRM,
    dataInicio,
    dataTermino,
    dataProximoContato,
    horaProximoContatoFinal,
    observacoes)
  VALUES (
    b.id,
    b.idCRM,
    b.usuario,
    b.tipoAcaoCRM,
    b.situacaoCRM,
    b.dataInicio,
    b.dataTermino,
    b.dataProximoContato,
    b.horaProximoContatoFinal,
    b.observacoes);
  ADD_CRM_ATUALIZA_CFE_HISTORICO (r_idCRM);
END ADD_CRM_HISTORICO_GRAVA;

/

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_tipoDocumento            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.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.tipoDocumento,
      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_tipoDocumento,
      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;
    FOR b IN (
      SELECT
        id,
        idItemOrcamentoReferenc,
        quantidade
      FROM MOORCAMENTOXORCAMENTO
      WHERE idItemOrcamento = p_item_idItemOrcamento)
    LOOP
      IF v_cab_tipoDocumento = 103 THEN
        UPDATE MOORCAMENTOXITENS c
        SET c.quantidadeSaldo = c.quantidadeSaldo + b.quantidade
        WHERE c.idItemOrcamento = b.idItemOrcamentoReferenc;
      END IF;
      DELETE MOORCAMENTOXORCAMENTO c
      WHERE c.id = b.id;
    END LOOP;
    FOR b IN (
      SELECT
        id,
        idItemContrato,
        quantidade
      FROM MOCONTRATOXORCAMENTO
      WHERE idItemOrcamento = p_item_idItemOrcamento)
    LOOP
      UPDATE MOCONTRATOXITENS c
      SET c.quantidadeSaldo = c.quantidadeSaldo + b.quantidade
      WHERE c.idItemContrato = b.idItemContrato;
      DELETE MOCONTRATOXORCAMENTO c
      WHERE c.id = b.id;
    END LOOP;
    -- 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 <> docXTransf.entradaSaidaOriginal
            OR docXTransf2.idItemOrcamento <> docXTransf.idItemOrcamento))
        AND NOT EXISTS (
          SELECT 1
          FROM MODOCUMENTOTRANSFXITENS itemTransf2
          JOIN MODOCTRANSFXORCAMENTOS docXTransf2
          ON docXTransf2.idItemDocTransferencia = itemTransf2.idItemDocTransferencia
          WHERE itemTransf2.documentoTransferencia = itemTransf.documentoTransferencia)
        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;
      FOR b IN (
        SELECT
          docXTransf.idItemDocTransferencia,
          cabTransf.situacaoDocTransferencia
        FROM MODOCTRANSFXORCAMENTOITEM docXTransf
        JOIN MODOCUMENTOTRANSFXITENS itemTransf
        ON itemTransf.idItemDocTransferencia = docXTransf.idItemDocTransferencia
        JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
        ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
        WHERE docXTransf.idItemOrcamento = p_item_idItemOrcamento
        AND docXTransf.entradaSaidaOriginal = 'O')
      LOOP
        ADD_DOCTRANSF_ITEM_EXCLUI (
          b.idItemDocTransferencia,
          'C', -- p_cancela_Exclui_Reabre
          b.situacaoDocTransferencia,
          0, -- p_cab_quantidadeConvertida,
          0, -- p_cab_valorProdutoServico,
          /* Retornos */
          v_auxNumber, -- r_cab_quantidadeConvertida
          v_auxNumber); -- r_cab_valorProdutoServico
      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;
    UPDATE MOORCAMENTOXNUMEROSSERIE numSer
    SET numSer.efetivado = 0
    WHERE numSer.efetivado = 1
    AND EXISTS (
      SELECT 1
      FROM MOORCAMENTOXORCAMENTO docXDoc
      WHERE docXDoc.idItemOrcamento = p_item_idItemOrcamento
      AND docXDoc.idItemOrcamentoReferenc = numSer.idItemOrcamento
      AND docXDoc.quantidade <> 0)
    AND EXISTS (
      SELECT 1
      FROM MOORCAMENTOXNUMEROSSERIE numSerDoc
      WHERE numSerDoc.idItemOrcamento = p_item_idItemOrcamento
      AND numSerDoc.idNumeroSerie = numSer.idNumeroSerie);
    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 MOORCAMENTOXTAREFAS b
      WHERE b.idAtividadePrevOrcamento > 0
      AND EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEPREV c
        WHERE c.idAtividadePrevOrcamento = b.idAtividadePrevOrcamento
        AND c.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_BUSCA_PRECO_INTERNO_TABELA (
  p_perfilUsuarioLogado          IN NUMBER,
  p_usuarioLogado                IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_devolucaoAnulacaoRetorno IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_dataPrecoFinal           IN DATE,
  p_cab_pessoa                   IN NUMBER,
  p_cab_projeto                  IN VARCHAR,
  p_modDoc_capituloNaturezaFisc  IN NUMBER,
  p_endPessEst_uf                IN CHAR,
  p_endPess_uf                   IN CHAR,
  p_item_vendedor                IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_gradProd_produto             IN NUMBER,
  p_gradProd_cor                 IN NUMBER,
  p_gradProd_tamanho             IN VARCHAR,
  p_manterPreco                  IN NUMBER,
  p_precoSugestaoAPrazoOriginal  IN NUMBER,
  p_precoSugestaoAVistaOriginal  IN NUMBER,
  p_tabelaPreco                  IN VARCHAR,
  r_tabelaPreco                  OUT VARCHAR,
  r_precoSugestaoAPrazo          OUT NUMBER,
  r_precoSugestaoAVista          OUT NUMBER,
  r_precoDesconto                OUT NUMBER,
  r_precoMinimo                  OUT NUMBER,
  r_informarPrecoManualmente     OUT NUMBER,
  r_precoAPrazo                  OUT NUMBER,
  r_precoAVista                  OUT NUMBER,
  r_promocao                     OUT NUMBER,
  r_precoPromocaoAPrazo          OUT NUMBER,
  r_precoPromocaoAVista          OUT NUMBER,
  r_precoIndexadoAPrazo          OUT NUMBER,
  r_precoIndexadoAVista          OUT NUMBER)
IS
BEGIN
  SELECT
    COALESCE (MAX (a.tabelaPreco), ' ') tabelaPreco,
    COALESCE (MAX (CASE WHEN a.precoContrato <> 0 THEN a.precoContrato WHEN a.promocao = 1 THEN a.precoPromocaoAPrazo ELSE a.precoAPrazo END * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoSugestaoAPrazo,
    COALESCE (MAX (CASE WHEN a.precoContrato <> 0 THEN a.precoContrato WHEN a.promocao = 1 THEN a.precoPromocaoAVista ELSE a.precoAVista END * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoSugestaoAVista,
    COALESCE (MAX (a.precoDesconto * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoDesconto,
    COALESCE (MAX (a.precoMinimo * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoMinimo,
    COALESCE (MAX (CASE WHEN a.precoContrato <> 0 THEN a.precoContrato ELSE a.precoAPrazo END * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoAPrazo,
    COALESCE (MAX (CASE WHEN a.precoContrato <> 0 THEN a.precoContrato ELSE a.precoAVista END * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoAVista,
    COALESCE (MAX (a.promocao), 0) promocao,
    COALESCE (MAX (CASE WHEN a.precoContrato <> 0 THEN a.precoContrato ELSE a.precoPromocaoAPrazo END * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoPromocaoAPrazo,
    COALESCE (MAX (CASE WHEN a.precoContrato <> 0 THEN a.precoContrato ELSE a.precoPromocaoAVista END * CASE WHEN a.indexador = ' ' OR a.cotacao = 0 THEN 1 ELSE a.cotacao END), 0) precoPromocaoAVista,
    COALESCE (MAX (CASE WHEN a.precoContrato <> 0 THEN a.precoContrato WHEN a.promocao = 1 THEN a.precoPromocaoAPrazo ELSE a.precoAPrazo END), 0) precoIndexadoAPrazo,
    COALESCE (MAX (CASE WHEN a.precoContrato <> 0 THEN a.precoContrato WHEN a.promocao = 1 THEN a.precoPromocaoAVista ELSE a.precoAVista END), 0) precoIndexadoAVista
  INTO
    r_tabelaPreco,
    r_precoSugestaoAPrazo,
    r_precoSugestaoAVista,
    r_precoDesconto,
    r_precoMinimo,
    r_precoAPrazo,
    r_precoAVista,
    r_promocao,
    r_precoPromocaoAPrazo,
    r_precoPromocaoAVista,
    r_precoIndexadoAPrazo,
    r_precoIndexadoAVista
  FROM(
    SELECT 
      a.tabelaPreco,
      a.precoAPrazo,
      a.precoAVista,
      a.promocao,
      a.precoPromocaoAVista,
      a.precoPromocaoAPrazo,
      a.precoDesconto,
      a.precoMinimo,
      a.indexador,
      a.precoContrato,
      COALESCE ((
        SELECT
          CASE
            WHEN p_cab_entradaSaida =
              CASE
                WHEN p_cab_devolucaoAnulacaoRetorno = 1
                THEN 'S'
                ELSE 'E'
              END
            THEN indDia.cotacaoCompra
            ELSE indDia.cotacaoVenda
          END
        FROM PAINDEXADORXDIAS indDia
        WHERE indDia.indexador = a.indexador
        AND indDia.aPartirDe = (
          SELECT MAX(indDia2.aPartirDe)
          FROM PAINDEXADORXDIAS indDia2
          WHERE indDia2.indexador = indDia.indexador
          AND indDia2.aPartirDe <= sysdate)),0) cotacao
    FROM (
      SELECT 
        a.tabelaPreco,
        a.precoAPrazo,
        a.precoAVista,
        a.promocao,
        a.precoPromocaoAVista,
        a.precoPromocaoAPrazo,
        a.precoDesconto,
        a.precoMinimo,
        tabela.indexador,
          CASE
            WHEN p_cab_projeto = ' '
            THEN 0
            ELSE COALESCE ((
              SELECT MAX (contrXitem.precoUnitario)
              FROM MOCONTRATOXPROJETOS contrXProj
              JOIN MOCONTRATOS contr
              ON contr.idContrato = contrXProj.idContrato
              JOIN MOCONTRATOXITENS contrXitem
              ON contrXitem.idContrato = contr.idContrato
              JOIN CAGRADESPRODUTO gradProd
              ON gradProd.gradeProduto = contrXitem.gradeProduto
              WHERE contrXProj.projeto = p_cab_projeto
              AND contrXProj.ativo = 1
              AND contr.situacaoContrato = 'A'
              AND contrXitem.tabelaPreco = a.tabelaPreco
              AND contrXitem.cancelado = 0
              AND gradProd.produto = p_gradProd_produto), 0)
          END precoContrato,
        ROW_NUMBER() OVER (
          ORDER BY
            CASE
              WHEN p_cab_projeto = ' '
              THEN 0
              WHEN EXISTS (
                SELECT 1
                FROM MOCONTRATOXPROJETOS contrXProj
                JOIN MOCONTRATOS contr
                ON contr.idContrato = contrXProj.idContrato
                JOIN MOCONTRATOXITENS contrXitem
                ON contrXitem.idContrato = contr.idContrato
                JOIN CAGRADESPRODUTO gradProd
                ON gradProd.gradeProduto = contrXitem.gradeProduto
                WHERE contrXProj.projeto = p_cab_projeto
                AND contrXProj.ativo = 1
                AND contr.situacaoContrato = 'A'
                AND contrXitem.tabelaPreco = a.tabelaPreco
                AND contrXitem.cancelado = 0
                AND gradProd.produto = p_gradProd_produto)
              THEN 1
              WHEN EXISTS (
                SELECT 1
                FROM MOCONTRATOXPROJETOS contrXProj
                JOIN MOCONTRATOS contr
                ON contr.idContrato = contrXProj.idContrato
                WHERE contrXProj.projeto = p_cab_projeto
                AND contrXProj.ativo = 1
                AND contr.situacaoContrato = 'A'
                AND contr.tabelaPreco = a.tabelaPreco)
              THEN 2
              ELSE 3
            END,
            tabela.ordenacao,
            a.tabelaPreco,
            (a.filtrarCores + a.filtrarTamanhos + a.filtrarPersonalizacoes) desc,
            a.ordenacao,
            a.idPrecoTabela) ordenacao
      FROM CATABELAPRECOXPRECOS a
      JOIN PATABELASPRECO tabela
      ON tabela.tabelaPreco = a.tabelaPreco
      JOIN PAFILTROSCABECALHO filtroCab
      ON filtroCab.filtroCabecalho = tabela.filtroCabecalho
      JOIN CAPESSOAS pess
      ON pess.pessoa = p_cab_pessoa
      WHERE a.produto = p_gradProd_produto
      AND a.tabelaPreco <> ' '
      AND (p_tabelaPreco = ' '
        OR a.tabelaPreco = p_tabelaPreco)
      AND a.ativo = 1
      AND a.quantidadeMinima <= p_item_quantidade
      AND a.quantidadeMaxima >= p_item_quantidade
      AND a.dataValidadeInicial <= p_cab_dataPrecoFinal
      AND a.dataValidadeFinal >= p_cab_dataPrecoFinal
      AND (p_gradProd_cor = 0
        AND a.filtrarCores = 0
        OR p_gradProd_cor > 0
        AND (a.filtrarCores = 0
          OR EXISTS (
            SELECT 1
            FROM CATABELAPRECOXCORES tabcor
            WHERE tabcor.idPrecoTabela = a.idPrecoTabela
            AND tabcor.cor = p_gradProd_cor
            AND tabcor.ativo = 1)))
      AND (p_gradProd_tamanho = ' '
        AND a.filtrarTamanhos = 0
        OR p_gradProd_tamanho <> ' '
        AND (a.filtrarTamanhos = 0
          OR EXISTS (
            SELECT 1
            FROM CATABELAPRECOXTAMANHOS tabtam
            WHERE tabtam.idPrecoTabela = a.idPrecoTabela
            AND tabtam.tamanho = p_gradProd_tamanho
            AND tabtam.ativo = 1)))
      AND (p_item_personalizacao = 0
        AND a.filtrarPersonalizacoes = 0
        OR p_item_personalizacao > 0
        AND (a.filtrarPersonalizacoes = 0
          OR EXISTS (
            SELECT 1
            FROM CATABELAPRECOXPERSONALIZ tabPers
            WHERE tabPers.idPrecoTabela = a.idPrecoTabela
            AND tabPers.personalizacao = p_item_personalizacao
            AND tabPers.ativo = 1)))
      AND (p_manterPreco = 1
        OR tabela.ativo = 1 
        AND
          CASE
            WHEN p_tabelaPreco <> ' '
              OR p_cab_entradaSaida = ' '
              OR p_modDoc_capituloNaturezaFisc = 9
            THEN 1
            WHEN p_cab_entradaSaida =
              CASE
                WHEN p_cab_devolucaoAnulacaoRetorno = 1
                THEN 'S'
                ELSE 'E'
              END
            THEN tabela.validoParaCompra
            ELSE tabela.validoParaVenda
          END = 1
        AND (tabela.filtrarVendedores = 0
          OR EXISTS (
            SELECT 1
            FROM PATABELAPRECOXVENDEDORES tabVend
            WHERE tabVend.tabelaPreco = tabela.tabelaPreco
            AND tabVend.vendedor = p_item_vendedor
            AND tabVend.ativo = 1))
        AND (tabela.filtrarLocaisEstoque = 0
          OR EXISTS (
            SELECT 1
            FROM PATABELAPRECOXLOCAISESTOQ tabLocEst
            WHERE tabLocEst.tabelaPreco = tabela.tabelaPreco
            AND tabLocEst.localEstoque = p_item_localEstoque
            AND tabLocEst.ativo = 1))
        AND (tabela.filtroCabecalho = 0
          OR (filtroCab.filtrarEstabelecimentos = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROCABECXESTABELEC filCabEst
              WHERE filCabEst.filtroCabecalho = tabela.filtroCabecalho
              AND filCabEst.estabelecimento = p_cab_estabelecimento
              AND filCabEst.ativo = 1))
          AND (filtroCab.filtrarUfs = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROCABECXUFS filCabUf
              WHERE filCabUf.filtroCabecalho = tabela.filtroCabecalho
              AND filCabUf.uf =
                CASE
                  WHEN p_cab_pessoa = 0
                  THEN p_endPessEst_uf
                  ELSE p_endPess_uf
                END
              AND filCabUf.ativo = 1))
          AND (filtroCab.filtrarPessoas = 0
            OR EXISTS (
              SELECT 1
              FROM PAFILTROCABECXPESSOAS filCabPess
              WHERE filCabPess.filtroCabecalho = tabela.filtroCabecalho
              AND filCabPess.pessoa = p_cab_pessoa
              AND filCabPess.ativo = 1))
          AND (filtroCab.filtrarPerfisUsuario = 0
            AND filtroCab.filtrarUsuarios = 0
            OR filtroCab.filtrarPerfisUsuario = 1
            AND EXISTS (
              SELECT 1
              FROM PAFILTROCABECXPERFISUSUAR filCabPerfUs
              WHERE filCabPerfUs.filtroCabecalho = tabela.filtroCabecalho
              AND filCabPerfUs.perfilUsuario = p_perfilUsuarioLogado
              AND filCabPerfUs.ativo = 1)
            OR filtroCab.filtrarUsuarios = 1
            AND EXISTS (
              SELECT 1
              FROM PAFILTROCABECXUSUARIOS filCabUs
              WHERE filCabUs.filtroCabecalho = tabela.filtroCabecalho
              AND filCabUs.usuario = p_usuarioLogado
              AND filCabUs.ativo = 1))
          AND (filtroCab.indicadorPessoa = ' '
            OR filtroCab.indicadorPessoa = pess.indicadorPessoa)
          AND (filtroCab.colaborador = ' '
            OR filtroCab.colaborador = 'N'
            AND (p_cab_pessoa = 0
              OR NOT(EXISTS(
                SELECT 1
                FROM CACOLABORADORES colab
                WHERE colab.colaborador = p_cab_pessoa
                AND colab.ativo = 1)))
            OR filtroCab.colaborador = 'S'
            AND p_cab_pessoa <> 0
            AND EXISTS(
              SELECT 1
              FROM CACOLABORADORES colab
              WHERE colab.colaborador = p_cab_pessoa
              AND colab.ativo = 1))))) a
    WHERE a.ordenacao = 1) a;
  r_informarPrecoManualmente :=
    CASE
      WHEN r_tabelaPreco <> ' '
        AND r_precoSugestaoAPrazo = 0
      THEN 1
      ELSE 0
    END;
  IF r_tabelaPreco <> ' '
    AND r_precoSugestaoAPrazo = 0
    AND r_precoSugestaoAVista = 0
    AND p_manterPreco = 1
  THEN
    r_precoSugestaoAPrazo := p_precoSugestaoAPrazoOriginal;
    r_precoSugestaoAVista := p_precoSugestaoAVistaOriginal;
  END IF;
END ADD_BUSCA_PRECO_INTERNO_TABELA;

/

DROP TABLE TEMPIMPORTITENS;

CREATE GLOBAL TEMPORARY TABLE TEMPIMPORTITENS
  (
    sessaoClient                  VARCHAR (30) DEFAULT ' ' NOT NULL,
    contadorSessao                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    sequencia                     NUMERIC (3,0) DEFAULT 0 NOT NULL,
    selecionado                   NUMERIC (1,0) DEFAULT 0 NOT NULL,
    produtoImpresso               VARCHAR (60) DEFAULT ' ' NOT NULL,
    descricaoImpressa             VARCHAR (120) DEFAULT ' ' NOT NULL,
    codigoFornecedor              VARCHAR (60) DEFAULT ' ' NOT NULL,
    eanGtin                       VARCHAR (14) DEFAULT ' ' NOT NULL,
    descricaoFornecedor           VARCHAR (120) DEFAULT ' ' NOT NULL,
    ncm                           CHAR (8) DEFAULT '        ' NOT NULL,
    cest                          NUMERIC (7,0) DEFAULT 0 NOT NULL,
    codigoFCI                     VARCHAR (36) DEFAULT ' ' NOT NULL,
    codigoProdutoAnp              NUMERIC (9,0) DEFAULT 0 NOT NULL,
    excecaoTipi                   CHAR (3) DEFAULT '   ' NOT NULL,
    cfop                          NUMERIC (4,0) DEFAULT 0 NOT NULL,
    unidadeMedidaComercial        VARCHAR (6) DEFAULT ' ' NOT NULL,
    quantidadeComercial           NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeGrade               NUMERIC (15,6) DEFAULT 0 NOT NULL,
    contadorGrade                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    precoUnitarioComercial        NUMERIC (15,7) DEFAULT 0 NOT NULL,
    valorProdutoComercial         NUMERIC (15,2) DEFAULT 0 NOT NULL,
    eanGtinTributado              VARCHAR (14) DEFAULT ' ' NOT NULL,
    unidadeMedidaTributado        VARCHAR (6) DEFAULT ' ' NOT NULL,
    quantidadeTributado           NUMERIC (15,6) DEFAULT 0 NOT NULL,
    precoUnitarioTributado        NUMERIC (15,7) DEFAULT 0 NOT NULL,
    valorFrete                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorSeguro                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDesconto                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorOutrasDespesasAcessorias NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorProdutoTributado         NUMERIC (15,2) DEFAULT 0 NOT NULL,
    origemMercadoria              CHAR (1) DEFAULT ' ' NOT NULL,
    stICMS                        CHAR (2) DEFAULT '  ' NOT NULL,
    modalidadeBaseCalcICMS        CHAR (1) DEFAULT ' ' NOT NULL,
    baseICMS                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaICMS                  NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorICMS                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    reducaoBaseICMS               NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseFCP                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaFCP                   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorFCP                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    modalidadeBaseCalcICMSST      CHAR (1) DEFAULT ' ' NOT NULL,
    margemValorAdicionadoST       NUMERIC (15,4) DEFAULT 0 NOT NULL,
    reducaoBaseST                 NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseICMSST                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaICMSST                NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorICMSST                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseFCPST                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaFCPST                 NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorFCPST                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSDesoneracao          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    motivoDesoneracaoICMS         CHAR (2) DEFAULT '  ' NOT NULL,
    valorICMSOperacao             NUMERIC (15,2) DEFAULT 0 NOT NULL,
    diferimentoICMS               NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorICMSDiferido             NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseICMSSTAnteriormente       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSSTAnteriormente      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaSTSuportConsFinal     NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaFCPSTAnteriormente    NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseFCPSTAnteriormente        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorFCPSTAnteriormente       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    partilhaICMSInterestadual     NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseICMSUFRemetente           NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSUFRemetente          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseICMSUFDestinatario        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorICMSUFDestinatario       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaICMSUFDestinatario    NUMERIC (7,4) DEFAULT 0 NOT NULL,
    stSimplesNacional             CHAR (3) DEFAULT '   ' NOT NULL,
    creditoSimplesNacional        NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorCreditoSimplesNacional   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseImpostoImportacao         NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorImpostoImportacao        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDespesasAduaneiras       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorIOF                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    codigoEnquadramentoIPI        NUMERIC (3,0) DEFAULT 0 NOT NULL,
    stIPI                         CHAR (2) DEFAULT '  ' NOT NULL,
    baseIPI                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorIPI                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaIPI                   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    qtdeUnidIPI                   NUMERIC (15,6) DEFAULT 0 NOT NULL,
    valorAliquotaIPI              NUMERIC (15,4) DEFAULT 0 NOT NULL,
    baseISSQN                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaISSQN                 NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorISSQN                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    indicadorISSQN                CHAR (1) DEFAULT ' ' NOT NULL,
    listaServicos                 NUMERIC (4,0) DEFAULT 0 NOT NULL,
    valorISSQNRetencao            NUMERIC (15,2) DEFAULT 0 NOT NULL,
    stPIS                         CHAR (2) DEFAULT '  ' NOT NULL,
    basePIS                       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorPIS                      NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaPIS                   NUMERIC (7,4) DEFAULT 0 NOT NULL,
    quantidadeVendidaPIS          NUMERIC (15,6) DEFAULT 0 NOT NULL,
    valorAliquotaPIS              NUMERIC (15,4) DEFAULT 0 NOT NULL,
    aliquotaPISST                 NUMERIC (7,4) DEFAULT 0 NOT NULL,
    basePISST                     NUMERIC (15,2) DEFAULT 0 NOT NULL,
    quantidadeVendidaPISST        NUMERIC (15,6) DEFAULT 0 NOT NULL,
    valorAliquotaPISST            NUMERIC (15,4) DEFAULT 0 NOT NULL,
    valorPISST                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    stCOFINS                      CHAR (2) DEFAULT '  ' NOT NULL,
    baseCOFINS                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorCOFINS                   NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaCOFINS                NUMERIC (7,4) DEFAULT 0 NOT NULL,
    quantidadeVendidaCOFINS       NUMERIC (15,6) DEFAULT 0 NOT NULL,
    valorAliquotaCOFINS           NUMERIC (15,4) DEFAULT 0 NOT NULL,
    aliquotaCOFINSST              NUMERIC (7,4) DEFAULT 0 NOT NULL,
    baseCOFINSST                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    quantidadeVendidaCOFINSST     NUMERIC (15,6) DEFAULT 0 NOT NULL,
    valorAliquotaCOFINSST         NUMERIC (15,4) DEFAULT 0 NOT NULL,
    valorCOFINSST                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    baseFCPUFDestinatario         NUMERIC (15,2) DEFAULT 0 NOT NULL,
    aliquotaFCPUFDestinatario     NUMERIC (7,4) DEFAULT 0 NOT NULL,
    aliquotaICMSInterestadual     NUMERIC (7,4) DEFAULT 0 NOT NULL,
    valorFCPUFDestinatario        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    informacoesAdicionaisProduto  VARCHAR (500) DEFAULT ' ' NOT NULL
  ) ON COMMIT PRESERVE ROWS;
ALTER TABLE TEMPIMPORTITENS ADD CONSTRAINT TEMPIMPORTITENS_PK1 PRIMARY KEY (sessaoClient, contadorSessao, sequencia);
CREATE INDEX TEMPIMPORTITENS_K2 ON TEMPIMPORTITENS (sessaoClient, contadorSessao, codigoFornecedor, sequencia);

INSERT INTO SITIPOSDOCUMENTOIMPRESSO (tipoDocumentoImpresso, descricao, ativo, ordenacao, habilitaFinalizacao, habilitaAbrirGaveta, permiteGrafico, permiteCaractere, permiteMerge, arquivoModeloMerge, permiteReport, observacoesReport, permiteFiscal, observacoes) VALUES (57, 'Checklist', 1, 640, 0, 0, 0, 0, 0, ' ', 1, ' ', 0, ' ');

COMMIT;

UPDATE SIVERSOESSISTEMA SET dataLiberacaoVersao = TO_DATE ('05/06/2024', 'DD/MM/YYYY'), dataAtualizacaoVersao =  SYSDATE, observacoes = 'BETA 13' WHERE idVersaoSistema = 2024001002;

COMMIT;

-- FIM BETA 13 - 05/6/24

DROP PROCEDURE ADD_ORCAMENTO_INFO_GRAVA_SEQ;
DROP PROCEDURE ADD_PRE_DOC_INFO_GRAVA_SEQ;
DROP PROCEDURE ADD_DOC_FISC_INFO_GRAVA_SEQ;

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

/

INSERT INTO SICONFIGURACOES (configuracao, descricao, ativo, subcategoriaConfiguracao, tipoCampo, mascara, exibirCampo, tipoArquivo, conteudoSugestao, tabelaSistema, observacoes) values (417, 'Atualizar preços ao trocar cliente no orçamento e ordem de serviço', 1, 30001, 'L', '1', 'E', 0, 'S', ' ', ' ');

COMMIT;

INSERT INTO SICONFIGURACOES (configuracao, descricao, ativo, subcategoriaConfiguracao, tipoCampo, mascara, exibirCampo, tipoArquivo, conteudoSugestao, tabelaSistema, observacoes) values (418, 'Efetuar enter entre campos na observação complementar do item', 1, 30001, 'L', '1', 'E', 0, 'N', ' ', ' ');

COMMIT;

create or replace FUNCTION FUNC_ADD_MONTA_OBSERVACAO_ITEM (
  p_sessaoClient                 IN VARCHAR2,
  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_413_obs_add_marca     IN NUMBER,
  p_config_418_obs_efetarEnter   IN NUMBER,
  p_tempComp_nomeTempComposicao  IN VARCHAR2,
  p_tempComp_sequencia           IN NUMBER,
  p_Doc_Orc_Pre_Sep_Transf       IN CHAR,
  p_item_id                      IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_idLoteEstoque           IN NUMBER,
  p_item_controleQuantidade      IN NUMBER,
  p_item_loteMultiplo            IN NUMBER,
  p_item_altura                  IN NUMBER,
  p_item_largura                 IN NUMBER,
  p_item_comprimento             IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_observacoesDigitadas    IN VARCHAR2)
RETURN VARCHAR2
IS
  v_prod_caracteristicaA NUMBER;
  v_prod_caracteristicaB NUMBER;
  v_prod_caracteristicaC NUMBER;
  v_prod_caracteristicaD NUMBER;
  v_prod_caracteristicaE NUMBER;
  v_prod_marca           NUMBER;
  v_prod_referencia      VARCHAR2(60);
  v_observacoes          VARCHAR2(4000);
  v_aux_observacoes      VARCHAR2(4000);
BEGIN
  v_observacoes := '';
  IF p_config_198_obs_add_referenc = 1
    OR p_config_199_obs_add_caractA = 1
    OR p_config_200_obs_add_caractB = 1
    OR p_config_201_obs_add_caractC = 1
    OR p_config_202_obs_add_caractD = 1
    OR p_config_203_obs_add_caractE = 1
    OR p_config_413_obs_add_marca = 1
  THEN
    SELECT
      prod.caracteristicaA,
      prod.caracteristicaB,
      prod.caracteristicaC,
      prod.caracteristicaD,
      prod.caracteristicaE,
      prod.marca,
      prod.referencia
    INTO
      v_prod_caracteristicaA,
      v_prod_caracteristicaB,
      v_prod_caracteristicaC,
      v_prod_caracteristicaD,
      v_prod_caracteristicaE,
      v_prod_marca,
      v_prod_referencia
    FROM CAGRADESPRODUTO gradProd
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE gradProd.gradeProduto = p_item_gradeProduto;
    -- Marca
    IF p_config_413_obs_add_marca = 1 AND v_prod_marca <> 0 THEN
      SELECT descricao
      INTO v_aux_observacoes
      FROM PAMARCAS
      WHERE marca = v_prod_marca;
      IF v_aux_observacoes <> ' ' THEN
        v_observacoes := RTRIM (SUBSTR (CASE WHEN v_observacoes <> ' ' THEN v_observacoes || CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END ELSE '' END || v_aux_observacoes, 1, 4000));
      END IF;
    END IF;
    -- Referência Produto
    IF p_config_198_obs_add_referenc = 1 AND v_prod_referencia <> ' ' THEN
      v_observacoes := RTRIM (SUBSTR (CASE WHEN v_observacoes <> ' ' THEN v_observacoes || CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END ELSE '' END || 'Ref.: ' || v_prod_referencia, 1, 4000));
    END IF;
    -- Caracteristica A
    IF p_config_199_obs_add_caractA = 1 AND v_prod_caracteristicaA <> 0 THEN
      SELECT descricao
      INTO v_aux_observacoes
      FROM PACARACTERISTICASA
      WHERE caracteristicaA = v_prod_caracteristicaA;
      IF v_aux_observacoes <> ' ' THEN
        v_observacoes := RTRIM (SUBSTR (CASE WHEN v_observacoes <> ' ' THEN v_observacoes || CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END ELSE '' END || v_aux_observacoes, 1, 4000));
      END IF;
    END IF;
    -- Caracteristica B
    IF p_config_200_obs_add_caractB = 1 AND v_prod_caracteristicaB <> 0 THEN
      SELECT descricao
      INTO v_aux_observacoes
      FROM PACARACTERISTICASB
      WHERE caracteristicaB = v_prod_caracteristicaB;
      IF v_aux_observacoes <> ' ' THEN
        v_observacoes := RTRIM (SUBSTR (CASE WHEN v_observacoes <> ' ' THEN v_observacoes || CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END ELSE '' END || v_aux_observacoes, 1, 4000));
      END IF;
    END IF;
    -- Caracteristica C
    IF p_config_201_obs_add_caractC = 1 AND v_prod_caracteristicaC <> 0 THEN
      SELECT descricao
      INTO v_aux_observacoes
      FROM PACARACTERISTICASC
      WHERE caracteristicaC = v_prod_caracteristicaC;
      IF v_aux_observacoes <> ' ' THEN
        v_observacoes := RTRIM (SUBSTR (CASE WHEN v_observacoes <> ' ' THEN v_observacoes || CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END ELSE '' END || v_aux_observacoes, 1, 4000));
      END IF;
    END IF;
    -- Caracteristica D
    IF p_config_202_obs_add_caractD = 1 AND v_prod_caracteristicaD <> 0 THEN
      SELECT descricao
      INTO v_aux_observacoes
      FROM PACARACTERISTICASD
      WHERE caracteristicaD = v_prod_caracteristicaD;
      IF v_aux_observacoes <> ' ' THEN
        v_observacoes := RTRIM (SUBSTR (CASE WHEN v_observacoes <> ' ' THEN v_observacoes || CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END ELSE '' END || v_aux_observacoes, 1, 4000));
      END IF;
    END IF;
    -- Caracteristica E
    IF p_config_203_obs_add_caractE = 1 AND v_prod_caracteristicaE <> 0 THEN
      SELECT descricao
      INTO v_aux_observacoes
      FROM PACARACTERISTICASE
      WHERE caracteristicaE = v_prod_caracteristicaE;
      IF v_aux_observacoes <> ' ' THEN
        v_observacoes := RTRIM (SUBSTR (CASE WHEN v_observacoes <> ' ' THEN v_observacoes || CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END ELSE '' END || v_aux_observacoes, 1, 4000));
      END IF;
    END IF;
  END IF;
  -- Formula Tinta
  IF p_item_idFormulaTinta <> 0 THEN
    SELECT TRIM (UPPER (marcTint.descricao))
      || ' ' || TRIM (formTint.descricaoCor)
      || CASE WHEN formTint.descricaoCor = formTint.descricaoNomeCor THEN '' ELSE ' ' || TRIM (formTint.descricaoNomeCor) END
      || ' Base: ' || TRIM (baseTint.baseTinta)
      || ' Emb.: ' || TRIM (embTint.descricao) 
    INTO v_aux_observacoes
    FROM CAFORMULASTINTAS formTint
    JOIN SIMARCASTINTAS marcTint
    ON marcTint.marcaTinta = formTint.marcaTinta
    JOIN CABASESTINTAS baseTint
    ON baseTint.idBaseTinta = formTint.idBaseTinta
    JOIN SIEMBALAGENSTINTAS embTint
    ON embTint.embalagemTinta = baseTint.embalagemTinta
    WHERE formTint.idFormulaTinta = p_item_idFormulaTinta;
    IF v_aux_observacoes <> ' ' THEN
      v_observacoes := RTRIM (SUBSTR (CASE WHEN v_observacoes <> ' ' THEN v_observacoes || CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END ELSE '' END || v_aux_observacoes, 1, 4000));
    END IF;
  END IF;
  -- Personalização
  IF p_item_personalizacao <> 0 THEN
    SELECT descricao
    INTO v_aux_observacoes
    FROM PAPERSONALIZACOES
    WHERE personalizacao = p_item_personalizacao;
    IF v_aux_observacoes <> ' ' THEN
      v_observacoes := RTRIM (SUBSTR (CASE WHEN v_observacoes <> ' ' THEN v_observacoes || CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END ELSE '' END || v_aux_observacoes, 1, 4000));
    END IF;
  END IF;
  -- Lote
  IF p_item_idLoteEstoque <> 0 THEN
    SELECT 'Lote: ' || loteEstoque
    INTO v_aux_observacoes
    FROM CAGRADEPRODUTOXLOTESESTOQ
    WHERE idLoteEstoque = p_item_idLoteEstoque;
    IF v_aux_observacoes <> ' ' THEN
      v_observacoes := RTRIM (SUBSTR (CASE WHEN v_observacoes <> ' ' THEN v_observacoes || CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END ELSE '' END || v_aux_observacoes, 1, 4000));
    END IF;
  END IF;
  -- Espessura / Largura / Comprimento
  IF p_item_controleQuantidade BETWEEN 2 AND 3 THEN
    v_observacoes := RTRIM (SUBSTR (CASE WHEN v_observacoes <> ' ' THEN v_observacoes || CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END ELSE '' END
      || 'Espessura ' || RTRIM (TO_CHAR (p_item_altura, 'FM999G999G999G999G999G990D999999999999999999'), TO_CHAR (0, 'D')) || ' CM'
      || ' X Largura ' || RTRIM (TO_CHAR (p_item_largura, 'FM999G999G999G999G999G990D999999999999999999'), TO_CHAR (0, 'D')) || ' CM', 1, 4000));
    IF p_item_controleQuantidade = 3 THEN
      v_observacoes := RTRIM (SUBSTR (v_observacoes || ' X Comprimento ' || RTRIM (TO_CHAR (p_item_comprimento, 'FM999G999G999G999G999G990D999999999999999999'), TO_CHAR (0, 'D')) || ' MT', 1, 4000));
    END IF;
  END IF;
  -- Volumes
  IF p_item_loteMultiplo <> 0 THEN
    v_observacoes := RTRIM (SUBSTR (CASE WHEN v_observacoes <> ' ' THEN v_observacoes || CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END ELSE '' END || 'Volumes: ' || RTRIM (TO_CHAR (( p_item_quantidade / p_item_loteMultiplo), 'FM999G999G999G999G999G990')), 1, 4000));
  END IF;
  -- Composição preço
  IF p_tempComp_nomeTempComposicao IS NOT NULL AND p_tempComp_nomeTempComposicao <> ' ' THEN
    SELECT COALESCE (LISTAGG ((RTRIM (comp.descricao) || CASE WHEN comp.informaQuantidade = 1 THEN ' ' || RTRIM (TO_CHAR (temp.quantidade, 'FM999G999G999G999G999G990D999999999999999999'), TO_CHAR (0, 'D')) ELSE '' END), CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END) WITHIN GROUP (ORDER BY comp.sequencia), ' ') numeros
    INTO v_aux_observacoes
    FROM TEMPCOMPOSICAOPRECO temp
    JOIN CAPRODUTOXCOMPOSICOESPREC comp
    ON comp.composicaoPreco = temp.composicaoPreco
    WHERE temp.sessaoClient = p_sessaoClient
    AND temp.nomeTempComposicao = p_tempComp_nomeTempComposicao
    AND temp.sequencia = p_tempComp_sequencia
    AND temp.selecionado = 1;
  ELSIF p_Doc_Orc_Pre_Sep_Transf = 'D' AND p_item_id <> 0 THEN
    SELECT COALESCE (LISTAGG ((RTRIM (comp.descricao) || CASE WHEN comp.informaQuantidade = 1 THEN ' ' || RTRIM (TO_CHAR (compDoc.quantidade, 'FM999G999G999G999G999G990D999999999999999999'), TO_CHAR (0, 'D')) ELSE '' END), CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END) WITHIN GROUP (ORDER BY comp.sequencia, compDoc.id), ' ') numeros
    INTO v_aux_observacoes
    FROM MODOCFISCALXCOMPOSICOESPR compDoc
    JOIN CAPRODUTOXCOMPOSICOESPREC comp
    ON comp.composicaoPreco = compDoc.composicaoPreco
    WHERE compDoc.idItemDocFiscal = p_item_id
    AND compDoc.selecionado = 1;
  ELSIF p_Doc_Orc_Pre_Sep_Transf = 'O' AND p_item_id <> 0 THEN
    SELECT COALESCE (LISTAGG ((RTRIM (comp.descricao) || CASE WHEN comp.informaQuantidade = 1 THEN ' ' || RTRIM (TO_CHAR (compDoc.quantidade, 'FM999G999G999G999G999G990D999999999999999999'), TO_CHAR (0, 'D')) ELSE '' END), CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END) WITHIN GROUP (ORDER BY comp.sequencia, compDoc.id), ' ') numeros
    INTO v_aux_observacoes
    FROM MOORCAMENTOXCOMPOSICOESPR compDoc
    JOIN CAPRODUTOXCOMPOSICOESPREC comp
    ON comp.composicaoPreco = compDoc.composicaoPreco
    WHERE compDoc.idItemOrcamento = p_item_id
    AND compDoc.selecionado = 1;
  ELSIF p_Doc_Orc_Pre_Sep_Transf = 'P' AND p_item_id <> 0 THEN
    SELECT COALESCE (LISTAGG ((RTRIM (comp.descricao) || CASE WHEN comp.informaQuantidade = 1 THEN ' ' || RTRIM (TO_CHAR (compDoc.quantidade, 'FM999G999G999G999G999G990D999999999999999999'), TO_CHAR (0, 'D')) ELSE '' END), CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END) WITHIN GROUP (ORDER BY comp.sequencia, compDoc.id), ' ') numeros
    INTO v_aux_observacoes
    FROM MOPREDOCUMXCOMPOSICOESPR compDoc
    JOIN CAPRODUTOXCOMPOSICOESPREC comp
    ON comp.composicaoPreco = compDoc.composicaoPreco
    WHERE compDoc.idItemPreDocumento = p_item_id
    AND compDoc.selecionado = 1;
  ELSE
    v_aux_observacoes := ' ';
  END IF;
  IF NOT(v_aux_observacoes IS NULL) AND v_aux_observacoes <> ' ' THEN
    v_observacoes := RTRIM (SUBSTR (CASE WHEN v_observacoes <> ' ' THEN v_observacoes || CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END ELSE '' END || v_aux_observacoes, 1, 4000));
  END IF;
  -- Observações Digitadas
  IF NOT(p_item_observacoesDigitadas IS NULL) AND p_item_observacoesDigitadas <> ' ' THEN
    v_observacoes := RTRIM (SUBSTR (CASE WHEN v_observacoes <> ' ' THEN v_observacoes || CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END ELSE '' END || p_item_observacoesDigitadas, 1, 4000));
  END IF;
  -- Números Série
  IF p_item_id <> 0 THEN
    IF p_Doc_Orc_Pre_Sep_Transf = 'D' THEN
      SELECT COALESCE (LISTAGG (ns.numeroSerie, CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END) WITHIN GROUP (ORDER BY ns.numeroSerie), ' ')
      INTO v_aux_observacoes
      FROM MODOCFISCALXNUMEROSSERIE nsDoc
      JOIN CAGRADEPRODUTOXNUMEROSSER ns
      ON ns.idNumeroSerie = nsDoc.idNumeroSerie
      WHERE nsDoc.idItemDocFiscal = p_item_id;
    ELSIF p_Doc_Orc_Pre_Sep_Transf = 'O' THEN
      SELECT COALESCE (LISTAGG (ns.numeroSerie, CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END) WITHIN GROUP (ORDER BY ns.numeroSerie), ' ')
      INTO v_aux_observacoes
      FROM MOORCAMENTOXNUMEROSSERIE nsDoc
      JOIN CAGRADEPRODUTOXNUMEROSSER ns
      ON ns.idNumeroSerie = nsDoc.idNumeroSerie
      WHERE nsDoc.idItemOrcamento = p_item_id;
    ELSIF p_Doc_Orc_Pre_Sep_Transf = 'P' THEN
      SELECT COALESCE (LISTAGG (ns.numeroSerie, CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END) WITHIN GROUP (ORDER BY ns.numeroSerie), ' ')
      INTO v_aux_observacoes
      FROM MOPREDOCUMXNUMEROSSERIE nsDoc
      JOIN CAGRADEPRODUTOXNUMEROSSER ns
      ON ns.idNumeroSerie = nsDoc.idNumeroSerie
      WHERE nsDoc.idItemPreDocumento = p_item_id;
    ELSIF p_Doc_Orc_Pre_Sep_Transf = 'S' THEN
      SELECT COALESCE (LISTAGG (ns.numeroSerie, CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END) WITHIN GROUP (ORDER BY ns.numeroSerie), ' ')
      INTO v_aux_observacoes
      FROM MOSEPARACAOXNUMEROSSERIE nsDoc
      JOIN CAGRADEPRODUTOXNUMEROSSER ns
      ON ns.idNumeroSerie = nsDoc.idNumeroSerie
      WHERE nsDoc.idItemSeparacao = p_item_id;
    ELSIF p_Doc_Orc_Pre_Sep_Transf = 'T' THEN
      SELECT COALESCE (LISTAGG (ns.numeroSerie, CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END) WITHIN GROUP (ORDER BY ns.numeroSerie), ' ')
      INTO v_aux_observacoes
      FROM MODOCTRANSFXNUMEROSSERIE nsDoc
      JOIN CAGRADEPRODUTOXNUMEROSSER ns
      ON ns.idNumeroSerie = nsDoc.idNumeroSerie
      WHERE nsDoc.idItemDocTransferencia = p_item_id;
    ELSE
      v_aux_observacoes := ' ';
    END IF;
    IF NOT(v_aux_observacoes IS NULL) AND v_aux_observacoes <> ' ' THEN
      v_observacoes := RTRIM (SUBSTR (CASE WHEN v_observacoes <> ' ' THEN v_observacoes || CASE WHEN p_config_418_obs_efetarEnter = 1 THEN '
' ELSE ' ' END ELSE '' END || 'Seriais: ' || v_aux_observacoes, 1, 4000));
    END IF;
  END IF;
  IF v_observacoes IS NULL THEN
    v_observacoes := ' ';
  END IF;
  RETURN v_observacoes;
END;

/

create or replace PROCEDURE ADD_DOC_FISC_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_227_manterPessoaOrcam IN NUMBER,
  p_config_230_etapaPedComprParc IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     IN NUMBER,
  p_config_418_obs_efetarEnter   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, -- B = Balanço, D = Documento Fiscal, G = Grade DF-e, O = Orçamento, P, Pré-Documento, T = Transferência
  p_idItemReferenciado           IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_tempComp_nomeTempComposicao  IN VARCHAR2,
  p_tempComp_sequencia           IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_idDocumentoFiscal       IN NUMBER,
  p_item_pedidoCompraFornecedor  IN VARCHAR2,
  p_item_sequenciaPedidoCompraFo IN NUMBER,
  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_quantidadeExtemporanea  IN NUMBER,
  p_item_acrescimoUnitarioExtemp IN NUMBER,
  p_item_valorAcrescimoExtempIte IN NUMBER,
  p_item_valorDescontoCustoOpIte IN NUMBER,
  p_item_valorAcrescimoCustoOpIt 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_valorAcrescimoExtempGer IN NUMBER,
  p_item_valorDescontoCustoOpGer IN NUMBER,
  p_item_valorAcrescimoCustoOpGe IN NUMBER,
  p_item_valorDescontoPagamento  IN NUMBER,
  p_item_valorOutrasDespPagament IN NUMBER,
  p_item_valorJurosPagamento     IN NUMBER,
  p_item_percentualDevolucao     IN NUMBER,
  p_item_valorIPIDevolucao       IN NUMBER,
  p_item_operacaoFiscal          IN NUMBER,
  p_item_movimentaEstoque        IN NUMBER,
  p_item_movimentaEstoqueFiscal  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_stICMSEscrituracao      IN CHAR,
  p_item_reducaoBaseICMSEscritur IN NUMBER,
  p_item_aliquotaICMSEscrituraca IN NUMBER,
  p_item_diferimentoICMSEscritur IN NUMBER,
  p_item_margemValorAdicSTEscrit IN NUMBER,
  p_item_reducaoBaseSTEscriturac IN NUMBER,
  p_item_aliquotaICMSSTEscritura IN NUMBER,
  p_item_somarICMSST             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_baseICMSEscrituracao    IN NUMBER,
  p_item_valorICMSEscrituracao   IN NUMBER,
  p_item_valorICMSDesonEscritura IN NUMBER,
  p_item_baseICMSSTEscrituracao  IN NUMBER,
  p_item_valorICMSSTEscrituracao 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_idItemDocFiscal       IN VARCHAR2,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER,
  r_item_idItemDocFiscal         OUT NUMBER,
  r_buffer_idItemDocFiscal       OUT VARCHAR2,
  r_valorInserido                OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_finalidadeNota           CHAR (1);
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_nfFornecedor             NUMBER;
  v_cab_documentoFiscal          NUMBER;
  v_cab_estabelecimento          NUMBER;
  v_cab_dataEmissao              DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_vendaConsumidor          NUMBER;
  v_cab_enderecoEntregaPessoa    NUMBER;
  v_cab_municipioFatoGerador     NUMBER;
  v_cab_localDestinoOperacao     CHAR (1);
  v_cab_indicadorConsumidorFinal CHAR (1);
  v_cab_projeto                  VARCHAR2 (60);
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  v_cab_situacaoDocumentoFiscal  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_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota 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_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_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_item_sequencia               NUMBER;
  v_item_cancelado               NUMBER;
  v_item_quantidadeDevolvidaRet  NUMBER;
  v_item_precoUnitario           NUMBER;
  v_item_precoUnitarioConvertido NUMBER;
  v_item_valorProdutoServicoBrut NUMBER;
  v_item_valorProdutoServico     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_movimentaEstoqueFiscal  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_stICMSEscrituracao      CHAR (2);
  v_item_reducaoBaseICMSEscritur NUMBER;
  v_item_aliquotaICMSEscrituraca NUMBER;
  v_item_diferimentoICMSEscritur NUMBER;
  v_item_margemValorAdicSTEscrit NUMBER;
  v_item_reducaoBaseSTEscriturac NUMBER;
  v_item_aliquotaICMSSTEscritura NUMBER;
  v_item_somarICMSST             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_baseICMSEscrituracao    NUMBER;
  v_item_valorICMSEscrituracao   NUMBER;
  v_item_valorICMSDesonEscritura NUMBER;
  v_item_baseICMSSTEscrituracao  NUMBER;
  v_item_valorICMSSTEscrituracao 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_item_valorDescontoCustoOpTot NUMBER;
  v_item_valorAcrescimoCustoOpTo NUMBER;
  v_item_precoCustoOperacao      NUMBER;
  v_item_valorCustoOperacao      NUMBER;
  v_item_precoCMV                NUMBER;
  v_item_valorCMV                NUMBER;
  v_item_valorAcrescimoExtempSub NUMBER;
  v_item_valorAcrescimoExtempTot 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_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_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  r_item_idItemDocFiscal := p_item_idItemDocFiscal;
  r_buffer_idItemDocFiscal := p_buffer_idItemDocFiscal;
  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.devolucaoAnulacaoRetorno,
    cab.finalidadeNota,
    cab.atualizaCustoMedio,
    cab.nfFornecedor,
    cab.documentoFiscal,
    cab.estabelecimento,
    cab.dataEmissao,
    cab.pessoa,
    cab.vendaConsumidor,
    cab.enderecoEntregaPessoa,
    cab.municipioFatoGerador,
    cab.localDestinoOperacao,
    cab.indicadorConsumidorFinal,
    cab.projeto,
    cab.modalidadeFrete,
    cab.tipoPagamentoFrete,
    cab.situacaoDocumentoFiscal,
    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,
    cab.valorDescontoCustoOpItem,
    cab.valorDescontoCustoOpGeral,
    cab.valorDescontoCustoOpTotal,
    cab.valorAcrescimoCustoOpItem,
    cab.valorAcrescimoCustoOpGeral,
    cab.valorAcrescimoCustoOpTotal,
    cab.valorCustoOperacao,
    cab.valorCMV,
    cab.quantidadeExtemporanea,
    cab.valorAcrescimoExtempSubtotal,
    cab.valorAcrescimoExtempItem,
    cab.valorAcrescimoExtempGeral,
    cab.valorAcrescimoExtempTotal,
    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
  INTO
    v_cab_origemDocumento,
    v_cab_tipoDocumento,
    v_cab_entradaSaida,
    v_cab_devolucaoAnulacaoRetorno,
    v_cab_finalidadeNota,
    v_cab_atualizaCustoMedio,
    v_cab_nfFornecedor,
    v_cab_documentoFiscal,
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_pessoa,
    v_cab_vendaConsumidor,
    v_cab_enderecoEntregaPessoa,
    v_cab_municipioFatoGerador,
    v_cab_localDestinoOperacao,
    v_cab_indicadorConsumidorFinal,
    v_cab_projeto,
    v_cab_modalidadeFrete,
    v_cab_tipoPagamentoFrete,
    v_cab_situacaoDocumentoFiscal,
    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_cab_valorDescontoCustoOpItem,
    v_cab_valorDescontoCustoOpGera,
    v_cab_valorDescontoCustoOpTota,
    v_cab_valorAcrescimoCustoOpIte,
    v_cab_valorAcrescimoCustoOpGer,
    v_cab_valorAcrescimoCustoOpTot,
    v_cab_valorCustoOperacao,
    v_cab_valorCMV,
    v_cab_quantidadeExtemporanea,
    v_cab_valorAcrescimoExtempSubt,
    v_cab_valorAcrescimoExtempItem,
    v_cab_valorAcrescimoExtempGera,
    v_cab_valorAcrescimoExtempTota,
    v_est_grupoFiscal,
    v_pessEst_regimeTributario,
    v_munEndEst_uf,
    v_pess_indicadorInscricaoEstad,
    v_endPess_enderecoPessoa,
    v_munEndPess_uf,
    v_munEndEntr_uf
  FROM MODOCUMENTOSFISCAIS 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
  WHERE cab.idDocumentoFiscal = p_item_idDocumentoFiscal;
  v_ini_cab_valorFreteItem := v_cab_valorFreteItem;
  v_ini_cab_valorFreteGeral := v_cab_valorFreteGeral;
  SELECT
    diminuiDescontoPrUnit,
    somaAcrescimosPrUnit,
    somaFreteSeguroPrUnit
  INTO
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit
  FROM PAMODELOSDOCUMENTO
  WHERE modeloDocumento = p_item_modeloDocumento;
  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_valorFreteTotal          := 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_item_quantidadeDevolvidaRet  := 0;
  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_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_movimentaEstoqueFiscal  := p_item_movimentaEstoqueFiscal;
  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_stICMSEscrituracao      := p_item_stICMSEscrituracao;
  v_item_reducaoBaseICMSEscritur := p_item_reducaoBaseICMSEscritur;
  v_item_aliquotaICMSEscrituraca := p_item_aliquotaICMSEscrituraca;
  v_item_diferimentoICMSEscritur := p_item_diferimentoICMSEscritur;
  v_item_margemValorAdicSTEscrit := p_item_margemValorAdicSTEscrit;
  v_item_reducaoBaseSTEscriturac := p_item_reducaoBaseSTEscriturac;
  v_item_aliquotaICMSSTEscritura := p_item_aliquotaICMSSTEscritura;
  v_item_somarICMSST             := p_item_somarICMSST;
  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_baseICMSEscrituracao    := p_item_baseICMSEscrituracao;
  v_item_valorICMSEscrituracao   := p_item_valorICMSEscrituracao;
  v_item_valorICMSDesonEscritura := p_item_valorICMSDesonEscritura;
  v_item_baseICMSSTEscrituracao  := p_item_baseICMSSTEscrituracao;
  v_item_valorICMSSTEscrituracao := p_item_valorICMSSTEscrituracao;
  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;
  IF p_manterFinanceiro_Retotalizar = 0 THEN
    SELECT COALESCE (MAX(1), 0)
    INTO v_cab_promocaoExiste
    FROM MODOCFISCALXPROMOCOES
    WHERE idDocumentoFiscal = p_item_idDocumentoFiscal;
  END IF;
  IF p_item_idItemDocFiscal > 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.quantidadeDevolvidaRetornada,
        a.pesoLiquido,
        a.pesoBruto,
        a.valorProdutoServicoBruto,
        a.valorProdutoServico,
        a.valorDescontoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.quantidadeExtemporanea,
        a.valorAcrescimoExtempSubtotal,
        a.valorAcrescimoExtempItem,
        a.valorDescontoCustoOpItem,
        a.valorAcrescimoCustoOpItem,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorAcrescimoExtempGeral,
        a.valorDescontoCustoOpGeral,
        a.valorAcrescimoCustoOpGeral,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.valorFreteTotal,
        a.valorSeguroTotal,
        a.valorDescontoTotal,
        a.valorOutrasDespesasTotal,
        a.valorAdicFreteMarinhaMerTotal,
        a.valorDespesasAduaneirasTotal,
        a.valorAcrescimoExtempTotal,
        a.valorDescontoCustoOpTotal,
        a.valorAcrescimoCustoOpTotal,
        a.operacaoFiscal,
        a.movimentaEstoque,
        a.movimentaEstoqueFiscal,
        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.stICMSEscrituracao,
        a.reducaoBaseICMSEscrituracao,
        a.aliquotaICMSEscrituracao,
        a.diferimentoICMSEscrituracao,
        a.margemValorAdicSTEscrituracao,
        a.reducaoBaseSTEscrituracao,
        a.aliquotaICMSSTEscrituracao,
        a.somarICMSST,
        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.baseICMSEscrituracao,
        a.valorICMSEscrituracao,
        a.valorICMSDesonEscrituracao,
        a.baseICMSSTEscrituracao,
        a.valorICMSSTEscrituracao,
        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,
        a.valorCustoOperacao,
        a.valorCMV,
        prod.tipoProduto
      FROM MODOCFISCALXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      WHERE a.idItemDocFiscal = p_item_idItemDocFiscal)
    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_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_item_quantidadeDevolvidaRet := a.quantidadeDevolvidaRetornada;
      IF p_buscarAliquotas_CalcularImp ='T'
      THEN
        v_item_movimentaEstoque        := a.movimentaEstoque;
        v_item_movimentaEstoqueFiscal  := a.movimentaEstoqueFiscal;
        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_stICMSEscrituracao      := a.stICMSEscrituracao;
        v_item_reducaoBaseICMSEscritur := a.reducaoBaseICMSEscrituracao;
        v_item_aliquotaICMSEscrituraca := a.aliquotaICMSEscrituracao;
        v_item_diferimentoICMSEscritur := a.diferimentoICMSEscrituracao;
        v_item_margemValorAdicSTEscrit := a.margemValorAdicSTEscrituracao;
        v_item_reducaoBaseSTEscriturac := a.reducaoBaseSTEscrituracao;
        v_item_aliquotaICMSSTEscritura := a.aliquotaICMSSTEscrituracao;
        v_item_somarICMSST             := a.somarICMSST;
        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_baseICMSEscrituracao    := a.baseICMSEscrituracao;
        v_item_valorICMSEscrituracao   := a.valorICMSEscrituracao;
        v_item_valorICMSDesonEscritura := a.valorICMSDesonEscrituracao;
        v_item_baseICMSSTEscrituracao  := a.baseICMSSTEscrituracao;
        v_item_valorICMSSTEscrituracao := a.valorICMSSTEscrituracao;
        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 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 <> p_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;
        v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
        v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
        v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
        v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
        v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
        v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
        v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
        v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
        v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
        v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
        v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
        v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
        v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      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,
    p_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);
  v_item_valorAcrescimoExtempSub := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
    p_item_quantidade,
    v_item_precoUnitario,
    p_item_quantidadeExtemporanea,
    p_item_acrescimoUnitarioExtemp);
  v_item_valorAcrescimoExtempTot := FUNC_ADD_CALC_EXTEMP_TOTAL(
    v_item_valorAcrescimoExtempSub,
    p_item_valorAcrescimoExtempIte,
    p_item_valorAcrescimoExtempGer);
  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,
        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 = CASE WHEN v_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
      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 / ((v_combo_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 / ((v_combo_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,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_estabelecimento,
        NULL, -- p_cab_dataPrecoInicial
        TRUNC (SYSDATE), -- p_cab_dataPrecoFinal
        v_cab_pessoa,
        v_cab_projeto,
        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_DOC_FISC_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_227_manterPessoaOrcam,
        p_config_230_etapaPedComprParc,
        p_config_362_calcCustoPorGrade,
        p_config_378_calcularVolumes,
        p_config_413_obs_add_marca,
        p_config_418_obs_efetarEnter,
        p_manterFinanceiro_Retotalizar,
        'S', -- p_buscarAliquotas_CalcularImp
        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_calcularImpostos,
        0, -- p_item_idItemDocFiscal
        p_item_idDocumentoFiscal,
        p_item_pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo,
        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
        CASE
          WHEN p_item_quantidade = 0
          THEN 0
          ELSE ROUND(p_item_quantidadeExtemporanea * a.quantidade / p_item_quantidade, 2)
        END, -- p_item_quantidadeExtemporanea
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_acrescimoUnitarioExtemp
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_acrescimoUnitarioExtemp
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoExtempIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpIt
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpIt
        p_item_observacoesDigitadas,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorFreteGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_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_valorAcrescimoExtempGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpGe
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpGe
        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
        p_item_percentualDevolucao,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorIPIDevolucao
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorIPIDevolucao,
        v_combo_operacaoFiscal,
        p_item_movimentaEstoque,
        p_item_movimentaEstoqueFiscal,
        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
        '  ', -- p_item_stICMSEscrituracao
        0, -- p_item_reducaoBaseICMSEscritur
        0, -- p_item_aliquotaICMSEscrituraca
        0, -- p_item_diferimentoICMSEscritur
        0, -- p_item_margemValorAdicSTEscrit
        0, -- p_item_reducaoBaseSTEscriturac
        0, -- p_item_aliquotaICMSSTEscritura
        0, -- p_item_somarICMSST
        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_baseICMSEscrituracao
        0, -- p_item_valorICMSEscrituracao
        0, -- p_item_valorICMSDesonEscritura
        0, -- p_item_baseICMSSTEscrituracao
        0, -- p_item_valorICMSSTEscrituracao
        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_idItemDocFiscal,
        /* Retornos */
        r_calcularImpostos,
        v_auxNumber, -- r_item_idItemDocFiscal
        r_buffer_idItemDocFiscal,
        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_DOC_FISC_ITEM_COMBO_RESID (
        p_item_idDocumentoFiscal,
        v_item_valorProdutoServico,
        p_item_valorDescontoItem,
        p_item_valorAcrescimoItem,
        v_modDoc_diminuiDescontoPrUnit,
        v_modDoc_somaAcrescimosPrUnit,
        r_buffer_idItemDocFiscal,
        r_valorInserido);
      r_calcularImpostos := 1;
    END IF;
  ELSE
    IF r_item_idItemDocFiscal <= 0 THEN
      r_item_idItemDocFiscal := FUNC_ADD_BUSCA_PROXIMO_ID ('MODOCFISCALXITENS', 'idItemDocFiscal', 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
          OR p_item_valorAcrescimoExtempGer <> 0
          OR p_item_valorDescontoCustoOpGer <> 0
          OR p_item_valorAcrescimoCustoOpGe <> 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_DOC_FISC_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          p_item_idDocumentoFiscal,
          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 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,
        p_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,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_finalidadeNota,
        v_cab_estabelecimento,
        v_cab_nfFornecedor,
        SYSDATE, -- p_cab_dataEmissao
        v_cab_pessoa,
        v_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,
        p_item_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
        1, -- 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_item_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_item_stICMSEscrituracao,
        v_item_reducaoBaseICMSEscritur,
        v_item_aliquotaICMSEscrituraca,
        v_item_diferimentoICMSEscritur,
        v_item_margemValorAdicSTEscrit,
        v_item_reducaoBaseSTEscriturac,
        v_item_aliquotaICMSSTEscritura,
        v_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,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_estabelecimento,
        v_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
        p_item_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
        1, -- p_calcularICMSEscrituracao
        v_item_stICMSEscrituracao,
        v_item_reducaoBaseICMSEscritur,
        v_item_aliquotaICMSEscrituraca,
        v_item_diferimentoICMSEscritur,
        0, -- p_baseICMSEscrituracao
        0, -- p_valorICMSEscrituracao
        0, -- p_valorICMSDesonEscrituracao
        1, -- p_calcularICMSSTEscrituracao
        v_item_margemValorAdicSTEscrit,
        v_item_reducaoBaseSTEscriturac,
        v_item_aliquotaICMSSTEscritura,
        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_item_baseICMSEscrituracao,
        v_item_valorICMSEscrituracao,
        v_item_valorICMSDesonEscritura,
        v_item_baseICMSSTEscrituracao,
        v_item_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,
      v_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,
      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,
      v_item_valorICMSSTEscrituracao,
      v_item_somarICMSST,
      v_item_valorAcrescimoExtempTot,
      v_modDoc_geraFinanceiro);
    v_item_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
      v_cab_nfFornecedor,
      v_cab_tipoPagamentoFrete,
      v_item_valorProdutoServico,
      v_item_valorFreteTotal,
      v_item_valorSeguroTotal,
      v_item_valorDescontoTotal,
      v_item_valorOutrasDespesasTot,
      p_item_valorIPIDevolucao,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      v_item_valorICMSST,
      v_item_valorICMSSTEscrituracao,
      v_item_somarICMSST);
    ADD_CALCULA_CUSTO_CMV (
      v_cab_atualizaCustoMedio,
      v_cab_estabelecimento,
      v_cab_nfFornecedor,
      p_item_modeloDocumento,
      p_item_quantidade,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      p_item_valorIPIDevolucao,
      v_item_valorPIS,
      v_item_valorPISST,
      v_item_valorCOFINS,
      v_item_valorCOFINSST,
      v_item_valorCreditoSimplesNac,
      v_item_valorICMS,
      v_item_valorICMSST,
      v_item_valorICMSSTEscrituracao,
      v_item_valorLiquidoItem,
      p_item_valorDescontoCustoOpIte,
      p_item_valorDescontoCustoOpGer,
      p_item_valorAcrescimoCustoOpIt,
      p_item_valorAcrescimoCustoOpGe,
      v_item_valorAcrescimoExtempTot,
      v_item_valorDescontoCustoOpTot,
      v_item_valorAcrescimoCustoOpTo,
      v_item_precoCustoOperacao,
      v_item_valorCustoOperacao,
      v_item_precoCMV,
      v_item_valorCMV);
    IF v_inserindoItem = 1 THEN
      SELECT COALESCE (MAX (sequencia),0) + 1
      INTO v_item_sequencia
      FROM MODOCFISCALXITENS
      WHERE idDocumentoFiscal = p_item_idDocumentoFiscal;
      v_cab_ultimoVendedorItem := p_item_vendedor;
    END IF;
    IF v_item_cancelado = 0 THEN
      IF p_manterFinanceiro_Retotalizar <> 2 THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume + TRUNC(CASE WHEN p_item_controleQuantidade = 1 AND p_item_loteMultiplo <> 0 THEN p_item_quantidade / p_item_loteMultiplo ELSE p_item_quantidadeConvertida END,0);
        END IF;
        v_cab_pesoLiquido := v_cab_pesoLiquido + p_item_pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto + p_item_pesoBruto;
      END IF;
      v_cab_quantidade := v_cab_quantidade + p_item_quantidadeConvertida;
      IF v_prod_tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorServicos := v_cab_valorServicos + v_item_valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos + p_item_valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorProdutos := v_cab_valorProdutos + v_item_valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos + p_item_valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem + p_item_valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem + p_item_valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem + p_item_valorAdicFreteMarItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem + p_item_valorDespesasAduanItem;
      v_cab_valorFreteGeral := v_cab_valorFreteGeral + p_item_valorFreteGeral;
      v_cab_valorSeguroGeral := v_cab_valorSeguroGeral + p_item_valorSeguroGeral;
      v_cab_valorDescontoGeral := v_cab_valorDescontoGeral + v_item_valorDescontoGeral;
      v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral + p_item_valorOutrasDespesasGer;
      v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral + p_item_valorAdicFreteMarGeral;
      v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral + p_item_valorDespesasAduanGeral;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento + v_item_valorBasePagamento;
      IF p_item_usarPrecoAVista = 1
        AND v_item_geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo + v_item_valorProdutoServico - v_item_valorDescontoTotal + v_item_valorOutrasDespesasTot;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento + v_item_valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento + v_item_valorOutrasDespPagament;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento + v_item_valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal + v_item_valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal + v_item_valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal + v_item_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_item_valorOutrasDespesasTot;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal + v_item_valorAdicFreteMarTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal + v_item_valorDespesasAduanTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem + v_item_valorLiquidoItem;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem + p_item_valorDescontoCustoOpIte;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera + p_item_valorDescontoCustoOpGer;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota + v_item_valorDescontoCustoOpTot;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte + p_item_valorAcrescimoCustoOpIt;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer + p_item_valorAcrescimoCustoOpGe;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot + v_item_valorAcrescimoCustoOpTo;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao + v_item_valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV + v_item_valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea + p_item_quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt + v_item_valorAcrescimoExtempSub;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem + p_item_valorAcrescimoExtempIte;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera + p_item_valorAcrescimoExtempGer;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota + v_item_valorAcrescimoExtempTot;
    END IF;
    UPDATE MODOCUMENTOSFISCAIS SET
      modalidadeFrete               = v_cab_modalidadeFrete,
      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,
      valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
      valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
      valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
      valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
      valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
      valorCustoOperacao            = v_cab_valorCustoOperacao,
      valorCMV                      = v_cab_valorCMV,
      quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
      valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
      valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
      valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
    WHERE idDocumentoFiscal = p_item_idDocumentoFiscal;
    IF p_item_idItemDocFiscal > 0 THEN
      DELETE MODOCFISCALXCOMPOSICOESPR compDoc
      WHERE compDoc.idItemDocFiscal = p_item_idItemDocFiscal
      AND EXISTS(
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.produto = comp.produto
        WHERE comp.composicaoPreco = compDoc.composicaoPreco
        AND gradProd.gradeProduto <> p_item_gradeProduto);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      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_413_obs_add_marca,
      p_config_418_obs_efetarEnter,
      ' ',
      0,
      'D',
      p_item_idItemDocFiscal,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    MERGE INTO MODOCFISCALXITENS a USING (
      SELECT
        r_item_idItemDocFiscal         idItemDocFiscal,
        p_item_idDocumentoFiscal       idDocumentoFiscal,
        v_item_sequencia               sequencia,
        v_item_cancelado               cancelado,
        p_item_pedidoCompraFornecedor  pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo sequenciaPedidoCompraFornec,
        p_item_modeloDocumento         modeloDocumento,
        p_item_estabelecimentoOriginal estabelecimentoOriginal,
        p_item_vendedor                vendedor,
        p_item_gradeProduto            gradeProduto,
        p_item_idFormulaTinta          idFormulaTinta,
        p_item_personalizacao          personalizacao,
        p_item_idLoteEstoque           idLoteEstoque,
        p_item_operacaoFiscal          operacaoFiscal,
        v_item_movimentaEstoque        movimentaEstoque,
        v_item_movimentaEstoqueFiscal  movimentaEstoqueFiscal,
        v_item_geraFinanceiro          geraFinanceiro,
        p_item_localEstoque            localEstoque,
        p_item_pessoaParticipante      pessoaParticipante,
        p_item_controleQuantidade      controleQuantidade,
        p_item_unidadeMedidaConversao  unidadeMedidaConversao,
        p_item_conversorQuantidade     conversorQuantidade,
        p_item_loteMinimo              loteMinimo,
        p_item_loteMultiplo            loteMultiplo,
        p_item_altura                  altura,
        p_item_largura                 largura,
        p_item_comprimento             comprimento,
        p_item_pecas                   pecas,
        p_item_quantidade              quantidade,
        p_item_quantidadeConvertida    quantidadeConvertida,
        v_item_quantidadeDevolvidaRet  quantidadeDevolvidaRetornada,
        p_item_percentualDevolucao     percentualDevolucao,
        p_item_pesoLiquido             pesoLiquido,
        p_item_pesoBruto               pesoBruto,
        p_item_tipoPreco               tipoPreco,
        p_item_tabelaPreco             tabelaPreco,
        p_item_precoSugestaoAPrazo     precoSugestaoAPrazo,
        p_item_precoSugestaoAVista     precoSugestaoAVista,
        p_item_precoDesconto           precoDesconto,
        p_item_precoMinimo             precoMinimo,
        p_item_usarPrecoAVista         usarPrecoAVista,
        p_item_precoUnitarioBruto      precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos acrescimoUnitarioComposicao,
        v_item_precoUnitario           precoUnitario,
        v_item_precoUnitarioConvertido precoUnitarioConvertido,
        v_item_valorProdutoServicoBrut valorProdutoServicoBruto,
        v_item_valorProdutoServico     valorProdutoServico,
        p_item_percDescontoItem        percDescontoItem,
        p_item_valorDescontoItem       valorDescontoItem,
        p_item_percAcrescimoItem       percAcrescimoItem,
        p_item_valorAcrescimoItem      valorAcrescimoItem,
        p_item_valorFreteItem          valorFreteItem,
        p_item_valorSeguroItem         valorSeguroItem,
        p_item_valorAdicFreteMarItem   valorAdicFreteMarinhaMerItem,
        p_item_valorDespesasAduanItem  valorDespesasAduaneirasItem,
        p_item_valorFreteGeral         valorFreteGeral,
        p_item_valorSeguroGeral        valorSeguroGeral,
        v_item_valorDescontoGeral      valorDescontoGeral,
        p_item_valorOutrasDespesasGer  valorOutrasDespesasGeral,
        p_item_valorAdicFreteMarGeral  valorAdicFreteMarinhaMerGeral,
        p_item_valorDespesasAduanGeral valorDespesasAduaneirasGeral,
        v_item_valorBasePagamento      valorBasePagamento,
        v_item_valorDescontoPagamento  valorDescontoPagamento,
        v_item_valorOutrasDespPagament valorOutrasDespesasPagamento,
        v_item_valorJurosPagamento     valorJurosPagamento,
        v_item_valorFreteTotal         valorFreteTotal,
        v_item_valorSeguroTotal        valorSeguroTotal,
        v_item_valorDescontoTotal      valorDescontoTotal,
        v_item_valorOutrasDespesasTot  valorOutrasDespesasTotal,
        v_item_valorAdicFreteMarTotal  valorAdicFreteMarinhaMerTotal,
        v_item_valorDespesasAduanTotal valorDespesasAduaneirasTotal,
        v_item_cfop                    cfop,
        v_item_indicadorISSQN          indicadorISSQN,
        v_item_aliquotaISSQN           aliquotaISSQN,
        v_item_retidoISSQN             retidoISSQN,
        v_item_tributadoForaMunicipio  tributadoForaMunicipio,
        v_item_incentivoFiscal         incentivoFiscal,
        v_item_listaServicos           listaServicos,
        v_item_cnae                    cnae,
        v_item_idServicoMunicipio      idServicoMunicipio,
        v_item_numeroProcessoAdministr numeroProcessoAdministrativo,
        v_item_baseISSQN               baseISSQN,
        v_item_valorISSQN              valorISSQN,
        v_item_retencaoIRRF            retencaoIRRF,
        v_item_baseRetIRRF             baseRetIRRF,
        v_item_valorRetIRRF            valorRetIRRF,
        v_item_retencaoINSS            retencaoINSS,
        v_item_baseRetINSS             baseRetINSS,
        v_item_valorRetINSS            valorRetINSS,
        v_item_retencaoPIS             retencaoPIS,
        v_item_baseRetPIS              baseRetPIS,
        v_item_valorRetPIS             valorRetPIS,
        v_item_retencaoCOFINS          retencaoCOFINS,
        v_item_baseRetCOFINS           baseRetCOFINS,
        v_item_valorRetCOFINS          valorRetCOFINS,
        v_item_retencaoCSLL            retencaoCSLL,
        v_item_baseRetCSLL             baseRetCSLL,
        v_item_valorRetCSLL            valorRetCSLL,
        v_item_retencaoOutros          retencaoOutros,
        v_item_baseRetOutros           baseRetOutros,
        v_item_valorRetOutros          valorRetOutros,
        v_item_aliquotaII              aliquotaII,
        v_item_baseII                  baseII,
        v_item_valorII                 valorII,
        v_item_aliquotaIOF             aliquotaIOF,
        v_item_baseIOF                 baseIOF,
        v_item_valorIOF                valorIOF,
        v_item_codigoEnquadramentoIPI  codigoEnquadramentoIPI,
        v_item_stIPI                   stIPI,
        v_item_aliquotaIPI             aliquotaIPI,
        v_item_valorAliquotaIPI        valorAliquotaIPI,
        v_item_baseIPI                 baseIPI,
        v_item_valorIPI                valorIPI,
        p_item_valorIPIDevolucao       valorIPIDevolucao,
        v_item_stPIS                   stPIS,
        v_item_aliquotaPIS             aliquotaPIS,
        v_item_valorAliquotaPIS        valorAliquotaPIS,
        v_item_basePIS                 basePIS,
        v_item_valorPIS                valorPIS,
        v_item_aliquotaPISST           aliquotaPISST,
        v_item_valorAliquotaPISST      valorAliquotaPISST,
        v_item_basePISST               basePISST,
        v_item_valorPISST              valorPISST,
        v_item_stCOFINS                stCOFINS,
        v_item_aliquotaCOFINS          aliquotaCOFINS,
        v_item_valorAliquotaCOFINS     valorAliquotaCOFINS,
        v_item_baseCOFINS              baseCOFINS,
        v_item_valorCOFINS             valorCOFINS,
        v_item_aliquotaCOFINSST        aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST   valorAliquotaCOFINSST,
        v_item_baseCOFINSST            baseCOFINSST,
        v_item_valorCOFINSST           valorCOFINSST,
        v_item_stSimplesNacional       stSimplesNacional,
        v_item_creditoSimplesNacional  creditoSimplesNacional,
        v_item_baseCreditoSimplesNac   baseCreditoSimplesNacional,
        v_item_valorCreditoSimplesNac  valorCreditoSimplesNacional,
        v_item_stICMS                  stICMS,
        v_item_modalBaseCalcICMS       modalidadeBaseCalcICMS,
        v_item_reducaoBaseICMS         reducaoBaseICMS,
        v_item_aliquotaICMS            aliquotaICMS,
        v_item_diferimentoICMS         diferimentoICMS,
        v_item_motivoDesoneracaoICMS   motivoDesoneracaoICMS,
        v_item_idBeneficio             idBeneficio,
        v_item_baseICMS                baseICMS,
        v_item_valorICMSOperacao       valorICMSOperacao,
        v_item_valorICMSDiferido       valorICMSDiferido,
        v_item_valorICMS               valorICMS,
        v_item_valorICMSDesoneracao    valorICMSDesoneracao,
        v_item_modalBaseCalcICMSST     modalidadeBaseCalcICMSST,
        v_item_margemValorAdicionadoST margemValorAdicionadoST,
        v_item_reducaoBaseST           reducaoBaseST,
        v_item_aliquotaICMSST          aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin aliquotaSTSuportConsFinal,
        v_item_baseICMSST              baseICMSST,
        v_item_valorICMSST             valorICMSST,
        v_item_baseICMSSTAnteriormente baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment valorICMSSTAnteriormente,
        v_item_valorICMSProprioSubstit valorICMSProprioSubstituto,
        v_item_reducaoBaseICMSEfetivo  reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo     aliquotaICMSEfetivo,
        v_item_baseICMSEfetivo         baseICMSEfetivo,
        v_item_valorICMSEfetivo        valorICMSEfetivo,
        v_item_stICMSEscrituracao      stICMSEscrituracao,
        v_item_reducaoBaseICMSEscritur reducaoBaseICMSEscrituracao,
        v_item_aliquotaICMSEscrituraca aliquotaICMSEscrituracao,
        v_item_diferimentoICMSEscritur diferimentoICMSEscrituracao,
        v_item_baseICMSEscrituracao    baseICMSEscrituracao,
        v_item_valorICMSEscrituracao   valorICMSEscrituracao,
        v_item_valorICMSDesonEscritura valorICMSDesonEscrituracao,
        v_item_margemValorAdicSTEscrit margemValorAdicSTEscrituracao,
        v_item_reducaoBaseSTEscriturac reducaoBaseSTEscrituracao,
        v_item_aliquotaICMSSTEscritura aliquotaICMSSTEscrituracao,
        v_item_baseICMSSTEscrituracao  baseICMSSTEscrituracao,
        v_item_valorICMSSTEscrituracao valorICMSSTEscrituracao,
        v_item_somarICMSST             somarICMSST,
        v_item_aliquotaICMSUFDestinat  aliquotaICMSUFDestinatario,
        v_item_aliquotaICMSInterestad  aliquotaICMSInterestadual,
        v_item_partilhaICMSInterestad  partilhaICMSInterestadual,
        v_item_baseICMSUFDestinatario  baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente     baseICMSUFRemetente,
        v_item_valorICMSUFRemetente    valorICMSUFRemetente,
        v_item_aliquotaFCP             aliquotaFCP,
        v_item_baseFCP                 baseFCP,
        v_item_valorFCP                valorFCP,
        v_item_aliquotaFCPST           aliquotaFCPST,
        v_item_baseFCPST               baseFCPST,
        v_item_valorFCPST              valorFCPST,
        v_item_aliquotaFCPSTAnteriorm  aliquotaFCPSTAnteriormente,
        v_item_baseFCPSTAnteriormente  baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente valorFCPSTAnteriormente,
        v_item_aliquotaFCPUFDestinat   aliquotaFCPUFDestinatario,
        v_item_baseFCPUFDestinatario   baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario  valorFCPUFDestinatario,
        v_item_aliquotaEstImpFederais  aliquotaEstimadaImpFederais,
        v_item_aliquotaEstImpEstaduais aliquotaEstimadaImpEstaduais,
        v_item_aliquotaEstImpMunicipai aliquotaEstimadaImpMunicipais,
        v_item_baseEstimadaImpostos    baseEstimadaImpostos,
        v_item_valorEstImpFederais     valorEstimadoImpFederais,
        v_item_valorEstImpEstaduais    valorEstimadoImpEstaduais,
        v_item_valorEstImpMunicipais   valorEstimadoImpMunicipais,
        v_item_valorLiquidoItem        valorLiquidoItem,
        p_item_valorDescontoCustoOpIte valorDescontoCustoOpItem,
        p_item_valorDescontoCustoOpGer valorDescontoCustoOpGeral,
        v_item_valorDescontoCustoOpTot valorDescontoCustoOpTotal,
        p_item_valorAcrescimoCustoOpIt valorAcrescimoCustoOpItem,
        p_item_valorAcrescimoCustoOpGe valorAcrescimoCustoOpGeral,
        v_item_valorAcrescimoCustoOpTo valorAcrescimoCustoOpTotal,
        v_item_precoCustoOperacao      precoCustoOperacao,
        v_item_valorCustoOperacao      valorCustoOperacao,
        v_item_precoCMV                precoCMV,
        v_item_valorCMV                valorCMV,
        p_item_quantidadeExtemporanea  quantidadeExtemporanea,
        p_item_acrescimoUnitarioExtemp acrescimoUnitarioExtemporaneo,
        v_item_valorAcrescimoExtempSub valorAcrescimoExtempSubtotal,
        p_item_valorAcrescimoExtempIte valorAcrescimoExtempItem,
        p_item_valorAcrescimoExtempGer valorAcrescimoExtempGeral,
        v_item_valorAcrescimoExtempTot valorAcrescimoExtempTotal,
        p_item_observacoesDigitadas    observacoesDigitadas,
        v_observacoes                  observacoes
      FROM DUAL) b
    ON (a.idItemDocFiscal = b.idItemDocFiscal)
    WHEN MATCHED THEN UPDATE SET
      a.idDocumentoFiscal             = b.idDocumentoFiscal,
      a.sequencia                     = b.sequencia,
      a.cancelado                     = b.cancelado,
      a.pedidoCompraFornecedor        = b.pedidoCompraFornecedor,
      a.sequenciaPedidoCompraFornec   = b.sequenciaPedidoCompraFornec,
      a.vendedor                      = b.vendedor,
      a.modeloDocumento               = b.modeloDocumento,
      a.estabelecimentoOriginal       = b.estabelecimentoOriginal,
      a.gradeProduto                  = b.gradeProduto,
      a.idFormulaTinta                = b.idFormulaTinta,
      a.personalizacao                = b.personalizacao,
      a.idLoteEstoque                 = b.idLoteEstoque,
      a.operacaoFiscal                = b.operacaoFiscal,
      a.movimentaEstoque              = b.movimentaEstoque,
      a.movimentaEstoqueFiscal        = b.movimentaEstoqueFiscal,
      a.geraFinanceiro                = b.geraFinanceiro,
      a.localEstoque                  = b.localEstoque,
      a.pessoaParticipante            = b.pessoaParticipante,
      a.controleQuantidade            = b.controleQuantidade,
      a.unidadeMedidaConversao        = b.unidadeMedidaConversao,
      a.conversorQuantidade           = b.conversorQuantidade,
      a.loteMinimo                    = b.loteMinimo,
      a.loteMultiplo                  = b.loteMultiplo,
      a.altura                        = b.altura,
      a.largura                       = b.largura,
      a.comprimento                   = b.comprimento,
      a.pecas                         = b.pecas,
      a.quantidade                    = b.quantidade,
      a.quantidadeConvertida          = b.quantidadeConvertida,
      a.quantidadeDevolvidaRetornada  = b.quantidadeDevolvidaRetornada,
      a.percentualDevolucao           = b.percentualDevolucao,
      a.pesoLiquido                   = b.pesoLiquido,
      a.pesoBruto                     = b.pesoBruto,
      a.tipoPreco                     = b.tipoPreco,
      a.tabelaPreco                   = b.tabelaPreco,
      a.precoSugestaoAPrazo           = b.precoSugestaoAPrazo,
      a.precoSugestaoAVista           = b.precoSugestaoAVista,
      a.precoDesconto                 = b.precoDesconto,
      a.precoMinimo                   = b.precoMinimo,
      a.usarPrecoAVista               = b.usarPrecoAVista,
      a.precoUnitarioBruto            = b.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao   = b.acrescimoUnitarioComposicao,
      a.precoUnitario                 = b.precoUnitario,
      a.precoUnitarioConvertido       = b.precounitarioConvertido,
      a.valorProdutoServicoBruto      = b.valorProdutoServicoBruto,
      a.valorProdutoServico           = b.valorProdutoServico,
      a.percDescontoItem              = b.percDescontoItem,
      a.valorDescontoItem             = b.valorDescontoItem,
      a.percAcrescimoItem             = b.percAcrescimoItem,
      a.valorAcrescimoItem            = b.valorAcrescimoItem,
      a.valorFreteItem                = b.valorFreteItem,
      a.valorSeguroItem               = b.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem  = b.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem   = b.valorDespesasAduaneirasItem,
      a.valorFreteGeral               = b.valorFreteGeral,
      a.valorSeguroGeral              = b.valorSeguroGeral,
      a.valorDescontoGeral            = b.valorDescontoGeral,
      a.valorOutrasDespesasGeral      = b.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral = b.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral  = b.valorDespesasAduaneirasGeral,
      a.valorBasePagamento            = b.valorBasePagamento,
      a.valorDescontoPagamento        = b.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento  = b.valorOutrasDespesasPagamento,
      a.valorJurosPagamento           = b.valorJurosPagamento,
      a.valorFreteTotal               = b.valorFreteTotal,
      a.valorSeguroTotal              = b.valorSeguroTotal,
      a.valorDescontoTotal            = b.valorDescontoTotal,
      a.valorOutrasDespesasTotal      = b.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal = b.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal  = b.valorDespesasAduaneirasTotal,
      a.cfop                          = b.cfop,
      a.indicadorISSQN                = b.indicadorISSQN,
      a.aliquotaISSQN                 = b.aliquotaISSQN,
      a.retidoISSQN                   = b.retidoISSQN,
      a.tributadoForaMunicipio        = b.tributadoForaMunicipio,
      a.incentivoFiscal               = b.incentivoFiscal,
      a.listaServicos                 = b.listaServicos,
      a.cnae                          = b.cnae,
      a.idServicoMunicipio            = b.idServicoMunicipio,
      a.numeroProcessoAdministrativo  = b.numeroProcessoAdministrativo,
      a.baseISSQN                     = b.baseISSQN,
      a.valorISSQN                    = b.valorISSQN,
      a.retencaoIRRF                  = b.retencaoIRRF,
      a.baseRetIRRF                   = b.baseRetIRRF,
      a.valorRetIRRF                  = b.valorRetIRRF,
      a.retencaoINSS                  = b.retencaoINSS,
      a.baseRetINSS                   = b.baseRetINSS,
      a.valorRetINSS                  = b.valorRetINSS,
      a.retencaoPIS                   = b.retencaoPIS,
      a.baseRetPIS                    = b.baseRetPIS,
      a.valorRetPIS                   = b.valorRetPIS,
      a.retencaoCOFINS                = b.retencaoCOFINS,
      a.baseRetCOFINS                 = b.baseRetCOFINS,
      a.valorRetCOFINS                = b.valorRetCOFINS,
      a.retencaoCSLL                  = b.retencaoCSLL,
      a.baseRetCSLL                   = b.baseRetCSLL,
      a.valorRetCSLL                  = b.valorRetCSLL,
      a.retencaoOutros                = b.retencaoOutros,
      a.baseRetOutros                 = b.baseRetOutros,
      a.valorRetOutros                = b.valorRetOutros,
      a.aliquotaII                    = b.aliquotaII,
      a.baseII                        = b.baseII,
      a.valorII                       = b.valorII,
      a.aliquotaIOF                   = b.aliquotaIOF,
      a.baseIOF                       = b.baseIOF,
      a.valorIOF                      = b.valorIOF,
      a.codigoEnquadramentoIPI        = b.codigoEnquadramentoIPI,
      a.stIPI                         = b.stIPI,
      a.aliquotaIPI                   = b.aliquotaIPI,
      a.valorAliquotaIPI              = b.valorAliquotaIPI,
      a.baseIPI                       = b.baseIPI,
      a.valorIPI                      = b.valorIPI,
      a.valorIPIDevolucao             = b.valorIPIDevolucao,
      a.stPIS                         = b.stPIS,
      a.aliquotaPIS                   = b.aliquotaPIS,
      a.valorAliquotaPIS              = b.valorAliquotaPIS,
      a.basePIS                       = b.basePIS,
      a.valorPIS                      = b.valorPIS,
      a.aliquotaPISST                 = b.aliquotaPISST,
      a.valorAliquotaPISST            = b.valorAliquotaPISST,
      a.basePISST                     = b.basePISST,
      a.valorPISST                    = b.valorPISST,
      a.stCOFINS                      = b.stCOFINS,
      a.aliquotaCOFINS                = b.aliquotaCOFINS,
      a.valorAliquotaCOFINS           = b.valorAliquotaCOFINS,
      a.baseCOFINS                    = b.baseCOFINS,
      a.valorCOFINS                   = b.valorCOFINS,
      a.aliquotaCOFINSST              = b.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST         = b.valorAliquotaCOFINSST,
      a.baseCOFINSST                  = b.baseCOFINSST,
      a.valorCOFINSST                 = b.valorCOFINSST,
      a.stSimplesNacional             = b.stSimplesNacional,
      a.creditoSimplesNacional        = b.creditoSimplesNacional,
      a.baseCreditoSimplesNacional    = b.baseCreditoSimplesNacional,
      a.valorCreditoSimplesNacional   = b.valorCreditoSimplesNacional,
      a.stICMS                        = b.stICMS,
      a.modalidadeBaseCalcICMS        = b.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS               = b.reducaoBaseICMS,
      a.aliquotaICMS                  = b.aliquotaICMS,
      a.diferimentoICMS               = b.diferimentoICMS,
      a.motivoDesoneracaoICMS         = b.motivoDesoneracaoICMS,
      a.idBeneficio                   = b.idBeneficio,
      a.baseICMS                      = b.baseICMS,
      a.valorICMSoperacao             = b.valorICMSoperacao,
      a.valorICMSdiferido             = b.valorICMSdiferido,
      a.valorICMS                     = b.valorICMS,
      a.valorICMSdesoneracao          = b.valorICMSdesoneracao,
      a.modalidadeBaseCalcICMSST      = b.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST       = b.margemValorAdicionadoST,
      a.reducaoBaseST                 = b.reducaoBaseST,
      a.aliquotaICMSST                = b.aliquotaICMSST,
      a.aliquotaSTSuportConsFinal     = b.aliquotaSTSuportConsFinal,
      a.baseICMSST                    = b.baseICMSST,
      a.valorICMSST                   = b.valorICMSST,
      a.baseICMSSTAnteriormente       = b.baseICMSSTAnteriormente,
      a.valorICMSSTAnteriormente      = b.valorICMSSTAnteriormente,
      a.valorICMSProprioSubstituto    = b.valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo        = b.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo           = b.aliquotaICMSEfetivo,
      a.baseICMSEfetivo               = b.baseICMSEfetivo,
      a.valorICMSEfetivo              = b.valorICMSEfetivo,
      a.stICMSEscrituracao            = b.stICMSEscrituracao,
      a.reducaoBaseICMSEscrituracao   = b.reducaoBaseICMSEscrituracao,
      a.aliquotaICMSEscrituracao      = b.aliquotaICMSEscrituracao,
      a.diferimentoICMSEscrituracao   = b.diferimentoICMSEscrituracao,
      a.baseICMSEscrituracao          = b.baseICMSEscrituracao,
      a.valorICMSEscrituracao         = b.valorICMSEscrituracao,
      a.valorICMSDesonEscrituracao    = b.valorICMSDesonEscrituracao,
      a.margemValorAdicSTEscrituracao = b.margemValorAdicSTEscrituracao,
      a.reducaoBaseSTEscrituracao     = b.reducaoBaseSTEscrituracao,
      a.aliquotaICMSSTEscrituracao    = b.aliquotaICMSSTEscrituracao,
      a.baseICMSSTEscrituracao        = b.baseICMSSTEscrituracao,
      a.valorICMSSTEscrituracao       = b.valorICMSSTEscrituracao,
      a.somarICMSST                   = b.somarICMSST,
      a.aliquotaICMSUFDestinatario    = b.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual     = b.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual     = b.partilhaICMSInterestadual,
      a.baseICMSUFDestinatario        = b.baseICMSUFDestinatario,
      a.valorICMSUFDestinatario       = b.valorICMSUFDestinatario,
      a.baseICMSUFRemetente           = b.baseICMSUFRemetente,
      a.valorICMSUFRemetente          = b.valorICMSUFRemetente,
      a.aliquotaFCP                   = b.aliquotaFCP,
      a.baseFCP                       = b.baseFCP,
      a.valorFCP                      = b.valorFCP,
      a.aliquotaFCPST                 = b.aliquotaFCPST,
      a.baseFCPST                     = b.baseFCPST,
      a.valorFCPST                    = b.valorFCPST,
      a.aliquotaFCPSTAnteriormente    = b.aliquotaFCPSTAnteriormente,
      a.baseFCPSTAnteriormente        = b.baseFCPSTAnteriormente,
      a.valorFCPSTAnteriormente       = b.valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario     = b.aliquotaFCPUFDestinatario,
      a.baseFCPUFDestinatario         = b.baseFCPUFDestinatario,
      a.valorFCPUFDestinatario        = b.valorFCPUFDestinatario,
      a.aliquotaestimadaimpfederais   = b.aliquotaestimadaimpfederais,
      a.aliquotaestimadaimpestaduais  = b.aliquotaestimadaimpestaduais,
      a.aliquotaestimadaimpmunicipais = b.aliquotaestimadaimpmunicipais,
      a.baseestimadaimpostos          = b.baseestimadaimpostos,
      a.valorestimadoimpfederais      = b.valorestimadoimpfederais,
      a.valorEstimadoImpEstaduais     = b.valorEstimadoImpEstaduais,
      a.valorEstimadoImpMunicipais    = b.valorEstimadoImpMunicipais,
      a.valorLiquidoItem              = b.valorLiquidoItem,
      a.valorDescontoCustoOpItem      = b.valorDescontoCustoOpItem,
      a.valorDescontoCustoOpGeral     = b.valorDescontoCustoOpGeral,
      a.valorDescontoCustoOpTotal     = b.valorDescontoCustoOpTotal,
      a.valorAcrescimoCustoOpItem     = b.valorAcrescimoCustoOpItem,
      a.valorAcrescimoCustoOpGeral    = b.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoCustoOpTotal    = b.valorAcrescimoCustoOpTotal,
      a.precoCustoOperacao            = b.precoCustoOperacao,
      a.valorCustoOperacao            = b.valorCustoOperacao,
      a.precoCMV                      = b.precoCMV,
      a.valorCMV                      = b.valorCMV,
      a.quantidadeExtemporanea        = b.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo = b.acrescimoUnitarioExtemporaneo,
      a.valorAcrescimoExtempSubtotal  = b.valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem      = b.valorAcrescimoExtempItem,
      a.valorAcrescimoExtempGeral     = b.valorAcrescimoExtempGeral,
      a.valorAcrescimoExtempTotal     = b.valorAcrescimoExtempTotal,
      a.observacoesDigitadas          = b.observacoesDigitadas,
      a.observacoes                   = b.observacoes
    WHEN NOT MATCHED THEN INSERT (
      idItemDocFiscal,
      idDocumentoFiscal,
      sequencia,
      cancelado,
      pedidoCompraFornecedor,
      sequenciaPedidoCompraFornec,
      modeloDocumento,
      estabelecimentoOriginal,
      vendedor,
      gradeProduto,
      idFormulaTinta,
      personalizacao,
      idLoteEstoque,
      operacaoFiscal,
      movimentaEstoque,
      movimentaEstoqueFiscal,
      geraFinanceiro,
      localEstoque,
      pessoaParticipante,
      controleQuantidade,
      unidadeMedidaConversao,
      conversorQuantidade,
      loteMinimo,
      loteMultiplo,
      altura,
      largura,
      comprimento,
      pecas,
      quantidade,
      quantidadeConvertida,
      quantidadeDevolvidaRetornada,
      percentualDevolucao,
      pesoLiquido,
      pesoBruto,
      tipoPreco,
      tabelaPreco,
      precoSugestaoAPrazo,
      precoSugestaoAVista,
      precoDesconto,
      precoMinimo,
      usarPrecoAVista,
      precoUnitarioBruto,
      acrescimoUnitarioComposicao,
      precoUnitario,
      precoUnitarioConvertido,
      valorProdutoServicoBruto,
      valorProdutoServico,
      percDescontoItem,
      valorDescontoItem,
      percAcrescimoItem,
      valorAcrescimoItem,
      valorFreteItem,
      valorSeguroItem,
      valorAdicFreteMarinhaMerItem,
      valorDespesasAduaneirasItem,
      valorFreteGeral,
      valorSeguroGeral,
      valorDescontoGeral,
      valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral,
      valorDespesasAduaneirasGeral,
      valorBasePagamento,
      valorDescontoPagamento,
      valorOutrasDespesasPagamento,
      valorJurosPagamento,
      valorFreteTotal,
      valorSeguroTotal,
      valorDescontoTotal,
      valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal,
      valorDespesasAduaneirasTotal,
      cfop,
      indicadorISSQN,
      aliquotaISSQN,
      retidoISSQN,
      tributadoForaMunicipio,
      incentivoFiscal,
      listaServicos,
      cnae,
      idServicoMunicipio,
      numeroProcessoAdministrativo,
      baseISSQN,
      valorISSQN,
      retencaoIRRF,
      baseRetIRRF,
      valorRetIRRF,
      retencaoINSS,
      baseRetINSS,
      valorRetINSS,
      retencaoPIS,
      baseRetPIS,
      valorRetPIS,
      retencaoCOFINS,
      baseRetCOFINS,
      valorRetCOFINS,
      retencaoCSLL,
      baseRetCSLL,
      valorRetCSLL,
      retencaoOutros,
      baseRetOutros,
      valorRetOutros,
      aliquotaII,
      baseII,
      valorII,
      aliquotaIOF,
      baseIOF,
      valorIOF,
      codigoEnquadramentoIPI,
      stIPI,
      aliquotaIPI,
      valorAliquotaIPI,
      baseIPI,
      valorIPI,
      valorIPIDevolucao,
      stPIS,
      aliquotaPIS,
      valorAliquotaPIS,
      basePIS,
      valorPIS,
      aliquotaPISST,
      valorAliquotaPISST,
      basePISST,
      valorPISST,
      stCOFINS,
      aliquotaCOFINS,
      valorAliquotaCOFINS,
      baseCOFINS,
      valorCOFINS,
      aliquotaCOFINSST,
      valorAliquotaCOFINSST,
      baseCOFINSST,
      valorCOFINSST,
      stSimplesNacional,
      creditoSimplesNacional,
      baseCreditoSimplesNacional,
      valorCreditoSimplesNacional,
      stICMS,
      modalidadeBaseCalcICMS,
      reducaoBaseICMS,
      aliquotaICMS,
      diferimentoICMS,
      motivoDesoneracaoICMS,
      idBeneficio,
      baseICMS,
      valorICMSOperacao,
      valorICMSDiferido,
      valorICMS,
      valorICMSDesoneracao,
      modalidadeBaseCalcICMSST,
      margemValorAdicionadoST,
      reducaoBaseST,
      aliquotaICMSST,
      aliquotaSTSuportConsFinal,
      baseICMSST,
      valorICMSST,
      baseICMSSTAnteriormente,
      valorICMSSTAnteriormente,
      valorICMSProprioSubstituto,
      reducaoBaseICMSEfetivo,
      aliquotaICMSEfetivo,
      baseICMSEfetivo,
      valorICMSEfetivo,
      stICMSEscrituracao,
      reducaoBaseICMSEscrituracao,
      aliquotaICMSEscrituracao,
      diferimentoICMSEscrituracao,
      baseICMSEscrituracao,
      valorICMSEscrituracao,
      valorICMSDesonEscrituracao,
      margemValorAdicSTEscrituracao,
      reducaoBaseSTEscrituracao,
      aliquotaICMSSTEscrituracao,
      baseICMSSTEscrituracao,
      valorICMSSTEscrituracao,
      somarICMSST,
      aliquotaICMSUFDestinatario,
      aliquotaICMSInterestadual,
      partilhaICMSInterestadual,
      baseICMSUFDestinatario,
      valorICMSUFDestinatario,
      baseICMSUFRemetente,
      valorICMSUFRemetente,
      aliquotaFCP,
      baseFCP,
      valorFCP,
      aliquotaFCPST,
      baseFCPST,
      valorFCPST,
      aliquotaFCPSTAnteriormente,
      baseFCPSTAnteriormente,
      valorFCPSTAnteriormente,
      aliquotaFCPUFDestinatario,
      baseFCPUFDestinatario,
      valorFCPUFDestinatario,
      aliquotaEstimadaImpFederais,
      aliquotaEstimadaImpEstaduais,
      aliquotaEstimadaImpMunicipais,
      baseEstimadaImpostos,
      valorEstimadoImpFederais,
      valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais,
      valorLiquidoItem,
      valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral,
      valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpItem,
      valorAcrescimoCustoOpGeral,
      valorAcrescimoCustoOpTotal,
      precoCustoOperacao,
      valorCustoOperacao,
      precoCMV,
      valorCMV,
      quantidadeExtemporanea,
      acrescimoUnitarioExtemporaneo,
      valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral,
      valorAcrescimoExtempTotal,
      observacoesDigitadas,
      observacoes)
    VALUES (
      b.idItemDocFiscal,
      b.idDocumentoFiscal,
      b.sequencia,
      b.cancelado,
      b.pedidoCompraFornecedor,
      b.sequenciaPedidoCompraFornec,
      b.modeloDocumento,
      b.estabelecimentoOriginal,
      b.vendedor,
      b.gradeProduto,
      b.idFormulaTinta,
      b.personalizacao,
      b.idLoteEstoque,
      b.operacaoFiscal,
      b.movimentaEstoque,
      b.movimentaEstoqueFiscal,
      b.geraFinanceiro,
      b.localEstoque,
      b.pessoaParticipante,
      b.controleQuantidade,
      b.unidadeMedidaConversao,
      b.conversorQuantidade,
      b.loteMinimo,
      b.loteMultiplo,
      b.altura,
      b.largura,
      b.comprimento,
      b.pecas,
      b.quantidade,
      b.quantidadeConvertida,
      b.quantidadeDevolvidaRetornada,
      b.percentualDevolucao,
      b.pesoLiquido,
      b.pesoBruto,
      b.tipoPreco,
      b.tabelaPreco,
      b.precoSugestaoAPrazo,
      b.precoSugestaoAVista,
      b.precoDesconto,
      b.precoMinimo,
      b.usarPrecoAVista,
      b.precoUnitarioBruto,
      b.acrescimoUnitarioComposicao,
      b.precoUnitario,
      b.precoUnitarioConvertido,
      b.valorProdutoServicoBruto,
      b.valorProdutoServico,
      b.percDescontoItem,
      b.valorDescontoItem,
      b.percAcrescimoItem,
      b.valorAcrescimoItem,
      b.valorFreteItem,
      b.valorSeguroItem,
      b.valorAdicFreteMarinhaMerItem,
      b.valorDespesasAduaneirasItem,
      b.valorFreteGeral,
      b.valorSeguroGeral,
      b.valorDescontoGeral,
      b.valorOutrasDespesasGeral,
      b.valorAdicFreteMarinhaMerGeral,
      b.valorDespesasAduaneirasGeral,
      b.valorBasePagamento,
      b.valorDescontoPagamento,
      b.valorOutrasDespesasPagamento,
      b.valorJurosPagamento,
      b.valorFreteTotal,
      b.valorSeguroTotal,
      b.valorDescontoTotal,
      b.valorOutrasDespesasTotal,
      b.valorAdicFreteMarinhaMerTotal,
      b.valorDespesasAduaneirasTotal,
      b.cfop,
      b.indicadorISSQN,
      b.aliquotaISSQN,
      b.retidoISSQN,
      b.tributadoForaMunicipio,
      b.incentivoFiscal,
      b.listaServicos,
      b.cnae,
      b.idServicoMunicipio,
      b.numeroProcessoAdministrativo,
      b.baseISSQN,
      b.valorISSQN,
      b.retencaoIRRF,
      b.baseRetIRRF,
      b.valorRetIRRF,
      b.retencaoINSS,
      b.baseRetINSS,
      b.valorRetINSS,
      b.retencaoPIS,
      b.baseRetPIS,
      b.valorRetPIS,
      b.retencaoCOFINS,
      b.baseRetCOFINS,
      b.valorRetCOFINS,
      b.retencaoCSLL,
      b.baseRetCSLL,
      b.valorRetCSLL,
      b.retencaoOutros,
      b.baseRetOutros,
      b.valorRetOutros,
      b.aliquotaII,
      b.baseII,
      b.valorII,
      b.aliquotaIOF,
      b.baseIOF,
      b.valorIOF,
      b.codigoEnquadramentoIPI,
      b.stIPI,
      b.aliquotaIPI,
      b.valorAliquotaIPI,
      b.baseIPI,
      b.valorIPI,
      b.valorIPIDevolucao,
      b.stPIS,
      b.aliquotaPIS,
      b.valorAliquotaPIS,
      b.basePIS,
      b.valorPIS,
      b.aliquotaPISST,
      b.valorAliquotaPISST,
      b.basePISST,
      b.valorPISST,
      b.stCOFINS,
      b.aliquotaCOFINS,
      b.valorAliquotaCOFINS,
      b.baseCOFINS,
      b.valorCOFINS,
      b.aliquotaCOFINSST,
      b.valorAliquotaCOFINSST,
      b.baseCOFINSST,
      b.valorCOFINSST,
      b.stSimplesNacional,
      b.creditoSimplesNacional,
      b.baseCreditoSimplesNacional,
      b.valorCreditoSimplesNacional,
      b.stICMS,
      b.modalidadeBaseCalcICMS,
      b.reducaoBaseICMS,
      b.aliquotaICMS,
      b.diferimentoICMS,
      b.motivoDesoneracaoICMS,
      b.idBeneficio,
      b.baseICMS,
      b.valorICMSOperacao,
      b.valorICMSDiferido,
      b.valorICMS,
      b.valorICMSDesoneracao,
      b.modalidadeBaseCalcICMSST,
      b.margemValorAdicionadoST,
      b.reducaoBaseST,
      b.aliquotaICMSST,
      b.aliquotaSTSuportConsFinal,
      b.baseICMSST,
      b.valorICMSST,
      b.baseICMSSTAnteriormente,
      b.valorICMSSTAnteriormente,
      b.valorICMSProprioSubstituto,
      b.reducaoBaseICMSEfetivo,
      b.aliquotaICMSEfetivo,
      b.baseICMSEfetivo,
      b.valorICMSEfetivo,
      b.stICMSEscrituracao,
      b.reducaoBaseICMSEscrituracao,
      b.aliquotaICMSEscrituracao,
      b.diferimentoICMSEscrituracao,
      b.baseICMSEscrituracao,
      b.valorICMSEscrituracao,
      b.valorICMSDesonEscrituracao,
      b.margemValorAdicSTEscrituracao,
      b.reducaoBaseSTEscrituracao,
      b.aliquotaICMSSTEscrituracao,
      b.baseICMSSTEscrituracao,
      b.valorICMSSTEscrituracao,
      b.somarICMSST,
      b.aliquotaICMSUFDestinatario,
      b.aliquotaICMSInterestadual,
      b.partilhaICMSInterestadual,
      b.baseICMSUFDestinatario,
      b.valorICMSUFDestinatario,
      b.baseICMSUFRemetente,
      b.valorICMSUFRemetente,
      b.aliquotaFCP,
      b.baseFCP,
      b.valorFCP,
      b.aliquotaFCPST,
      b.baseFCPST,
      b.valorFCPST,
      b.aliquotaFCPSTAnteriormente,
      b.baseFCPSTAnteriormente,
      b.valorFCPSTAnteriormente,
      b.aliquotaFCPUFDestinatario,
      b.baseFCPUFDestinatario,
      b.valorFCPUFDestinatario,
      b.aliquotaEstimadaImpFederais,
      b.aliquotaEstimadaImpEstaduais,
      b.aliquotaEstimadaImpMunicipais,
      b.baseEstimadaImpostos,
      b.valorEstimadoImpFederais,
      b.valorEstimadoImpEstaduais,
      b.valorEstimadoImpMunicipais,
      b.valorLiquidoItem,
      b.valorDescontoCustoOpItem,
      b.valorDescontoCustoOpGeral,
      b.valorDescontoCustoOpTotal,
      b.valorAcrescimoCustoOpItem,
      b.valorAcrescimoCustoOpGeral,
      b.valorAcrescimoCustoOpTotal,
      b.precoCustoOperacao,
      b.valorCustoOperacao,
      b.precoCMV,
      b.valorCMV,
      b.quantidadeExtemporanea,
      b.acrescimoUnitarioExtemporaneo,
      b.valorAcrescimoExtempSubtotal,
      b.valorAcrescimoExtempItem,
      b.valorAcrescimoExtempGeral,
      b.valorAcrescimoExtempTotal,
      b.observacoesDigitadas,
      b.observacoes);
    v_atualizarObservacoes := 0;
    IF p_idItemReferenciado > 0 THEN
      IF p_tipoDocumentoReferenciado IN ('D','P') THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV(
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_devolucaoAnulacaoRetorno,
          'D',
          r_item_idItemDocFiscal,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          p_tipoDocumentoReferenciado,
          p_idItemReferenciado);
      END IF;
      IF p_tipoDocumentoReferenciado = 'B' THEN
        ADD_DOC_FISC_ITEM_BALANC_GRAVA (
          p_estabelecimentoAtivo,
          p_idItemReferenciado,
          r_item_idItemDocFiscal);
      ELSIF p_tipoDocumentoReferenciado = 'D' THEN
        ADD_DOC_FISC_ITEM_REF_DOC_FIS (
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'G' THEN
        ADD_DOC_FISC_ITEM_REF_DFE_GRAD (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_person_190_modeloFrete,
          p_config_227_manterPessoaOrcam,
          p_config_230_etapaPedComprParc,
          p_config_378_calcularVolumes,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'O' THEN
        ADD_DOC_FISC_ITEM_REF_ORCAMEN (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'P' THEN
        ADD_DOC_FISC_ITEM_REF_PRE_DOC (
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_idDocumentoFiscal,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemDocFiscal,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'T' THEN
        ADD_DOC_FISC_ITEM_TRANS_GRAVA (
          p_estabelecimentoAtivo,
          v_cab_entradaSaida,
          p_idItemReferenciado,
          r_item_idItemDocFiscal,
          p_quantidadeReferenciada);
      END IF;
    END IF;
    IF p_tempComp_nomeTempComposicao <> ' '
      AND (NOT (p_tipoDocumentoReferenciado IN ('D','O','P'))
        OR p_idItemReferenciado <= 0)
    THEN
      ADD_DOC_FISC_ITEM_COMP_TEMP (
        p_sessaoClient,
        p_estabelecimentoAtivo,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        r_item_idItemDocFiscal,
        v_atualizarObservacoes,
        v_atualizarObservacoes);
    END IF;
    v_idEnderecoEstoque := 0;
    IF p_item_idEnderecoEstoque > 0 THEN
      ADD_DOC_FISC_ITEM_ENDER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemDocFiscal,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_quantidade,
        ' ',
        v_idEnderecoEstoque);
    END IF;
    IF p_item_idNumeroSerie > 0 THEN
      ADD_DOC_FISC_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemDocFiscal,
        v_idEnderecoEstoque,
        p_item_gradeProduto,
        p_item_idNumeroSerie,
        0,
        v_auxNumber);
      v_atualizarObservacoes := 1;
    END IF;
    IF v_atualizarObservacoes = 1 THEN
      v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
        p_sessaoClient,
        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_413_obs_add_marca,
        p_config_418_obs_efetarEnter,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        'D',
        r_item_idItemDocFiscal,
        p_item_gradeProduto,
        p_item_idFormulaTinta,
        p_item_personalizacao,
        p_item_idLoteEstoque,
        p_item_controleQuantidade,
        p_item_loteMultiplo,
        p_item_altura,
        p_item_largura,
        p_item_comprimento,
        p_item_quantidade,
        p_item_observacoesDigitadas);
      UPDATE MODOCFISCALXITENS
      SET observacoes = v_observacoes
      WHERE idItemDocFiscal = r_item_idItemDocFiscal;
    END IF;
    IF v_cab_situacaoDocumentoFiscal > 20 THEN
      ADD_DOC_FISC_ITEM_EST_ATUALIZA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_item_idItemDocFiscal,
        p_estabelecimentoAtivo);
      ADD_DOC_FISC_ITEM_FIL_ATUALIZA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_item_idItemDocFiscal,
        p_estabelecimentoAtivo);
    END IF;
    r_buffer_idItemDocFiscal := CASE WHEN (r_buffer_idItemDocFiscal IS NULL OR r_buffer_idItemDocFiscal = '' OR r_buffer_idItemDocFiscal = ' ') THEN '' ELSE RTRIM (r_buffer_idItemDocFiscal) || ';' END || TO_CHAR (LPAD(r_item_idItemDocFiscal,14,'0'));
    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;
  END IF;
END ADD_DOC_FISC_ITEM_GRAVA;

/

create or replace PROCEDURE ADD_PRE_DOC_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_227_manterPessoaOrcam IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     IN NUMBER,
  p_config_418_obs_efetarEnter   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, -- D = Documento Fiscal, O = Orçamento, P, Pré-Documento, T = Transferência
  p_idItemReferenciado           IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_tempComp_nomeTempComposicao  IN VARCHAR2,
  p_tempComp_sequencia           IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemPreDocumento      IN NUMBER,
  p_item_preDocumento            IN NUMBER,
  p_item_pedidoCompraFornecedor  IN VARCHAR2,
  p_item_sequenciaPedidoCompraFo IN NUMBER,
  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_quantidadeExtemporanea  IN NUMBER,
  p_item_acrescimoUnitarioExtemp IN NUMBER,
  p_item_valorAcrescimoExtempIte IN NUMBER,
  p_item_valorDescontoCustoOpIte IN NUMBER,
  p_item_valorAcrescimoCustoOpIt 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_valorAcrescimoExtempGer IN NUMBER,
  p_item_valorDescontoCustoOpGer IN NUMBER,
  p_item_valorAcrescimoCustoOpGe IN NUMBER,
  p_item_valorDescontoPagamento  IN NUMBER,
  p_item_valorOutrasDespPagament IN NUMBER,
  p_item_valorJurosPagamento     IN NUMBER,
  p_item_percentualDevolucao     IN NUMBER,
  p_item_valorIPIDevolucao       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_idItemPreDocumento    IN VARCHAR2,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER,
  r_item_idItemPreDocumento      OUT NUMBER,
  r_buffer_idItemPreDocumento    OUT VARCHAR2,
  r_valorInserido                OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_finalidadeNota           CHAR (1);
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_documentoFiscal          NUMBER;
  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_projeto                  VARCHAR2 (60);
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  v_cab_statusPreDocumento       CHAR (1);
  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_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota 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_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_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_item_sequencia               NUMBER;
  v_item_cancelado               NUMBER;
  v_item_quantidadeDevolvidaRet  NUMBER;
  v_item_precoUnitario           NUMBER;
  v_item_precoUnitarioConvertido NUMBER;
  v_item_valorProdutoServicoBrut NUMBER;
  v_item_valorProdutoServico     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_item_valorDescontoCustoOpTot NUMBER;
  v_item_valorAcrescimoCustoOpTo NUMBER;
  v_item_precoCustoOperacao      NUMBER;
  v_item_valorCustoOperacao      NUMBER;
  v_item_precoCMV                NUMBER;
  v_item_valorCMV                NUMBER;
  v_item_valorAcrescimoExtempSub NUMBER;
  v_item_valorAcrescimoExtempTot 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_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_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  r_item_idItemPreDocumento := p_item_idItemPreDocumento;
  r_buffer_idItemPreDocumento := p_buffer_idItemPreDocumento;
  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.devolucaoAnulacaoRetorno,
    cab.finalidadeNota,
    cab.atualizaCustoMedio,
    cab.documentoFiscal,
    cab.estabelecimento,
    cab.dataEmissao,
    cab.pessoa,
    cab.enderecoEntregaPessoa,
    cab.municipioFatoGerador,
    cab.localDestinoOperacao,
    cab.indicadorConsumidorFinal,
    cab.projeto,
    cab.modalidadeFrete,
    cab.tipoPagamentoFrete,
    cab.statusPreDocumento,
    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,
    cab.valorDescontoCustoOpItem,
    cab.valorDescontoCustoOpGeral,
    cab.valorDescontoCustoOpTotal,
    cab.valorAcrescimoCustoOpItem,
    cab.valorAcrescimoCustoOpGeral,
    cab.valorAcrescimoCustoOpTotal,
    cab.valorCustoOperacao,
    cab.valorCMV,
    cab.quantidadeExtemporanea,
    cab.valorAcrescimoExtempSubtotal,
    cab.valorAcrescimoExtempItem,
    cab.valorAcrescimoExtempGeral,
    cab.valorAcrescimoExtempTotal,
    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
  INTO
    v_cab_origemDocumento,
    v_cab_tipoDocumento,
    v_cab_entradaSaida,
    v_cab_devolucaoAnulacaoRetorno,
    v_cab_finalidadeNota,
    v_cab_atualizaCustoMedio,
    v_cab_documentoFiscal,
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_pessoa,
    v_cab_enderecoEntregaPessoa,
    v_cab_municipioFatoGerador,
    v_cab_localDestinoOperacao,
    v_cab_indicadorConsumidorFinal,
    v_cab_projeto,
    v_cab_modalidadeFrete,
    v_cab_tipoPagamentoFrete,
    v_cab_statusPreDocumento,
    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_cab_valorDescontoCustoOpItem,
    v_cab_valorDescontoCustoOpGera,
    v_cab_valorDescontoCustoOpTota,
    v_cab_valorAcrescimoCustoOpIte,
    v_cab_valorAcrescimoCustoOpGer,
    v_cab_valorAcrescimoCustoOpTot,
    v_cab_valorCustoOperacao,
    v_cab_valorCMV,
    v_cab_quantidadeExtemporanea,
    v_cab_valorAcrescimoExtempSubt,
    v_cab_valorAcrescimoExtempItem,
    v_cab_valorAcrescimoExtempGera,
    v_cab_valorAcrescimoExtempTota,
    v_est_grupoFiscal,
    v_pessEst_regimeTributario,
    v_munEndEst_uf,
    v_pess_indicadorInscricaoEstad,
    v_endPess_enderecoPessoa,
    v_munEndPess_uf,
    v_munEndEntr_uf
  FROM MOPREDOCUMENTOS 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
  WHERE cab.preDocumento = p_item_preDocumento;
  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_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_item_quantidadeDevolvidaRet  := 0;
  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_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;
  IF p_manterFinanceiro_Retotalizar = 0 THEN
    SELECT COALESCE (MAX(1), 0)
    INTO v_cab_promocaoExiste
    FROM MOPREDOCUMXPROMOCOES
    WHERE preDocumento = p_item_preDocumento;
  END IF;
  IF p_item_idItemPreDocumento > 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.quantidadeDevolvidaRetornada,
        a.pesoLiquido,
        a.pesoBruto,
        a.valorProdutoServicoBruto,
        a.valorProdutoServico,
        a.valorDescontoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.quantidadeExtemporanea,
        a.valorAcrescimoExtempSubtotal,
        a.valorAcrescimoExtempItem,
        a.valorDescontoCustoOpItem,
        a.valorAcrescimoCustoOpItem,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorAcrescimoExtempGeral,
        a.valorDescontoCustoOpGeral,
        a.valorAcrescimoCustoOpGeral,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.valorFreteTotal,
        a.valorSeguroTotal,
        a.valorDescontoTotal,
        a.valorOutrasDespesasTotal,
        a.valorAdicFreteMarinhaMerTotal,
        a.valorDespesasAduaneirasTotal,
        a.valorAcrescimoExtempTotal,
        a.valorDescontoCustoOpTotal,
        a.valorAcrescimoCustoOpTotal,
        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,
        a.valorCustoOperacao,
        a.valorCMV,
        prod.tipoProduto
      FROM MOPREDOCUMXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      WHERE a.idItemPreDocumento = p_item_idItemPreDocumento)
    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_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_item_quantidadeDevolvidaRet := a.quantidadeDevolvidaRetornada;
      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 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 <> p_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;
        v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
        v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
        v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
        v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
        v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
        v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
        v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
        v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
        v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
        v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
        v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
        v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
        v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      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,
    p_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);
  v_item_valorAcrescimoExtempSub := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
    p_item_quantidade,
    v_item_precoUnitario,
    p_item_quantidadeExtemporanea,
    p_item_acrescimoUnitarioExtemp);
  v_item_valorAcrescimoExtempTot := FUNC_ADD_CALC_EXTEMP_TOTAL(
    v_item_valorAcrescimoExtempSub,
    p_item_valorAcrescimoExtempIte,
    p_item_valorAcrescimoExtempGer);
  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 = CASE WHEN v_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
      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 / ((v_combo_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 / ((v_combo_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,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_estabelecimento,
        NULL, -- p_cab_dataPrecoInicial
        TRUNC(SYSDATE), -- p_cab_dataPrecoFinal
        v_cab_pessoa,
        v_cab_projeto,
        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_PRE_DOC_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_227_manterPessoaOrcam,
        p_config_362_calcCustoPorGrade,
        p_config_378_calcularVolumes,
        p_config_413_obs_add_marca,
        p_config_418_obs_efetarEnter,
        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, -- D = Documento Fiscal, G = Grade DF-e, O = Orçamento, 'P', Pré-Documento, T = Transferência
        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_calcularImpostos,
        0, -- p_item_idItemPreDocumento
        p_item_preDocumento,
        p_item_pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo,
        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
        CASE
          WHEN p_item_quantidade = 0
          THEN 0
          ELSE ROUND(p_item_quantidadeExtemporanea * a.quantidade / p_item_quantidade, 2)
        END, -- p_item_quantidadeExtemporanea
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_acrescimoUnitarioExtemp
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_acrescimoUnitarioExtemp
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoExtempIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpIt
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpIt
        p_item_observacoesDigitadas,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorFreteGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_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_valorAcrescimoExtempGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpGe
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpGe
        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
        p_item_percentualDevolucao,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorIPIDevolucao
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorIPIDevolucao,
        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_idItemPreDocumento,
        /* Retornos */
        r_calcularImpostos,
        v_auxNumber, -- idItemPreDocumento
        r_buffer_idItemPreDocumento,
        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_PRE_DOC_ITEM_COMBO_RESIDUO (
        p_item_preDocumento,
        v_item_valorProdutoServico,
        p_item_valorDescontoItem,
        p_item_valorAcrescimoItem,
        v_modDoc_diminuiDescontoPrUnit,
        v_modDoc_somaAcrescimosPrUnit,
        r_buffer_idItemPreDocumento,
        r_valorInserido);
      r_calcularImpostos := 1;
    END IF;
  ELSE
    IF r_item_idItemPreDocumento <= 0 THEN
      r_item_idItemPreDocumento := FUNC_ADD_BUSCA_PROXIMO_ID ('MOPREDOCUMXITENS', 'idItemPreDocumento', 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
          OR p_item_valorAcrescimoExtempGer <> 0
          OR p_item_valorDescontoCustoOpGer <> 0
          OR p_item_valorAcrescimoCustoOpGe <> 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_PRE_DOC_PAG_EXCLUI_TROCA (
          r_calcularImpostos,
          p_item_preDocumento,
          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 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,
        p_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,
        v_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,
        v_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
        p_item_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,
      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
      v_item_valorAcrescimoExtempTot,
      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,
      p_item_valorIPIDevolucao,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      v_item_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0 -- p_item_somarICMSST
      );
    ADD_CALCULA_CUSTO_CMV (
      v_cab_atualizaCustoMedio,
      v_cab_estabelecimento,
      0, -- p_cab_nfFornecedor
      p_item_modeloDocumento,
      p_item_quantidade,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      p_item_valorIPIDevolucao,
      v_item_valorPIS,
      v_item_valorPISST,
      v_item_valorCOFINS,
      v_item_valorCOFINSST,
      v_item_valorCreditoSimplesNac,
      v_item_valorICMS,
      v_item_valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      v_item_valorLiquidoItem,
      p_item_valorDescontoCustoOpIte,
      p_item_valorDescontoCustoOpGer,
      p_item_valorAcrescimoCustoOpIt,
      p_item_valorAcrescimoCustoOpGe,
      v_item_valorAcrescimoExtempTot,
      v_item_valorDescontoCustoOpTot,
      v_item_valorAcrescimoCustoOpTo,
      v_item_precoCustoOperacao,
      v_item_valorCustoOperacao,
      v_item_precoCMV,
      v_item_valorCMV);
    IF v_inserindoItem = 1 THEN
      SELECT COALESCE (MAX (sequencia),0) + 1
      INTO v_item_sequencia
      FROM MOPREDOCUMXITENS
      WHERE preDocumento = p_item_preDocumento;
      v_cab_ultimoVendedorItem := p_item_vendedor;
    END IF;
    IF v_item_cancelado = 0 THEN
      IF p_manterFinanceiro_Retotalizar <> 2 THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume + TRUNC(CASE WHEN p_item_controleQuantidade = 1 AND p_item_loteMultiplo <> 0 THEN p_item_quantidade / p_item_loteMultiplo ELSE p_item_quantidadeConvertida END,0);
        END IF;
        v_cab_pesoLiquido := v_cab_pesoLiquido + p_item_pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto + p_item_pesoBruto;
      END IF;
      v_cab_quantidade := v_cab_quantidade + p_item_quantidadeConvertida;
      IF v_prod_tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorServicos := v_cab_valorServicos + v_item_valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos + p_item_valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorProdutos := v_cab_valorProdutos + v_item_valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos + p_item_valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem + p_item_valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem + p_item_valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem + p_item_valorAdicFreteMarItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem + p_item_valorDespesasAduanItem;
      v_cab_valorFreteGeral := v_cab_valorFreteGeral + p_item_valorFreteGeral;
      v_cab_valorSeguroGeral := v_cab_valorSeguroGeral + p_item_valorSeguroGeral;
      v_cab_valorDescontoGeral := v_cab_valorDescontoGeral + v_item_valorDescontoGeral;
      v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral + p_item_valorOutrasDespesasGer;
      v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral + p_item_valorAdicFreteMarGeral;
      v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral + p_item_valorDespesasAduanGeral;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento + v_item_valorBasePagamento;
      IF p_item_usarPrecoAVista = 1
        AND v_item_geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo + v_item_valorProdutoServico - v_item_valorDescontoTotal + v_item_valorOutrasDespesasTot;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento + v_item_valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento + v_item_valorOutrasDespPagament;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento + v_item_valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal + v_item_valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal + v_item_valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal + v_item_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_item_valorOutrasDespesasTot;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal + v_item_valorAdicFreteMarTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal + v_item_valorDespesasAduanTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem + v_item_valorLiquidoItem;
      v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem + p_item_valorDescontoCustoOpIte;
      v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera + p_item_valorDescontoCustoOpGer;
      v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota + v_item_valorDescontoCustoOpTot;
      v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte + p_item_valorAcrescimoCustoOpIt;
      v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer + p_item_valorAcrescimoCustoOpGe;
      v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot + v_item_valorAcrescimoCustoOpTo;
      v_cab_valorCustoOperacao := v_cab_valorCustoOperacao + v_item_valorCustoOperacao;
      v_cab_valorCMV := v_cab_valorCMV + v_item_valorCMV;
      v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea + p_item_quantidadeExtemporanea;
      v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt + v_item_valorAcrescimoExtempSub;
      v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem + p_item_valorAcrescimoExtempIte;
      v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera + p_item_valorAcrescimoExtempGer;
      v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota + v_item_valorAcrescimoExtempTot;
    END IF;
    UPDATE MOPREDOCUMENTOS SET
      modalidadeFrete               = v_cab_modalidadeFrete,
      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,
      valorDescontoCustoOpItem      = v_cab_valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral     = v_cab_valorDescontoCustoOpGera,
      valorDescontoCustoOpTotal     = v_cab_valorDescontoCustoOpTota,
      valorAcrescimoCustoOpItem     = v_cab_valorAcrescimoCustoOpIte,
      valorAcrescimoCustoOpGeral    = v_cab_valorAcrescimoCustoOpGer,
      valorAcrescimoCustoOpTotal    = v_cab_valorAcrescimoCustoOpTot,
      valorCustoOperacao            = v_cab_valorCustoOperacao,
      valorCMV                      = v_cab_valorCMV,
      quantidadeExtemporanea        = v_cab_quantidadeExtemporanea,
      valorAcrescimoExtempSubtotal  = v_cab_valorAcrescimoExtempSubt,
      valorAcrescimoExtempItem      = v_cab_valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral     = v_cab_valorAcrescimoExtempGera,
      valorAcrescimoExtempTotal     = v_cab_valorAcrescimoExtempTota
    WHERE preDocumento = p_item_preDocumento;
    IF p_item_idItemPreDocumento > 0 THEN
      DELETE MOPREDOCUMXCOMPOSICOESPR compDoc
      WHERE compDoc.idItemPreDocumento = p_item_idItemPreDocumento
      AND EXISTS(
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.produto = comp.produto
        WHERE comp.composicaoPreco = compDoc.composicaoPreco
        AND gradProd.gradeProduto <> p_item_gradeProduto);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      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_413_obs_add_marca,
      p_config_418_obs_efetarEnter,
      ' ',
      0,
      'P',
      p_item_idItemPreDocumento,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    MERGE INTO MOPREDOCUMXITENS a USING (
      SELECT
        r_item_idItemPreDocumento      idItemPreDocumento,
        p_item_preDocumento            preDocumento,
        v_item_sequencia               sequencia,
        v_item_cancelado               cancelado,
        p_item_pedidoCompraFornecedor  pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo sequenciaPedidoCompraFornec,
        p_item_modeloDocumento         modeloDocumento,
        p_item_estabelecimentoOriginal estabelecimentoOriginal,
        p_item_vendedor                vendedor,
        p_item_gradeProduto            gradeProduto,
        p_item_idFormulaTinta          idFormulaTinta,
        p_item_personalizacao          personalizacao,
        p_item_idLoteEstoque           idLoteEstoque,
        p_item_operacaoFiscal          operacaoFiscal,
        v_item_movimentaEstoque        movimentaEstoque,
        v_item_geraFinanceiro          geraFinanceiro,
        p_item_localEstoque            localEstoque,
        p_item_pessoaParticipante      pessoaParticipante,
        p_item_controleQuantidade      controleQuantidade,
        p_item_unidadeMedidaConversao  unidadeMedidaConversao,
        p_item_conversorQuantidade     conversorQuantidade,
        p_item_loteMinimo              loteMinimo,
        p_item_loteMultiplo            loteMultiplo,
        p_item_altura                  altura,
        p_item_largura                 largura,
        p_item_comprimento             comprimento,
        p_item_pecas                   pecas,
        p_item_quantidade              quantidade,
        p_item_quantidadeConvertida    quantidadeConvertida,
        v_item_quantidadeDevolvidaRet  quantidadeDevolvidaRetornada,
        p_item_percentualDevolucao     percentualDevolucao,
        p_item_pesoLiquido             pesoLiquido,
        p_item_pesoBruto               pesoBruto,
        p_item_tipoPreco               tipoPreco,
        p_item_tabelaPreco             tabelaPreco,
        p_item_precoSugestaoAPrazo     precoSugestaoAPrazo,
        p_item_precoSugestaoAVista     precoSugestaoAVista,
        p_item_precoDesconto           precoDesconto,
        p_item_precoMinimo             precoMinimo,
        p_item_usarPrecoAVista         usarPrecoAVista,
        p_item_precoUnitarioBruto      precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos acrescimoUnitarioComposicao,
        v_item_precoUnitario           precoUnitario,
        v_item_precoUnitarioConvertido precoUnitarioConvertido,
        v_item_valorProdutoServicoBrut valorProdutoServicoBruto,
        v_item_valorProdutoServico     valorProdutoServico,
        p_item_percDescontoItem        percDescontoItem,
        p_item_valorDescontoItem       valorDescontoItem,
        p_item_percAcrescimoItem       percAcrescimoItem,
        p_item_valorAcrescimoItem      valorAcrescimoItem,
        p_item_valorFreteItem          valorFreteItem,
        p_item_valorSeguroItem         valorSeguroItem,
        p_item_valorAdicFreteMarItem   valorAdicFreteMarinhaMerItem,
        p_item_valorDespesasAduanItem  valorDespesasAduaneirasItem,
        p_item_valorFreteGeral         valorFreteGeral,
        p_item_valorSeguroGeral        valorSeguroGeral,
        v_item_valorDescontoGeral      valorDescontoGeral,
        p_item_valorOutrasDespesasGer  valorOutrasDespesasGeral,
        p_item_valorAdicFreteMarGeral  valorAdicFreteMarinhaMerGeral,
        p_item_valorDespesasAduanGeral valorDespesasAduaneirasGeral,
        v_item_valorBasePagamento      valorBasePagamento,
        v_item_valorDescontoPagamento  valorDescontoPagamento,
        v_item_valorOutrasDespPagament valorOutrasDespesasPagamento,
        v_item_valorJurosPagamento     valorJurosPagamento,
        v_item_valorFreteTotal         valorFreteTotal,
        v_item_valorSeguroTotal        valorSeguroTotal,
        v_item_valorDescontoTotal      valorDescontoTotal,
        v_item_valorOutrasDespesasTot  valorOutrasDespesasTotal,
        v_item_valorAdicFreteMarTotal  valorAdicFreteMarinhaMerTotal,
        v_item_valorDespesasAduanTotal valorDespesasAduaneirasTotal,
        v_item_cfop                    cfop,
        v_item_indicadorISSQN          indicadorISSQN,
        v_item_aliquotaISSQN           aliquotaISSQN,
        v_item_retidoISSQN             retidoISSQN,
        v_item_tributadoForaMunicipio  tributadoForaMunicipio,
        v_item_incentivoFiscal         incentivoFiscal,
        v_item_listaServicos           listaServicos,
        v_item_cnae                    cnae,
        v_item_idServicoMunicipio      idServicoMunicipio,
        v_item_numeroProcessoAdministr numeroProcessoAdministrativo,
        v_item_baseISSQN               baseISSQN,
        v_item_valorISSQN              valorISSQN,
        v_item_retencaoIRRF            retencaoIRRF,
        v_item_baseRetIRRF             baseRetIRRF,
        v_item_valorRetIRRF            valorRetIRRF,
        v_item_retencaoINSS            retencaoINSS,
        v_item_baseRetINSS             baseRetINSS,
        v_item_valorRetINSS            valorRetINSS,
        v_item_retencaoPIS             retencaoPIS,
        v_item_baseRetPIS              baseRetPIS,
        v_item_valorRetPIS             valorRetPIS,
        v_item_retencaoCOFINS          retencaoCOFINS,
        v_item_baseRetCOFINS           baseRetCOFINS,
        v_item_valorRetCOFINS          valorRetCOFINS,
        v_item_retencaoCSLL            retencaoCSLL,
        v_item_baseRetCSLL             baseRetCSLL,
        v_item_valorRetCSLL            valorRetCSLL,
        v_item_retencaoOutros          retencaoOutros,
        v_item_baseRetOutros           baseRetOutros,
        v_item_valorRetOutros          valorRetOutros,
        v_item_aliquotaII              aliquotaII,
        v_item_baseII                  baseII,
        v_item_valorII                 valorII,
        v_item_aliquotaIOF             aliquotaIOF,
        v_item_baseIOF                 baseIOF,
        v_item_valorIOF                valorIOF,
        v_item_codigoEnquadramentoIPI  codigoEnquadramentoIPI,
        v_item_stIPI                   stIPI,
        v_item_aliquotaIPI             aliquotaIPI,
        v_item_valorAliquotaIPI        valorAliquotaIPI,
        v_item_baseIPI                 baseIPI,
        v_item_valorIPI                valorIPI,
        p_item_valorIPIDevolucao       valorIPIDevolucao,
        v_item_stPIS                   stPIS,
        v_item_aliquotaPIS             aliquotaPIS,
        v_item_valorAliquotaPIS        valorAliquotaPIS,
        v_item_basePIS                 basePIS,
        v_item_valorPIS                valorPIS,
        v_item_aliquotaPISST           aliquotaPISST,
        v_item_valorAliquotaPISST      valorAliquotaPISST,
        v_item_basePISST               basePISST,
        v_item_valorPISST              valorPISST,
        v_item_stCOFINS                stCOFINS,
        v_item_aliquotaCOFINS          aliquotaCOFINS,
        v_item_valorAliquotaCOFINS     valorAliquotaCOFINS,
        v_item_baseCOFINS              baseCOFINS,
        v_item_valorCOFINS             valorCOFINS,
        v_item_aliquotaCOFINSST        aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST   valorAliquotaCOFINSST,
        v_item_baseCOFINSST            baseCOFINSST,
        v_item_valorCOFINSST           valorCOFINSST,
        v_item_stSimplesNacional       stSimplesNacional,
        v_item_creditoSimplesNacional  creditoSimplesNacional,
        v_item_baseCreditoSimplesNac   baseCreditoSimplesNacional,
        v_item_valorCreditoSimplesNac  valorCreditoSimplesNacional,
        v_item_stICMS                  stICMS,
        v_item_modalBaseCalcICMS       modalidadeBaseCalcICMS,
        v_item_reducaoBaseICMS         reducaoBaseICMS,
        v_item_aliquotaICMS            aliquotaICMS,
        v_item_diferimentoICMS         diferimentoICMS,
        v_item_motivoDesoneracaoICMS   motivoDesoneracaoICMS,
        v_item_idBeneficio             idBeneficio,
        v_item_baseICMS                baseICMS,
        v_item_valorICMSOperacao       valorICMSOperacao,
        v_item_valorICMSDiferido       valorICMSDiferido,
        v_item_valorICMS               valorICMS,
        v_item_valorICMSDesoneracao    valorICMSDesoneracao,
        v_item_modalBaseCalcICMSST     modalidadeBaseCalcICMSST,
        v_item_margemValorAdicionadoST margemValorAdicionadoST,
        v_item_reducaoBaseST           reducaoBaseST,
        v_item_aliquotaICMSST          aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin aliquotaSTSuportConsFinal,
        v_item_baseICMSST              baseICMSST,
        v_item_valorICMSST             valorICMSST,
        v_item_baseICMSSTAnteriormente baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment valorICMSSTAnteriormente,
        v_item_valorICMSProprioSubstit valorICMSProprioSubstituto,
        v_item_reducaoBaseICMSEfetivo  reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo     aliquotaICMSEfetivo,
        v_item_baseICMSEfetivo         baseICMSEfetivo,
        v_item_valorICMSEfetivo        valorICMSEfetivo,
        v_item_aliquotaICMSUFDestinat  aliquotaICMSUFDestinatario,
        v_item_aliquotaICMSInterestad  aliquotaICMSInterestadual,
        v_item_partilhaICMSInterestad  partilhaICMSInterestadual,
        v_item_baseICMSUFDestinatario  baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente     baseICMSUFRemetente,
        v_item_valorICMSUFRemetente    valorICMSUFRemetente,
        v_item_aliquotaFCP             aliquotaFCP,
        v_item_baseFCP                 baseFCP,
        v_item_valorFCP                valorFCP,
        v_item_aliquotaFCPST           aliquotaFCPST,
        v_item_baseFCPST               baseFCPST,
        v_item_valorFCPST              valorFCPST,
        v_item_aliquotaFCPSTAnteriorm  aliquotaFCPSTAnteriormente,
        v_item_baseFCPSTAnteriormente  baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente valorFCPSTAnteriormente,
        v_item_aliquotaFCPUFDestinat   aliquotaFCPUFDestinatario,
        v_item_baseFCPUFDestinatario   baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario  valorFCPUFDestinatario,
        v_item_aliquotaEstImpFederais  aliquotaEstimadaImpFederais,
        v_item_aliquotaEstImpEstaduais aliquotaEstimadaImpEstaduais,
        v_item_aliquotaEstImpMunicipai aliquotaEstimadaImpMunicipais,
        v_item_baseEstimadaImpostos    baseEstimadaImpostos,
        v_item_valorEstImpFederais     valorEstimadoImpFederais,
        v_item_valorEstImpEstaduais    valorEstimadoImpEstaduais,
        v_item_valorEstImpMunicipais   valorEstimadoImpMunicipais,
        v_item_valorLiquidoItem        valorLiquidoItem,
        p_item_valorDescontoCustoOpIte valorDescontoCustoOpItem,
        p_item_valorDescontoCustoOpGer valorDescontoCustoOpGeral,
        v_item_valorDescontoCustoOpTot valorDescontoCustoOpTotal,
        p_item_valorAcrescimoCustoOpIt valorAcrescimoCustoOpItem,
        p_item_valorAcrescimoCustoOpGe valorAcrescimoCustoOpGeral,
        v_item_valorAcrescimoCustoOpTo valorAcrescimoCustoOpTotal,
        v_item_precoCustoOperacao      precoCustoOperacao,
        v_item_valorCustoOperacao      valorCustoOperacao,
        v_item_precoCMV                precoCMV,
        v_item_valorCMV                valorCMV,
        p_item_quantidadeExtemporanea  quantidadeExtemporanea,
        p_item_acrescimoUnitarioExtemp acrescimoUnitarioExtemporaneo,
        v_item_valorAcrescimoExtempSub valorAcrescimoExtempSubtotal,
        p_item_valorAcrescimoExtempIte valorAcrescimoExtempItem,
        p_item_valorAcrescimoExtempGer valorAcrescimoExtempGeral,
        v_item_valorAcrescimoExtempTot valorAcrescimoExtempTotal,
        p_item_observacoesDigitadas    observacoesDigitadas,
        v_observacoes                  observacoes
      FROM DUAL) b
    ON (a.idItemPreDocumento = b.idItemPreDocumento)
    WHEN MATCHED THEN UPDATE SET
      a.preDocumento                  = b.preDocumento,
      a.sequencia                     = b.sequencia,
      a.cancelado                     = b.cancelado,
      a.pedidoCompraFornecedor        = b.pedidoCompraFornecedor,
      a.sequenciaPedidoCompraFornec   = b.sequenciaPedidoCompraFornec,
      a.vendedor                      = b.vendedor,
      a.modeloDocumento               = b.modeloDocumento,
      a.estabelecimentoOriginal       = b.estabelecimentoOriginal,
      a.gradeProduto                  = b.gradeProduto,
      a.idFormulaTinta                = b.idFormulaTinta,
      a.personalizacao                = b.personalizacao,
      a.idLoteEstoque                 = b.idLoteEstoque,
      a.operacaoFiscal                = b.operacaoFiscal,
      a.movimentaEstoque              = b.movimentaEstoque,
      a.geraFinanceiro                = b.geraFinanceiro,
      a.localEstoque                  = b.localEstoque,
      a.pessoaParticipante            = b.pessoaParticipante,
      a.controleQuantidade            = b.controleQuantidade,
      a.unidadeMedidaConversao        = b.unidadeMedidaConversao,
      a.conversorQuantidade           = b.conversorQuantidade,
      a.loteMinimo                    = b.loteMinimo,
      a.loteMultiplo                  = b.loteMultiplo,
      a.altura                        = b.altura,
      a.largura                       = b.largura,
      a.comprimento                   = b.comprimento,
      a.pecas                         = b.pecas,
      a.quantidade                    = b.quantidade,
      a.quantidadeConvertida          = b.quantidadeConvertida,
      a.quantidadeDevolvidaRetornada  = b.quantidadeDevolvidaRetornada,
      a.percentualDevolucao           = b.percentualDevolucao,
      a.pesoLiquido                   = b.pesoLiquido,
      a.pesoBruto                     = b.pesoBruto,
      a.tipoPreco                     = b.tipoPreco,
      a.tabelaPreco                   = b.tabelaPreco,
      a.precoSugestaoAPrazo           = b.precoSugestaoAPrazo,
      a.precoSugestaoAVista           = b.precoSugestaoAVista,
      a.precoDesconto                 = b.precoDesconto,
      a.precoMinimo                   = b.precoMinimo,
      a.usarPrecoAVista               = b.usarPrecoAVista,
      a.precoUnitarioBruto            = b.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao   = b.acrescimoUnitarioComposicao,
      a.precoUnitario                 = b.precoUnitario,
      a.precoUnitarioConvertido       = b.precounitarioConvertido,
      a.valorProdutoServicoBruto      = b.valorProdutoServicoBruto,
      a.valorProdutoServico           = b.valorProdutoServico,
      a.percDescontoItem              = b.percDescontoItem,
      a.valorDescontoItem             = b.valorDescontoItem,
      a.percAcrescimoItem             = b.percAcrescimoItem,
      a.valorAcrescimoItem            = b.valorAcrescimoItem,
      a.valorFreteItem                = b.valorFreteItem,
      a.valorSeguroItem               = b.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem  = b.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem   = b.valorDespesasAduaneirasItem,
      a.valorFreteGeral               = b.valorFreteGeral,
      a.valorSeguroGeral              = b.valorSeguroGeral,
      a.valorDescontoGeral            = b.valorDescontoGeral,
      a.valorOutrasDespesasGeral      = b.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral = b.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral  = b.valorDespesasAduaneirasGeral,
      a.valorBasePagamento            = b.valorBasePagamento,
      a.valorDescontoPagamento        = b.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento  = b.valorOutrasDespesasPagamento,
      a.valorJurosPagamento           = b.valorJurosPagamento,
      a.valorFreteTotal               = b.valorFreteTotal,
      a.valorSeguroTotal              = b.valorSeguroTotal,
      a.valorDescontoTotal            = b.valorDescontoTotal,
      a.valorOutrasDespesasTotal      = b.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal = b.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal  = b.valorDespesasAduaneirasTotal,
      a.cfop                          = b.cfop,
      a.indicadorISSQN                = b.indicadorISSQN,
      a.aliquotaISSQN                 = b.aliquotaISSQN,
      a.retidoISSQN                   = b.retidoISSQN,
      a.tributadoForaMunicipio        = b.tributadoForaMunicipio,
      a.incentivoFiscal               = b.incentivoFiscal,
      a.listaServicos                 = b.listaServicos,
      a.cnae                          = b.cnae,
      a.idServicoMunicipio            = b.idServicoMunicipio,
      a.numeroProcessoAdministrativo  = b.numeroProcessoAdministrativo,
      a.baseISSQN                     = b.baseISSQN,
      a.valorISSQN                    = b.valorISSQN,
      a.retencaoIRRF                  = b.retencaoIRRF,
      a.baseRetIRRF                   = b.baseRetIRRF,
      a.valorRetIRRF                  = b.valorRetIRRF,
      a.retencaoINSS                  = b.retencaoINSS,
      a.baseRetINSS                   = b.baseRetINSS,
      a.valorRetINSS                  = b.valorRetINSS,
      a.retencaoPIS                   = b.retencaoPIS,
      a.baseRetPIS                    = b.baseRetPIS,
      a.valorRetPIS                   = b.valorRetPIS,
      a.retencaoCOFINS                = b.retencaoCOFINS,
      a.baseRetCOFINS                 = b.baseRetCOFINS,
      a.valorRetCOFINS                = b.valorRetCOFINS,
      a.retencaoCSLL                  = b.retencaoCSLL,
      a.baseRetCSLL                   = b.baseRetCSLL,
      a.valorRetCSLL                  = b.valorRetCSLL,
      a.retencaoOutros                = b.retencaoOutros,
      a.baseRetOutros                 = b.baseRetOutros,
      a.valorRetOutros                = b.valorRetOutros,
      a.aliquotaII                    = b.aliquotaII,
      a.baseII                        = b.baseII,
      a.valorII                       = b.valorII,
      a.aliquotaIOF                   = b.aliquotaIOF,
      a.baseIOF                       = b.baseIOF,
      a.valorIOF                      = b.valorIOF,
      a.codigoEnquadramentoIPI        = b.codigoEnquadramentoIPI,
      a.stIPI                         = b.stIPI,
      a.aliquotaIPI                   = b.aliquotaIPI,
      a.valorAliquotaIPI              = b.valorAliquotaIPI,
      a.baseIPI                       = b.baseIPI,
      a.valorIPI                      = b.valorIPI,
      a.valorIPIDevolucao             = b.valorIPIDevolucao,
      a.stPIS                         = b.stPIS,
      a.aliquotaPIS                   = b.aliquotaPIS,
      a.valorAliquotaPIS              = b.valorAliquotaPIS,
      a.basePIS                       = b.basePIS,
      a.valorPIS                      = b.valorPIS,
      a.aliquotaPISST                 = b.aliquotaPISST,
      a.valorAliquotaPISST            = b.valorAliquotaPISST,
      a.basePISST                     = b.basePISST,
      a.valorPISST                    = b.valorPISST,
      a.stCOFINS                      = b.stCOFINS,
      a.aliquotaCOFINS                = b.aliquotaCOFINS,
      a.valorAliquotaCOFINS           = b.valorAliquotaCOFINS,
      a.baseCOFINS                    = b.baseCOFINS,
      a.valorCOFINS                   = b.valorCOFINS,
      a.aliquotaCOFINSST              = b.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST         = b.valorAliquotaCOFINSST,
      a.baseCOFINSST                  = b.baseCOFINSST,
      a.valorCOFINSST                 = b.valorCOFINSST,
      a.stSimplesNacional             = b.stSimplesNacional,
      a.creditoSimplesNacional        = b.creditoSimplesNacional,
      a.baseCreditoSimplesNacional    = b.baseCreditoSimplesNacional,
      a.valorCreditoSimplesNacional   = b.valorCreditoSimplesNacional,
      a.stICMS                        = b.stICMS,
      a.modalidadeBaseCalcICMS        = b.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS               = b.reducaoBaseICMS,
      a.aliquotaICMS                  = b.aliquotaICMS,
      a.diferimentoICMS               = b.diferimentoICMS,
      a.motivoDesoneracaoICMS         = b.motivoDesoneracaoICMS,
      a.idBeneficio                   = b.idBeneficio,
      a.baseICMS                      = b.baseICMS,
      a.valorICMSoperacao             = b.valorICMSoperacao,
      a.valorICMSdiferido             = b.valorICMSdiferido,
      a.valorICMS                     = b.valorICMS,
      a.valorICMSdesoneracao          = b.valorICMSdesoneracao,
      a.modalidadeBaseCalcICMSST      = b.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST       = b.margemValorAdicionadoST,
      a.reducaoBaseST                 = b.reducaoBaseST,
      a.aliquotaICMSST                = b.aliquotaICMSST,
      a.aliquotaSTSuportConsFinal     = b.aliquotaSTSuportConsFinal,
      a.baseICMSST                    = b.baseICMSST,
      a.valorICMSST                   = b.valorICMSST,
      a.baseICMSSTAnteriormente       = b.baseICMSSTAnteriormente,
      a.valorICMSSTAnteriormente      = b.valorICMSSTAnteriormente,
      a.valorICMSProprioSubstituto    = b.valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo        = b.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo           = b.aliquotaICMSEfetivo,
      a.baseICMSEfetivo               = b.baseICMSEfetivo,
      a.valorICMSEfetivo              = b.valorICMSEfetivo,
      a.aliquotaICMSUFDestinatario    = b.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual     = b.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual     = b.partilhaICMSInterestadual,
      a.baseICMSUFDestinatario        = b.baseICMSUFDestinatario,
      a.valorICMSUFDestinatario       = b.valorICMSUFDestinatario,
      a.baseICMSUFRemetente           = b.baseICMSUFRemetente,
      a.valorICMSUFRemetente          = b.valorICMSUFRemetente,
      a.aliquotaFCP                   = b.aliquotaFCP,
      a.baseFCP                       = b.baseFCP,
      a.valorFCP                      = b.valorFCP,
      a.aliquotaFCPST                 = b.aliquotaFCPST,
      a.baseFCPST                     = b.baseFCPST,
      a.valorFCPST                    = b.valorFCPST,
      a.aliquotaFCPSTAnteriormente    = b.aliquotaFCPSTAnteriormente,
      a.baseFCPSTAnteriormente        = b.baseFCPSTAnteriormente,
      a.valorFCPSTAnteriormente       = b.valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario     = b.aliquotaFCPUFDestinatario,
      a.baseFCPUFDestinatario         = b.baseFCPUFDestinatario,
      a.valorFCPUFDestinatario        = b.valorFCPUFDestinatario,
      a.aliquotaestimadaimpfederais   = b.aliquotaestimadaimpfederais,
      a.aliquotaestimadaimpestaduais  = b.aliquotaestimadaimpestaduais,
      a.aliquotaestimadaimpmunicipais = b.aliquotaestimadaimpmunicipais,
      a.baseestimadaimpostos          = b.baseestimadaimpostos,
      a.valorestimadoimpfederais      = b.valorestimadoimpfederais,
      a.valorEstimadoImpEstaduais     = b.valorEstimadoImpEstaduais,
      a.valorEstimadoImpMunicipais    = b.valorEstimadoImpMunicipais,
      a.valorLiquidoItem              = b.valorLiquidoItem,
      a.valorDescontoCustoOpItem      = b.valorDescontoCustoOpItem,
      a.valorDescontoCustoOpGeral     = b.valorDescontoCustoOpGeral,
      a.valorDescontoCustoOpTotal     = b.valorDescontoCustoOpTotal,
      a.valorAcrescimoCustoOpItem     = b.valorAcrescimoCustoOpItem,
      a.valorAcrescimoCustoOpGeral    = b.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoCustoOpTotal    = b.valorAcrescimoCustoOpTotal,
      a.precoCustoOperacao            = b.precoCustoOperacao,
      a.valorCustoOperacao            = b.valorCustoOperacao,
      a.precoCMV                      = b.precoCMV,
      a.valorCMV                      = b.valorCMV,
      a.quantidadeExtemporanea        = b.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo = b.acrescimoUnitarioExtemporaneo,
      a.valorAcrescimoExtempSubtotal  = b.valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem      = b.valorAcrescimoExtempItem,
      a.valorAcrescimoExtempGeral     = b.valorAcrescimoExtempGeral,
      a.valorAcrescimoExtempTotal     = b.valorAcrescimoExtempTotal,
      a.observacoesDigitadas          = b.observacoesDigitadas,
      a.observacoes                   = b.observacoes
    WHEN NOT MATCHED THEN INSERT (
      idItemPreDocumento,
      preDocumento,
      sequencia,
      cancelado,
      pedidoCompraFornecedor,
      sequenciaPedidoCompraFornec,
      modeloDocumento,
      estabelecimentoOriginal,
      vendedor,
      gradeProduto,
      idFormulaTinta,
      personalizacao,
      idLoteEstoque,
      operacaoFiscal,
      movimentaEstoque,
      geraFinanceiro,
      localEstoque,
      pessoaParticipante,
      controleQuantidade,
      unidadeMedidaConversao,
      conversorQuantidade,
      loteMinimo,
      loteMultiplo,
      altura,
      largura,
      comprimento,
      pecas,
      quantidade,
      quantidadeConvertida,
      quantidadeDevolvidaRetornada,
      percentualDevolucao,
      pesoLiquido,
      pesoBruto,
      tipoPreco,
      tabelaPreco,
      precoSugestaoAPrazo,
      precoSugestaoAVista,
      precoDesconto,
      precoMinimo,
      usarPrecoAVista,
      precoUnitarioBruto,
      acrescimoUnitarioComposicao,
      precoUnitario,
      precoUnitarioConvertido,
      valorProdutoServicoBruto,
      valorProdutoServico,
      percDescontoItem,
      valorDescontoItem,
      percAcrescimoItem,
      valorAcrescimoItem,
      valorFreteItem,
      valorSeguroItem,
      valorAdicFreteMarinhaMerItem,
      valorDespesasAduaneirasItem,
      valorFreteGeral,
      valorSeguroGeral,
      valorDescontoGeral,
      valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral,
      valorDespesasAduaneirasGeral,
      valorBasePagamento,
      valorDescontoPagamento,
      valorOutrasDespesasPagamento,
      valorJurosPagamento,
      valorFreteTotal,
      valorSeguroTotal,
      valorDescontoTotal,
      valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal,
      valorDespesasAduaneirasTotal,
      cfop,
      indicadorISSQN,
      aliquotaISSQN,
      retidoISSQN,
      tributadoForaMunicipio,
      incentivoFiscal,
      listaServicos,
      cnae,
      idServicoMunicipio,
      numeroProcessoAdministrativo,
      baseISSQN,
      valorISSQN,
      retencaoIRRF,
      baseRetIRRF,
      valorRetIRRF,
      retencaoINSS,
      baseRetINSS,
      valorRetINSS,
      retencaoPIS,
      baseRetPIS,
      valorRetPIS,
      retencaoCOFINS,
      baseRetCOFINS,
      valorRetCOFINS,
      retencaoCSLL,
      baseRetCSLL,
      valorRetCSLL,
      retencaoOutros,
      baseRetOutros,
      valorRetOutros,
      aliquotaII,
      baseII,
      valorII,
      aliquotaIOF,
      baseIOF,
      valorIOF,
      codigoEnquadramentoIPI,
      stIPI,
      aliquotaIPI,
      valorAliquotaIPI,
      baseIPI,
      valorIPI,
      valorIPIDevolucao,
      stPIS,
      aliquotaPIS,
      valorAliquotaPIS,
      basePIS,
      valorPIS,
      aliquotaPISST,
      valorAliquotaPISST,
      basePISST,
      valorPISST,
      stCOFINS,
      aliquotaCOFINS,
      valorAliquotaCOFINS,
      baseCOFINS,
      valorCOFINS,
      aliquotaCOFINSST,
      valorAliquotaCOFINSST,
      baseCOFINSST,
      valorCOFINSST,
      stSimplesNacional,
      creditoSimplesNacional,
      baseCreditoSimplesNacional,
      valorCreditoSimplesNacional,
      stICMS,
      modalidadeBaseCalcICMS,
      reducaoBaseICMS,
      aliquotaICMS,
      diferimentoICMS,
      motivoDesoneracaoICMS,
      idBeneficio,
      baseICMS,
      valorICMSOperacao,
      valorICMSDiferido,
      valorICMS,
      valorICMSDesoneracao,
      modalidadeBaseCalcICMSST,
      margemValorAdicionadoST,
      reducaoBaseST,
      aliquotaICMSST,
      aliquotaSTSuportConsFinal,
      baseICMSST,
      valorICMSST,
      baseICMSSTAnteriormente,
      valorICMSSTAnteriormente,
      valorICMSProprioSubstituto,
      reducaoBaseICMSEfetivo,
      aliquotaICMSEfetivo,
      baseICMSEfetivo,
      valorICMSEfetivo,
      aliquotaICMSUFDestinatario,
      aliquotaICMSInterestadual,
      partilhaICMSInterestadual,
      baseICMSUFDestinatario,
      valorICMSUFDestinatario,
      baseICMSUFRemetente,
      valorICMSUFRemetente,
      aliquotaFCP,
      baseFCP,
      valorFCP,
      aliquotaFCPST,
      baseFCPST,
      valorFCPST,
      aliquotaFCPSTAnteriormente,
      baseFCPSTAnteriormente,
      valorFCPSTAnteriormente,
      aliquotaFCPUFDestinatario,
      baseFCPUFDestinatario,
      valorFCPUFDestinatario,
      aliquotaEstimadaImpFederais,
      aliquotaEstimadaImpEstaduais,
      aliquotaEstimadaImpMunicipais,
      baseEstimadaImpostos,
      valorEstimadoImpFederais,
      valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais,
      valorLiquidoItem,
      valorDescontoCustoOpItem,
      valorDescontoCustoOpGeral,
      valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpItem,
      valorAcrescimoCustoOpGeral,
      valorAcrescimoCustoOpTotal,
      precoCustoOperacao,
      valorCustoOperacao,
      precoCMV,
      valorCMV,
      quantidadeExtemporanea,
      acrescimoUnitarioExtemporaneo,
      valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempItem,
      valorAcrescimoExtempGeral,
      valorAcrescimoExtempTotal,
      observacoesDigitadas,
      observacoes)
    VALUES (
      b.idItemPreDocumento,
      b.preDocumento,
      b.sequencia,
      b.cancelado,
      b.pedidoCompraFornecedor,
      b.sequenciaPedidoCompraFornec,
      b.modeloDocumento,
      b.estabelecimentoOriginal,
      b.vendedor,
      b.gradeProduto,
      b.idFormulaTinta,
      b.personalizacao,
      b.idLoteEstoque,
      b.operacaoFiscal,
      b.movimentaEstoque,
      b.geraFinanceiro,
      b.localEstoque,
      b.pessoaParticipante,
      b.controleQuantidade,
      b.unidadeMedidaConversao,
      b.conversorQuantidade,
      b.loteMinimo,
      b.loteMultiplo,
      b.altura,
      b.largura,
      b.comprimento,
      b.pecas,
      b.quantidade,
      b.quantidadeConvertida,
      b.quantidadeDevolvidaRetornada,
      b.percentualDevolucao,
      b.pesoLiquido,
      b.pesoBruto,
      b.tipoPreco,
      b.tabelaPreco,
      b.precoSugestaoAPrazo,
      b.precoSugestaoAVista,
      b.precoDesconto,
      b.precoMinimo,
      b.usarPrecoAVista,
      b.precoUnitarioBruto,
      b.acrescimoUnitarioComposicao,
      b.precoUnitario,
      b.precoUnitarioConvertido,
      b.valorProdutoServicoBruto,
      b.valorProdutoServico,
      b.percDescontoItem,
      b.valorDescontoItem,
      b.percAcrescimoItem,
      b.valorAcrescimoItem,
      b.valorFreteItem,
      b.valorSeguroItem,
      b.valorAdicFreteMarinhaMerItem,
      b.valorDespesasAduaneirasItem,
      b.valorFreteGeral,
      b.valorSeguroGeral,
      b.valorDescontoGeral,
      b.valorOutrasDespesasGeral,
      b.valorAdicFreteMarinhaMerGeral,
      b.valorDespesasAduaneirasGeral,
      b.valorBasePagamento,
      b.valorDescontoPagamento,
      b.valorOutrasDespesasPagamento,
      b.valorJurosPagamento,
      b.valorFreteTotal,
      b.valorSeguroTotal,
      b.valorDescontoTotal,
      b.valorOutrasDespesasTotal,
      b.valorAdicFreteMarinhaMerTotal,
      b.valorDespesasAduaneirasTotal,
      b.cfop,
      b.indicadorISSQN,
      b.aliquotaISSQN,
      b.retidoISSQN,
      b.tributadoForaMunicipio,
      b.incentivoFiscal,
      b.listaServicos,
      b.cnae,
      b.idServicoMunicipio,
      b.numeroProcessoAdministrativo,
      b.baseISSQN,
      b.valorISSQN,
      b.retencaoIRRF,
      b.baseRetIRRF,
      b.valorRetIRRF,
      b.retencaoINSS,
      b.baseRetINSS,
      b.valorRetINSS,
      b.retencaoPIS,
      b.baseRetPIS,
      b.valorRetPIS,
      b.retencaoCOFINS,
      b.baseRetCOFINS,
      b.valorRetCOFINS,
      b.retencaoCSLL,
      b.baseRetCSLL,
      b.valorRetCSLL,
      b.retencaoOutros,
      b.baseRetOutros,
      b.valorRetOutros,
      b.aliquotaII,
      b.baseII,
      b.valorII,
      b.aliquotaIOF,
      b.baseIOF,
      b.valorIOF,
      b.codigoEnquadramentoIPI,
      b.stIPI,
      b.aliquotaIPI,
      b.valorAliquotaIPI,
      b.baseIPI,
      b.valorIPI,
      b.valorIPIDevolucao,
      b.stPIS,
      b.aliquotaPIS,
      b.valorAliquotaPIS,
      b.basePIS,
      b.valorPIS,
      b.aliquotaPISST,
      b.valorAliquotaPISST,
      b.basePISST,
      b.valorPISST,
      b.stCOFINS,
      b.aliquotaCOFINS,
      b.valorAliquotaCOFINS,
      b.baseCOFINS,
      b.valorCOFINS,
      b.aliquotaCOFINSST,
      b.valorAliquotaCOFINSST,
      b.baseCOFINSST,
      b.valorCOFINSST,
      b.stSimplesNacional,
      b.creditoSimplesNacional,
      b.baseCreditoSimplesNacional,
      b.valorCreditoSimplesNacional,
      b.stICMS,
      b.modalidadeBaseCalcICMS,
      b.reducaoBaseICMS,
      b.aliquotaICMS,
      b.diferimentoICMS,
      b.motivoDesoneracaoICMS,
      b.idBeneficio,
      b.baseICMS,
      b.valorICMSOperacao,
      b.valorICMSDiferido,
      b.valorICMS,
      b.valorICMSDesoneracao,
      b.modalidadeBaseCalcICMSST,
      b.margemValorAdicionadoST,
      b.reducaoBaseST,
      b.aliquotaICMSST,
      b.aliquotaSTSuportConsFinal,
      b.baseICMSST,
      b.valorICMSST,
      b.baseICMSSTAnteriormente,
      b.valorICMSSTAnteriormente,
      b.valorICMSProprioSubstituto,
      b.reducaoBaseICMSEfetivo,
      b.aliquotaICMSEfetivo,
      b.baseICMSEfetivo,
      b.valorICMSEfetivo,
      b.aliquotaICMSUFDestinatario,
      b.aliquotaICMSInterestadual,
      b.partilhaICMSInterestadual,
      b.baseICMSUFDestinatario,
      b.valorICMSUFDestinatario,
      b.baseICMSUFRemetente,
      b.valorICMSUFRemetente,
      b.aliquotaFCP,
      b.baseFCP,
      b.valorFCP,
      b.aliquotaFCPST,
      b.baseFCPST,
      b.valorFCPST,
      b.aliquotaFCPSTAnteriormente,
      b.baseFCPSTAnteriormente,
      b.valorFCPSTAnteriormente,
      b.aliquotaFCPUFDestinatario,
      b.baseFCPUFDestinatario,
      b.valorFCPUFDestinatario,
      b.aliquotaEstimadaImpFederais,
      b.aliquotaEstimadaImpEstaduais,
      b.aliquotaEstimadaImpMunicipais,
      b.baseEstimadaImpostos,
      b.valorEstimadoImpFederais,
      b.valorEstimadoImpEstaduais,
      b.valorEstimadoImpMunicipais,
      b.valorLiquidoItem,
      b.valorDescontoCustoOpItem,
      b.valorDescontoCustoOpGeral,
      b.valorDescontoCustoOpTotal,
      b.valorAcrescimoCustoOpItem,
      b.valorAcrescimoCustoOpGeral,
      b.valorAcrescimoCustoOpTotal,
      b.precoCustoOperacao,
      b.valorCustoOperacao,
      b.precoCMV,
      b.valorCMV,
      b.quantidadeExtemporanea,
      b.acrescimoUnitarioExtemporaneo,
      b.valorAcrescimoExtempSubtotal,
      b.valorAcrescimoExtempItem,
      b.valorAcrescimoExtempGeral,
      b.valorAcrescimoExtempTotal,
      b.observacoesDigitadas,
      b.observacoes);
    v_atualizarObservacoes := 0;
    IF p_idItemReferenciado > 0 THEN
      IF p_tipoDocumentoReferenciado IN ('D','P') THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV(
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_devolucaoAnulacaoRetorno,
          'P',
          r_item_idItemPreDocumento,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          p_tipoDocumentoReferenciado,
          p_idItemReferenciado);
      END IF;
      IF p_tipoDocumentoReferenciado = 'D' THEN
        ADD_PRE_DOC_ITEM_REF_DOC_FIS (
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_preDocumento,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemPreDocumento,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'O' THEN
        ADD_PRE_DOC_ITEM_REF_ORCAMEN (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_preDocumento,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemPreDocumento,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'P' THEN
        ADD_PRE_DOC_ITEM_REF_PRE_DOC (
          p_estabelecimentoAtivo,
          p_config_227_manterPessoaOrcam,
          p_item_preDocumento,
          v_cab_tipoDocumento,
          v_cab_documentoFiscal,
          v_cab_estabelecimento,
          v_cab_pessoa,
          r_item_idItemPreDocumento,
          v_item_sequencia,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_unidadeMedidaConversao,
          p_item_quantidade,
          p_item_quantidadeConvertida,
          v_item_valorLiquidoItem,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'T' THEN
        ADD_PRE_DOC_ITEM_TRANS_GRAVA (
          p_estabelecimentoAtivo,
          v_cab_entradaSaida,
          p_idItemReferenciado,
          r_item_idItemPreDocumento,
          p_quantidadeReferenciada);
      END IF;
    END IF;
    IF p_tempComp_nomeTempComposicao <> ' '
      AND (NOT (p_tipoDocumentoReferenciado IN ('D','O','P'))
        OR p_idItemReferenciado <= 0)
    THEN
      ADD_PRE_DOC_ITEM_COMP_TEMP (
        p_sessaoClient,
        p_estabelecimentoAtivo,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        r_item_idItemPreDocumento,
        v_atualizarObservacoes,
        v_atualizarObservacoes);
    END IF;
    v_idEnderecoEstoque := 0;
    IF p_item_idEnderecoEstoque > 0 THEN
      ADD_PRE_DOC_ITEM_ENDER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemPreDocumento,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_quantidade,
        ' ',
        v_idEnderecoEstoque);
    END IF;
    IF p_item_idNumeroSerie > 0 THEN
      ADD_PRE_DOC_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemPreDocumento,
        v_idEnderecoEstoque,
        p_item_gradeProduto,
        p_item_idNumeroSerie,
        0,
        v_auxNumber);
      v_atualizarObservacoes := 1;
    END IF;
    IF v_atualizarObservacoes = 1 THEN
      v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
        p_sessaoClient,
        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_413_obs_add_marca,
        p_config_418_obs_efetarEnter,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        'P',
        r_item_idItemPreDocumento,
        p_item_gradeProduto,
        p_item_idFormulaTinta,
        p_item_personalizacao,
        p_item_idLoteEstoque,
        p_item_controleQuantidade,
        p_item_loteMultiplo,
        p_item_altura,
        p_item_largura,
        p_item_comprimento,
        p_item_quantidade,
        p_item_observacoesDigitadas);
      UPDATE MOPREDOCUMXITENS
      SET observacoes = v_observacoes
      WHERE idItemPreDocumento = r_item_idItemPreDocumento;
    END IF;
    IF v_cab_statusPreDocumento = 'A' THEN
      ADD_PRE_DOC_ITEM_EST_ATUALIZA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_item_idItemPreDocumento,
        p_estabelecimentoAtivo);
      ADD_PRE_DOC_ITEM_FIL_ATUALIZA (
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_item_idItemPreDocumento,
        p_estabelecimentoAtivo);
    END IF;
    r_buffer_idItemPreDocumento := CASE WHEN (r_buffer_idItemPreDocumento IS NULL OR r_buffer_idItemPreDocumento = '' OR r_buffer_idItemPreDocumento = ' ') THEN '' ELSE RTRIM (r_buffer_idItemPreDocumento) || ';' END || TO_CHAR (LPAD(r_item_idItemPreDocumento,14,'0'));
    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;
  END IF;
END ADD_PRE_DOC_ITEM_GRAVA;

/

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_config_413_obs_add_marca     IN NUMBER,
  p_config_418_obs_efetarEnter   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, 'F' Fatura Contrato, 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_atividadeProjeto        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_idAtividadesPrevistasSelec   IN VARCHAR2,
  p_nivel                        IN NUMBER,
  p_buffer_item_idItemOrcamento  IN VARCHAR2,
  /* Retornos */
  r_mensagemAviso                OUT VARCHAR,
  r_calcularImpostos             OUT NUMBER,
  r_item_idItemOrcamento         OUT NUMBER,
  r_buffer_item_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_projeto                  VARCHAR2 (60);
  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_unidadeMedida           VARCHAR2(6);
  v_prod_controleEstoque         NUMBER;
  v_prod_pesoLiquido             NUMBER;
  v_prod_pesoBruto               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_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_ativ_selecionaAtividadePrev  NUMBER;
  v_ativ_numero                  NUMBER;
  v_ativ_quantidade              NUMBER;
  v_ativ_precoUnitarioMenor      NUMBER;
  v_ativ_precoUnitario           NUMBER;
  v_ativ_valorTotalItem          NUMBER;
  v_ativ_geraFinanceiro          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_item_idItemOrcamento := p_buffer_item_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.projeto,
    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_projeto,
    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.unidadeMedida,
    prod.controleEstoque,
    prod.pesoLiquido,
    prod.pesoBruto,
    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_unidadeMedida,
    v_prod_controleEstoque,
    v_prod_pesoLiquido,
    v_prod_pesoBruto,
    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
        IF p_buscarGeraFinanceiroEstoque = 1 THEN
          v_item_movimentaEstoque        := a.movimentaEstoque;
          v_item_geraFinanceiro          := a.geraFinanceiro;
        END IF;
        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 / ((v_combo_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 / ((v_combo_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_cab_projeto,
        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_config_413_obs_add_marca,
        p_config_418_obs_efetarEnter,
        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_atividadeProjeto,
        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_idAtividadesPrevistasSelec
        p_nivel + 1, -- p_nivel,
        r_buffer_item_idItemOrcamento,
        r_mensagemAviso,
        r_calcularImpostos,
        v_auxNumber, -- idItemOrcamento
        r_buffer_item_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_item_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
      SELECT COALESCE (MAX (sequencia),0) + 1
      INTO v_item_sequencia
      FROM MOORCAMENTOXITENS
      WHERE orcamento = p_item_orcamento;
      v_cab_ultimoVendedorItem := p_item_vendedor;
    END IF;
    IF v_item_cancelado = 0 THEN
      IF p_manterFinanceiro_Retotalizar <> 2 THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume + TRUNC(CASE WHEN p_item_controleQuantidade = 1 AND p_item_loteMultiplo <> 0 THEN p_item_quantidade / p_item_loteMultiplo ELSE p_item_quantidadeConvertida END,0);
        END IF;
        v_cab_pesoLiquido := v_cab_pesoLiquido + p_item_pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto + p_item_pesoBruto;
      END IF;
      v_cab_quantidade := v_cab_quantidade + p_item_quantidadeConvertida;
      IF v_prod_tipoProduto = '09' THEN
        v_cab_valorServicosBruto := v_cab_valorServicosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorServicos := v_cab_valorServicos + v_item_valorProdutoServico;
        v_cab_valorDescontoServicos := v_cab_valorDescontoServicos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos + p_item_valorAcrescimoItem;
      ELSE 
        v_cab_valorProdutosBruto := v_cab_valorProdutosBruto + v_item_valorProdutoServicoBrut;
        v_cab_valorProdutos := v_cab_valorProdutos + v_item_valorProdutoServico;
        v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos + p_item_valorDescontoItem;
        v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos + p_item_valorAcrescimoItem;
      END IF;
      v_cab_valorFreteItem := v_cab_valorFreteItem + p_item_valorFreteItem;
      v_cab_valorSeguroItem := v_cab_valorSeguroItem + p_item_valorSeguroItem;
      v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem + p_item_valorAdicFreteMarItem;
      v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem + p_item_valorDespesasAduanItem;
      v_cab_valorFreteGeral := v_cab_valorFreteGeral + v_item_valorFreteGeral;
      v_cab_valorSeguroGeral := v_cab_valorSeguroGeral + p_item_valorSeguroGeral;
      v_cab_valorDescontoGeral := v_cab_valorDescontoGeral + v_item_valorDescontoGeral;
      v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral + p_item_valorOutrasDespesasGer;
      v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral + p_item_valorAdicFreteMarGeral;
      v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral + p_item_valorDespesasAduanGeral;
      v_cab_valorBasePagamento := v_cab_valorBasePagamento + v_item_valorBasePagamento;
      IF p_item_usarPrecoAVista = 1
        AND v_item_geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo + v_item_valorProdutoServico - v_item_valorDescontoTotal + v_item_valorOutrasDespesasTot;
      END IF;
      v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento + v_item_valorDescontoPagamento;
      v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento + v_item_valorOutrasDespPagament;
      v_cab_valorJurosPagamento := v_cab_valorJurosPagamento + v_item_valorJurosPagamento;
      v_cab_valorFreteTotal := v_cab_valorFreteTotal + v_item_valorFreteTotal;
      v_cab_valorSeguroTotal := v_cab_valorSeguroTotal + v_item_valorSeguroTotal;
      v_cab_valorDescontoTotal := v_cab_valorDescontoTotal + v_item_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_item_valorOutrasDespesasTot;
      v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal + v_item_valorAdicFreteMarTotal;
      v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal + v_item_valorDespesasAduanTotal;
      v_cab_valorLiquidoItem := v_cab_valorLiquidoItem + v_item_valorLiquidoItem;
    ELSE
      v_item_quantidadeSaldo := 0;
    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 = p_item_orcamento;
    IF p_item_idItemOrcamento > 0 THEN
      DELETE MOORCAMENTOXCOMPOSICOESPR compDoc
      WHERE compDoc.idItemOrcamento = p_item_idItemOrcamento
      AND EXISTS(
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.produto = comp.produto
        WHERE comp.composicaoPreco = compDoc.composicaoPreco
        AND gradProd.gradeProduto <> p_item_gradeProduto);
    END IF;
    v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_sessaoClient,
      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_413_obs_add_marca,
      p_config_418_obs_efetarEnter,
      ' ',
      0,
      'O',
      p_item_idItemOrcamento,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_controleQuantidade,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_quantidade,
      p_item_observacoesDigitadas);
    MERGE INTO MOORCAMENTOXITENS a USING (
      SELECT
        r_item_idItemOrcamento         idItemOrcamento,
        p_item_orcamento               orcamento,
        v_item_sequencia               sequencia,
        v_item_cancelado               cancelado,
        p_item_pedidoCompraFornecedor  pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo sequenciaPedidoCompraFornec,
        p_item_ambiente                ambiente,
        p_item_ambienteObservacoes     ambienteObservacoes,
        p_item_modeloDocumento         modeloDocumento,
        p_item_estabelecimentoOriginal estabelecimentoOriginal,
        p_item_vendedor                vendedor,
        p_item_gradeProduto            gradeProduto,
        p_item_atividadeServico        atividadeServico,
        p_item_statusAtividadeServico  statusAtividadeServico,
        p_item_idFormulaTinta          idFormulaTinta,
        p_item_personalizacao          personalizacao,
        p_item_idLoteEstoque           idLoteEstoque,
        p_item_vinculoItemDocumento    vinculoItemDocumento,
        p_item_operacaoFiscal          operacaoFiscal,
        v_item_movimentaEstoque        movimentaEstoque,
        v_item_geraFinanceiro          geraFinanceiro,
        p_item_localEstoque            localEstoque,
        p_item_pessoaParticipante      pessoaParticipante,
        p_item_dataEntrega             dataEntrega,
        p_item_controleQuantidade      controleQuantidade,
        p_item_unidadeMedidaConversao  unidadeMedidaConversao,
        p_item_conversorQuantidade     conversorQuantidade,
        p_item_loteMinimo              loteMinimo,
        p_item_loteMultiplo            loteMultiplo,
        p_item_altura                  altura,
        p_item_largura                 largura,
        p_item_comprimento             comprimento,
        p_item_pecas                   pecas,
        p_item_quantidade              quantidade,
        p_item_quantidadeConvertida    quantidadeConvertida,
        v_item_quantidadeSaldo         quantidadeSaldo,
        p_item_controleEntrega         controleEntrega,
        p_item_pesoLiquido             pesoLiquido,
        p_item_pesoBruto               pesoBruto,
        p_item_tipoPreco               tipoPreco,
        p_item_tabelaPreco             tabelaPreco,
        p_item_precoSugestaoAPrazo     precoSugestaoAPrazo,
        p_item_precoSugestaoAVista     precoSugestaoAVista,
        p_item_precoDesconto           precoDesconto,
        p_item_precoMinimo             precoMinimo,
        p_item_usarPrecoAVista         usarPrecoAVista,
        p_item_precoUnitarioBruto      precoUnitarioBruto,
        p_item_acrescimoUnitarioCompos acrescimoUnitarioComposicao,
        v_item_precoUnitario           precoUnitario,
        v_item_precoUnitarioConvertido precoUnitarioConvertido,
        v_item_valorProdutoServicoBrut valorProdutoServicoBruto,
        v_item_valorProdutoServico     valorProdutoServico,
        p_item_percDescontoItem        percDescontoItem,
        p_item_valorDescontoItem       valorDescontoItem,
        p_item_percAcrescimoItem       percAcrescimoItem,
        p_item_valorAcrescimoItem      valorAcrescimoItem,
        p_item_valorFreteItem          valorFreteItem,
        p_item_valorSeguroItem         valorSeguroItem,
        p_item_valorAdicFreteMarItem   valorAdicFreteMarinhaMerItem,
        p_item_valorDespesasAduanItem  valorDespesasAduaneirasItem,
        v_item_valorFreteGeral         valorFreteGeral,
        p_item_valorSeguroGeral        valorSeguroGeral,
        v_item_valorDescontoGeral      valorDescontoGeral,
        p_item_valorOutrasDespesasGer  valorOutrasDespesasGeral,
        p_item_valorAdicFreteMarGeral  valorAdicFreteMarinhaMerGeral,
        p_item_valorDespesasAduanGeral valorDespesasAduaneirasGeral,
        v_item_valorBasePagamento      valorBasePagamento,
        v_item_valorDescontoPagamento  valorDescontoPagamento,
        v_item_valorOutrasDespPagament valorOutrasDespesasPagamento,
        v_item_valorJurosPagamento     valorJurosPagamento,
        v_item_valorFreteTotal         valorFreteTotal,
        v_item_valorSeguroTotal        valorSeguroTotal,
        v_item_valorDescontoTotal      valorDescontoTotal,
        v_item_valorOutrasDespesasTot  valorOutrasDespesasTotal,
        v_item_valorAdicFreteMarTotal  valorAdicFreteMarinhaMerTotal,
        v_item_valorDespesasAduanTotal valorDespesasAduaneirasTotal,
        v_item_cfop                    cfop,
        v_item_indicadorISSQN          indicadorISSQN,
        v_item_aliquotaISSQN           aliquotaISSQN,
        v_item_retidoISSQN             retidoISSQN,
        v_item_tributadoForaMunicipio  tributadoForaMunicipio,
        v_item_incentivoFiscal         incentivoFiscal,
        v_item_listaServicos           listaServicos,
        v_item_cnae                    cnae,
        v_item_idServicoMunicipio      idServicoMunicipio,
        v_item_numeroProcessoAdministr numeroProcessoAdministrativo,
        v_item_baseISSQN               baseISSQN,
        v_item_valorISSQN              valorISSQN,
        v_item_retencaoIRRF            retencaoIRRF,
        v_item_baseRetIRRF             baseRetIRRF,
        v_item_valorRetIRRF            valorRetIRRF,
        v_item_retencaoINSS            retencaoINSS,
        v_item_baseRetINSS             baseRetINSS,
        v_item_valorRetINSS            valorRetINSS,
        v_item_retencaoPIS             retencaoPIS,
        v_item_baseRetPIS              baseRetPIS,
        v_item_valorRetPIS             valorRetPIS,
        v_item_retencaoCOFINS          retencaoCOFINS,
        v_item_baseRetCOFINS           baseRetCOFINS,
        v_item_valorRetCOFINS          valorRetCOFINS,
        v_item_retencaoCSLL            retencaoCSLL,
        v_item_baseRetCSLL             baseRetCSLL,
        v_item_valorRetCSLL            valorRetCSLL,
        v_item_retencaoOutros          retencaoOutros,
        v_item_baseRetOutros           baseRetOutros,
        v_item_valorRetOutros          valorRetOutros,
        v_item_aliquotaII              aliquotaII,
        v_item_baseII                  baseII,
        v_item_valorII                 valorII,
        v_item_aliquotaIOF             aliquotaIOF,
        v_item_baseIOF                 baseIOF,
        v_item_valorIOF                valorIOF,
        v_item_codigoEnquadramentoIPI  codigoEnquadramentoIPI,
        v_item_stIPI                   stIPI,
        v_item_aliquotaIPI             aliquotaIPI,
        v_item_valorAliquotaIPI        valorAliquotaIPI,
        v_item_baseIPI                 baseIPI,
        v_item_valorIPI                valorIPI,
        v_item_stPIS                   stPIS,
        v_item_aliquotaPIS             aliquotaPIS,
        v_item_valorAliquotaPIS        valorAliquotaPIS,
        v_item_basePIS                 basePIS,
        v_item_valorPIS                valorPIS,
        v_item_aliquotaPISST           aliquotaPISST,
        v_item_valorAliquotaPISST      valorAliquotaPISST,
        v_item_basePISST               basePISST,
        v_item_valorPISST              valorPISST,
        v_item_stCOFINS                stCOFINS,
        v_item_aliquotaCOFINS          aliquotaCOFINS,
        v_item_valorAliquotaCOFINS     valorAliquotaCOFINS,
        v_item_baseCOFINS              baseCOFINS,
        v_item_valorCOFINS             valorCOFINS,
        v_item_aliquotaCOFINSST        aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST   valorAliquotaCOFINSST,
        v_item_baseCOFINSST            baseCOFINSST,
        v_item_valorCOFINSST           valorCOFINSST,
        v_item_stSimplesNacional       stSimplesNacional,
        v_item_creditoSimplesNacional  creditoSimplesNacional,
        v_item_baseCreditoSimplesNac   baseCreditoSimplesNacional,
        v_item_valorCreditoSimplesNac  valorCreditoSimplesNacional,
        v_item_stICMS                  stICMS,
        v_item_modalBaseCalcICMS       modalidadeBaseCalcICMS,
        v_item_reducaoBaseICMS         reducaoBaseICMS,
        v_item_aliquotaICMS            aliquotaICMS,
        v_item_diferimentoICMS         diferimentoICMS,
        v_item_motivoDesoneracaoICMS   motivoDesoneracaoICMS,
        v_item_idBeneficio             idBeneficio,
        v_item_baseICMS                baseICMS,
        v_item_valorICMSOperacao       valorICMSOperacao,
        v_item_valorICMSDiferido       valorICMSDiferido,
        v_item_valorICMS               valorICMS,
        v_item_valorICMSDesoneracao    valorICMSDesoneracao,
        v_item_modalBaseCalcICMSST     modalidadeBaseCalcICMSST,
        v_item_margemValorAdicionadoST margemValorAdicionadoST,
        v_item_reducaoBaseST           reducaoBaseST,
        v_item_aliquotaICMSST          aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin aliquotaSTSuportConsFinal,
        v_item_baseICMSST              baseICMSST,
        v_item_valorICMSST             valorICMSST,
        v_item_baseICMSSTAnteriormente baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment valorICMSSTAnteriormente,
        v_item_valorICMSProprioSubstit valorICMSProprioSubstituto,
        v_item_reducaoBaseICMSEfetivo  reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo     aliquotaICMSEfetivo,
        v_item_baseICMSEfetivo         baseICMSEfetivo,
        v_item_valorICMSEfetivo        valorICMSEfetivo,
        v_item_aliquotaICMSUFDestinat  aliquotaICMSUFDestinatario,
        v_item_aliquotaICMSInterestad  aliquotaICMSInterestadual,
        v_item_partilhaICMSInterestad  partilhaICMSInterestadual,
        v_item_baseICMSUFDestinatario  baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente     baseICMSUFRemetente,
        v_item_valorICMSUFRemetente    valorICMSUFRemetente,
        v_item_aliquotaFCP             aliquotaFCP,
        v_item_baseFCP                 baseFCP,
        v_item_valorFCP                valorFCP,
        v_item_aliquotaFCPST           aliquotaFCPST,
        v_item_baseFCPST               baseFCPST,
        v_item_valorFCPST              valorFCPST,
        v_item_aliquotaFCPSTAnteriorm  aliquotaFCPSTAnteriormente,
        v_item_baseFCPSTAnteriormente  baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente valorFCPSTAnteriormente,
        v_item_aliquotaFCPUFDestinat   aliquotaFCPUFDestinatario,
        v_item_baseFCPUFDestinatario   baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario  valorFCPUFDestinatario,
        v_item_aliquotaEstImpFederais  aliquotaEstimadaImpFederais,
        v_item_aliquotaEstImpEstaduais aliquotaEstimadaImpEstaduais,
        v_item_aliquotaEstImpMunicipai aliquotaEstimadaImpMunicipais,
        v_item_baseEstimadaImpostos    baseEstimadaImpostos,
        v_item_valorEstImpFederais     valorEstimadoImpFederais,
        v_item_valorEstImpEstaduais    valorEstimadoImpEstaduais,
        v_item_valorEstImpMunicipais   valorEstimadoImpMunicipais,
        v_item_valorLiquidoItem        valorLiquidoItem,
        p_item_observacoesDigitadas    observacoesDigitadas,
        v_observacoes                  observacoes
      FROM DUAL) b
    ON (a.idItemOrcamento = b.idItemOrcamento)
    WHEN MATCHED THEN UPDATE SET
      a.orcamento                     = b.orcamento,
      a.sequencia                     = b.sequencia,
      a.cancelado                     = b.cancelado,
      a.pedidoCompraFornecedor        = b.pedidoCompraFornecedor,
      a.sequenciaPedidoCompraFornec   = b.sequenciaPedidoCompraFornec,
      a.ambiente                      = b.ambiente,
      a.ambienteObservacoes           = b.ambienteObservacoes,
      a.vendedor                      = b.vendedor,
      a.modeloDocumento               = b.modeloDocumento,
      a.estabelecimentoOriginal       = b.estabelecimentoOriginal,
      a.gradeProduto                  = b.gradeProduto,
      a.atividadeServico              = b.atividadeServico,
      a.statusAtividadeServico        = b.statusAtividadeServico,
      a.idFormulaTinta                = b.idFormulaTinta,
      a.personalizacao                = b.personalizacao,
      a.idLoteEstoque                 = b.idLoteEstoque,
      a.vinculoItemDocumento          = b.vinculoItemDocumento,
      a.operacaoFiscal                = b.operacaoFiscal,
      a.movimentaEstoque              = b.movimentaEstoque,
      a.geraFinanceiro                = b.geraFinanceiro,
      a.localEstoque                  = b.localEstoque,
      a.pessoaParticipante            = b.pessoaParticipante,
      a.dataEntrega                   = b.dataEntrega,
      a.controleQuantidade            = b.controleQuantidade,
      a.unidadeMedidaConversao        = b.unidadeMedidaConversao,
      a.conversorQuantidade           = b.conversorQuantidade,
      a.loteMinimo                    = b.loteMinimo,
      a.loteMultiplo                  = b.loteMultiplo,
      a.altura                        = b.altura,
      a.largura                       = b.largura,
      a.comprimento                   = b.comprimento,
      a.pecas                         = b.pecas,
      a.quantidade                    = b.quantidade,
      a.quantidadeConvertida          = b.quantidadeConvertida,
      a.quantidadeSaldo               = b.quantidadeSaldo,
      a.controleEntrega               = b.controleEntrega,
      a.pesoLiquido                   = b.pesoLiquido,
      a.pesoBruto                     = b.pesoBruto,
      a.tipoPreco                     = b.tipoPreco,
      a.tabelaPreco                   = b.tabelaPreco,
      a.precoSugestaoAPrazo           = b.precoSugestaoAPrazo,
      a.precoSugestaoAVista           = b.precoSugestaoAVista,
      a.precoDesconto                 = b.precoDesconto,
      a.precoMinimo                   = b.precoMinimo,
      a.usarPrecoAVista               = b.usarPrecoAVista,
      a.precoUnitarioBruto            = b.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao   = b.acrescimoUnitarioComposicao,
      a.precoUnitario                 = b.precoUnitario,
      a.precoUnitarioConvertido       = b.precounitarioConvertido,
      a.valorProdutoServicoBruto      = b.valorProdutoServicoBruto,
      a.valorProdutoServico           = b.valorProdutoServico,
      a.percDescontoItem              = b.percDescontoItem,
      a.valorDescontoItem             = b.valorDescontoItem,
      a.percAcrescimoItem             = b.percAcrescimoItem,
      a.valorAcrescimoItem            = b.valorAcrescimoItem,
      a.valorFreteItem                = b.valorFreteItem,
      a.valorSeguroItem               = b.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem  = b.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem   = b.valorDespesasAduaneirasItem,
      a.valorFreteGeral               = b.valorFreteGeral,
      a.valorSeguroGeral              = b.valorSeguroGeral,
      a.valorDescontoGeral            = b.valorDescontoGeral,
      a.valorOutrasDespesasGeral      = b.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral = b.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral  = b.valorDespesasAduaneirasGeral,
      a.valorBasePagamento            = b.valorBasePagamento,
      a.valorDescontoPagamento        = b.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento  = b.valorOutrasDespesasPagamento,
      a.valorJurosPagamento           = b.valorJurosPagamento,
      a.valorFreteTotal               = b.valorFreteTotal,
      a.valorSeguroTotal              = b.valorSeguroTotal,
      a.valorDescontoTotal            = b.valorDescontoTotal,
      a.valorOutrasDespesasTotal      = b.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal = b.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal  = b.valorDespesasAduaneirasTotal,
      a.cfop                          = b.cfop,
      a.indicadorISSQN                = b.indicadorISSQN,
      a.aliquotaISSQN                 = b.aliquotaISSQN,
      a.baseISSQN                     = b.baseISSQN,
      a.valorISSQN                    = b.valorISSQN,
      a.retidoISSQN                   = b.retidoISSQN,
      a.tributadoForaMunicipio        = b.tributadoForaMunicipio,
      a.incentivoFiscal               = b.incentivoFiscal,
      a.listaServicos                 = b.listaServicos,
      a.cnae                          = b.cnae,
      a.idServicoMunicipio            = b.idServicoMunicipio,
      a.numeroProcessoAdministrativo  = b.numeroProcessoAdministrativo,
      a.retencaoIRRF                  = b.retencaoIRRF,
      a.baseRetIRRF                   = b.baseRetIRRF,
      a.valorRetIRRF                  = b.valorRetIRRF,
      a.retencaoINSS                  = b.retencaoINSS,
      a.baseRetINSS                   = b.baseRetINSS,
      a.valorRetINSS                  = b.valorRetINSS,
      a.retencaoPIS                   = b.retencaoPIS,
      a.baseRetPIS                    = b.baseRetPIS,
      a.valorRetPIS                   = b.valorRetPIS,
      a.retencaoCOFINS                = b.retencaoCOFINS,
      a.baseRetCOFINS                 = b.baseRetCOFINS,
      a.valorRetCOFINS                = b.valorRetCOFINS,
      a.retencaoCSLL                  = b.retencaoCSLL,
      a.baseRetCSLL                   = b.baseRetCSLL,
      a.valorRetCSLL                  = b.valorRetCSLL,
      a.retencaoOutros                = b.retencaoOutros,
      a.baseRetOutros                 = b.baseRetOutros,
      a.valorRetOutros                = b.valorRetOutros,
      a.aliquotaII                    = b.aliquotaII,
      a.baseII                        = b.baseII,
      a.valorII                       = b.valorII,
      a.aliquotaIOF                   = b.aliquotaIOF,
      a.baseIOF                       = b.baseIOF,
      a.valorIOF                      = b.valorIOF,
      a.codigoEnquadramentoIPI        = b.codigoEnquadramentoIPI,
      a.stIPI                         = b.stIPI,
      a.aliquotaIPI                   = b.aliquotaIPI,
      a.valorAliquotaIPI              = b.valorAliquotaIPI,
      a.baseIPI                       = b.baseIPI,
      a.valorIPI                      = b.valorIPI,
      a.stPIS                         = b.stPIS,
      a.aliquotaPIS                   = b.aliquotaPIS,
      a.valorAliquotaPIS              = b.valorAliquotaPIS,
      a.basePIS                       = b.basePIS,
      a.valorPIS                      = b.valorPIS,
      a.aliquotaPISST                 = b.aliquotaPISST,
      a.valorAliquotaPISST            = b.valorAliquotaPISST,
      a.basePISST                     = b.basePISST,
      a.valorPISST                    = b.valorPISST,
      a.stCOFINS                      = b.stCOFINS,
      a.aliquotaCOFINS                = b.aliquotaCOFINS,
      a.valorAliquotaCOFINS           = b.valorAliquotaCOFINS,
      a.baseCOFINS                    = b.baseCOFINS,
      a.valorCOFINS                   = b.valorCOFINS,
      a.aliquotaCOFINSST              = b.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST         = b.valorAliquotaCOFINSST,
      a.baseCOFINSST                  = b.baseCOFINSST,
      a.valorCOFINSST                 = b.valorCOFINSST,
      a.stSimplesNacional             = b.stSimplesNacional,
      a.creditoSimplesNacional        = b.creditoSimplesNacional,
      a.baseCreditoSimplesNacional    = b.baseCreditoSimplesNacional,
      a.valorCreditoSimplesNacional   = b.valorCreditoSimplesNacional,
      a.stICMS                        = b.stICMS,
      a.modalidadeBaseCalcICMS        = b.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS               = b.reducaoBaseICMS,
      a.aliquotaICMS                  = b.aliquotaICMS,
      a.diferimentoICMS               = b.diferimentoICMS,
      a.motivoDesoneracaoICMS         = b.motivoDesoneracaoICMS,
      a.idBeneficio                   = b.idBeneficio,
      a.baseICMS                      = b.baseICMS,
      a.valorICMSoperacao             = b.valorICMSoperacao,
      a.valorICMSdiferido             = b.valorICMSdiferido,
      a.valorICMS                     = b.valorICMS,
      a.valorICMSdesoneracao          = b.valorICMSdesoneracao,
      a.modalidadeBaseCalcICMSST      = b.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST       = b.margemValorAdicionadoST,
      a.reducaoBaseST                 = b.reducaoBaseST,
      a.aliquotaICMSST                = b.aliquotaICMSST,
      a.aliquotaSTSuportConsFinal     = b.aliquotaSTSuportConsFinal,
      a.baseICMSST                    = b.baseICMSST,
      a.valorICMSST                   = b.valorICMSST,
      a.baseICMSSTAnteriormente       = b.baseICMSSTAnteriormente,
      a.valorICMSSTAnteriormente      = b.valorICMSSTAnteriormente,
      a.valorICMSProprioSubstituto    = b.valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo        = b.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo           = b.aliquotaICMSEfetivo,
      a.baseICMSEfetivo               = b.baseICMSEfetivo,
      a.valorICMSEfetivo              = b.valorICMSEfetivo,
      a.aliquotaICMSUFDestinatario    = b.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual     = b.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual     = b.partilhaICMSInterestadual,
      a.baseICMSUFDestinatario        = b.baseICMSUFDestinatario,
      a.valorICMSUFDestinatario       = b.valorICMSUFDestinatario,
      a.baseICMSUFRemetente           = b.baseICMSUFRemetente,
      a.valorICMSUFRemetente          = b.valorICMSUFRemetente,
      a.aliquotaFCP                   = b.aliquotaFCP,
      a.baseFCP                       = b.baseFCP,
      a.valorFCP                      = b.valorFCP,
      a.aliquotaFCPST                 = b.aliquotaFCPST,
      a.baseFCPST                     = b.baseFCPST,
      a.valorFCPST                    = b.valorFCPST,
      a.aliquotaFCPSTAnteriormente    = b.aliquotaFCPSTAnteriormente,
      a.baseFCPSTAnteriormente        = b.baseFCPSTAnteriormente,
      a.valorFCPSTAnteriormente       = b.valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario     = b.aliquotaFCPUFDestinatario,
      a.baseFCPUFDestinatario         = b.baseFCPUFDestinatario,
      a.valorFCPUFDestinatario        = b.valorFCPUFDestinatario,
      a.aliquotaestimadaimpfederais   = b.aliquotaestimadaimpfederais,
      a.aliquotaestimadaimpestaduais  = b.aliquotaestimadaimpestaduais,
      a.aliquotaestimadaimpmunicipais = b.aliquotaestimadaimpmunicipais,
      a.baseestimadaimpostos          = b.baseestimadaimpostos,
      a.valorestimadoimpfederais      = b.valorestimadoimpfederais,
      a.valorEstimadoImpEstaduais     = b.valorEstimadoImpEstaduais,
      a.valorEstimadoImpMunicipais    = b.valorEstimadoImpMunicipais,
      a.valorLiquidoItem              = b.valorLiquidoItem,
      a.observacoesDigitadas          = b.observacoesDigitadas,
      a.observacoes                   = b.observacoes
    WHEN NOT MATCHED THEN INSERT (
      idItemOrcamento,
      orcamento,
      sequencia,
      cancelado,
      pedidoCompraFornecedor,
      sequenciaPedidoCompraFornec,
      ambiente,
      ambienteObservacoes,
      modeloDocumento,
      estabelecimentoOriginal,
      vendedor,
      gradeProduto,
      atividadeServico,
      statusAtividadeServico,
      idFormulaTinta,
      personalizacao,
      idLoteEstoque,
      vinculoItemDocumento,
      operacaoFiscal,
      movimentaEstoque,
      geraFinanceiro,
      localEstoque,
      pessoaParticipante,
      dataEntrega,
      controleQuantidade,
      unidadeMedidaConversao,
      conversorQuantidade,
      loteMinimo,
      loteMultiplo,
      altura,
      largura,
      comprimento,
      pecas,
      quantidade,
      quantidadeConvertida,
      quantidadeSaldo,
      controleEntrega,
      pesoLiquido,
      pesoBruto,
      tipoPreco,
      tabelaPreco,
      precoSugestaoAPrazo,
      precoSugestaoAVista,
      precoDesconto,
      precoMinimo,
      usarPrecoAVista,
      precoUnitarioBruto,
      acrescimoUnitarioComposicao,
      precoUnitario,
      precoUnitarioConvertido,
      valorProdutoServicoBruto,
      valorProdutoServico,
      percDescontoItem,
      valorDescontoItem,
      percAcrescimoItem,
      valorAcrescimoItem,
      valorFreteItem,
      valorSeguroItem,
      valorAdicFreteMarinhaMerItem,
      valorDespesasAduaneirasItem,
      valorFreteGeral,
      valorSeguroGeral,
      valorDescontoGeral,
      valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral,
      valorDespesasAduaneirasGeral,
      valorBasePagamento,
      valorDescontoPagamento,
      valorOutrasDespesasPagamento,
      valorJurosPagamento,
      valorFreteTotal,
      valorSeguroTotal,
      valorDescontoTotal,
      valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal,
      valorDespesasAduaneirasTotal,
      cfop,
      indicadorISSQN,
      aliquotaISSQN,
      retidoISSQN,
      tributadoForaMunicipio,
      incentivoFiscal,
      listaServicos,
      cnae,
      idServicoMunicipio,
      numeroProcessoAdministrativo,
      baseISSQN,
      valorISSQN,
      retencaoIRRF,
      baseRetIRRF,
      valorRetIRRF,
      retencaoINSS,
      baseRetINSS,
      valorRetINSS,
      retencaoPIS,
      baseRetPIS,
      valorRetPIS,
      retencaoCOFINS,
      baseRetCOFINS,
      valorRetCOFINS,
      retencaoCSLL,
      baseRetCSLL,
      valorRetCSLL,
      retencaoOutros,
      baseRetOutros,
      valorRetOutros,
      aliquotaII,
      baseII,
      valorII,
      aliquotaIOF,
      baseIOF,
      valorIOF,
      codigoEnquadramentoIPI,
      stIPI,
      aliquotaIPI,
      valorAliquotaIPI,
      baseIPI,
      valorIPI,
      stPIS,
      aliquotaPIS,
      valorAliquotaPIS,
      basePIS,
      valorPIS,
      aliquotaPISST,
      valorAliquotaPISST,
      basePISST,
      valorPISST,
      stCOFINS,
      aliquotaCOFINS,
      valorAliquotaCOFINS,
      baseCOFINS,
      valorCOFINS,
      aliquotaCOFINSST,
      valorAliquotaCOFINSST,
      baseCOFINSST,
      valorCOFINSST,
      stSimplesNacional,
      creditoSimplesNacional,
      baseCreditoSimplesNacional,
      valorCreditoSimplesNacional,
      stICMS,
      modalidadeBaseCalcICMS,
      reducaoBaseICMS,
      aliquotaICMS,
      diferimentoICMS,
      motivoDesoneracaoICMS,
      idBeneficio,
      baseICMS,
      valorICMSOperacao,
      valorICMSDiferido,
      valorICMS,
      valorICMSDesoneracao,
      modalidadeBaseCalcICMSST,
      margemValorAdicionadoST,
      reducaoBaseST,
      aliquotaICMSST,
      aliquotaSTSuportConsFinal,
      baseICMSST,
      valorICMSST,
      baseICMSSTAnteriormente,
      valorICMSSTAnteriormente,
      valorICMSProprioSubstituto,
      reducaoBaseICMSEfetivo,
      aliquotaICMSEfetivo,
      baseICMSEfetivo,
      valorICMSEfetivo,
      aliquotaICMSUFDestinatario,
      aliquotaICMSInterestadual,
      partilhaICMSInterestadual,
      baseICMSUFDestinatario,
      valorICMSUFDestinatario,
      baseICMSUFRemetente,
      valorICMSUFRemetente,
      aliquotaFCP,
      baseFCP,
      valorFCP,
      aliquotaFCPST,
      baseFCPST,
      valorFCPST,
      aliquotaFCPSTAnteriormente,
      baseFCPSTAnteriormente,
      valorFCPSTAnteriormente,
      aliquotaFCPUFDestinatario,
      baseFCPUFDestinatario,
      valorFCPUFDestinatario,
      aliquotaEstimadaImpFederais,
      aliquotaEstimadaImpEstaduais,
      aliquotaEstimadaImpMunicipais,
      baseEstimadaImpostos,
      valorEstimadoImpFederais,
      valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais,
      valorLiquidoItem,
      observacoesDigitadas,
      observacoes)
    VALUES (
      b.idItemOrcamento,
      b.orcamento,
      b.sequencia,
      b.cancelado,
      b.pedidoCompraFornecedor,
      b.sequenciaPedidoCompraFornec,
      b.ambiente,
      b.ambienteObservacoes,
      b.modeloDocumento,
      b.estabelecimentoOriginal,
      b.vendedor,
      b.gradeProduto,
      b.atividadeServico,
      b.statusAtividadeServico,
      b.idFormulaTinta,
      b.personalizacao,
      b.idLoteEstoque,
      b.vinculoItemDocumento,
      b.operacaoFiscal,
      b.movimentaEstoque,
      b.geraFinanceiro,
      b.localEstoque,
      b.pessoaParticipante,
      b.dataEntrega,
      b.controleQuantidade,
      b.unidadeMedidaConversao,
      b.conversorQuantidade,
      b.loteMinimo,
      b.loteMultiplo,
      b.altura,
      b.largura,
      b.comprimento,
      b.pecas,
      b.quantidade,
      b.quantidadeConvertida,
      b.quantidadeSaldo,
      b.controleEntrega,
      b.pesoLiquido,
      b.pesoBruto,
      b.tipoPreco,
      b.tabelaPreco,
      b.precoSugestaoAPrazo,
      b.precoSugestaoAVista,
      b.precoDesconto,
      b.precoMinimo,
      b.usarPrecoAVista,
      b.precoUnitarioBruto,
      b.acrescimoUnitarioComposicao,
      b.precoUnitario,
      b.precoUnitarioConvertido,
      b.valorProdutoServicoBruto,
      b.valorProdutoServico,
      b.percDescontoItem,
      b.valorDescontoItem,
      b.percAcrescimoItem,
      b.valorAcrescimoItem,
      b.valorFreteItem,
      b.valorSeguroItem,
      b.valorAdicFreteMarinhaMerItem,
      b.valorDespesasAduaneirasItem,
      b.valorFreteGeral,
      b.valorSeguroGeral,
      b.valorDescontoGeral,
      b.valorOutrasDespesasGeral,
      b.valorAdicFreteMarinhaMerGeral,
      b.valorDespesasAduaneirasGeral,
      b.valorBasePagamento,
      b.valorDescontoPagamento,
      b.valorOutrasDespesasPagamento,
      b.valorJurosPagamento,
      b.valorFreteTotal,
      b.valorSeguroTotal,
      b.valorDescontoTotal,
      b.valorOutrasDespesasTotal,
      b.valorAdicFreteMarinhaMerTotal,
      b.valorDespesasAduaneirasTotal,
      b.cfop,
      b.indicadorISSQN,
      b.aliquotaISSQN,
      b.retidoISSQN,
      b.tributadoForaMunicipio,
      b.incentivoFiscal,
      b.listaServicos,
      b.cnae,
      b.idServicoMunicipio,
      b.numeroProcessoAdministrativo,
      b.baseISSQN,
      b.valorISSQN,
      b.retencaoIRRF,
      b.baseRetIRRF,
      b.valorRetIRRF,
      b.retencaoINSS,
      b.baseRetINSS,
      b.valorRetINSS,
      b.retencaoPIS,
      b.baseRetPIS,
      b.valorRetPIS,
      b.retencaoCOFINS,
      b.baseRetCOFINS,
      b.valorRetCOFINS,
      b.retencaoCSLL,
      b.baseRetCSLL,
      b.valorRetCSLL,
      b.retencaoOutros,
      b.baseRetOutros,
      b.valorRetOutros,
      b.aliquotaII,
      b.baseII,
      b.valorII,
      b.aliquotaIOF,
      b.baseIOF,
      b.valorIOF,
      b.codigoEnquadramentoIPI,
      b.stIPI,
      b.aliquotaIPI,
      b.valorAliquotaIPI,
      b.baseIPI,
      b.valorIPI,
      b.stPIS,
      b.aliquotaPIS,
      b.valorAliquotaPIS,
      b.basePIS,
      b.valorPIS,
      b.aliquotaPISST,
      b.valorAliquotaPISST,
      b.basePISST,
      b.valorPISST,
      b.stCOFINS,
      b.aliquotaCOFINS,
      b.valorAliquotaCOFINS,
      b.baseCOFINS,
      b.valorCOFINS,
      b.aliquotaCOFINSST,
      b.valorAliquotaCOFINSST,
      b.baseCOFINSST,
      b.valorCOFINSST,
      b.stSimplesNacional,
      b.creditoSimplesNacional,
      b.baseCreditoSimplesNacional,
      b.valorCreditoSimplesNacional,
      b.stICMS,
      b.modalidadeBaseCalcICMS,
      b.reducaoBaseICMS,
      b.aliquotaICMS,
      b.diferimentoICMS,
      b.motivoDesoneracaoICMS,
      b.idBeneficio,
      b.baseICMS,
      b.valorICMSOperacao,
      b.valorICMSDiferido,
      b.valorICMS,
      b.valorICMSDesoneracao,
      b.modalidadeBaseCalcICMSST,
      b.margemValorAdicionadoST,
      b.reducaoBaseST,
      b.aliquotaICMSST,
      b.aliquotaSTSuportConsFinal,
      b.baseICMSST,
      b.valorICMSST,
      b.baseICMSSTAnteriormente,
      b.valorICMSSTAnteriormente,
      b.valorICMSProprioSubstituto,
      b.reducaoBaseICMSEfetivo,
      b.aliquotaICMSEfetivo,
      b.baseICMSEfetivo,
      b.valorICMSEfetivo,
      b.aliquotaICMSUFDestinatario,
      b.aliquotaICMSInterestadual,
      b.partilhaICMSInterestadual,
      b.baseICMSUFDestinatario,
      b.valorICMSUFDestinatario,
      b.baseICMSUFRemetente,
      b.valorICMSUFRemetente,
      b.aliquotaFCP,
      b.baseFCP,
      b.valorFCP,
      b.aliquotaFCPST,
      b.baseFCPST,
      b.valorFCPST,
      b.aliquotaFCPSTAnteriormente,
      b.baseFCPSTAnteriormente,
      b.valorFCPSTAnteriormente,
      b.aliquotaFCPUFDestinatario,
      b.baseFCPUFDestinatario,
      b.valorFCPUFDestinatario,
      b.aliquotaEstimadaImpFederais,
      b.aliquotaEstimadaImpEstaduais,
      b.aliquotaEstimadaImpMunicipais,
      b.baseEstimadaImpostos,
      b.valorEstimadoImpFederais,
      b.valorEstimadoImpEstaduais,
      b.valorEstimadoImpMunicipais,
      b.valorLiquidoItem,
      b.observacoesDigitadas,
      b.observacoes);
    v_atualizarObservacoes := 0;
    IF p_idItemReferenciado > 0 THEN
      IF p_tipoDocumentoReferenciado = 'C' THEN
        UPDATE MOPAINELCOMPRAXGRADE
        SET idItemOrcamento = r_item_idItemOrcamento
        WHERE idGradePainelCompra = p_idItemReferenciado;
      ELSIF p_tipoDocumentoReferenciado = 'F' THEN
        ADD_ORCAMENTO_ITEM_REF_CONTR (
          p_estabelecimentoAtivo,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      ELSIF p_tipoDocumentoReferenciado = 'L' THEN
        ADD_ORCAMENTO_ITEM_LISTA_GRAVA (
          p_estabelecimentoAtivo,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      ELSIF p_tipoDocumentoReferenciado = 'O' THEN
        ADD_ORCAMENTO_ITEM_REF_ORCAMEN (
          p_estabelecimentoAtivo,
          v_cab_tipoDocumento,
          r_item_idItemOrcamento,
          p_item_quantidade,
          p_idItemReferenciado,
          p_quantidadeReferenciada,
          v_atualizarObservacoes,
          v_atualizarObservacoes);
      ELSIF p_tipoDocumentoReferenciado = 'T' THEN
        ADD_ORCAMENTO_ITEM_TRANS_GRAVA (
          p_estabelecimentoAtivo,
          v_cab_entradaSaida,
          p_idItemReferenciado,
          r_item_idItemOrcamento,
          p_quantidadeReferenciada);
      END IF;
    END IF;
    IF p_tempComp_nomeTempComposicao <> ' '
      AND (p_tipoDocumentoReferenciado <> 'O'
        OR p_idItemReferenciado <= 0)
    THEN
      ADD_ORCAMENTO_ITEM_COMP_TEMP (
        p_sessaoClient,
        p_estabelecimentoAtivo,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        r_item_idItemOrcamento,
        v_atualizarObservacoes,
        v_atualizarObservacoes);
    END IF;
    v_idEnderecoEstoque := 0;
    IF p_item_idEnderecoEstoque > 0 THEN
      ADD_ORCAMENTO_ITEM_ENDER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemOrcamento,
        p_item_idEnderecoEstoque,
        p_item_quantidade,
        p_item_quantidade,
        ' ',
        v_idEnderecoEstoque);
    END IF;
    IF p_item_idNumeroSerie > 0 THEN
      ADD_ORCAMENTO_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemOrcamento,
        v_idEnderecoEstoque,
        p_item_gradeProduto,
        p_item_idNumeroSerie,
        0,
        v_auxNumber);
      v_atualizarObservacoes := 1;
    END IF;
    IF p_item_atividadeProjeto > 0 THEN
      ADD_ORCAMENTO_ITEM_PROJ_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_item_idItemOrcamento,
        p_item_atividadeProjeto,
        v_auxNumber);
    END IF;
    IF v_atualizarObservacoes = 1 THEN
      v_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
        p_sessaoClient,
        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_413_obs_add_marca,
        p_config_418_obs_efetarEnter,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        'O',
        r_item_idItemOrcamento,
        p_item_gradeProduto,
        p_item_idFormulaTinta,
        p_item_personalizacao,
        p_item_idLoteEstoque,
        p_item_controleQuantidade,
        p_item_loteMultiplo,
        p_item_altura,
        p_item_largura,
        p_item_comprimento,
        p_item_quantidade,
        p_item_observacoesDigitadas);
      UPDATE MOORCAMENTOXITENS
      SET observacoes = v_observacoes
      WHERE idItemOrcamento = r_item_idItemOrcamento;
    END IF;
    IF v_etOrc_situacaoOrcamento > 40 THEN
      ADD_ORCAMENTO_ITEM_RES_ITEM (
        r_item_idItemOrcamento,
        p_estabelecimentoAtivo,
        ' ',
        v_auxVarchar);
    END IF;
    r_buffer_item_idItemOrcamento := CASE WHEN (r_buffer_item_idItemOrcamento IS NULL OR r_buffer_item_idItemOrcamento = '' OR r_buffer_item_idItemOrcamento = ' ') THEN '' ELSE RTRIM (r_buffer_item_idItemOrcamento) || ';' END || TO_CHAR (LPAD(r_item_idItemOrcamento,14,'0'));
    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;
    IF p_item_idItemOrcamento <= 0
      AND v_item_cancelado = 0
      AND p_item_atividadeServico > 0
    THEN
      SELECT
        habilitaAtividadePrevista,
        selecionaAtividadePrevista
      INTO
        v_auxNumber,
        v_ativ_selecionaAtividadePrev
      FROM PAATIVIDADESSERVICO
      WHERE atividadeServico = p_item_atividadeServico;
      IF v_auxNumber = 1 THEN
        ADD_ORCAMENTO_ITEM_PREV_INSERE (
          p_config_64_casasDecSaidas,
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_perfilUsuarioLogado,
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          v_cab_estabelecimento,
          v_cab_pessoa,
          v_munEndEst_uf,
          v_munEndPess_uf,
          r_item_idItemOrcamento,
          p_item_atividadeServico,
          p_item_vendedor,
          p_item_gradeProduto,
          p_item_tipoPreco,
          p_item_tabelaPreco,
          v_item_precoUnitario,
          v_ativ_selecionaAtividadePrev,
          p_idAtividadesPrevistasSelec,
          v_auxNumber);
        IF v_auxNumber = 1 THEN
          SELECT
            COUNT (1) numeroAtividades,
            SUM (
              CASE
                WHEN prev.faturarAtividade = 'P'
                THEN prev.quantidade
                ELSE COALESCE ((
                  SELECT realiz.quantidade
                  FROM MOORCAMENTOXATIVIDADEREAL realiz
                  WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
                  AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
              END) quantidade,
            MIN (prev.precoUnitario) precoUnitarioMenor,
            MAX (prev.precoUnitario) precoUnitarioMaior,
            SUM (ROUND (
              CASE
                WHEN prev.faturarAtividade = 'P'
                THEN prev.quantidade
                ELSE COALESCE ((
                  SELECT realiz.quantidade
                  FROM MOORCAMENTOXATIVIDADEREAL realiz
                  WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
                  AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
              END * prev.precoUnitario, 2)) valorTotalItem
          INTO
            v_ativ_numero,
            v_ativ_quantidade,
            v_ativ_precoUnitarioMenor,
            v_ativ_precoUnitario,
            v_ativ_valorTotalItem
          FROM MOORCAMENTOXATIVIDADEPREV prev
          WHERE prev.idItemOrcamento = r_item_idItemOrcamento
          AND prev.statusAtividadeServico <> 'C'
          AND prev.faturarAtividade IN ('P','R');
          IF v_ativ_numero > 0 THEN
            v_ativ_geraFinanceiro := 1;
            IF v_ativ_numero > 1
              AND v_ativ_precoUnitarioMenor <> v_ativ_precoUnitario
              AND v_ativ_quantidade <> 0
            THEN
              v_ativ_precoUnitario := ROUND (v_ativ_valorTotalItem / v_ativ_quantidade, TO_NUMBER (p_config_64_casasDecSaidas));
            END IF;
          ELSE
            SELECT
              COUNT (1) numeroAtividades,
              SUM (COALESCE ((
                SELECT realiz.quantidade
                FROM MOORCAMENTOXATIVIDADEREAL realiz
                WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
                AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)) quantidade,
              MIN (prev.precoUnitario) precoUnitarioMenor,
              MAX (prev.precoUnitario) precoUnitarioMaior,
              SUM (ROUND (COALESCE ((
                SELECT realiz.quantidade
                FROM MOORCAMENTOXATIVIDADEREAL realiz
                WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
                AND realiz.statusAtividadeServico <> 'C'), prev.quantidade) * prev.precoUnitario, 2)) valorTotalItem
            INTO
              v_ativ_numero,
              v_ativ_quantidade,
              v_ativ_precoUnitarioMenor,
              v_ativ_precoUnitario,
              v_ativ_valorTotalItem
            FROM MOORCAMENTOXATIVIDADEPREV prev
            JOIN PAATIVIDADESSERVICO ativ
            ON ativ.atividadeServico = prev.atividadeServico
            JOIN CAGRADESPRODUTO gradProd
            ON gradProd.gradeProduto = ativ.gradeProduto
            JOIN CAPRODUTOS prod
            ON prod.produto = gradProd.produto
            WHERE prev.idItemOrcamento = r_item_idItemOrcamento
            AND prev.statusAtividadeServico <> 'C'
            AND ativ.gradeProduto > 0
            AND prod.unidadeMedida = v_prod_unidadeMedida;
            IF v_ativ_numero > 0 THEN
              v_ativ_geraFinanceiro := 0;
              IF v_ativ_numero > 1
                AND v_ativ_precoUnitarioMenor <> v_ativ_precoUnitario
                AND v_ativ_quantidade <> 0
              THEN
                v_ativ_precoUnitario := ROUND (v_ativ_valorTotalItem / v_ativ_quantidade, TO_NUMBER (p_config_64_casasDecSaidas));
              END IF;
            END IF;
          END IF;
          IF v_ativ_numero > 0
            AND (v_ativ_quantidade <> p_item_quantidade
              OR v_ativ_precoUnitario <> v_item_precoUnitario
              OR v_ativ_geraFinanceiro <> v_item_geraFinanceiro)
          THEN
            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_config_413_obs_add_marca,
              p_config_418_obs_efetarEnter,
              0, -- p_manterFinanceiro_Retotalizar,
              'T', -- p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
              0, -- p_buscarGeraFinanceiroEstoque,
              ' ', -- p_tipoDocumentoReferenciado, 
              0, -- p_idItemReferenciado,
              0, -- p_quantidadeReferenciada
              ' ', -- p_tempComp_nomeTempComposicao,
              0, -- p_tempComp_sequencia
              ' ', -- p_mensagemAviso,
              r_calcularImpostos,
              r_item_idItemOrcamento,
              p_item_orcamento,
              p_item_pedidoCompraFornecedor,
              p_item_sequenciaPedidoCompraFo,
              p_item_ambiente,
              p_item_ambienteObservacoes,
              p_item_vinculoItemDocumento,
              p_item_atividadeServico,
              p_item_statusAtividadeServico,
              p_item_controleEntrega,
              p_item_dataEntrega,
              p_item_modeloDocumento,
              p_item_estabelecimentoOriginal,
              p_item_vendedor,
              p_item_gradeProduto,
              p_item_idFormulaTinta,
              p_item_personalizacao,
              p_item_idLoteEstoque,
              0, -- p_item_idEnderecoEstoque
              0, -- p_item_idNumeroSerie
              0, -- p_item_atividadeProjeto,
              p_item_localEstoque,
              p_item_pessoaParticipante,
              p_item_controleQuantidade,
              p_item_unidadeMedidaConversao,
              p_item_conversorQuantidade,
              p_item_loteMinimo,
              p_item_loteMultiplo,
              p_item_altura,
              p_item_largura,
              p_item_comprimento,
              CASE p_item_controleQuantidade
                WHEN 2
                THEN CASE WHEN p_item_altura = 0 OR p_item_largura = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100))), 3) END
                WHEN 3
                THEN CASE WHEN p_item_altura = 0 OR p_item_comprimento = 0 OR p_item_comprimento = 0 THEN 0 ELSE ROUND (v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100) * p_item_comprimento), 3) END
                WHEN 4
                THEN CASE WHEN p_item_conversorQuantidade = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / p_item_conversorQuantidade), 3) END
                ELSE 0
              END, -- p_item_pecas
              v_ativ_quantidade,
              CASE p_item_controleQuantidade
                WHEN 2
                THEN ROUND (CASE WHEN p_item_altura = 0 OR p_item_largura = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100))), 3) END, v_uniMedConv_casasDecimaisUnid)
                WHEN 3
                THEN ROUND (CASE WHEN p_item_altura = 0 OR p_item_comprimento = 0 OR p_item_comprimento = 0 THEN 0 ELSE ROUND (v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100) * p_item_comprimento), 3) END, v_uniMedConv_casasDecimaisUnid)
                WHEN 4
                THEN ROUND (CASE WHEN p_item_conversorQuantidade = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / p_item_conversorQuantidade), 3) END, v_uniMedConv_casasDecimaisUnid)
                ELSE v_ativ_quantidade
              END, -- p_item_quantidadeConvertida
              ROUND ((v_ativ_quantidade * v_prod_pesoLiquido), 3), -- p_item_pesoLiquido
              ROUND ((v_ativ_quantidade * v_prod_pesoBruto), 3), -- p_item_pesoBruto
              p_item_tipoPreco,
              p_item_tabelaPreco,
              p_item_precoSugestaoAPrazo,
              p_item_precoSugestaoAVista,
              p_item_precoDesconto,
              p_item_precoMinimo,
              p_item_usarPrecoAVista,
              v_ativ_precoUnitario, -- p_item_precoUnitarioBruto
              p_item_acrescimoUnitarioCompos,
              v_ativ_precoUnitario, -- p_item_precoUnitario
              p_item_percDescontoItem,
              p_item_valorDescontoItem,
              p_item_percAcrescimoItem,
              p_item_valorAcrescimoItem,
              p_item_valorFreteItem,
              p_item_valorSeguroItem,
              p_item_valorAdicFreteMarItem,
              p_item_valorDespesasAduanItem,
              p_item_observacoesDigitadas,
              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,
              p_item_operacaoFiscal,
              v_item_movimentaEstoque,
              v_ativ_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_idAtividadesPrevistasSelec
              0, -- p_nivel,
              ' ',
              v_auxVarchar, -- r_mensagemAviso
              r_calcularImpostos,
              v_auxNumber, -- idItemOrcamento
              v_auxVarchar, -- r_buffer_item_idItemOrcamento
              v_auxNumber); -- r_valorInserido
          END IF;
        END IF;
      END IF;
    END IF;
  END IF;
END ADD_ORCAMENTO_ITEM_GRAVA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_PREV_RECALC (
  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_config_413_obs_add_marca     IN NUMBER,
  p_config_418_obs_efetarEnter   IN NUMBER,
  p_idItemOrcamento              IN NUMBER)
IS
  v_calcularImpostos        NUMBER;
  v_ativ_numero             NUMBER;
  v_ativ_quantidade         NUMBER;
  v_ativ_precoUnitarioMenor NUMBER;
  v_ativ_precoUnitario      NUMBER;
  v_ativ_valorTotalItem     NUMBER;
  v_ativ_geraFinanceiro     NUMBER;
  v_auxNumber               NUMBER;
  v_auxVarchar              VARCHAR2 (32000);
BEGIN
  v_calcularImpostos := 0;
  SELECT
    COUNT (1) numeroAtividades,
    SUM (
      CASE
        WHEN prev.faturarAtividade = 'P'
        THEN prev.quantidade
        ELSE COALESCE ((
          SELECT realiz.quantidade
          FROM MOORCAMENTOXATIVIDADEREAL realiz
          WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
          AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
      END) quantidade,
    MIN (prev.precoUnitario) precoUnitarioMenor,
    MAX (prev.precoUnitario) precoUnitarioMaior,
    SUM (ROUND (
      CASE
        WHEN prev.faturarAtividade = 'P'
        THEN prev.quantidade
        ELSE COALESCE ((
          SELECT realiz.quantidade
          FROM MOORCAMENTOXATIVIDADEREAL realiz
          WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
          AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
      END * prev.precoUnitario, 2)) valorTotalItem
  INTO
    v_ativ_numero,
    v_ativ_quantidade,
    v_ativ_precoUnitarioMenor,
    v_ativ_precoUnitario,
    v_ativ_valorTotalItem
  FROM MOORCAMENTOXATIVIDADEPREV prev
  WHERE prev.idItemOrcamento = p_idItemOrcamento
  AND prev.statusAtividadeServico <> 'C'
  AND prev.faturarAtividade IN ('P','R');
  IF v_ativ_numero > 0 THEN
    v_ativ_geraFinanceiro := 1;
    IF v_ativ_numero > 1
      AND v_ativ_precoUnitarioMenor <> v_ativ_precoUnitario
      AND v_ativ_quantidade <> 0
    THEN
      v_ativ_precoUnitario := ROUND (v_ativ_valorTotalItem / v_ativ_quantidade, TO_NUMBER (p_config_64_casasDecSaidas));
    END IF;
  ELSE
    SELECT
      COUNT (1) numeroAtividades,
      SUM (COALESCE ((
        SELECT realiz.quantidade
        FROM MOORCAMENTOXATIVIDADEREAL realiz
        WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
        AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)) quantidade,
        MIN (prev.precoUnitario) precoUnitarioMenor,
        MAX (prev.precoUnitario) precoUnitarioMaior,
        SUM (ROUND (COALESCE ((
          SELECT realiz.quantidade
          FROM MOORCAMENTOXATIVIDADEREAL realiz
          WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
          AND realiz.statusAtividadeServico <> 'C'), prev.quantidade) * prev.precoUnitario, 2)) valorTotalItem
    INTO
      v_ativ_numero,
      v_ativ_quantidade,
      v_ativ_precoUnitarioMenor,
      v_ativ_precoUnitario,
      v_ativ_valorTotalItem
    FROM MOORCAMENTOXATIVIDADEPREV prev
    JOIN MOORCAMENTOXITENS item
    ON item.idItemOrcamento = p_idItemOrcamento
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PAATIVIDADESSERVICO ativ
    ON ativ.atividadeServico = prev.atividadeServico
    JOIN CAGRADESPRODUTO gradProdAtiv
    ON gradProdAtiv.gradeProduto = ativ.gradeProduto
    JOIN CAPRODUTOS prodAtiv
    ON prodAtiv.produto = gradProdAtiv.produto
    WHERE prev.idItemOrcamento = p_idItemOrcamento
    AND prev.statusAtividadeServico <> 'C'
    AND ativ.gradeProduto > 0
    AND prodAtiv.unidadeMedida = prod.unidadeMedida;
    IF v_ativ_numero > 0 THEN
      v_ativ_geraFinanceiro := 0;
      IF v_ativ_numero > 1
        AND v_ativ_precoUnitarioMenor <> v_ativ_precoUnitario
        AND v_ativ_quantidade <> 0
      THEN
        v_ativ_precoUnitario := ROUND (v_ativ_valorTotalItem / v_ativ_quantidade, TO_NUMBER (p_config_64_casasDecSaidas));
      END IF;
    END IF;
  END IF;
  IF v_ativ_numero > 0 THEN
    FOR a IN (
      SELECT
        a.orcamento,
        a.pedidoCompraFornecedor,
        a.sequenciaPedidoCompraFornec,
        a.ambiente,
        a.ambienteObservacoes,
        a.vinculoItemDocumento,
        a.atividadeServico,
        a.statusAtividadeServico,
        a.controleEntrega,
        a.dataEntrega,
        a.modeloDocumento,
        a.estabelecimentoOriginal,
        a.vendedor,
        a.gradeProduto,
        a.idFormulaTinta,
        a.personalizacao,
        a.idLoteEstoque,
        a.localEstoque,
        a.pessoaParticipante,
        a.controleQuantidade,
        a.unidadeMedidaConversao,
        a.conversorQuantidade,
        a.loteMinimo,
        a.loteMultiplo,
        a.altura,
        a.largura,
        a.comprimento,
        a.quantidade,
        a.precoUnitario,
        a.tipoPreco,
        a.tabelaPreco,
        a.precoSugestaoAPrazo,
        a.precoSugestaoAVista,
        a.precoDesconto,
        a.precoMinimo,
        a.usarPrecoAVista,
        a.acrescimoUnitarioComposicao,
        a.percDescontoItem,
        a.valorDescontoItem,
        a.percAcrescimoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.observacoesDigitadas,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.operacaoFiscal,
        a.movimentaEstoque,
        a.geraFinanceiro,
        prod.pesoLiquido prod_pesoLiquido,
        prod.pesoBruto prod_pesoBruto,
        unMedConv.casasDecimaisUnidadeMedida unMedConv_casasDecimais
      FROM MOORCAMENTOXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN SIUNIDADESMEDIDA unMedConv
      ON unMedConv.unidadeMedida = a.unidadeMedidaConversao
      WHERE a.idItemOrcamento = p_idItemOrcamento)
    LOOP   
      IF v_ativ_quantidade <> a.quantidade
        OR v_ativ_precoUnitario <> a.precoUnitario
        OR v_ativ_geraFinanceiro <> a.geraFinanceiro
      THEN
        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_config_413_obs_add_marca,
          p_config_418_obs_efetarEnter,
          0, -- p_manterFinanceiro_Retotalizar,
          'T', -- p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
          0, -- p_buscarGeraFinanceiroEstoque,
          ' ', -- p_tipoDocumentoReferenciado, 
          0, -- p_idItemReferenciado,
          0, -- p_quantidadeReferenciada
          ' ', -- p_tempComp_nomeTempComposicao,
          0, -- p_tempComp_sequencia
          ' ', -- p_mensagemAviso,
          0, -- p_calcularImpostos
          p_idItemOrcamento,
          a.orcamento,
          a.pedidoCompraFornecedor,
          a.sequenciaPedidoCompraFornec,
          a.ambiente,
          a.ambienteObservacoes,
          a.vinculoItemDocumento,
          a.atividadeServico,
          a.statusAtividadeServico,
          a.controleEntrega,
          a.dataEntrega,
          a.modeloDocumento,
          a.estabelecimentoOriginal,
          a.vendedor,
          a.gradeProduto,
          a.idFormulaTinta,
          a.personalizacao,
          a.idLoteEstoque,
          0, -- p_item_idEnderecoEstoque
          0, -- p_item_idNumeroSerie
          0, -- p_item_atividadeProjeto,
          a.localEstoque,
          a.pessoaParticipante,
          a.controleQuantidade,
          a.unidadeMedidaConversao,
          a.conversorQuantidade,
          a.loteMinimo,
          a.loteMultiplo,
          a.altura,
          a.largura,
          a.comprimento,
          CASE a.controleQuantidade
            WHEN 2
            THEN ROUND (CASE WHEN a.altura = 0 OR a.largura = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / ((a.altura / 100) * (a.largura / 100))), 3) END, 6)
            WHEN 3
            THEN ROUND (CASE WHEN a.altura = 0 OR a.comprimento = 0 OR a.comprimento = 0 THEN 0 ELSE ROUND (v_ativ_quantidade / ((a.altura / 100) * (a.largura / 100) * a.comprimento), 3) END, 6)
            WHEN 4
            THEN ROUND (CASE WHEN a.conversorQuantidade = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / a.conversorQuantidade), 3) END, 6)
            ELSE 0
          END, -- p_item_pecas
          v_ativ_quantidade,
          CASE a.controleQuantidade
            WHEN 2
            THEN ROUND (CASE WHEN a.altura = 0 OR a.largura = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / ((a.altura / 100) * (a.largura / 100))), 3) END, a.unMedConv_casasDecimais)
            WHEN 3
            THEN ROUND (CASE WHEN a.altura = 0 OR a.comprimento = 0 OR a.comprimento = 0 THEN 0 ELSE ROUND (v_ativ_quantidade / ((a.altura / 100) * (a.largura / 100) * a.comprimento), 3) END, a.unMedConv_casasDecimais)
            WHEN 4
            THEN ROUND (CASE WHEN a.conversorQuantidade = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / a.conversorQuantidade), 3) END, a.unMedConv_casasDecimais)
            ELSE v_ativ_quantidade
          END, -- p_item_quantidadeConvertida
          ROUND ((v_ativ_quantidade * a.prod_pesoLiquido), 3), -- p_item_pesoLiquido
          ROUND ((v_ativ_quantidade * a.prod_pesoBruto), 3), -- p_item_pesoBruto
          a.tipoPreco,
          a.tabelaPreco,
          a.precoSugestaoAPrazo,
          a.precoSugestaoAVista,
          a.precoDesconto,
          a.precoMinimo,
          a.usarPrecoAVista,
          v_ativ_precoUnitario, -- p_item_precoUnitarioBruto
          a.acrescimoUnitarioComposicao,
          v_ativ_precoUnitario, -- p_item_precoUnitario
          a.percDescontoItem,
          a.valorDescontoItem,
          a.percAcrescimoItem,
          a.valorAcrescimoItem,
          a.valorFreteItem,
          a.valorSeguroItem,
          a.valorAdicFreteMarinhaMerItem,
          a.valorDespesasAduaneirasItem,
          a.observacoesDigitadas,
          a.valorFreteGeral,
          a.valorSeguroGeral,
          a.valorDescontoGeral,
          a.valorOutrasDespesasGeral,
          a.valorAdicFreteMarinhaMerGeral,
          a.valorDespesasAduaneirasGeral,
          a.valorDescontoPagamento,
          a.valorOutrasDespesasPagamento,
          a.valorJurosPagamento,
          a.operacaoFiscal,
          a.movimentaEstoque,
          v_ativ_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_idAtividadesPrevistasSelec
          0, -- p_nivel,
          ' ',
          v_auxVarchar, -- r_mensagemAviso
          v_calcularImpostos,
          v_auxNumber, -- idItemOrcamento
          v_auxVarchar, -- r_buffer_idItemOrcamento
          v_auxNumber); -- r_valorInserido
        IF v_calcularImpostos = 1 THEN
          ADD_ORCAMENTO_CALC_IMP_CAB (
            p_config_64_casasDecSaidas,
            p_config_209_filtrarGrupoEcon,
            p_config_362_calcCustoPorGrade,
            a.orcamento,
            ' ', -- p_troca_tipoPagamentoFrete,
            ' '); --p_a_cab_tipoPagamentoFrete
        END IF;
      END IF;
    END LOOP;
  END IF;
END ADD_ORCAMENTO_ITEM_PREV_RECALC;

/

UPDATE SIVERSOESSISTEMA SET dataLiberacaoVersao = TO_DATE ('18/06/2024', 'DD/MM/YYYY'), dataAtualizacaoVersao =  SYSDATE, observacoes = 'BETA 14' WHERE idVersaoSistema = 2024001002;

COMMIT;

-- FIM BETA 14 - 18/6/24

INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (167, '56', '56 - ALKTEIA CLUB', 204, 1, 56, ' ');

COMMIT;

UPDATE SIVERSOESSISTEMA SET dataLiberacaoVersao = TO_DATE ('19/06/2024', 'DD/MM/YYYY'), dataAtualizacaoVersao =  SYSDATE, observacoes = 'BETA 15' WHERE idVersaoSistema = 2024001002;

COMMIT;

-- FIM BETA 15 - 19/6/24

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

/

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

/

INSERT INTO SITIPOSBENEFICIOS (tipoBeneficio, descricao, ativo, observacoes) VALUES ('DR', 'Desconto a partir do item X da regra', 1, ' ');
INSERT INTO SITIPOSBENEFICIOS (tipoBeneficio, descricao, ativo, observacoes) VALUES ('PU', 'Preço Unitário a partir do item X da regra', 1, ' ');

COMMIT;

UPDATE SIVERSOESSISTEMA SET dataLiberacaoVersao = TO_DATE ('24/06/2024', 'DD/MM/YYYY'), dataAtualizacaoVersao =  SYSDATE, observacoes = 'BETA 16' WHERE idVersaoSistema = 2024001002;

COMMIT;

-- FIM BETA 16 - 24/6/24

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

/

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

/

UPDATE MOPREDOCUMXCONFERENCIAS a
SET a.idItemDocTransferencia = 0
WHERE a.idItemDocTransferencia > 0
AND EXISTS (
  SELECT 1
  FROM MODOCUMENTOTRANSFXITENS itemTransf
  JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
  ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
  WHERE itemTransf.idItemDocTransferencia = a.idItemDocTransferencia
  AND (itemTransf.cancelado = 1
    OR cabTransf.situacaoDocTransferencia = 'C'));

COMMIT;

UPDATE MODOCFISCALXCONFERENCIAS a
SET a.idItemDocTransferencia = 0
WHERE a.idItemDocTransferencia > 0
AND EXISTS (
  SELECT 1
  FROM MODOCUMENTOTRANSFXITENS itemTransf
  JOIN MODOCUMENTOSTRANSFERENCIA cabTransf
  ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
  WHERE itemTransf.idItemDocTransferencia = a.idItemDocTransferencia
  AND (itemTransf.cancelado = 1
    OR cabTransf.situacaoDocTransferencia = 'C'));

COMMIT;

UPDATE SIVERSOESSISTEMA SET dataLiberacaoVersao = TO_DATE ('25/06/2024', 'DD/MM/YYYY'), dataAtualizacaoVersao =  SYSDATE, observacoes = 'BETA 17' WHERE idVersaoSistema = 2024001002;

COMMIT;

-- FIM BETA 17 - 25/6/24

INSERT INTO SIVERSOESSISTEMA (idVersaoSistema, versaoAplicativo, dataLiberacaoVersao, possuiConversaoTabelas, atualizada, dataAtualizacaoVersao, observacoes) VALUES (2024001002, '2024.1.2', TO_DATE ('25/06/2024', 'DD/MM/YYYY'), 1, 1, sysdate, 'BETA 17');

COMMIT;

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