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      := CASE WHEN a.controleQuantidadeVenda < 1 THEN 1 ELSE a.controleQuantidadeVenda END;
        v_combo_unidadeMedidaConversao  :=
          CASE
            WHEN a.controleQuantidadeVenda IN (2,3) 
            THEN 'PC'
            WHEN a.controleQuantidadeVenda IN (4,5) AND a.unidadeMedidaVenda <> ' '
            THEN a.unidadeMedidaVenda
            ELSE a.unidadeMedida
          END;
        v_combo_conversorQuantidade := CASE WHEN a.controleQuantidadeVenda IN (4,5) AND a.conversorQuantidadeVenda <> 0 THEN a.conversorQuantidadeVenda ELSE 0 END;
        v_combo_loteMinimo          := ROUND (a.loteMinimoVenda, a.casasDecimaisUnidadeMedida);
        v_combo_loteMultiplo        := ROUND (a.loteMultiploVenda, a.casasDecimaisUnidadeMedida);
      END IF;
      IF 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))), 6) END;
        v_combo_quantidadeConvertida := v_combo_pecas;
        v_combo_conversorQuantidade  := CASE WHEN v_combo_quantidadeConvertida = 0 THEN 0 ELSE ROUND (a.quantidade / v_combo_quantidadeConvertida, 6) END;
      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), 6) END;
        v_combo_quantidadeConvertida := v_combo_pecas;
        v_combo_conversorQuantidade  := CASE WHEN v_combo_quantidadeConvertida = 0 THEN 0 ELSE ROUND (a.quantidade / v_combo_quantidadeConvertida, 6) END;
      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, 6) END;
        v_combo_quantidadeConvertida := v_combo_pecas;
      ELSIF v_combo_controleQuantidade = 5 THEN
        v_combo_altura               := 0;
        v_combo_largura              := 0;
        v_combo_comprimento          := 0;
        v_combo_pecas                := ROUND (a.quantidade * v_combo_conversorQuantidade, 6);
        v_combo_quantidadeConvertida := v_combo_pecas;
      ELSE
        v_combo_conversorQuantidade  := 1;
        v_combo_altura               := 0;
        v_combo_largura              := 0;
        v_combo_comprimento          := 0;
        v_combo_pecas                := 0;
        v_combo_quantidadeConvertida := a.quantidade;
      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
      v_soma_valorProdutos          := 0;
      v_soma_valorDescontoProdutos  := 0;
      v_soma_valorAcrescimoProdutos := 0;
      v_soma_valorServicos          := 0;
      v_soma_valorDescontoServicos  := 0;
      v_soma_valorAcrescimoServicos := 0;
      v_ajuste_residuoDesconto      := 0;
      v_ajuste_residuoAcrescimo     := 0;
      v_ajuste_valorOriginal        := v_item_valorProdutoServico -
        CASE
          WHEN v_modDoc_diminuiDescontoPrUnit = 1
          THEN 0
          ELSE p_item_valorDescontoItem
        END +
        CASE
          WHEN v_modDoc_somaAcrescimosPrUnit = 1
          THEN 0
          ELSE p_item_valorAcrescimoItem
        END;
      WHILE r_buffer_idItemDocFiscal IS NOT NULL AND LENGTH(RTRIM(r_buffer_idItemDocFiscal)) >= 14
      LOOP
        v_ajuste_idItemDocFiscal := TO_NUMBER(SUBSTR(r_buffer_idItemDocFiscal,1,14));
        r_buffer_idItemDocFiscal := RTRIM(SUBSTR(r_buffer_idItemDocFiscal,16,32000));
        SELECT
          a.quantidade,
          a.precoUnitarioBruto,
          a.valorProdutoServicoBruto,
          a.valorDescontoItem,
          a.valorAcrescimoItem,
          prod.tipoProduto
        INTO
          v_ajuste_quantidade,
          v_ajuste_precoUnitarioBruto,
          v_ajuste_valorProdutoServicoBr,
          v_ajuste_valorDescontoItem,
          v_ajuste_valorAcrescimoItem,
          v_ajuste_prod_tipoProduto
        FROM MODOCFISCALXITENS a
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = a.gradeProduto
        JOIN CAPRODUTOS prod
        ON prod.produto = gradProd.produto
        WHERE a.idItemDocFiscal = v_ajuste_idItemDocFiscal;
        IF v_ajuste_prod_tipoProduto = '09' THEN
          v_soma_valorServicos := v_soma_valorServicos - v_ajuste_valorProdutoServicoBr
            + CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            - CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END;
          v_soma_valorDescontoServicos  := v_soma_valorDescontoServicos  - v_ajuste_valorDescontoItem;
          v_soma_valorAcrescimoServicos := v_soma_valorAcrescimoServicos - v_ajuste_valorAcrescimoItem;
        ELSE
          v_soma_valorProdutos := v_soma_valorProdutos - v_ajuste_valorProdutoServicoBr
            + CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            - CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END;
          v_soma_valorDescontoProdutos  := v_soma_valorDescontoProdutos  - v_ajuste_valorDescontoItem;
          v_soma_valorAcrescimoProdutos := v_soma_valorAcrescimoProdutos - v_ajuste_valorAcrescimoItem;
        END IF;
        v_ajuste_valorDescontoItem := v_ajuste_valorDescontoItem + ROUND (
          CASE
            WHEN r_valorInserido > v_ajuste_valorOriginal
            THEN r_valorInserido - v_ajuste_valorOriginal
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoDesconto, 2);
        v_ajuste_residuoDesconto :=
          CASE
            WHEN r_valorInserido > v_ajuste_valorOriginal
            THEN r_valorInserido - v_ajuste_valorOriginal
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoDesconto - ROUND (
          CASE
            WHEN r_valorInserido > v_ajuste_valorOriginal
            THEN r_valorInserido - v_ajuste_valorOriginal
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoDesconto, 2);
        v_ajuste_valorAcrescimoItem := v_ajuste_valorAcrescimoItem + ROUND (
          CASE
            WHEN v_ajuste_valorOriginal > r_valorInserido
            THEN v_ajuste_valorOriginal - r_valorInserido
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoAcrescimo, 2);
        v_ajuste_residuoAcrescimo :=
          CASE
            WHEN v_ajuste_valorOriginal > r_valorInserido
            THEN v_ajuste_valorOriginal - r_valorInserido
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoAcrescimo - ROUND (
          CASE
            WHEN v_ajuste_valorOriginal > r_valorInserido
            THEN v_ajuste_valorOriginal - r_valorInserido
            ELSE 0
          END
          * (v_ajuste_valorProdutoServicoBr - v_ajuste_valorDescontoItem + v_ajuste_valorAcrescimoItem)
          / r_valorInserido + v_ajuste_residuoAcrescimo, 2);
        IF v_ajuste_prod_tipoProduto = '09' THEN
          v_soma_valorServicos := v_soma_valorServicos + v_ajuste_valorProdutoServicoBr
            - CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            + CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END;
          v_soma_valorDescontoServicos  := v_soma_valorDescontoServicos  + v_ajuste_valorDescontoItem;
          v_soma_valorAcrescimoServicos := v_soma_valorAcrescimoServicos + v_ajuste_valorAcrescimoItem;
        ELSE
          v_soma_valorProdutos := v_soma_valorProdutos + v_ajuste_valorProdutoServicoBr
            - CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            + CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END;
          v_soma_valorDescontoProdutos  := v_soma_valorDescontoProdutos  + v_ajuste_valorDescontoItem;
          v_soma_valorAcrescimoProdutos := v_soma_valorAcrescimoProdutos + v_ajuste_valorAcrescimoItem;
        END IF;
        UPDATE MODOCFISCALXITENS
        SET precoUnitario =
          CASE
            WHEN v_ajuste_quantidade = 0
              OR CASE
                   WHEN v_modDoc_diminuiDescontoPrUnit = 1
                   THEN v_ajuste_valorDescontoItem
                   ELSE 0
                 END =
                 CASE
                   WHEN v_modDoc_somaAcrescimosPrUnit = 1
                   THEN v_ajuste_valorAcrescimoItem
                   ELSE 0
                 END
            THEN v_ajuste_precoUnitarioBruto
            ELSE ROUND (( v_ajuste_valorProdutoServicoBr
              - CASE
                  WHEN v_modDoc_diminuiDescontoPrUnit = 1
                  THEN v_ajuste_valorDescontoItem
                  ELSE 0
                END
              + CASE
                  WHEN v_modDoc_somaAcrescimosPrUnit = 1
                  THEN v_ajuste_valorAcrescimoItem
                  ELSE 0
                END) / v_ajuste_quantidade, 7)
          END,
          valorProdutoServico = v_ajuste_valorProdutoServicoBr
            - CASE
                WHEN v_modDoc_diminuiDescontoPrUnit = 1
                THEN v_ajuste_valorDescontoItem
                ELSE 0
              END
            + CASE
                WHEN v_modDoc_somaAcrescimosPrUnit = 1
                THEN v_ajuste_valorAcrescimoItem
                ELSE 0
              END,
          percDescontoItem =
            CASE
              WHEN v_ajuste_valorProdutoServicoBr = 0
              THEN 0
              ELSE ROUND (100 * v_ajuste_valorDescontoItem / v_ajuste_valorProdutoServicoBr, 4)
            END,
          valorDescontoItem = v_ajuste_valorDescontoItem,
          percAcrescimoItem =
            CASE
              WHEN v_ajuste_valorProdutoServicoBr = 0
              THEN 0
              ELSE ROUND (100 * v_ajuste_valorAcrescimoItem / v_ajuste_valorProdutoServicoBr, 4)
            END,
          valorAcrescimoItem  = v_ajuste_valorAcrescimoItem
        WHERE idItemDocFiscal = v_ajuste_idItemDocFiscal;
      END LOOP;
      UPDATE MODOCUMENTOSFISCAIS SET
        valorProdutos          = valorProdutos          + v_soma_valorProdutos,
        valorDescontoProdutos  = valorDescontoProdutos  + v_soma_valorDescontoProdutos,
        valorAcrescimoProdutos = valorAcrescimoProdutos + v_soma_valorAcrescimoProdutos,
        valorServicos          = valorServicos          + v_soma_valorServicos,
        valorDescontoServicos  = valorDescontoServicos  + v_soma_valorDescontoServicos,
        valorAcrescimoServicos = valorAcrescimoServicos + v_soma_valorAcrescimoServicos
      WHERE idDocumentoFiscal  = p_item_idDocumentoFiscal;
      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);
    IF p_idItemReferenciado > 0 THEN
      IF p_tipoDocumentoReferenciado IN ('D','P') THEN
        ADD_DOC_ATUALIZA_QUANT_DEVOLV (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          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,
          0,
          v_auxNumber);
      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_209_filtrarGrupoEcon,
          p_config_230_etapaPedComprParc,
          p_config_362_calcCustoPorGrade,
          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,
          0,
          v_auxNumber);
      ELSIF p_tipoDocumentoReferenciado = 'O' THEN
        ADD_DOC_FISC_ITEM_REF_ORCAMEN (
          p_usuarioLogado,
          p_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_227_manterPessoaOrcam,
          p_config_362_calcCustoPorGrade,
          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,
          0,
          v_auxNumber);
      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,
          0,
          v_auxNumber);
      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;
    ELSE
    ADD_DOC_ATUALIZA_RESERVAS (
      p_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_cab_devolucaoAnulacaoRetorno,
      0, -- p_idItemPreDocumento
      r_item_idItemDocFiscal);
    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,
        0,
        v_auxNumber);
    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);
    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,
      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;
    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;

/

DROP PROCEDURE ADD_DOC_FISC_ITEM_COMBO_RESID;

/

create or replace PROCEDURE ADD_PRE_DOC_ROT_EFET_ORCAMENTO (
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_sessao                       IN NUMBER,
  p_idTerminalSiTef              IN VARCHAR2,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_orcamento                    IN NUMBER,
  p_sessaoCaixa                  IN NUMBER,
  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_estabelecimentoAtivo,
    p_config_209_filtrarGrupoEcon,
    p_config_362_calcCustoPorGrade,
    p_orcamento);
  r_preDocumento := v_preDocumento;
END ADD_PRE_DOC_ROT_EFET_ORCAMENTO;

/

create or replace PROCEDURE ADD_DOC_FISC_ROT_EFET_ORCAMENT (
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_sessao                       IN NUMBER,
  p_idTerminalSiTef              IN VARCHAR2,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_1_NFCe_2_ConsFinal_3_NF      IN VARCHAR2,
  p_orcamento                    IN NUMBER,
  p_sessaoCaixa                  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_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_estabelecimentoAtivo,
    p_config_209_filtrarGrupoEcon,
    p_config_362_calcCustoPorGrade,
    p_orcamento);
  r_idDocumentoFiscal := v_idDocumentoFiscal;
END ADD_DOC_FISC_ROT_EFET_ORCAMENT;

/

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_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 (
      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)
    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;
    INSERT INTO MODOCFISCALXCONFERENCIAS (
      id,
      idDocumentoFiscal,
      documentoTransferencia,
      gradeProduto,
      idFormulaTinta,
      personalizacao,
      idLoteEstoque,
      idNumeroSerie,
      codigoErro,
      quantidadeConferida,
      encerrado,
      idItemDocTransferencia,
      observacoes)
    SELECT
      FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXCONFERENCIAS', 'id', 0, p_estabelecimentoAtivo, NULL),
      r_idDocumentoFiscal,
      x.documentoTransferencia,
      x.gradeProduto,
      x.idFormulaTinta,
      x.personalizacao,
      x.idLoteEstoque,
      x.idNumeroSerie,
      x.codigoErro,
      x.quantidadeConferida,
      x.encerrado,
      x.idItemDocTransferencia,
      x.observacoes
    FROM MOPREDOCUMXCONFERENCIAS 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;
    DELETE MOPREDOCUMXCONFERENCIAS
    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
      tabelaSistema = 'MODOCUMENTOSFISCAIS',
      id = r_idDocumentoFiscal
    WHERE tabelaSistema = 'MOPREDOCUMENTOS'
    AND id = 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;
    FOR pagtos IN (
      SELECT idPagamentoPreDocumento
      FROM MOPREDOCUMXPAGAMENTOS
      WHERE preDocumento = p_preDocumento)
    LOOP
      UPDATE MOFINANCEIROS x SET
        x.documento = TO_CHAR(v_documentoFiscal),
        x.fatura = TO_CHAR(v_documentoFiscal)
      WHERE x.idPagamentoPreDocumento = pagtos.idPagamentoPreDocumento;
    END LOOP;
  END IF;
END ADD_DOC_FISC_ROT_EFET_PRE_DOC;

/

create or replace PROCEDURE ADD_DOC_FISC_INFO_SISTEMA_CRIA (
  p_exclusivo                    IN VARCHAR2,
  p_paf                          IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_cab_idDocumentoFiscal        IN NUMBER)
IS
  v_modeloDocumentoFiscal        CHAR(2);
  v_indicadorConsumidorFinal     CHAR(1);
  v_regimeTributario             CHAR(1);
  v_md5                          VARCHAR(32);
  v_documentoFiscalRefProduto    NUMBER;
  v_dataEmissaoRefProduto        DATE;
  v_documentoFiscalRefServico    NUMBER;
  v_dataEmissaoRefServico        DATE;
  v_valorPagamentoBruto          NUMBER;
  v_creditoSimplesNacional       NUMBER;
  v_valorCreditoSimplesNacional  NUMBER;
  v_valorFCP                     NUMBER;
  v_valorFCPUFDestinatario       NUMBER;
  v_valorICMSUFDestinatario      NUMBER;
  v_valorICMSUFRemetente         NUMBER;
  v_baseEstimadaImpostos         NUMBER;
  v_valorEstimadoImpostos        NUMBER;
  v_possui_1913                  NUMBER;
  v_possui_5912                  NUMBER;
  v_motorista                    NUMBER;
  v_motoristaNomeRazaoSocial     VARCHAR2(60);
BEGIN
  SELECT
    cab.modeloDocumentoFiscal,
    cab.indicadorConsumidorFinal,
    cab.valorPagamentoBruto,
    pess.regimeTributario
  INTO
    v_modeloDocumentoFiscal,
    v_indicadorConsumidorFinal,
    v_valorPagamentoBruto,
    v_regimeTributario
  FROM MODOCUMENTOSFISCAIS cab
  JOIN PAESTABELECIMENTOS est
  ON est.estabelecimento = cab.estabelecimento
  JOIN CAPESSOAS pess
  ON pess.pessoa = est.pessoaEstabelecimento
  WHERE cab.idDocumentoFiscal = p_cab_idDocumentoFiscal;
  IF p_paf = 1
    AND FUNC_ADD_BUSCA_CONFIG (322, p_perfilUsuarioLogado, p_usuarioLogado, p_estabelecimentoAtivo) = 'S'
  THEN
    SELECT COALESCE (MAX (md5PAFECF), ' ')
    INTO v_md5
    FROM SIPAFLAUDO
    WHERE idLaudo = 1;
    DELETE MODOCFISCALXINFOCOMPLEMEN
    WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
    AND geradoPeloSistema = 1
    AND descInformacaoComplementar LIKE 'MD5:%';
  ELSE
    v_md5 := ' ';
  END IF;
  SELECT
    COALESCE (MAX (docRef.documentoFiscal), 0),
    MAX (TRUNC (doc.dataEmissao))
  INTO
    v_documentoFiscalRefProduto,
    v_dataEmissaoRefProduto
  FROM MODOCFISCALXITENS item
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = item.gradeProduto
  JOIN CAPRODUTOS prod
  ON prod.produto = gradProd.produto
  JOIN MODOCUMENTOSFISCAIS doc
  ON doc.idDocumentoFiscal = item.idDocumentoFiscal
  JOIN MOENTREGAS entr
  ON entr.idItemDocFiscalRemessa = item.idItemDocFiscal
  JOIN MODOCFISCALXDOCFISCAL docXDoc
  ON docXDoc.idItemDocFiscal = item.idItemDocFiscal
  JOIN MODOCFISCALXITENS itemRef
  ON itemRef.idItemDocFiscal = docXDoc.idItemDocFiscalReferenciado
  JOIN MODOCUMENTOSFISCAIS docRef
  ON docRef.idDocumentoFiscal = itemRef.idDocumentoFiscal
  WHERE item.idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND prod.tipoProduto <> '09'
  AND doc.entradaSaida = 'S'
  AND doc.devolucaoAnulacaoRetorno = 0
  AND docRef.entradaSaida = 'S'
  AND docRef.devolucaoAnulacaoRetorno = 0;
  SELECT
    COALESCE (MAX (docRef.documentoFiscal), 0),
    MAX (TRUNC (doc.dataEmissao))
  INTO
    v_documentoFiscalRefServico,
    v_dataEmissaoRefServico
  FROM MODOCFISCALXITENS item
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = item.gradeProduto
  JOIN CAPRODUTOS prod
  ON prod.produto = gradProd.produto
  JOIN MODOCUMENTOSFISCAIS doc
  ON doc.idDocumentoFiscal = item.idDocumentoFiscal
  JOIN MOENTREGAS entr
  ON entr.idItemDocFiscalRemessa = item.idItemDocFiscal
  JOIN MODOCFISCALXDOCFISCAL docXDoc
  ON docXDoc.idItemDocFiscal = item.idItemDocFiscal
  JOIN MODOCFISCALXITENS itemRef
  ON itemRef.idItemDocFiscal = docXDoc.idItemDocFiscalReferenciado
  JOIN MODOCUMENTOSFISCAIS docRef
  ON docRef.idDocumentoFiscal = itemRef.idDocumentoFiscal
  WHERE item.idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND prod.tipoProduto = '09'
  AND doc.entradaSaida = 'S'
  AND doc.devolucaoAnulacaoRetorno = 0
  AND docRef.entradaSaida = 'S'
  AND docRef.devolucaoAnulacaoRetorno = 0;
  SELECT
    COALESCE (MAX (item.creditoSimplesNacional), 0),
    COALESCE (SUM (item.valorCreditoSimplesNacional), 0),
    COALESCE (SUM (item.valorFCP), 0),
    COALESCE (SUM (item.valorFCPUFDestinatario), 0),
    COALESCE (SUM (item.valorICMSUFDestinatario), 0),
    COALESCE (SUM (item.valorICMSUFRemetente), 0),
    COALESCE (SUM (item.baseEstimadaImpostos), 0),
    COALESCE (SUM (item.valorEstimadoImpFederais + item.valorEstimadoImpEstaduais + item.valorEstimadoImpMunicipais), 0),
    COALESCE (MAX (CASE WHEN cfop IN (1913, 2913) THEN 1 ELSE 0 END), 0),
    COALESCE (MAX (CASE WHEN cfop IN (5912, 6912) THEN 1 ELSE 0 END), 0),
    COALESCE (MAX (entr.motorista), 0)
  INTO
    v_creditoSimplesNacional,
    v_valorCreditoSimplesNacional,
    v_valorFCP,
    v_valorFCPUFDestinatario,
    v_valorICMSUFDestinatario,
    v_valorICMSUFRemetente,
    v_baseEstimadaImpostos,
    v_valorEstimadoImpostos,
    v_possui_1913,
    v_possui_5912,
    v_motorista
  FROM MODOCFISCALXITENS item
  LEFT JOIN MOENTREGAS entr
  ON entr.idItemDocFiscalRemessa = item.idItemDocFiscal
  WHERE item.idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND item.cancelado = 0;
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar LIKE 'NF-e Ref.:%';
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar LIKE 'Valor do ICMS relativo ao Fundo de Combate a Pobreza - FCP: R$';
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar LIKE 'Valor do ICMS relativo ao Fundo de Combate a Pobreza - FCP da UF de destino: R$%';
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar LIKE 'Valor do ICMS Interestadual para a UF de destino: R$%';
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar LIKE 'Valor do ICMS Interestadual para a UF do remetente: R$%';
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar LIKE 'Valor Aproximado Tributos: R$%';
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar = 'Venda destinada a consumidor final sem fins comerciais.';
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar LIKE 'Nota de transporte referente a nota de antecipação de faturamento%';
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar LIKE 'Nota de transporte referente a nota de serviço%';
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar LIKE 'Permite aproveitamento de credito de ICMS no valor de R$%';
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar = 'Documento emitido por ME ou EPP optante pelo Simples Nacional; Nao gera direito a credito fiscal de IPI.';
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar = 'Mercadoria remetida para demonstracao.';
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar = 'Imposto suspenso nos termos do Ajuste SINIEF 02/18.';
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar LIKE 'Motorista:%';
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND informacaoComplementar > 0;
  DELETE MODOCFISCALXINFOCOMPLEMEN
  WHERE IdDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND imprimir = 1
  AND informacaoComplementar = 0
  AND (descInformacaoComplementar LIKE 'P%R$%'
    OR descInformacaoComplementar LIKE 'T%R$%')
  AND SUBSTR(descInformacaoComplementar,2,1) BETWEEN '1' AND '9';
  IF v_md5 <> ' ' THEN
    ADD_DOC_FISC_INFO_CRIA (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      0,
      'MD5: ' || RTRIM(v_md5));
  END IF;
  IF v_modeloDocumentoFiscal <> '58' THEN
    FOR a IN (
      SELECT chaveNfe
      FROM MODOCFISCALXNFREF
      WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
      AND chaveNfe <> ' ')
    LOOP      
      ADD_DOC_FISC_INFO_CRIA (
        p_estabelecimentoAtivo,
        p_cab_idDocumentoFiscal,
        1,
        1,
        0,
        0,
        'NF-e Ref.: '
        || SUBSTR(a.chaveNfe,1,2)
        || '-' || SUBSTR(a.chaveNfe,3,4)
        || '-' || SUBSTR(a.chaveNfe,7,2)
        || '.' || SUBSTR(a.chaveNfe,9,3)
        || '.' || SUBSTR(a.chaveNfe,12,3)
        || '/' || SUBSTR(a.chaveNfe,15,4)
        || '-' || SUBSTR(a.chaveNfe,19,2)
        || '-' || SUBSTR(a.chaveNfe,21,2)
        || '-' || SUBSTR(a.chaveNfe,23,3)
        || '-' || SUBSTR(a.chaveNfe,26,3)
        || '.' || SUBSTR(a.chaveNfe,29,3)
        || '.' || SUBSTR(a.chaveNfe,32,3)
        || '-' || SUBSTR(a.chaveNfe,35,3)
        || '.' || SUBSTR(a.chaveNfe,38,3)
        || '.' || SUBSTR(a.chaveNfe,41,3)
        || '-' || SUBSTR(a.chaveNfe,44,1));
    END LOOP;
  END IF;
  IF v_valorFCP > 0 THEN
    ADD_DOC_FISC_INFO_CRIA (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      0,
      'Valor do ICMS relativo ao Fundo de Combate a Pobreza - FCP: R$ ' || TRIM (TO_CHAR (v_valorFCP, 'FM999G999G999G999G999G990D00')) || '.');
  END IF;
  IF v_valorFCPUFDestinatario > 0 THEN  
    ADD_DOC_FISC_INFO_CRIA (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      0,
      'Valor do ICMS relativo ao Fundo de Combate a Pobreza - FCP da UF de destino: R$ ' || TRIM (TO_CHAR (v_valorFCPUFDestinatario, 'FM999G999G999G999G999G990D00')) || '.');
  END IF;
  IF v_valorICMSUFDestinatario > 0 OR v_valorICMSUFRemetente > 0 THEN
    ADD_DOC_FISC_INFO_CRIA (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      0,
      'Valor do ICMS Interestadual para a UF de destino: R$ ' || TRIM (TO_CHAR (v_valorICMSUFDestinatario, 'FM999G999G999G999G999G990D00')) || '.');
  END IF;
  IF v_valorICMSUFDestinatario > 0 OR v_valorICMSUFRemetente > 0 THEN
    ADD_DOC_FISC_INFO_CRIA (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      0,
      'Valor do ICMS Interestadual para a UF do remetente: R$ ' || TRIM (TO_CHAR (v_valorICMSUFRemetente, 'FM999G999G999G999G999G990D00')) || '.');
  END IF;
  IF v_valorEstimadoImpostos > 0 THEN
    ADD_DOC_FISC_INFO_CRIA (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      0,
      'Valor Aproximado Tributos: R$ ' || TRIM (TO_CHAR (v_valorEstimadoImpostos, 'FM999G999G999G999G999G990D00')) || ' (' || CASE WHEN v_baseEstimadaImpostos = 0 THEN '0,00' ELSE TRIM (TO_CHAR (100* ROUND(v_valorEstimadoImpostos / v_baseEstimadaImpostos,2), 'FM999G999G999G999G999G990D00')) END || '%) Fonte: IBPT.');
  END IF;
  IF v_indicadorConsumidorFinal = '1' THEN
    ADD_DOC_FISC_INFO_CRIA (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      0,
      'Venda destinada a consumidor final sem fins comerciais.');
  END IF;
  IF v_documentoFiscalRefProduto > 0 THEN
    ADD_DOC_FISC_INFO_CRIA (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      0,
      'Nota de transporte referente a nota de antecipação de faturamento ' || TRIM (TO_CHAR (v_documentoFiscalRefProduto)) || CASE WHEN v_dataEmissaoRefProduto IS NULL THEN '' ELSE ' gerada na data ' || TO_CHAR(v_dataEmissaoRefProduto,'DD/MM/YYYY') END || '.');
  END IF;
  IF v_documentoFiscalRefServico > 0 THEN
    ADD_DOC_FISC_INFO_CRIA (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      0,
      'Nota de transporte referente a nota de serviço ' || TRIM (TO_CHAR (v_documentoFiscalRefServico)) || CASE WHEN v_dataEmissaoRefServico IS NULL THEN '' ELSE ' gerada na data ' || TO_CHAR(v_dataEmissaoRefServico,'DD/MM/YYYY') END || '.');
  END IF;
  IF v_regimeTributario IN ('1','2') AND v_valorCreditoSimplesNacional > 0 THEN
    ADD_DOC_FISC_INFO_CRIA (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      0,
      'Permite aproveitamento de credito de ICMS no valor de R$ ' || TRIM (TO_CHAR (v_valorCreditoSimplesNacional, 'FM999G999G999G999G999G990D00')) || ', correspondente a aliquota de ' || TRIM (TO_CHAR (v_creditoSimplesNacional, 'FM999G999G999G999G999G990D00')) || '%, nos termos do art. 23 da LC. 123, de 2006.');
  END IF;
  IF v_regimeTributario IN ('1','2') THEN
    ADD_DOC_FISC_INFO_CRIA (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      0,
      'Documento emitido por ME ou EPP optante pelo Simples Nacional; Nao gera direito a credito fiscal de IPI.');
  END IF;
  FOR obs IN (
    SELECT
      a.informacaoComplementar,
      a.descInformacaoComplementar
    FROM PAINFORMACOESCOMPLEMENTAR a
    WHERE a.informacaoComplementar > 0
    AND (
      EXISTS (
        SELECT 1
        FROM MODOCFISCALXITENS item
        JOIN PAOPERFISCALXINFOCOMPLEM opXInfo
        ON opXInfo.operacaoFiscal = item.operacaoFiscal
        WHERE item.idDocumentoFiscal = p_cab_idDocumentoFiscal
        AND item.cancelado = 0
        AND item.operacaoFiscal > 0
        AND opXInfo.informacaoComplementar = a.informacaoComplementar)
      OR EXISTS (
        SELECT 1
        FROM MODOCUMENTOSFISCAIS cab
        JOIN MODOCFISCALXITENS item
        ON item.idDocumentoFiscal = cab.idDocumentoFiscal
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = item.gradeProduto
        JOIN CAPRODUTOS prod
        ON prod.produto = gradProd.produto
        JOIN PAESTABELECIMENTOS est
        ON est.estabelecimento = cab.idDocumentoFiscal
        LEFT JOIN CAENDERECOSPESSOA endEst
        ON endEst.pessoa = est.pessoaEstabelecimento
        AND endEst.ativo = 1
        AND endEst.principal = 1
        JOIN SIMUNICIPIOS munEst
        ON munEst.municipio = COALESCE(endEst.municipio,0)
        LEFT JOIN CAENDERECOSPESSOA endPess
        ON endPess.pessoa = cab.pessoa
        AND endPess.ativo = 1 AND
        endPess.principal = 1
        JOIN SIMUNICIPIOS munPess
        ON munPess.municipio = COALESCE(endPess.municipio,0)
        WHERE cab.idDocumentoFiscal = p_cab_idDocumentoFiscal
        AND item.cancelado = 0
        AND a.informacaoComplementar = 
          FUNC_ADD_BUSCA_INFO_DESON (
            cab.tipoDocumento,
            cab.entradaSaida,
            cab.estabelecimento,
            cab.pessoa,
            cab.vendaConsumidor,
            munEst.uf,
            munPess.uf,
            item.stICMS,
            gradProd.produto,
            prod.origemMercadoria,
            prod.idNcm)))
    ORDER BY a.informacaoComplementar)
  LOOP
    ADD_DOC_FISC_INFO_GRAVA_DESCR (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      obs.informacaoComplementar,
      obs.descInformacaoComplementar);
  END LOOP;
  IF v_possui_5912 = 1 THEN
    ADD_DOC_FISC_INFO_GRAVA_DESCR (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      0,
      'Mercadoria remetida para demonstracao.');
  END IF;
  IF v_possui_5912 = 1 OR v_possui_1913 = 1 THEN
    ADD_DOC_FISC_INFO_GRAVA_DESCR (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      0,
      'Imposto suspenso nos termos do Ajuste SINIEF 02/18.');
  END IF;
  IF v_motorista <> 0 THEN
    SELECT COALESCE (MAX (nomeRazaoSocial), ' ')
    INTO v_motoristaNomeRazaoSocial
    FROM CAPESSOAS
    WHERE pessoa = v_motorista;
    ADD_DOC_FISC_INFO_GRAVA_DESCR (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      0,
      'Motorista: ' || TRIM (v_motoristaNomeRazaoSocial));
  END IF;
  IF p_exclusivo = 'BITELO' THEN
    ADD_DOC_FISC_INFO_GRAVA_DESCR (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      0,
      'ATENÇÃO: 
CONFIRA A MERCADORIA NO ATO DA ENTREGA, OS MATERIAIS SERÃO DESCARREGADOS AO LADO DO CAMINHÃO. 
DÚVIDAS E RECLAMAÇÕES SOBRE ENTREGAS LIGAR PARA (51) 3497-7589.');
  END IF;
  IF p_exclusivo = 'DC' THEN
    ADD_DOC_FISC_INFO_GRAVA_DESCR (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      0,
      'Declaro que o produto acima se encontra em perfeito estado, não constando nenhum dano físico, ou avarias, e, sobretudo com número de série idêntico ao da embalagem e com todos os acessórios e itens que o acompanham, bem como sua embalagem também em perfeito estado.

______________________________
    Assinatura do Recebido
    CPF/RG:');
  END IF;
  IF v_modeloDocumentoFiscal = '55'
    AND v_valorPagamentoBruto > 0
    AND FUNC_ADD_BUSCA_CONFIG (110, p_perfilUsuarioLogado, p_usuarioLogado, p_estabelecimentoAtivo) = 'S' THEN
    ADD_DOC_FISC_INFO_PAG_DOC_FISC (
      p_perfilUsuarioLogado,
      p_usuarioLogado,
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      p_cab_idDocumentoFiscal,
      0);
  END IF;
END ADD_DOC_FISC_INFO_SISTEMA_CRIA;

/

create or replace PROCEDURE ADD_PRE_DOC_CALC_IMP_RESIDUO (
  p_troca_tipoPagamentoFrete     IN NUMBER,
  p_a_cab_tipoPagamentoFrete     IN CHAR,
  p_cab_origemDocumento          IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_tipoPagamentoFrete       IN CHAR,
  p_cab_valorProdutos            IN NUMBER,
  p_cab_valorServicos            IN NUMBER,
  p_cab_valorBasePagamento       IN NUMBER,
  p_cab_valorAVistaMinimo        IN NUMBER,
  p_cab_valorFreteTotal          IN NUMBER,
  p_cab_valorSeguroTotal         IN NUMBER,
  p_cab_valorDescontoTotal       IN NUMBER,
  p_cab_valorOutrasDespesasTotal IN NUMBER,
  p_cab_valorAdicFreteMarinTotal IN NUMBER,
  p_cab_valorDespesasAduanTotal  IN NUMBER,
  p_cab_impostosEditados         IN NUMBER,
  p_cab_valorLiquidoItem         IN NUMBER,
  p_cab_valorDescCustoOpTotal    IN NUMBER,
  p_cab_valorAcrescCustoOpTotal  IN NUMBER,
  p_cab_valorCustoOperacao       IN NUMBER,
  p_cab_valorCMV                 IN NUMBER,
  p_cab_valorAcrescExtempTotal   IN NUMBER,
  p_item_idItemPreDocumento      IN NUMBER,
  p_saldoRatFreteGeral           IN NUMBER,
  p_saldoRatSeguroGeral          IN NUMBER,
  p_saldoRatDescontoGeral        IN NUMBER,
  p_saldoRatOutrasDespesasGeral  IN NUMBER,
  p_saldoRatAdicFreteMarinGeral  IN NUMBER,
  p_saldoRatDespesasAduanGeral   IN NUMBER,
  p_saldoRatDescontoPagamento    IN NUMBER,
  p_saldoRatOutrasDespPagamento  IN NUMBER,
  p_saldoRatJurosPagamento       IN NUMBER,
  p_saldoRatDescCustoOpGeral     IN NUMBER,
  p_saldoRatAcrescCustoOpGeral   IN NUMBER,
  p_saldoRatAcrescExtempGeral    IN NUMBER,
  p_calcularImpostosItem         IN NUMBER,
  /* 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,
  r_calcularImpostosItem         OUT NUMBER)
IS
  v_auxNumber                    NUMBER;
  v_valorBaseRateio              NUMBER;
  v_precoUnitario                NUMBER;
  v_precoUnitarioConvertido      NUMBER;
  v_valorProdutoServico          NUMBER;
  v_valorFreteGeral              NUMBER;
  v_valorSeguroGeral             NUMBER;
  v_valorDescontoGeral           NUMBER;
  v_valorOutrasDespesasGeral     NUMBER;
  v_valorAdicFreteMarinMerGeral  NUMBER;
  v_valorDespesasAduaneirasGeral NUMBER;
  v_valorBasePagamento           NUMBER;
  v_valorDescontoPagamento       NUMBER;
  v_valorOutrasDespesasPagamento NUMBER;
  v_valorJurosPagamento          NUMBER;
  v_valorFreteTotal              NUMBER;
  v_valorSeguroTotal             NUMBER;
  v_valorDescontoTotal           NUMBER;
  v_valorOutrasDespesasTotal     NUMBER;
  v_valorAdicFreteMarinMerTotal  NUMBER;
  v_valorDespesasAduaneirasTotal NUMBER;
  v_valorLiquidoItem             NUMBER;
  v_valorDescontoCustoOpGeral    NUMBER;
  v_valorDescontoCustoOpTotal    NUMBER;
  v_valorAcrescimoCustoOpGeral   NUMBER;
  v_valorAcrescimoCustoOpTotal   NUMBER;
  v_precoCustoOperacao           NUMBER;
  v_valorCustoOperacao           NUMBER;
  v_precoCMV                     NUMBER;
  v_valorCMV                     NUMBER;
  v_valorAcrescimoExtempSubtotal NUMBER;
  v_valorAcrescimoExtempGeral    NUMBER;
  v_valorAcrescimoExtempTotal    NUMBER;
  v_calculoImpostosPendenteItem  NUMBER;
BEGIN
  r_cab_valorProdutos            := p_cab_valorProdutos;
  r_cab_valorServicos            := p_cab_valorServicos;
  r_cab_valorBasePagamento       := p_cab_valorBasePagamento;
  r_cab_valorAVistaMinimo        := p_cab_valorAVistaMinimo;
  r_cab_valorFreteTotal          := p_cab_valorFreteTotal;
  r_cab_valorSeguroTotal         := p_cab_valorSeguroTotal;
  r_cab_valorDescontoTotal       := p_cab_valorDescontoTotal;
  r_cab_valorOutrasDespesasTotal := p_cab_valorOutrasDespesasTotal;
  r_cab_valorAdicFreteMarinTotal := p_cab_valorAdicFreteMarinTotal;
  r_cab_valorDespesasAduanTotal  := p_cab_valorDespesasAduanTotal;
  r_cab_valorLiquidoItem         := p_cab_valorLiquidoItem;
  r_cab_valorDescCustoOpTotal    := p_cab_valorDescCustoOpTotal;
  r_cab_valorAcrescCustoOpTotal  := p_cab_valorAcrescCustoOpTotal;
  r_cab_valorCustoOperacao       := p_cab_valorCustoOperacao;
  r_cab_valorCMV                 := p_cab_valorCMV;
  r_cab_valorAcrescExtempTotal   := p_cab_valorAcrescExtempTotal;
  r_calcularImpostosItem         := p_calcularImpostosItem;
  FOR a IN (
    SELECT
      a.modeloDocumento,
      a.geraFinanceiro,
      a.quantidade,
      a.quantidadeConvertida,
      a.usarPrecoAVista,
      a.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao,
      a.precoUnitario,
      a.precoUnitarioConvertido,
      a.valorProdutoServicoBruto,
      a.valorProdutoServico,
      a.valorDescontoItem,
      a.valorAcrescimoItem,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem,
      a.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.valorIPIDevolucao,
      a.retidoISSQN,
      a.valorISSQN,
      a.valorRetIRRF,
      a.valorRetINSS,
      a.valorRetPIS,
      a.valorRetCOFINS,
      a.valorRetCSLL,
      a.valorRetOutros,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMS,
      a.valorICMSST,
      a.valorLiquidoItem,
      a.valorDescontoCustoOpItem,
      a.valorDescontoCustoOpGeral,
      a.valorDescontoCustoOpTotal,
      a.valorAcrescimoCustoOpItem,
      a.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoCustoOpTotal,
      a.precoCustoOperacao,
      a.valorCustoOperacao,
      a.precoCMV,
      a.valorCMV,
      a.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo,
      a.valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem,
      a.valorAcrescimoExtempGeral,
      a.valorAcrescimoExtempTotal,
      modDoc.geraFinanceiro modDoc_geraFinanceiro,
      modDoc.diminuiDescontoPrUnit,
      modDoc.somaAcrescimosPrUnit,
      modDoc.somaFreteSeguroPrUnit,
      prod.tipoProduto,
      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 PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = a.modeloDocumento
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE a.idItemPreDocumento = p_item_idItemPreDocumento
    ORDER BY a.sequencia)
  LOOP
    v_precoUnitario                := a.precoUnitario;
    v_precoUnitarioConvertido      := a.precoUnitarioConvertido;
    v_valorProdutoServico          := a.valorProdutoServico;
    v_valorFreteGeral              := a.valorFreteGeral;
    v_valorSeguroGeral             := a.valorSeguroGeral;
    v_valorDescontoGeral           := a.valorDescontoGeral;
    v_valorOutrasDespesasGeral     := a.valorOutrasDespesasGeral;
    v_valorAdicFreteMarinMerGeral  := a.valorAdicFreteMarinhaMerGeral;
    v_valorDespesasAduaneirasGeral := a.valorDespesasAduaneirasGeral;
    v_valorBasePagamento           := a.valorBasePagamento;
    v_valorDescontoPagamento       := a.valorDescontoPagamento;
    v_valorOutrasDespesasPagamento := a.valorOutrasDespesasPagamento;
    v_valorJurosPagamento          := a.valorJurosPagamento;
    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_valorLiquidoItem             := a.valorLiquidoItem;
    v_valorDescontoCustoOpGeral    := a.valorDescontoCustoOpGeral;
    v_valorDescontoCustoOpTotal    := a.valorDescontoCustoOpTotal;
    v_valorAcrescimoCustoOpGeral   := a.valorAcrescimoCustoOpGeral;
    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_valorAcrescimoExtempGeral    := a.valorAcrescimoExtempGeral;
    v_valorAcrescimoExtempTotal    := a.valorAcrescimoExtempTotal;
    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 - v_valorDescontoPagamento + v_valorOutrasDespesasPagamento + v_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;
    v_valorFreteGeral              := v_valorFreteGeral + p_saldoRatFreteGeral;
    v_valorSeguroGeral             := v_valorSeguroGeral + p_saldoRatSeguroGeral;
    v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral + p_saldoRatAdicFreteMarinGeral;
    v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + p_saldoRatDespesasAduanGeral;
    v_valorDescontoGeral           := v_valorDescontoGeral + p_saldoRatDescontoGeral;
    v_valorOutrasDespesasGeral     := v_valorDespesasAduaneirasGeral + p_saldoRatOutrasDespesasGeral;
    v_valorDescontoPagamento       := v_valorDescontoPagamento + p_saldoRatDescontoPagamento;
    v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + p_saldoRatOutrasDespPagamento;
    v_valorJurosPagamento          := v_valorJurosPagamento + p_saldoRatJurosPagamento;
    v_valorDescontoCustoOpGeral    := v_valorDescontoCustoOpGeral + p_saldoRatDescCustoOpGeral;
    v_valorAcrescimoCustoOpGeral   := v_valorAcrescimoCustoOpGeral + p_saldoRatAcrescCustoOpGeral;
    v_valorAcrescimoExtempGeral    := v_valorAcrescimoExtempGeral + p_saldoRatAcrescExtempGeral;
    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,
      v_valorFreteGeral,
      v_valorSeguroGeral,
      v_valorDescontoGeral,
      v_valorOutrasDespesasGeral,
      v_valorAdicFreteMarinMerGeral,
      v_valorDespesasAduaneirasGeral,
      v_valorDescontoPagamento,
      v_valorOutrasDespesasPagamento,
      v_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,
      v_valorAcrescimoExtempGeral);
    IF p_cab_impostosEditados = 0 
        OR v_valorProdutoServico <> a.valorProdutoServico
        OR CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE v_valorFreteTotal END
        <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE p_cab_tipoPagamentoFrete END = 'V' THEN 0 ELSE a.valorFreteTotal END
        OR CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE v_valorSeguroTotal END
        <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE p_cab_tipoPagamentoFrete END = 'V' THEN 0 ELSE a.valorSeguroTotal END
        OR v_valorDescontoTotal <> a.valorDescontoTotal
        OR v_valorOutrasDespesasTotal <> a.valorOutrasDespesasTotal
        OR v_valorAdicFreteMarinMerTotal <> a.valorAdicFreteMarinhaMerTotal
        OR v_valorDespesasAduaneirasTotal <> a.valorDespesasAduaneirasTotal
        OR v_precoUnitario <> a.precoUnitario
        OR v_valorProdutoServico <> a.valorProdutoServico
    THEN
      r_calcularImpostosItem := 1;
    END IF;
    v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
      p_cab_origemDocumento,
      0, -- p_cab_nfFornecedor
      p_cab_tipoPagamentoFrete,
      a.geraFinanceiro,
      v_valorProdutoServico,
      v_valorDescontoPagamento,
      v_valorOutrasDespesasPagamento,
      v_valorJurosPagamento,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      a.valorIPIDevolucao,
      a.retidoISSQN,
      a.valorISSQN,
      a.valorRetIRRF,
      a.valorRetINSS,
      a.valorRetPIS,
      a.valorRetCOFINS,
      a.valorRetCSLL,
      a.valorRetOutros,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.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,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0 -- p_item_somarICMSST
      );
    ADD_CALCULA_CUSTO_CMV (
      p_cab_atualizaCustoMedio,
      p_cab_estabelecimento,
      0,
      a.modeloDocumento,
      a.quantidade,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorIPIDevolucao,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMS,
      a.valorICMSST,
      0,
      v_valorLiquidoItem,
      a.valorDescontoCustoOpItem,
      v_valorDescontoCustoOpGeral,
      a.valorAcrescimoCustoOpItem,
      v_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,
      valorFreteGeral               = v_valorFreteGeral,
      valorSeguroGeral              = v_valorSeguroGeral,
      valorDescontoGeral            = v_valorDescontoGeral,
      valorOutrasDespesasGeral      = v_valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral = v_valorAdicFreteMarinMerGeral,
      valorDespesasAduaneirasGeral  = v_valorDespesasAduaneirasGeral,
      valorBasePagamento            = v_valorBasePagamento,
      valorDescontoPagamento        = v_valorDescontoPagamento,
      valorOutrasDespesasPagamento  = v_valorOutrasDespesasPagamento,
      valorJurosPagamento           = v_valorJurosPagamento,
      valorFreteTotal               = v_valorFreteTotal,
      valorSeguroTotal              = v_valorSeguroTotal,
      valorDescontoTotal            = v_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
      valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
      valorLiquidoItem              = v_valorLiquidoItem,
      valorDescontoCustoOpGeral     = v_valorDescontoCustoOpGeral,
      valorDescontoCustoOpTotal     = v_valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpGeral    = v_valorAcrescimoCustoOpGeral,
      valorAcrescimoCustoOpTotal    = v_valorAcrescimoCustoOpTotal,
      precoCustoOperacao            = v_precoCustoOperacao,
      valorCustoOperacao            = v_valorCustoOperacao,
      precoCMV                      = v_precoCMV,
      valorCMV                      = v_valorCMV,
      valorAcrescimoExtempSubtotal  = v_valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempGeral     = v_valorAcrescimoExtempGeral,
      valorAcrescimoExtempTotal     = v_valorAcrescimoExtempTotal
    WHERE idItemPreDocumento        = p_item_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 + v_valorDescontoPagamento - v_valorOutrasDespesasPagamento - v_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_valorDescCustoOpTotal    := r_cab_valorDescCustoOpTotal + v_valorDescontoCustoOpTotal;
    r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem + v_valorLiquidoItem;
    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_RESIDUO;

/

create or replace PROCEDURE ADD_PRE_DOC_CALC_IMP_RATEIO (
  p_cab_preDocumento             IN NUMBER,
  p_troca_tipoPagamentoFrete     IN NUMBER,
  p_a_cab_tipoPagamentoFrete     IN CHAR,
  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_tipoPagamentoFrete       IN CHAR,
  p_cab_valorFreteGeral          IN NUMBER,
  p_cab_valorSeguroGeral         IN NUMBER,
  p_cab_valorDescontoGeral       IN NUMBER,
  p_cab_valorOutrasDespesasGeral IN NUMBER,
  p_cab_valorAdicFreteMarinGeral IN NUMBER,
  p_cab_valorDespesasAduanGeral  IN NUMBER,
  p_cab_valorDescontoPagamento   IN NUMBER,
  p_cab_valorOutrasDespPagamento IN NUMBER,
  p_cab_valorJurosPagamento      IN NUMBER,
  p_cab_impostosEditados         IN NUMBER,
  p_cab_valorDescCustoOpGeral    IN NUMBER,
  p_cab_valorAcrescCustoOpGeral  IN NUMBER,
  p_cab_valorAcrescExtempGeral   IN NUMBER,
  p_habilitaControleEntrega      IN NUMBER,
  /* 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,
  r_calcularImpostosItem         OUT NUMBER)
IS
  v_auxNumber                    NUMBER;
  v_valorDescontoPromocaoGeral   NUMBER;
  v_valorDescontoPromocaoPagamen NUMBER;
  v_rateioDescontofiltrarSemProm NUMBER;
  v_rateioDescontofiltrarAPrazo  NUMBER;
  v_rateioFretePorControleEntr   NUMBER;
  v_valorBaseFreteSemFinSemEntr  NUMBER;
  v_valorBaseFreteComFinSemEntr  NUMBER;
  v_valorBaseFreteSemFinComEntr  NUMBER;
  v_valorBaseFreteComFinComEntr  NUMBER;
  v_valorBaseRateio              NUMBER;
  v_valorBaseRateioComEntrega    NUMBER;
  v_valorBaseRateioFinanceiro    NUMBER;
  v_valorBaseRateioOutrasDespGer NUMBER;
  v_valorBaseRateioOutrasDespFin NUMBER;
  v_valorBaseRateioDescontoGeral NUMBER;
  v_valorBaseRateioPagamento     NUMBER;
  v_valorBaseRateioPagamFinanc   NUMBER;
  v_valorBaseRateioPagamDesconto NUMBER;
  v_valorBaseRateioPagamFinDesc  NUMBER;
  v_saldoRatFreteGeral           NUMBER;
  v_saldoRatSeguroGeral          NUMBER;
  v_saldoRatDescontoGeral        NUMBER;
  v_saldoRatOutrasDespesasGeral  NUMBER;
  v_saldoRatAdicFreteMarinGeral  NUMBER;
  v_saldoRatDespesasAduanGeral   NUMBER;
  v_saldoRatDescontoPagamento    NUMBER;
  v_saldoRatOutrasDespPagamento  NUMBER;
  v_saldoRatJurosPagamento       NUMBER;
  v_saldoRatDescCustoOpGeral     NUMBER;
  v_saldoRatAcrescCustoOpGeral   NUMBER;
  v_saldoRatAcrescExtempGeral    NUMBER;
  v_residuoFreteGeral            NUMBER;
  v_residuoSeguroGeral           NUMBER;
  v_residuoDescontoGeral         NUMBER;
  v_residuoOutrasDespesasGeral   NUMBER;
  v_residuoAdicFreteMarinGeral   NUMBER;
  v_residuoDespesasAduanGeral    NUMBER;
  v_residuoDescontoPagamento     NUMBER;
  v_residuoOutrasDespPagamento   NUMBER;
  v_residuoJurosPagamento        NUMBER;
  v_residuoDescCustoOpGeral      NUMBER;
  v_residuoAcrescCustoOpGeral    NUMBER;
  v_residuoAcrescExtempGeral     NUMBER;
  v_idItemPreDocUltimoItem       NUMBER;
  v_idItemPreDocRateioFrete      NUMBER;
  v_precoUnitario                NUMBER;
  v_precoUnitarioConvertido      NUMBER;
  v_valorProdutoServico          NUMBER;
  v_valorFreteGeral              NUMBER;
  v_valorSeguroGeral             NUMBER;
  v_valorDescontoGeral           NUMBER;
  v_valorOutrasDespesasGeral     NUMBER;
  v_valorAdicFreteMarinMerGeral  NUMBER;
  v_valorDespesasAduaneirasGeral NUMBER;
  v_valorBasePagamento           NUMBER;
  v_valorDescontoPagamento       NUMBER;
  v_valorOutrasDespesasPagamento NUMBER;
  v_valorJurosPagamento          NUMBER;
  v_valorFreteTotal              NUMBER;
  v_valorSeguroTotal             NUMBER;
  v_valorDescontoTotal           NUMBER;
  v_valorOutrasDespesasTotal     NUMBER;
  v_valorAdicFreteMarinMerTotal  NUMBER;
  v_valorDespesasAduaneirasTotal NUMBER;
  v_valorLiquidoItem             NUMBER;
  v_valorDescontoCustoOpGeral    NUMBER;
  v_valorDescontoCustoOpTotal    NUMBER;
  v_valorAcrescimoCustoOpGeral   NUMBER;
  v_valorAcrescimoCustoOpTotal   NUMBER;
  v_precoCustoOperacao           NUMBER;
  v_valorCustoOperacao           NUMBER;
  v_precoCMV                     NUMBER;
  v_valorCMV                     NUMBER;
  v_valorAcrescimoExtempSubtotal NUMBER;
  v_valorAcrescimoExtempGeral    NUMBER;
  v_valorAcrescimoExtempTotal    NUMBER;
  v_calculoImpostosPendenteItem  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;
  r_calcularImpostosItem         := 0;
  v_saldoRatFreteGeral           := p_cab_valorFreteGeral;
  v_saldoRatSeguroGeral          := p_cab_valorSeguroGeral;
  v_saldoRatDescontoGeral        := p_cab_valorDescontoGeral;
  v_saldoRatOutrasDespesasGeral  := p_cab_valorOutrasDespesasGeral;
  v_saldoRatAdicFreteMarinGeral  := p_cab_valorAdicFreteMarinGeral;
  v_saldoRatDespesasAduanGeral   := p_cab_valorDespesasAduanGeral;
  v_saldoRatDescontoPagamento    := p_cab_valorDescontoPagamento;
  v_saldoRatOutrasDespPagamento  := p_cab_valorOutrasDespPagamento;
  v_saldoRatJurosPagamento       := p_cab_valorJurosPagamento;
  v_saldoRatDescCustoOpGeral     := p_cab_valorDescCustoOpGeral;
  v_saldoRatAcrescCustoOpGeral   := p_cab_valorAcrescCustoOpGeral;
  v_saldoRatAcrescExtempGeral    := p_cab_valorAcrescExtempGeral;
  v_residuoFreteGeral            := 0;
  v_residuoSeguroGeral           := 0;
  v_residuoDescontoGeral         := 0;
  v_residuoOutrasDespesasGeral   := 0;
  v_residuoAdicFreteMarinGeral   := 0;
  v_residuoDespesasAduanGeral    := 0;
  v_residuoDescontoPagamento     := 0;
  v_residuoOutrasDespPagamento   := 0;
  v_residuoJurosPagamento        := 0;
  v_residuoDescCustoOpGeral      := 0;
  v_residuoAcrescCustoOpGeral    := 0;
  v_residuoAcrescExtempGeral     := 0;
  v_idItemPreDocUltimoItem       := 0;
  v_idItemPreDocRateioFrete      := 0;
  v_valorDescontoPromocaoGeral   := 0;
  v_valorDescontoPromocaoPagamen := 0;
  v_rateioDescontofiltrarSemProm := 0;
  v_rateioDescontofiltrarAPrazo  := 0;

  -- v_valorDescontoPromocaoGeral
  IF p_cab_valorDescontoGeral > 0 THEN
    SELECT COALESCE(SUM(promo.valorDesconto),0)
    INTO v_valorDescontoPromocaoGeral
    FROM MOPREDOCUMXITENS a
    JOIN MOPREDOCUMXPROMOCOES promo
    ON promo.idItemPreDocumento = a.idItemPreDocumento
    WHERE a.preDocumento = p_cab_preDocumento
    AND a.cancelado = 0
    AND promo.cabecalhoItemPagamento ='C';
  END IF;

  -- v_valorDescontoPromocaoPagamen
  IF p_cab_valorDescontoPagamento > 0 THEN
    SELECT COALESCE(SUM(promo.valorDesconto),0)
    INTO v_valorDescontoPromocaoPagamen
    FROM MOPREDOCUMXITENS a
    JOIN MOPREDOCUMXPROMOCOES promo
    ON promo.idItemPreDocumento = a.idItemPreDocumento
    WHERE a.preDocumento = p_cab_preDocumento
    AND a.cancelado = 0
    AND promo.cabecalhoItemPagamento ='P';
  END IF;

  -- v_rateioDescontofiltrarSemProm
  IF p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral OR p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen THEN
    SELECT
      CASE
        WHEN EXISTS(
          SELECT 1
          FROM MOPREDOCUMXITENS a
          JOIN PAMODELOSDOCUMENTO modDoc
          ON modDoc.modeloDocumento = a.modeloDocumento
          WHERE a.preDocumento = p_cab_preDocumento
          AND a.cancelado = 0
          AND COALESCE((
            SELECT SUM(b.valorDesconto)
            FROM MOPREDOCUMXPROMOCOES b
            WHERE b.idItemPreDocumento = a.idItemPreDocumento
            AND b.cabecalhoItemPagamento IN ('C','P')),0) > (
            CASE
              WHEN modDoc.diminuiDescontoPrUnit = 1
                OR modDoc.somaAcrescimosPrUnit  = 1
                OR modDoc.somaFreteSeguroPrUnit = 1
              THEN a.valorProdutoServicoBruto
              ELSE a.valorProdutoServico
            END
            - a.valorDescontoItem
            + a.valorAcrescimoItem))
        THEN 0
        WHEN COALESCE ((
          SELECT SUM (CASE WHEN modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem)
          FROM MOPREDOCUMXITENS a
          JOIN PAMODELOSDOCUMENTO modDoc
          ON modDoc.modeloDocumento = a.modeloDocumento
          JOIN MOPREDOCUMXPROMOCOES b
          ON b.idItemPreDocumento = a.idItemPreDocumento
          WHERE a.preDocumento = p_cab_preDocumento
          AND a.cancelado = 0),0) > (
            CASE
              WHEN p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral
              THEN p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral
              ELSE 0
            END +
            CASE
              WHEN p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen
              THEN p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen
              ELSE 0
            END)
          AND EXISTS (
            SELECT 1
            FROM MOPREDOCUMXITENS a
            WHERE a.preDocumento = p_cab_preDocumento
            AND a.cancelado = 0
            AND NOT (EXISTS(
              SELECT 1
              FROM MOPREDOCUMXPROMOCOES b
              WHERE b.idItemPreDocumento = a.idItemPreDocumento)))
        THEN 1
        ELSE 0
      END
    INTO v_rateioDescontofiltrarSemProm
    FROM DUAL;
  END IF;

  -- v_rateioDescontofiltrarAPrazo
  IF p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral OR p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen THEN
    SELECT
      CASE
        WHEN COALESCE ((
          SELECT SUM (CASE WHEN modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem)
          FROM MOPREDOCUMXITENS a
          JOIN PAMODELOSDOCUMENTO modDoc
          ON modDoc.modeloDocumento = a.modeloDocumento
          WHERE a.preDocumento = p_cab_preDocumento
          AND a.cancelado = 0
          AND a.precoSugestaoAPrazo <> a.precoSugestaoAVista
          AND a.usarPrecoAVista = 1
          AND (v_rateioDescontofiltrarSemProm = 0
            OR NOT(EXISTS(
              SELECT 1
              FROM MOPREDOCUMXPROMOCOES promo
              WHERE promo.idItemPreDocumento = a.idItemPreDocumento)))),0) > (
            CASE
              WHEN p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral
              THEN p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral
              ELSE 0
            END +
            CASE
              WHEN p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen
              THEN p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen
              ELSE 0
            END)
          AND EXISTS (
            SELECT 1
            FROM MOPREDOCUMXITENS a
            WHERE a.preDocumento = p_cab_preDocumento
            AND a.cancelado = 0
            AND (a.precoSugestaoAPrazo = a.precoSugestaoAVista
              OR a.usarPrecoAVista = 0)
            AND (v_rateioDescontofiltrarSemProm = 0
              OR NOT(EXISTS(
                SELECT 1
                FROM MOPREDOCUMXPROMOCOES promo
                WHERE promo.idItemPreDocumento = a.idItemPreDocumento))))
        THEN 1
        ELSE 0
      END
    INTO v_rateioDescontofiltrarAPrazo
    FROM DUAL;
  END IF;

  -- Bases Rateio
  SELECT
    MAX(COALESCE((CASE WHEN p_habilitaControleEntrega = 0 OR EXISTS(SELECT 1 FROM MOPREDOCUMXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemPreDocumento = a.idItemPreDocumento AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1) THEN 1 ELSE 0 END),0)),
    COALESCE(SUM(CASE WHEN modDoc.geraFinanceiro = 1 THEN CASE WHEN modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 THEN CASE WHEN modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN modDoc.geraFinanceiro = 1 AND (p_habilitaControleEntrega = 0 OR EXISTS(SELECT 1 FROM MOPREDOCUMXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemPreDocumento = a.idItemPreDocumento AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1)) THEN CASE WHEN modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico - a.valorDescontoItem + a.valorAcrescimoItem END ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 AND (p_habilitaControleEntrega = 0 OR EXISTS(SELECT 1 FROM MOPREDOCUMXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemPreDocumento = a.idItemPreDocumento AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1)) THEN CASE WHEN modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico - a.valorDescontoItem + a.valorAcrescimoItem END ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem),0),
    COALESCE(SUM(CASE WHEN p_habilitaControleEntrega = 0 OR EXISTS(SELECT 1 FROM MOPREDOCUMXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemPreDocumento = a.idItemPreDocumento AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1) THEN CASE WHEN modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico - a.valorDescontoItem + a.valorAcrescimoItem END ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 THEN CASE WHEN modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico - a.valorDescontoItem + a.valorAcrescimoItem END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 THEN CASE WHEN modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico - a.valorDescontoItem + a.valorAcrescimoItem END ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN (v_rateioDescontofiltrarAPrazo = 0 OR a.precoSugestaoAPrazo = a.precoSugestaoAVista OR a.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MOPREDOCUMXPROMOCOES promo WHERE promo.idItemPreDocumento = a.idItemPreDocumento))) THEN CASE WHEN modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 THEN CASE WHEN modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN (v_rateioDescontofiltrarAPrazo = 0 OR a.precoSugestaoAPrazo = a.precoSugestaoAVista OR a.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MOPREDOCUMXPROMOCOES promo WHERE promo.idItemPreDocumento = a.idItemPreDocumento))) THEN CASE WHEN modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 AND (v_rateioDescontofiltrarAPrazo = 0 OR a.precoSugestaoAPrazo = a.precoSugestaoAVista OR a.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MOPREDOCUMXPROMOCOES promo WHERE promo.idItemPreDocumento = a.idItemPreDocumento))) THEN CASE WHEN modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0)
  INTO
    v_rateioFretePorControleEntr,
    v_valorBaseFreteSemFinSemEntr,
    v_valorBaseFreteComFinSemEntr,
    v_valorBaseFreteSemFinComEntr,
    v_valorBaseFreteComFinComEntr,
    v_valorBaseRateio,
    v_valorBaseRateioComEntrega,
    v_valorBaseRateioFinanceiro,
    v_valorBaseRateioOutrasDespGer,
    v_valorBaseRateioOutrasDespFin,
    v_valorBaseRateioDescontoGeral,
    v_valorBaseRateioPagamento,
    v_valorBaseRateioPagamFinanc,
    v_valorBaseRateioPagamDesconto,
    v_valorBaseRateioPagamFinDesc
  FROM MOPREDOCUMXITENS a
  JOIN PAMODELOSDOCUMENTO modDoc
  ON modDoc.modeloDocumento = a.modeloDocumento
  WHERE a.preDocumento = p_cab_preDocumento
  AND a.cancelado = 0;

  -- Efetua rateio
  FOR a IN (
    SELECT
      a.idItemPreDocumento,
      a.modeloDocumento,
      a.geraFinanceiro,
      a.quantidade,
      a.quantidadeConvertida,
      a.usarPrecoAVista,
      a.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao,
      a.precoUnitario,
      a.precoUnitarioConvertido,
      a.valorProdutoServicoBruto,
      a.valorProdutoServico,
      a.valorDescontoItem,
      a.valorAcrescimoItem,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem,
      a.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.valorIPIDevolucao,
      a.retidoISSQN,
      a.valorISSQN,
      a.valorRetIRRF,
      a.valorRetINSS,
      a.valorRetPIS,
      a.valorRetCOFINS,
      a.valorRetCSLL,
      a.valorRetOutros,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMS,
      a.valorICMSST,
      a.valorLiquidoItem,
      a.valorDescontoCustoOpItem,
      a.valorDescontoCustoOpGeral,
      a.valorDescontoCustoOpTotal,
      a.valorAcrescimoCustoOpItem,
      a.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoCustoOpTotal,
      a.precoCustoOperacao,
      a.valorCustoOperacao,
      a.precoCMV,
      a.valorCMV,
      a.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo,
      a.valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem,
      a.valorAcrescimoExtempGeral,
      a.valorAcrescimoExtempTotal,
      modDoc.diminuiDescontoPrUnit,
      modDoc.somaAcrescimosPrUnit,
      modDoc.somaFreteSeguroPrUnit,
      modDoc.geraFinanceiro modDoc_geraFinanceiro,
      prod.tipoProduto,
      CASE WHEN p_habilitaControleEntrega = 0 OR EXISTS(
        SELECT 1
        FROM MOPREDOCUMXORCAMENTOITEM docXorc
        JOIN MOORCAMENTOXITENS itemOrc
        ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento
        JOIN PACONTROLESENTREGA contr
        ON contr.controleEntrega = itemOrc.controleEntrega
        WHERE docXorc.idItemPreDocumento = a.idItemPreDocumento
        AND contr.habilitaFrete = 1) THEN 1 ELSE 0 END rateioFrete,
      CASE WHEN a.precoSugestaoAPrazo <> a.precoSugestaoAVista AND a.usarPrecoAVista = 1 THEN 1 ELSE 0 END aVista,
      CASE WHEN EXISTS(
        SELECT 1
        FROM MOPREDOCUMXPROMOCOES promo
        WHERE promo.idItemPreDocumento = a.idItemPreDocumento) THEN 1 ELSE 0 END promocao,
      COALESCE((
        SELECT SUM(promo.valorDesconto)
        FROM MOPREDOCUMXPROMOCOES promo
        WHERE promo.idItemPreDocumento = a.idItemPreDocumento
        AND promo.cabecalhoItemPagamento ='C'),0) valorDescontoPromocaoGeral,
      COALESCE((
        SELECT SUM(promo.valorDesconto)
        FROM MOPREDOCUMXPROMOCOES promo
        WHERE promo.idItemPreDocumento = a.idItemPreDocumento
        AND promo.cabecalhoItemPagamento ='P'),0) valorDescontoPromocaoPagamento,
      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 PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = a.modeloDocumento
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE a.preDocumento = p_cab_preDocumento
    AND a.cancelado = 0
    ORDER BY a.sequencia)
  LOOP
    v_idItemPreDocUltimoItem       := a.idItemPreDocumento;
    v_precoUnitario                := a.precoUnitario;
    v_precoUnitarioConvertido      := a.precoUnitarioConvertido;
    v_valorProdutoServico          := a.valorProdutoServico;
    v_valorDescontoGeral           := v_residuoDescontoGeral;
    v_valorFreteGeral              := v_residuoFreteGeral;
    v_valorSeguroGeral             := v_residuoSeguroGeral;
    v_valorAdicFreteMarinMerGeral  := v_residuoAdicFreteMarinGeral;
    v_valorDespesasAduaneirasGeral := v_residuoDespesasAduanGeral;
    v_valorOutrasDespesasGeral     := v_residuoOutrasDespesasGeral;
    v_valorBasePagamento           := a.valorBasePagamento;
    v_valorDescontoPagamento       := v_residuoDescontoPagamento;
    v_valorOutrasDespesasPagamento := v_residuoOutrasDespPagamento;
    v_valorJurosPagamento          := v_residuoJurosPagamento;
    v_valorDescontoCustoOpGeral    := v_residuoDescCustoOpGeral;
    v_valorAcrescimoCustoOpGeral   := v_residuoAcrescCustoOpGeral;
    v_valorAcrescimoExtempGeral    := v_residuoAcrescExtempGeral;
    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_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;

    -- v_valorDescontoGeral
    IF v_valorBaseRateioDescontoGeral > 0
      AND (v_rateioDescontofiltrarAPrazo = 0
        OR a.aVista = 0)
      AND (v_rateioDescontofiltrarSemProm = 0
        OR a.promocao = 0
        AND p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral > 0)
    THEN
      v_valorDescontoGeral := v_valorDescontoGeral + (p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral) * (CASE WHEN a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico - a.valorDescontoItem + a.valorAcrescimoItem END) / v_valorBaseRateioDescontoGeral;
    END IF;
    IF p_cab_valorDescontoGeral           > 0
      AND v_valorDescontoPromocaoGeral    > 0
      AND a.valorDescontoPromocaoGeral > 0
    THEN
      IF p_cab_valorDescontoGeral < v_valorDescontoPromocaoGeral THEN
        v_valorDescontoGeral := v_valorDescontoGeral + a.valorDescontoPromocaoGeral * p_cab_valorDescontoGeral / v_valorDescontoPromocaoGeral;
      ELSE
        v_valorDescontoGeral := v_valorDescontoGeral + a.valorDescontoPromocaoGeral;
      END IF;
    END IF;
    IF ROUND (v_valorDescontoGeral,2) >= v_saldoRatDescontoGeral THEN
      v_valorDescontoGeral   := v_saldoRatDescontoGeral;
      v_residuoDescontoGeral := 0;
    ELSE
      v_residuoDescontoGeral := v_valorDescontoGeral - ROUND (v_valorDescontoGeral,2);
      v_valorDescontoGeral   := ROUND (v_valorDescontoGeral,2);
    END IF;
    v_saldoRatDescontoGeral := v_saldoRatDescontoGeral - v_valorDescontoGeral;

    -- v_valorFreteGeral
    -- v_valorSeguroGeral
    IF v_valorBaseFreteComFinComEntr > 0 AND v_rateioFretePorControleEntr = 1 AND a.rateioFrete = 1 AND a.geraFinanceiro = 1 THEN
      v_idItemPreDocRateioFrete := a.idItemPreDocumento;
      v_valorFreteGeral  := v_valorFreteGeral  + p_cab_valorFreteGeral  * (CASE WHEN a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseFreteComFinComEntr;
      v_valorSeguroGeral := v_valorSeguroGeral + p_cab_valorSeguroGeral * (CASE WHEN a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseFreteComFinComEntr;
    ELSIF v_valorBaseFreteSemFinComEntr > 0 AND v_valorBaseFreteComFinComEntr <= 0 AND v_rateioFretePorControleEntr = 1 AND a.rateioFrete = 1 AND a.modDoc_geraFinanceiro = 1 THEN
      v_idItemPreDocRateioFrete := a.idItemPreDocumento;
      v_valorFreteGeral  := v_valorFreteGeral  + p_cab_valorFreteGeral  * (CASE WHEN a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseFreteSemFinComEntr;
      v_valorSeguroGeral := v_valorSeguroGeral + p_cab_valorSeguroGeral * (CASE WHEN a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseFreteSemFinComEntr;
    ELSIF v_valorBaseRateioComEntrega > 0 AND v_valorBaseFreteSemFinComEntr <= 0 AND v_valorBaseFreteComFinComEntr <= 0 AND v_rateioFretePorControleEntr = 1 AND a.rateioFrete = 1 THEN
      v_idItemPreDocRateioFrete := a.idItemPreDocumento;
      v_valorFreteGeral  := v_valorFreteGeral  + p_cab_valorFreteGeral  * (CASE WHEN a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioComEntrega;
      v_valorSeguroGeral := v_valorSeguroGeral + p_cab_valorSeguroGeral * (CASE WHEN a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioComEntrega;
    ELSIF v_valorBaseFreteComFinSemEntr > 0 AND v_rateioFretePorControleEntr = 0 AND a.geraFinanceiro = 1 THEN
      v_idItemPreDocRateioFrete := a.idItemPreDocumento;
      v_valorFreteGeral  := v_valorFreteGeral  + p_cab_valorFreteGeral  * (CASE WHEN a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseFreteComFinSemEntr;
      v_valorSeguroGeral := v_valorSeguroGeral + p_cab_valorSeguroGeral * (CASE WHEN a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseFreteComFinSemEntr;
    ELSIF v_valorBaseFreteSemFinSemEntr > 0 AND v_valorBaseFreteComFinSemEntr <= 0 AND v_rateioFretePorControleEntr = 0 AND a.modDoc_geraFinanceiro = 1 THEN
      v_idItemPreDocRateioFrete := a.idItemPreDocumento;
      v_valorFreteGeral  := v_valorFreteGeral  + p_cab_valorFreteGeral  * (CASE WHEN a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseFreteSemFinSemEntr;
      v_valorSeguroGeral := v_valorSeguroGeral + p_cab_valorSeguroGeral * (CASE WHEN a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseFreteSemFinSemEntr;
    ELSIF v_valorBaseRateio > 0 AND (v_valorBaseRateioComEntrega <= 0 AND v_valorBaseFreteSemFinComEntr <= 0 AND v_valorBaseFreteComFinComEntr <= 0 AND v_rateioFretePorControleEntr = 1 OR v_valorBaseFreteSemFinSemEntr <= 0 AND v_valorBaseFreteComFinSemEntr <= 0 AND v_rateioFretePorControleEntr = 0) THEN
      v_idItemPreDocRateioFrete := a.idItemPreDocumento;
      v_valorFreteGeral  := v_valorFreteGeral  + p_cab_valorFreteGeral  * (CASE WHEN a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateio;
      v_valorSeguroGeral := v_valorSeguroGeral + p_cab_valorSeguroGeral * (CASE WHEN a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateio;
    END IF;
    IF ROUND (v_valorFreteGeral,2) >= v_saldoRatFreteGeral THEN
      v_valorFreteGeral := v_saldoRatFreteGeral;
      v_residuoFreteGeral := 0;
    ELSE
      v_residuoFreteGeral := v_valorFreteGeral - ROUND (v_valorFreteGeral,2);
      v_valorFreteGeral := ROUND (v_valorFreteGeral,2);
    END IF;
    v_saldoRatFreteGeral := v_saldoRatFreteGeral - v_valorFreteGeral;
    IF ROUND (v_valorSeguroGeral,2) >= v_saldoRatSeguroGeral THEN
      v_valorSeguroGeral   := v_saldoRatSeguroGeral;
      v_residuoSeguroGeral := 0;
    ELSE
      v_residuoSeguroGeral := v_valorSeguroGeral  - ROUND (v_valorSeguroGeral,2);
      v_valorSeguroGeral   := ROUND (v_valorSeguroGeral,2);
    END IF;
    v_saldoRatSeguroGeral := v_saldoRatSeguroGeral - v_valorSeguroGeral;

    -- v_valorAdicFreteMarinMerGeral
    -- v_valorDespesasAduaneirasGeral
    -- v_valorDescontoCustoOpGeral
    -- v_valorAcrescimoCustoOpGeral
    -- v_valorAcrescimoExtempGeral
    IF v_valorBaseRateioFinanceiro > 0 AND a.geraFinanceiro = 1 THEN 
      v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral  + p_cab_valorAdicFreteMarinGeral * (CASE WHEN a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
      v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + p_cab_valorDespesasAduanGeral  * (CASE WHEN a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
      v_valorDescontoCustoOpGeral    := v_valorDescontoCustoOpGeral    + p_cab_valorDescCustoOpGeral    * (CASE WHEN a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
      v_valorAcrescimoCustoOpGeral   := v_valorAcrescimoCustoOpGeral   + p_cab_valorAcrescCustoOpGeral  * (CASE WHEN a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
      v_valorAcrescimoExtempGeral    := v_valorAcrescimoExtempGeral    + p_cab_valorAcrescExtempGeral   * (CASE WHEN a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
    ELSIF v_valorBaseRateio > 0 AND v_valorBaseRateioFinanceiro <= 0 THEN
      v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral  + p_cab_valorAdicFreteMarinGeral * (CASE WHEN a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateio;
      v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + p_cab_valorDespesasAduanGeral  * (CASE WHEN a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateio;
      v_valorDescontoCustoOpGeral    := v_valorDescontoCustoOpGeral    + p_cab_valorDescCustoOpGeral    * (CASE WHEN a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateio;
      v_valorAcrescimoCustoOpGeral   := v_valorAcrescimoCustoOpGeral   + p_cab_valorAcrescCustoOpGeral  * (CASE WHEN a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateio;
      v_valorAcrescimoExtempGeral    := v_valorAcrescimoExtempGeral    + p_cab_valorAcrescExtempGeral   * (CASE WHEN a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateio;
    END IF;
    IF ROUND (v_valorAdicFreteMarinMerGeral,2) >= v_saldoRatAdicFreteMarinGeral THEN
      v_valorAdicFreteMarinMerGeral := v_saldoRatAdicFreteMarinGeral;
      v_residuoAdicFreteMarinGeral  := 0;
    ELSE
      v_residuoAdicFreteMarinGeral  := v_valorAdicFreteMarinMerGeral - ROUND (v_valorAdicFreteMarinMerGeral,2);
      v_valorAdicFreteMarinMerGeral := ROUND (v_valorAdicFreteMarinMerGeral,2);
    END IF;
    v_saldoRatAdicFreteMarinGeral := v_saldoRatAdicFreteMarinGeral - v_valorAdicFreteMarinMerGeral;
    IF ROUND (v_valorDespesasAduaneirasGeral,2) >= v_saldoRatDespesasAduanGeral THEN
      v_valorDespesasAduaneirasGeral := v_saldoRatDespesasAduanGeral;
      v_residuoDespesasAduanGeral    := 0;
    ELSE
      v_residuoDespesasAduanGeral    := v_valorDespesasAduaneirasGeral - ROUND (v_valorDespesasAduaneirasGeral,2);
      v_valorDespesasAduaneirasGeral := ROUND (v_valorDespesasAduaneirasGeral,2);
    END IF;
    v_saldoRatDespesasAduanGeral := v_saldoRatDespesasAduanGeral - v_valorDespesasAduaneirasGeral;
    IF ROUND (v_valorDescontoCustoOpGeral,2) >= v_saldoRatDescCustoOpGeral THEN
      v_valorDescontoCustoOpGeral := v_saldoRatDescCustoOpGeral;
      v_residuoDescCustoOpGeral   := 0;
    ELSE
      v_residuoDescCustoOpGeral   := v_valorDescontoCustoOpGeral - ROUND (v_valorDescontoCustoOpGeral,2);
      v_valorDescontoCustoOpGeral := ROUND (v_valorDescontoCustoOpGeral,2);
    END IF;
    v_saldoRatDescCustoOpGeral := v_saldoRatDescCustoOpGeral - v_valorDescontoCustoOpGeral;
    IF ROUND (v_valorAcrescimoCustoOpGeral,2) >= v_saldoRatAcrescCustoOpGeral THEN
      v_valorAcrescimoCustoOpGeral := v_saldoRatAcrescCustoOpGeral;
      v_residuoAcrescCustoOpGeral  := 0;
    ELSE
      v_residuoAcrescCustoOpGeral  := v_valorAcrescimoCustoOpGeral - ROUND (v_valorAcrescimoCustoOpGeral,2);
      v_valorAcrescimoCustoOpGeral := ROUND (v_valorAcrescimoCustoOpGeral,2);
    END IF;
    v_saldoRatAcrescCustoOpGeral := v_saldoRatAcrescCustoOpGeral - v_valorAcrescimoCustoOpGeral;
    IF ROUND (v_valorAcrescimoExtempGeral,2) >= v_saldoRatAcrescExtempGeral THEN
      v_valorAcrescimoExtempGeral := v_saldoRatAcrescExtempGeral;
      v_residuoAcrescExtempGeral  := 0;
    ELSE
      v_residuoAcrescExtempGeral  := v_valorAcrescimoExtempGeral - ROUND (v_valorAcrescimoExtempGeral,2);
      v_valorAcrescimoExtempGeral := ROUND (v_valorAcrescimoExtempGeral,2);
    END IF;
    v_saldoRatAcrescExtempGeral := v_saldoRatAcrescExtempGeral - v_valorAcrescimoExtempGeral;

    -- v_valorOutrasDespesasGeral
    IF v_valorBaseRateioOutrasDespFin > 0 AND a.geraFinanceiro = 1 THEN
      v_valorOutrasDespesasGeral := v_valorOutrasDespesasGeral + p_cab_valorOutrasDespesasGeral * (CASE WHEN a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico - a.valorDescontoItem + a.valorAcrescimoItem END) / v_valorBaseRateioOutrasDespFin;
    ELSIF v_valorBaseRateioOutrasDespGer > 0 AND v_valorBaseRateioOutrasDespFin <= 0 THEN
      v_valorOutrasDespesasGeral := v_valorOutrasDespesasGeral + p_cab_valorOutrasDespesasGeral * (CASE WHEN a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico - a.valorDescontoItem + a.valorAcrescimoItem END) / v_valorBaseRateioOutrasDespGer;
    END IF;
    IF ROUND (v_valorOutrasDespesasGeral,2) >= v_saldoRatOutrasDespesasGeral THEN
      v_valorOutrasDespesasGeral   := v_saldoRatOutrasDespesasGeral;
      v_residuoOutrasDespesasGeral := 0;
    ELSE
      v_residuoOutrasDespesasGeral := v_valorOutrasDespesasGeral - ROUND (v_valorOutrasDespesasGeral,2);
      v_valorOutrasDespesasGeral   := ROUND (v_valorOutrasDespesasGeral,2);
    END IF;
    v_saldoRatOutrasDespesasGeral := v_saldoRatOutrasDespesasGeral - v_valorOutrasDespesasGeral;

    -- v_valorDescontoPagamento
    IF p_cab_valorDescontoPagamento       > 0
      AND v_valorBaseRateioPagamFinDesc   > 0
      AND a.geraFinanceiro = 1
      AND (v_rateioDescontofiltrarAPrazo  = 0
        OR a.aVista = 0)
      AND (v_rateioDescontofiltrarSemProm = 0
        OR a.promocao = 0
        AND p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen > 0)
    THEN
      v_valorDescontoPagamento := v_valorDescontoPagamento + (p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen) * (CASE WHEN a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioPagamFinDesc;
    ELSIF p_cab_valorDescontoPagamento    > 0
      AND v_valorBaseRateioPagamDesconto  > 0
      AND v_valorBaseRateioPagamFinDesc  <= 0
      AND (v_rateioDescontofiltrarAPrazo  = 0
        OR a.aVista = 0)
      AND (v_rateioDescontofiltrarSemProm = 0
        OR a.promocao = 0
        AND p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen > 0)
    THEN
      v_valorDescontoPagamento := v_valorDescontoPagamento + (p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen) * (CASE WHEN a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioPagamDesconto;
    END IF;
    IF p_cab_valorDescontoPagamento           > 0
      AND v_valorDescontoPromocaoPagamen      > 0
      AND a.valorDescontoPromocaoPagamento > 0
    THEN
      IF p_cab_valorDescontoPagamento < v_valorDescontoPromocaoPagamen THEN
        v_valorDescontoPagamento := v_valorDescontoPagamento + a.valorDescontoPromocaoPagamento * p_cab_valorDescontoPagamento / v_valorDescontoPromocaoPagamen;
      ELSE
        v_valorDescontoPagamento := v_valorDescontoPagamento + a.valorDescontoPromocaoPagamento;
      END IF;
    END IF;
    IF ROUND (v_valorDescontoPagamento,2) >= v_saldoRatDescontoPagamento THEN
      v_valorDescontoPagamento   := v_saldoRatDescontoPagamento;
      v_residuoDescontoPagamento := 0;
    ELSE
      v_residuoDescontoPagamento := v_valorDescontoPagamento - ROUND (v_valorDescontoPagamento,2);
      v_valorDescontoPagamento   := ROUND (v_valorDescontoPagamento,2);
    END IF;
    v_saldoRatDescontoPagamento  := v_saldoRatDescontoPagamento - v_valorDescontoPagamento;

    -- v_valorOutrasDespesasPagamento
    -- v_valorJurosPagamento
    IF v_valorBaseRateioPagamFinanc > 0 AND a.geraFinanceiro = 1 THEN
      v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + p_cab_valorOutrasDespPagamento * (CASE WHEN a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioPagamFinanc;
      v_valorJurosPagamento          := v_valorJurosPagamento          + p_cab_valorJurosPagamento      * (CASE WHEN a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioPagamFinanc;
    ELSIF v_valorBaseRateioPagamento > 0 AND v_valorBaseRateioPagamFinanc <= 0 THEN
      v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + p_cab_valorOutrasDespPagamento * (CASE WHEN a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioPagamento;
      v_valorJurosPagamento          := v_valorJurosPagamento          + p_cab_valorJurosPagamento      * (CASE WHEN a.diminuiDescontoPrUnit = 1 OR a.somaAcrescimosPrUnit = 1 or a.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem) / v_valorBaseRateioPagamento;
    END IF;
    IF ROUND (v_valorOutrasDespesasPagamento,2) >= v_saldoRatOutrasDespPagamento THEN
      v_valorOutrasDespesasPagamento := v_saldoRatOutrasDespPagamento;
      v_residuoOutrasDespPagamento   := 0;
    ELSE
      v_residuoOutrasDespPagamento   := v_valorOutrasDespesasPagamento - ROUND (v_valorOutrasDespesasPagamento,2);
      v_valorOutrasDespesasPagamento := ROUND (v_valorOutrasDespesasPagamento,2);
    END IF;
    v_saldoRatOutrasDespPagamento := v_saldoRatOutrasDespPagamento - v_valorOutrasDespesasPagamento;
    IF ROUND (v_valorJurosPagamento,2) >= v_saldoRatJurosPagamento THEN
      v_valorJurosPagamento   := v_saldoRatJurosPagamento;
      v_residuoJurosPagamento := 0;
    ELSE
      v_residuoJurosPagamento := v_valorJurosPagamento - ROUND (v_valorJurosPagamento,2);
      v_valorJurosPagamento   := ROUND (v_valorJurosPagamento,2);
    END IF;
    v_saldoRatJurosPagamento := v_saldoRatJurosPagamento - v_valorJurosPagamento;

    -- Recalcula Valores
    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,
      v_valorFreteGeral,
      v_valorSeguroGeral,
      v_valorDescontoGeral,
      v_valorOutrasDespesasGeral,
      v_valorAdicFreteMarinMerGeral,
      v_valorDespesasAduaneirasGeral,
      v_valorDescontoPagamento,
      v_valorOutrasDespesasPagamento,
      v_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,
      v_valorAcrescimoExtempGeral);
    IF p_cab_impostosEditados = 0 
        OR v_valorProdutoServico <> a.valorProdutoServico
        OR CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE v_valorFreteTotal END
        <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE p_cab_tipoPagamentoFrete END = 'V' THEN 0 ELSE a.valorFreteTotal END
        OR CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE v_valorSeguroTotal END
        <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE p_cab_tipoPagamentoFrete END = 'V' THEN 0 ELSE a.valorSeguroTotal END
        OR v_valorDescontoTotal <> a.valorDescontoTotal
        OR v_valorOutrasDespesasTotal <> a.valorOutrasDespesasTotal
        OR v_valorAdicFreteMarinMerTotal <> a.valorAdicFreteMarinhaMerTotal
        OR v_valorDespesasAduaneirasTotal <> a.valorDespesasAduaneirasTotal
        OR v_precoUnitario <> a.precoUnitario
        OR v_valorProdutoServico <> a.valorProdutoServico
    THEN
      r_calcularImpostosItem := 1;
    END IF;
    v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
      p_cab_origemDocumento,
      0, -- p_cab_nfFornecedor
      p_cab_tipoPagamentoFrete,
      a.geraFinanceiro,
      v_valorProdutoServico,
      v_valorDescontoPagamento,
      v_valorOutrasDespesasPagamento,
      v_valorJurosPagamento,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      a.valorIPIDevolucao,
      a.retidoISSQN,
      a.valorISSQN,
      a.valorRetIRRF,
      a.valorRetINSS,
      a.valorRetPIS,
      a.valorRetCOFINS,
      a.valorRetCSLL,
      a.valorRetOutros,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.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,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorICMSST,
      0, -- p_item_valorICMSSTEscrit
      0 -- p_item_somarICMSST
      );
    ADD_CALCULA_CUSTO_CMV (
      p_cab_atualizaCustoMedio,
      p_cab_estabelecimento,
      0,
      a.modeloDocumento,
      a.quantidade,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorIPIDevolucao,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMS,
      a.valorICMSST,
      0,
      v_valorLiquidoItem,
      a.valorDescontoCustoOpItem,
      v_valorDescontoCustoOpGeral,
      a.valorAcrescimoCustoOpItem,
      v_valorAcrescimoCustoOpGeral,
      v_valorAcrescimoExtempTotal,
      /* Retornos */
      v_valorDescontoCustoOpTotal,
      v_valorAcrescimoCustoOpTotal,
      v_precoCustoOperacao,
      v_valorCustoOperacao,
      v_precoCMV,
      v_valorCMV);

    -- Atualiza Item
    UPDATE MOPREDOCUMXITENS SET
      precoUnitario                 = v_precoUnitario,
      precoUnitarioConvertido       = v_precoUnitarioConvertido,
      valorProdutoServico           = v_valorProdutoServico,
      valorFreteGeral               = v_valorFreteGeral,
      valorSeguroGeral              = v_valorSeguroGeral,
      valorDescontoGeral            = v_valorDescontoGeral,
      valorOutrasDespesasGeral      = v_valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral = v_valorAdicFreteMarinMerGeral,
      valorDespesasAduaneirasGeral  = v_valorDespesasAduaneirasGeral,
      valorBasePagamento            = v_valorBasePagamento,
      valorDescontoPagamento        = v_valorDescontoPagamento,
      valorOutrasDespesasPagamento  = v_valorOutrasDespesasPagamento,
      valorJurosPagamento           = v_valorJurosPagamento,
      valorFreteTotal               = v_valorFreteTotal,
      valorSeguroTotal              = v_valorSeguroTotal,
      valorDescontoTotal            = v_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
      valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
      valorLiquidoItem              = v_valorLiquidoItem,
      valorDescontoCustoOpGeral     = v_valorDescontoCustoOpGeral,
      valorDescontoCustoOpTotal     = v_valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpGeral    = v_valorAcrescimoCustoOpGeral,
      valorAcrescimoCustoOpTotal    = v_valorAcrescimoCustoOpTotal,
      precoCustoOperacao            = v_precoCustoOperacao,
      valorCustoOperacao            = v_valorCustoOperacao,
      precoCMV                      = v_precoCMV,
      valorCMV                      = v_valorCMV,
      valorAcrescimoExtempSubtotal  = v_valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempGeral     = v_valorAcrescimoExtempGeral,
      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 + v_valorDescontoPagamento - v_valorOutrasDespesasPagamento - v_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;
  IF v_idItemPreDocUltimoItem <> 0 AND (v_saldoRatDescontoGeral <> 0 OR v_saldoRatOutrasDespesasGeral <> 0 OR v_saldoRatDescontoPagamento <> 0 OR v_saldoRatOutrasDespPagamento <> 0 OR v_saldoRatJurosPagamento <> 0 OR v_saldoRatFreteGeral <> 0 OR v_saldoRatSeguroGeral <> 0 OR v_saldoRatAdicFreteMarinGeral <> 0 OR v_saldoRatDespesasAduanGeral <> 0) THEN
    ADD_PRE_DOC_CALC_IMP_RESIDUO (
      p_troca_tipoPagamentoFrete,
      p_a_cab_tipoPagamentoFrete,
      p_cab_origemDocumento,
      p_cab_atualizaCustoMedio,
      p_cab_estabelecimento,
      p_cab_tipoPagamentoFrete,
      r_cab_valorProdutos,
      r_cab_valorServicos,
      r_cab_valorBasePagamento,
      r_cab_valorAVistaMinimo,
      r_cab_valorFreteTotal,
      r_cab_valorSeguroTotal,
      r_cab_valorDescontoTotal,
      r_cab_valorOutrasDespesasTotal,
      r_cab_valorAdicFreteMarinTotal,
      r_cab_valorDespesasAduanTotal,
      p_cab_impostosEditados,
      r_cab_valorLiquidoItem,
      r_cab_valorDescCustoOpTotal,
      r_cab_valorAcrescCustoOpTotal,
      r_cab_valorCustoOperacao,
      r_cab_valorCMV,
      r_cab_valorAcrescExtempTotal,
      CASE WHEN v_idItemPreDocRateioFrete = 0 THEN v_idItemPreDocUltimoItem ELSE v_idItemPreDocRateioFrete END,
      v_saldoRatFreteGeral,
      v_saldoRatSeguroGeral,
      v_saldoRatDescontoGeral,
      v_saldoRatOutrasDespesasGeral,
      v_saldoRatAdicFreteMarinGeral,
      v_saldoRatDespesasAduanGeral,
      v_saldoRatDescontoPagamento,
      v_saldoRatOutrasDespPagamento,
      v_saldoRatJurosPagamento,
      v_saldoRatDescCustoOpGeral,
      v_saldoRatAcrescCustoOpGeral,
      v_saldoRatAcrescExtempGeral,
      r_calcularImpostosItem,
      /* Retornos */
      r_cab_valorProdutos,
      r_cab_valorServicos,
      r_cab_valorBasePagamento,
      r_cab_valorAVistaMinimo,
      r_cab_valorFreteTotal,
      r_cab_valorSeguroTotal,
      r_cab_valorDescontoTotal,
      r_cab_valorOutrasDespesasTotal,
      r_cab_valorAdicFreteMarinTotal,
      r_cab_valorDespesasAduanTotal,
      r_cab_valorLiquidoItem,
      r_cab_valorDescCustoOpTotal,
      r_cab_valorAcrescCustoOpTotal,
      r_cab_valorCustoOperacao,
      r_cab_valorCMV,
      r_cab_valorAcrescExtempTotal,
      r_calcularImpostosItem);
  END IF;
END ADD_PRE_DOC_CALC_IMP_RATEIO;

/

