BEGIN

  v_item_valorDescontoGeral      := p_item_valorDescontoGeral;
  v_item_valorOutrasDespGeral    := p_item_valorOutrasDespGeral;

  SELECT
    cab.origemDocumento,
    cab.tipoDocumento,
    cab.modeloDocumento,
    cab.entradaSaida,
    cab.atualizaCustoMedio,
    cab.estabelecimento,
    cab.dataEmissao,
    cab.dataPreco,
    cab.pessoa,
    cab.dataEntrega,
    cab.municipioFatoGerador,
    cab.localDestinoOperacao,
    cab.indicadorConsumidorFinal,
    cab.modalidadeFrete,
    cab.tipoPagamentoFrete,
    cab.ultimoVendedorItem,
    cab.quantidade,
    cab.pesoLiquido,
    cab.pesoBruto,
    cab.valorProdutosBruto,
    cab.valorProdutos,
    cab.valorDescontoProdutos,
    cab.valorAcrescimoProdutos,
    cab.valorServicosBruto,
    cab.valorServicos,
    cab.valorDescontoServicos,
    cab.valorAcrescimoServicos,
    cab.valorFreteItem,
    cab.valorSeguroItem,
    cab.valorAdicFreteMarinhaMerItem,
    cab.valorDespesasAduaneirasItem,
    cab.valorFreteGeral,
    cab.valorSeguroGeral,
    cab.valorDescontoGeral,
    cab.valorOutrasDespesasGeral,
    cab.valorAdicFreteMarinhaMerGeral,
    cab.valorDespesasAduaneirasGeral,
    cab.condicaoPagamento,
    cab.numeroParcelas,
    cab.somaPrazoParcelas,
    cab.valorXPrazoParcelas,
    cab.prazoMedio,
    cab.prazoMedioPonderado,
    cab.valorBasePagamento,
    cab.valorAVistaMinimo,
    cab.valorEntradaMinima,
    cab.valorAVistaEntrada,
    cab.valorPagamentoBruto,
    cab.valorDescontoPagamento,
    cab.valorOutrasDespesasPagamento,
    cab.valorJurosPagamento,
    cab.valorPagamentoLiquido,
    cab.valorTroco,
    cab.valorFreteTotal,
    cab.valorSeguroTotal,
    cab.valorDescontoTotal,
    cab.valorOutrasDespesasTotal,
    cab.valorAdicFreteMarinhaMerTotal,
    cab.valorDespesasAduaneirasTotal,
    cab.valorImpostosSomaPagamento,
    cab.valorImpostosDiminuiPagamento,
    cab.valorLiquidoItem,
    modDoc.capituloNaturezaFiscal,
    modDoc.habilitaAmbiente,
    modDoc.tipoPreco,
    modDoc.tabelaPreco,
    modDoc.fatorMultiplicadorPreco,
    modDoc.tipoPrecoB,
    modDoc.tabelaPrecoB,
    modDoc.fatorMultiplicadorPrecoB,
    modDoc.diminuiDescontoPrUnit,
    modDoc.somaAcrescimosPrUnit,
    modDoc.somaFreteSeguroPrUnit,
    est.grupoFiscal,
    COALESCE (pessEst.regimeTributario, ' '),
    COALESCE ((SELECT MIN(munEst.uf) FROM CAENDERECOSPESSOA endEst JOIN SIMUNICIPIOS munEst ON munEst.municipio = endEst.municipio WHERE endEst.pessoa = est.pessoaEstabelecimento AND endEst.ativo = 1 AND endEst.principal = 1), '  '),
    pess.indicadorInscricaoEstadual,
    COALESCE ((SELECT MIN(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), '  '),
    etOrc.situacaoOrcamento
  INTO
    v_cab_origemDocumento,
    v_cab_tipoDocumento,
    v_cab_modeloDocumento,
    v_cab_entradaSaida,
    v_cab_atualizaCustoMedio,
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_dataPreco,
    v_cab_pessoa,
    v_cab_dataEntrega,
    v_cab_municipioFatoGerador,
    v_cab_localDestinoOperacao,
    v_cab_indicadorConsumidorFinal,
    r_cab_modalidadeFrete,
    v_cab_tipoPagamentoFrete,
    r_cab_ultimoVendedorItem,
    r_cab_quantidade,
    r_cab_pesoLiquido,
    r_cab_pesoBruto,
    r_cab_valorProdutosBruto,
    r_cab_valorProdutos,
    r_cab_valorDescontoProdutos,
    r_cab_valorAcrescimoProdutos,
    r_cab_valorServicosBruto,
    r_cab_valorServicos,
    r_cab_valorDescontoServicos,
    r_cab_valorAcrescimoServicos,
    r_cab_valorFreteItem,
    r_cab_valorSeguroItem,
    r_cab_valorAdicFreteMarItem,
    r_cab_valorDespesasAduanItem,
    r_cab_valorFreteGeral,
    r_cab_valorSeguroGeral,
    r_cab_valorDescontoGeral,
    r_cab_valorOutrasDespGeral,
    r_cab_valorAdicFreteMarGeral,
    r_cab_valorDespesasAduanGeral,
    v_cab_condicaoPagamento,
    v_cab_numeroParcelas,
    v_cab_somaPrazoParcelas,
    v_cab_valorXPrazoParcelas,
    v_cab_prazoMedio,
    v_cab_prazoMedioPonderado,
    r_cab_valorBasePagamento,
    r_cab_valorAVistaMinimo,
    v_cab_valorEntradaMinima,
    v_cab_valorAVistaEntrada,
    r_cab_valorPagamentoBruto,
    v_cab_valorDescontoPagamento,
    v_cab_valorOutrasDespPag,
    v_cab_valorJurosPagamento,
    r_cab_valorPagamentoLiquido,
    r_cab_valorTroco,
    r_cab_valorFreteTotal,
    r_cab_valorSeguroTotal,
    v_cab_valorDescontoTotal,
    v_cab_valorOutrasDespTotal,
    r_cab_valorAdicFreteMarTotal,
    r_cab_valorDespesasAduanTotal,
    r_cab_valorImpostosSomaPag,
    r_cab_valorImpostosDiminuiPag,
    r_cab_valorLiquidoItem,
    v_modDoc_capituloNatFiscal,
    v_modDoc_habilitaAmbiente,
    v_modDoc_tipoPreco,
    v_modDoc_tabelaPreco,
    v_modDoc_fatorMultipPreco,
    v_modDoc_tipoPrecoB,
    v_modDoc_tabelaPrecoB,
    v_modDoc_fatorMultipPrecoB,
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit,
    v_est_grupoFiscal,
    v_pessEst_regimeTributario,
    v_munEndEst_uf,
    v_pess_indicadorInscricaoEstad,
    v_munEndPess_uf,
    v_etOrc_situacaoOrcamento
  FROM MOORCAMENTOS cab
  JOIN PAMODELOSDOCUMENTO modDoc ON modDoc.modeloDocumento = cab.modeloDocumento
  JOIN PAESTABELECIMENTOS est ON est.estabelecimento = cab.estabelecimento
  JOIN CAPESSOAS pessEst ON pessEst.pessoa = est.pessoaEstabelecimento
  JOIN CAPESSOAS pess ON pess.pessoa = cab.pessoa
  JOIN PAETAPASORCAMENTO etOrc ON etOrc.etapaOrcamento = cab.etapaOrcamento
  WHERE cab.orcamento = p_cab_orcamento;
  SELECT
    prod.controleEstoque,
    prod.origemMercadoria,
    prod.idNcm,
    prod.listaServicos
  INTO
    v_prod_controleEstoque,
    v_prod_origemMercadoria,
    v_prod_idNcm,
    v_prod_listaServicos
  FROM CAGRADESPRODUTO gradProd
  JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
  WHERE gradProd.gradeProduto = p_item_gradeProduto;
  SELECT
    ativServ.validoPrevisto,
    ativServ.habilitaAtividadePrevista
  INTO
    v_ativServ_validoPrevisto,
    v_ativServ_habilitaAtivPrev
  FROM PAATIVIDADESSERVICO ativServ
  WHERE ativServ.atividadeServico = p_item_atividadeServico;
  SELECT
    opFisc.cfop,
    opFisc.indicadorISSQN,
    opFisc.aliquotaISSQN,
    opFisc.aliquotaIRRF,
    opFisc.aliquotaINSS,
    opFisc.retencaoPIS,
    opFisc.retencaoCOFINS,
    opFisc.retencaoCSLL,
    opFisc.aliquotaII,
    opFisc.aliquotaIOF,
    opFisc.codigoEnquadramentoIPI,
    opFisc.stIPI,
    opFisc.aliquotaIPI,
    opFisc.valorAliquotaIPI,
    opFisc.stPIS,
    opFisc.aliquotaPIS,
    opFisc.valorAliquotaPIS,
    opFisc.aliquotaPISST,
    opFisc.valorAliquotaPISST,
    opFisc.stCOFINS,
    opFisc.aliquotaCOFINS,
    opFisc.valorAliquotaCOFINS,
    opFisc.aliquotaCOFINSST,
    opFisc.valorAliquotaCOFINSST,
    opFisc.stSimplesNacional,
    opFisc.creditoSimplesNacional,
    opFisc.stICMS,
    opFisc.modalidadeBaseCalcICMS,
    opFisc.reducaoBaseICMS,
    opFisc.aliquotaICMS,
    opFisc.diferimentoICMS,
    opFisc.motivoDesoneracaoICMS,
    opFisc.modalidadeBaseCalcICMSST,
    opFisc.margemValorAdicionadoST,
    opFisc.reducaoBaseST,
    opFisc.aliquotaICMSST,
    opFisc.aliquotaSTSuportConsFinal,
    opFisc.reducaoBaseICMSEfetivo,
    opFisc.aliquotaICMSEfetivo,
    opFisc.aliquotaICMSUFDestinatario,
    opFisc.aliquotaICMSInterestadual,
    opFisc.partilhaICMSInterestadual,
    opFisc.aliquotaFCP,
    opFisc.aliquotaFCPST,
    opFisc.aliquotaFCPSTAnteriormente,
    opFisc.aliquotaFCPUFDestinatario,
    cfop.geraFinanceiro
  INTO
    v_opFisc_cfop,
    v_opFisc_indicadorISSQN,
    v_opFisc_aliquotaISSQN,
    v_opFisc_aliquotaIRRF,
    v_opFisc_aliquotaINSS,
    v_opFisc_retencaoPIS,
    v_opFisc_retencaoCOFINS,
    v_opFisc_retencaoCSLL,
    v_opFisc_aliquotaII,
    v_opFisc_aliquotaIOF,
    v_opFisc_codigoEnquadramIPI,
    v_opFisc_stIPI,
    v_opFisc_aliquotaIPI,
    v_opFisc_valorAliquotaIPI,
    v_opFisc_stPIS,
    v_opFisc_aliquotaPIS,
    v_opFisc_valorAliquotaPIS,
    v_opFisc_aliquotaPISST,
    v_opFisc_valorAliquotaPISST,
    v_opFisc_stCOFINS,
    v_opFisc_aliquotaCOFINS,
    v_opFisc_valorAliquotaCOFINS,
    v_opFisc_aliquotaCOFINSST,
    v_opFisc_valorAliquotaCOFINSST,
    v_opFisc_stSimplesNacional,
    v_opFisc_creditoSimplesNac,
    v_opFisc_stICMS,
    v_opFisc_modalBaseCalcICMS,
    v_opFisc_reducaoBaseICMS,
    v_opFisc_aliquotaICMS,
    v_opFisc_diferimentoICMS,
    v_opFisc_motivoDesoneracaoICMS,
    v_opFisc_modalBaseCalcICMSST,
    v_opFisc_margemValorAdicST,
    v_opFisc_reducaoBaseST,
    v_opFisc_aliquotaICMSST,
    v_opFisc_aliquotaSTSuportConsF,
    v_opFisc_reducaoBaseICMSEfetiv,
    v_opFisc_aliquotaICMSEfetivo,
    v_opFisc_aliquotaICMSUFDestin,
    v_opFisc_aliquotaICMSInterest,
    v_opFisc_partilhaICMSInterest,
    v_opFisc_aliquotaFCP,
    v_opFisc_aliquotaFCPST,
    v_opFisc_aliquotaFCPSTAnterior,
    v_opFisc_aliquotaFCPUFDestin,
    v_cfop_geraFinanceiro
  FROM PAOPERACOESFISCAIS opFisc
  JOIN SICFOPS cfop ON cfop.cfop = opFisc.cfop
  WHERE opFisc.operacaoFiscal = p_item_operacaoFiscal;
  r_obrigaFinalizar         := p_obrigaFinalizar;
  r_calculoImpostosPendente := p_calculoImpostosPendente;
  r_cab_valorMargem         := p_cab_valorMargem;
  r_idItemOrcamento         := 0;
  IF p_manterFinanceiro = 0
    AND (r_cab_valorFreteGeral <> 0
      OR r_cab_valorSeguroGeral <> 0
      OR r_cab_valorDescontoGeral <> 0
      OR r_cab_valorOutrasDespGeral <> 0
      OR r_cab_valorAdicFreteMarGeral <> 0
      OR r_cab_valorDespesasAduanGeral <> 0) THEN
    r_calculoImpostosPendente := 1;
  END IF;
  IF p_manterFinanceiro = 0
    AND (r_cab_valorDescontoGeral <> 0
      OR r_cab_valorOutrasDespGeral <> 0
      OR r_cab_valorPagamentoBruto <> 0) THEN
    r_calculoImpostosPendente := 1;
    ADD_ORCAMENTO_PAG_EXCLUI_TROCA (
      r_calculoImpostosPendente,
      p_cab_orcamento,
      r_cab_valorDescontoGeral,
      r_cab_valorOutrasDespGeral,
      v_cab_valorDescontoPagamento,
      v_cab_valorOutrasDespPag,
      v_cab_valorJurosPagamento,
      0,
      v_item_valorDescontoGeral,
      v_item_valorOutrasDespGeral,
      0,
      0,
      0,
      /* Retornos */
      r_calculoImpostosPendente,
      r_cab_valorDescontoGeral,
      r_cab_valorOutrasDespGeral,
      v_cab_condicaoPagamento,
      v_cab_numeroParcelas,
      v_cab_somaPrazoParcelas,
      v_cab_valorXPrazoParcelas,
      v_cab_prazoMedio,
      v_cab_prazoMedioPonderado,
      v_cab_valorEntradaMinima,
      v_cab_valorAVistaEntrada,
      r_cab_valorPagamentoBruto,
      v_cab_valorDescontoPagamento,
      v_cab_valorOutrasDespPag,
      v_cab_valorJurosPagamento,
      r_cab_valorPagamentoLiquido,
      r_cab_valorTroco,
      v_item_valorDescontoGeral,
      v_item_valorOutrasDespGeral,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber
    );
  END IF;
  r_cab_ultimoVendedorItem := p_item_vendedor;
  IF v_prod_controleEstoque = 3 THEN
    v_auxNumber := 0;
    ADD_ORCAMENTO_ITEM_INSERE_COMB (
      p_uniqueMachineID,
      p_usuarioLogado,
      p_perfilUsuarioLogado,
      p_estabelecimentoAtivo,
      p_config_64_casasDecSaidas,
      p_config_65_casasDecEntrada,
      p_config_209_filtrarGrupoEcon,
      p_config_330_redIcmsBasePisCof,
      p_config_362_calcCustoPorGrade,
      p_regMarg_tipoPreco,
      p_regMarg_tabelaPreco,
      p_regMarg_fatorMultiplicador,
      p_regMarg_tipoPrecoB,
      p_regMarg_tabelaPrecoB,
      p_regMarg_fatorMultiplicadorB,
      p_regMarg_reduzirImpostos,
      p_regMarg_reduzirTarifaCartao,
      p_regMarg_taxaCapitacaoCustoFi,
      p_regMarg_exibPercMargemCab,
      p_regMarg_exibImagemMargemCab,
      p_regMarg_regraImagemCab,
      p_regMarg_exibPercMargemItem,
      p_regMarg_exibImagemMargemItem,
      p_regMarg_regraImagemItem,
      p_regMarg_exibDetMargemItem,
      r_obrigaFinalizar,
      p_cab_orcamento,
      v_cab_origemDocumento,
      v_cab_tipoDocumento,
      v_cab_modeloDocumento,
      v_cab_entradaSaida,
      v_cab_atualizaCustoMedio,
      v_cab_estabelecimento,
      v_cab_dataEmissao,
      v_cab_dataPreco,
      v_cab_pessoa,
      v_cab_dataEntrega,
      v_cab_municipioFatoGerador,
      v_cab_localDestinoOperacao,
      v_cab_indicadorConsumidorFinal,
      v_cab_tipoPagamentoFrete,
      r_cab_quantidade,
      r_cab_pesoLiquido,
      r_cab_pesoBruto,
      r_cab_valorProdutosBruto,
      r_cab_valorProdutos,
      r_cab_valorDescontoProdutos,
      r_cab_valorAcrescimoProdutos,
      r_cab_valorServicosBruto,
      r_cab_valorServicos,
      r_cab_valorDescontoServicos,
      r_cab_valorAcrescimoServicos,
      v_cab_prazoMedioPonderado,
      r_cab_valorBasePagamento,
      r_cab_valorAVistaMinimo,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespTotal,
      r_cab_valorFreteTotal,
      r_cab_valorSeguroTotal,
      r_cab_valorAdicFreteMarTotal,
      r_cab_valorDespesasAduanTotal,
      r_cab_valorImpostosSomaPag,
      r_cab_valorImpostosDiminuiPag,
      r_cab_valorLiquidoItem,
      p_cab_valorTarifaCartao,
      r_cab_valorMargem,
      v_modDoc_capituloNatFiscal,
      v_modDoc_habilitaAmbiente,
      v_modDoc_tipoPreco,
      v_modDoc_tabelaPreco,
      v_modDoc_fatorMultipPreco,
      v_modDoc_tipoPrecoB,
      v_modDoc_tabelaPrecoB,
      v_modDoc_fatorMultipPrecoB,
      v_modDoc_diminuiDescontoPrUnit,
      v_modDoc_somaAcrescimosPrUnit,
      v_modDoc_somaFreteSeguroPrUnit,
      v_est_grupoFiscal,
      v_pessEst_regimeTributario,
      v_munEndEst_uf,
      v_pess_indicadorInscricaoEstad,
      v_munEndPess_uf,
      v_etOrc_situacaoOrcamento,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_movimentaEstoque,
      p_item_geraFinanceiro,
      p_item_localEstoque,
      p_item_pessoaParticipante,
      p_item_dataEntrega,
      p_item_quantidade,
      p_item_controleEntrega,
      p_item_usarPrecoAVista,
      p_item_percDescontoItem,
      p_item_percAcrescimoItem,
      p_item_observacoesDigitadas,
      p_idEnderecoEstoque,
      p_item_ambiente,
      p_item_amb_observacoes,
      p_atualizarTempMargem,
      p_idItemOrcamentoReferenciado,
      p_idItemDocTransferencia,
      /* Retornos */
      r_obrigaFinalizar,
      r_cab_quantidade,
      r_cab_pesoLiquido,
      r_cab_pesoBruto,
      r_cab_valorProdutosBruto,
      r_cab_valorProdutos,
      r_cab_valorDescontoProdutos,
      r_cab_valorAcrescimoProdutos,
      r_cab_valorServicosBruto,
      r_cab_valorServicos,
      r_cab_valorDescontoServicos,
      r_cab_valorAcrescimoServicos,
      r_cab_valorBasePagamento,
      r_cab_valorAVistaMinimo,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespTotal,
      r_cab_valorImpostosSomaPag,
      r_cab_valorImpostosDiminuiPag,
      r_cab_valorLiquidoItem,
      r_cab_valorMargem,
      r_cab_percentualMargem,
      r_cab_imagemMargem
    );
  ELSE
    r_item_valorBasePagamento      := 0;
    v_item_aliquotaEstImpFederais  := 0;
    v_item_aliquotaEstImpEstaduais := 0;
    v_item_aliquotaEstImpMunicipai := 0;
    IF v_cab_entradaSaida = 'S' THEN
      ADD_BUSCA_IBPT (
        v_cab_dataEmissao,
        v_munEndEst_uf,
        v_prod_origemMercadoria,
        v_prod_idNcm,
        v_prod_listaServicos,
        /* Retornos */
        v_auxNumber,
        v_auxNumber,
        v_item_aliquotaEstImpFederais,
        v_item_aliquotaEstImpEstaduais,
        v_item_aliquotaEstImpMunicipai,
        v_auxVarchar,
        v_auxVarchar,
        v_auxVarchar
      );
    END IF;
    ADD_CALCULA_IMPOSTOS_ITEM (
      p_config_64_casasDecSaidas,
      p_config_209_filtrarGrupoEcon,
      p_config_330_redIcmsBasePisCof,
      p_config_362_calcCustoPorGrade,
      v_cab_entradaSaida,
      0,
      v_cab_estabelecimento,
      0,
      v_cab_dataEmissao,
      v_cab_pessoa,
      v_cab_localDestinoOperacao,
      v_cab_indicadorConsumidorFinal,
      v_cab_tipoPagamentoFrete,
      v_pess_indicadorInscricaoEstad,
      p_item_pessoaParticipante,
      p_item_quantidade,
      p_item_precoPautaTabelado,
      p_item_valorProdutoServico,
      p_item_valorFreteTotal,
      p_item_valorSeguroTotal,
      p_item_valorDescontoTotal,
      p_item_valorOutrasDespTotal,
      p_item_valorAdicFreteMarTotal,
      p_item_valorDespesasAduanTotal,
      v_opFisc_cfop,
      1,
      v_opFisc_indicadorISSQN,
      v_opFisc_aliquotaISSQN,
      0,
      0,
      1,
      v_opFisc_aliquotaIRRF,
      0,
      0,
      1,
      v_opFisc_aliquotaINSS,
      0,
      0,
      1,
      v_opFisc_retencaoPIS,
      0,
      0,
      1,
      v_opFisc_retencaoCOFINS,
      0,
      0,
      1,
      v_opFisc_retencaoCSLL,
      0,
      0,
      1,
      v_opFisc_aliquotaII,
      0,
      0,
      1,
      v_opFisc_aliquotaIOF,
      0,
      0,
      1,
      v_opFisc_aliquotaIPI,
      v_opFisc_valorAliquotaIPI,
      0,
      0,
      0,
      1,
      v_opFisc_aliquotaPIS,
      v_opFisc_valorAliquotaPIS,
      0,
      0,
      1,
      v_opFisc_aliquotaPISST,
      v_opFisc_valorAliquotaPISST,
      0,
      0,
      1,
      v_opFisc_aliquotaCOFINS,
      v_opFisc_valorAliquotaCOFINS,
      0,
      0,
      1,
      v_opFisc_aliquotaCOFINSST,
      v_opFisc_valorAliquotaCOFINSST,
      0,
      0,
      1,
      v_opFisc_stSimplesNacional,
      v_opFisc_creditoSimplesNac,
      0,
      0,
      1,
      v_opFisc_stICMS,
      v_opFisc_modalBaseCalcICMS,
      v_opFisc_reducaoBaseICMS,
      v_opFisc_aliquotaICMS,
      v_opFisc_diferimentoICMS,
      0,
      0,
      0,
      0,
      0,
      1,
      v_opFisc_modalBaseCalcICMSST,
      v_opFisc_margemValorAdicST,
      v_opFisc_reducaoBaseST,
      v_opFisc_aliquotaICMSST,
      0,
      0,
      1,
      0,
      0,
      0,
      v_opFisc_reducaoBaseICMSEfetiv,
      v_opFisc_aliquotaICMSEfetivo,
      0,
      0,
      0,
      '  ',
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      1,
      (CASE WHEN v_munEndEst_uf <> v_munEndPess_uf AND v_munEndEst_uf <> 'EX' AND v_munEndPess_uf <> 'EX' AND v_cab_indicadorConsumidorFinal = '1' THEN v_opFisc_aliquotaICMSUFDestin ELSE 0 END),
      (CASE WHEN v_munEndEst_uf <> v_munEndPess_uf AND v_munEndEst_uf <> 'EX' AND v_munEndPess_uf <> 'EX' AND v_cab_indicadorConsumidorFinal = '1' THEN v_opFisc_aliquotaICMSInterest ELSE 0 END),
      (CASE WHEN v_munEndEst_uf <> v_munEndPess_uf AND v_munEndEst_uf <> 'EX' AND v_munEndPess_uf <> 'EX' AND v_cab_indicadorConsumidorFinal = '1' THEN v_opFisc_partilhaICMSInterest ELSE 0 END),
      0,
      0,
      0,
      0,
      1,
      v_opFisc_aliquotaFCP,
      0,
      0,
      v_opFisc_aliquotaFCPST,
      0,
      0,
      v_opFisc_aliquotaFCPSTAnterior,
      0,
      0,
      v_opFisc_aliquotaFCPUFDestin,
      0,
      0,
      1,
      v_item_aliquotaEstImpFederais,
      v_item_aliquotaEstImpEstaduais,
      v_item_aliquotaEstImpMunicipai,
      0,
      0,
      0,
      0,
      p_gradProd_produto,
      p_gradProd_cor,
      p_gradProd_tamanho,
      p_prod_controleEstoque,
      p_prod_tipoProduto,
      /* Retornos */
      v_item_baseISSQN,
      v_item_valorISSQN,
      v_item_baseIRRF,
      v_item_valorIRRF,
      v_item_baseINSS,
      v_item_valorINSS,
      v_item_baseRetPIS,
      v_item_valorRetPIS,
      v_item_baseRetCOFINS,
      v_item_valorRetCOFINS,
      v_item_baseRetCSLL,
      v_item_valorRetCSLL,
      v_item_baseII,
      v_item_valorII,
      v_item_baseIOF,
      v_item_valorIOF,
      v_item_baseIPI,
      v_item_valorIPI,
      v_item_basePIS,
      v_item_valorPIS,
      v_item_basePISST,
      v_item_valorPISST,
      v_item_baseCOFINS,
      v_item_valorCOFINS,
      v_item_baseCOFINSST,
      v_item_valorCOFINSST,
      v_item_baseCreditoSimplesNac,
      v_item_valorCreditoSimplesNac,
      v_item_baseICMS,
      v_item_valorICMSOperacao,
      v_item_valorICMSDiferido,
      v_item_valorICMS,
      v_item_valorICMSDesoneracao,
      v_item_baseICMSST,
      v_item_valorICMSST,
      v_item_baseICMSSTAnteriormente,
      v_item_valorICMSSTAnteriorment,
      v_item_valorICMSProprioSubstit,
      v_item_baseICMSEfetivo,
      v_item_valorICMSEfetivo,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_item_baseICMSUFDestinatario,
      v_item_valorICMSUFDestinatario,
      v_item_baseICMSUFRemetente,
      v_item_valorICMSUFRemetente,
      v_item_baseFCP,
      v_item_valorFCP,
      v_item_baseFCPST,
      v_item_valorFCPST,
      v_item_baseFCPSTAnteriormente,
      v_item_valorFCPSTAnteriormente,
      v_item_baseFCPUFDestinatario,
      v_item_valorFCPUFDestinatario,
      v_item_baseEstimadaImpostos,
      v_item_valorEstImpFederais,
      v_item_valorEstImpEstaduais,
      v_item_valorEstImpMunicipais);
    ADD_CALCULA_VALOR_LIQUIDO (
      0,
      v_cab_tipoPagamentoFrete,
      CASE WHEN p_item_geraFinanceiro = 1 AND v_cfop_geraFinanceiro = 1 THEN 1 ELSE 0 END,
      p_item_valorProdutoServico,
      0,
      0,
      0,
      p_item_valorFreteTotal,
      p_item_valorSeguroTotal,
      p_item_valorDescontoTotal,
      p_item_valorOutrasDespTotal,
      v_item_valorIRRF,
      v_item_valorINSS,
      v_item_valorRetPIS,
      v_item_valorRetCOFINS,
      v_item_valorRetCSLL,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      0,
      v_item_valorICMSST,
      0,
      0,
      0,
      /* Retornos */
      r_item_valorBasePagamento,
      v_item_valorImpostosSomaPag,
      v_item_valorImpostosDiminuiPag,
      v_item_valorLiquidoItem);
    r_cab_quantidade               := r_cab_quantidade + p_item_quantidadeConvertida;
    r_cab_pesoLiquido              := r_cab_pesoLiquido + p_item_pesoLiquido;
    r_cab_pesoBruto                := r_cab_pesoBruto + p_item_pesoBruto;
    IF p_item_servico = 1 THEN
      r_cab_valorServicosBruto       := r_cab_valorServicosBruto + p_item_valorProdutoServicoBrut;
      r_cab_valorServicos            := r_cab_valorServicos + p_item_valorProdutoServico;
      r_cab_valorDescontoServicos    := r_cab_valorDescontoServicos + p_item_valorDescontoItem;
      r_cab_valorAcrescimoServicos   := r_cab_valorAcrescimoServicos + p_item_valorAcrescimoItem;
    ELSE 
      r_cab_valorProdutosBruto       := r_cab_valorProdutosBruto + p_item_valorProdutoServicoBrut;
      r_cab_valorProdutos            := r_cab_valorProdutos + p_item_valorProdutoServico;
      r_cab_valorDescontoProdutos    := r_cab_valorDescontoProdutos + p_item_valorDescontoItem;
      r_cab_valorAcrescimoProdutos   := r_cab_valorAcrescimoProdutos + p_item_valorAcrescimoItem;
    END IF;
    r_cab_valorFreteItem           := r_cab_valorFreteItem + p_item_valorFreteItem;
    r_cab_valorSeguroItem          := r_cab_valorSeguroItem + p_item_valorSeguroItem;
    r_cab_valorAdicFreteMarItem    := r_cab_valorAdicFreteMarItem + p_item_valorAdicFreteMarItem;
    r_cab_valorDespesasAduanItem   := r_cab_valorDespesasAduanItem + p_item_valorDespesasAduanItem;
    r_cab_valorFreteGeral          := r_cab_valorFreteGeral + p_item_valorFreteGeral;
    r_cab_valorSeguroGeral         := r_cab_valorSeguroGeral + p_item_valorSeguroGeral;
    r_cab_valorDescontoGeral       := r_cab_valorDescontoGeral + v_item_valorDescontoGeral;
    r_cab_valorOutrasDespGeral     := r_cab_valorOutrasDespGeral + v_item_valorOutrasDespGeral;
    r_cab_valorAdicFreteMarGeral   := r_cab_valorAdicFreteMarGeral + p_item_valorAdicFreteMarGeral;
    r_cab_valorDespesasAduanGeral  := r_cab_valorDespesasAduanGeral + p_item_valorDespesasAduanGeral;
    r_cab_valorBasePagamento       := r_cab_valorBasePagamento + r_item_valorBasePagamento;
    IF p_item_usarPrecoAVista = 1 AND p_item_geraFinanceiro = 1 AND v_cfop_geraFinanceiro = 1 THEN
      r_cab_valorAVistaMinimo        := r_cab_valorAVistaMinimo + p_item_valorProdutoServico - p_item_valorDescontoTotal + p_item_valorOutrasDespTotal;
    END IF;
    IF r_cab_valorFreteTotal = 0 AND p_item_valorFreteTotal <> 0 AND NOT(p_person_190_modeloFrete IS NULL) AND p_person_190_modeloFrete <> ' ' THEN
      r_cab_modalidadeFrete          := p_person_190_modeloFrete;
    END IF;    
    r_cab_valorFreteTotal          := r_cab_valorFreteTotal + p_item_valorFreteTotal;
    r_cab_valorSeguroTotal         := r_cab_valorSeguroTotal + p_item_valorSeguroTotal;
    v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal + p_item_valorDescontoTotal;
    v_cab_valorOutrasDespTotal     := v_cab_valorOutrasDespTotal + p_item_valorOutrasDespTotal;
    r_cab_valorAdicFreteMarTotal   := r_cab_valorAdicFreteMarTotal + p_item_valorAdicFreteMarTotal;
    r_cab_valorDespesasAduanTotal  := r_cab_valorDespesasAduanTotal + p_item_valorDespesasAduanTotal;
    r_cab_valorImpostosSomaPag     := r_cab_valorImpostosSomaPag + v_item_valorImpostosSomaPag;
    r_cab_valorImpostosDiminuiPag  := r_cab_valorImpostosDiminuiPag + v_item_valorImpostosDiminuiPag;
    r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem + v_item_valorLiquidoItem;
    SELECT COALESCE (MAX (sequencia),0) + 1
    INTO v_item_sequencia
    FROM MOORCAMENTOXITENS
    WHERE orcamento = p_cab_orcamento;
    ADD_ORCAMENTO_ITEM_GRAVA (
      p_estabelecimentoAtivo,
      r_obrigaFinalizar,
      p_cab_orcamento,
      v_cab_modeloDocumento,
      v_cab_entradaSaida,
      v_cab_estabelecimento,
      v_cab_dataEmissao,
      v_cab_dataEntrega,
      v_etOrc_situacaoOrcamento,
      0,
      v_item_sequencia,
      0,
      0,
      p_item_vendedor,
      0,
      p_item_gradeProduto,
      p_item_servico,
      p_item_atividadeServico,
      'A',
      0,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      0,
      p_item_idLoteEstoque,
      p_item_vinculoItemDocumento,
      p_item_operacaoFiscal,
      0,
      p_item_movimentaEstoque,
      (CASE WHEN p_item_geraFinanceiro = 1 AND v_cfop_geraFinanceiro = 1 THEN 1 ELSE 0 END),
      0,
      p_item_localEstoque,
      0,
      p_item_pessoaParticipante,
      p_item_dataEntrega,
      p_item_controleQuantidade,
      p_item_unidadeMedidaConversao,
      p_item_conversorQuantidade,
      p_item_loteMinimo,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_pecas,
      p_item_quantidade,
      p_item_quantidadeConvertida,
      0,
      p_item_quantidade,
      p_item_controleEntrega,
      1,
      p_item_pesoLiquido,
      p_item_pesoBruto,
      p_item_tipoPreco,
      p_item_tabelaPreco,
      p_item_precoSugestaoAPrazo,
      p_item_precoSugestaoAVista,
      p_item_precoDesconto,
      p_item_precoMinimo,
      p_item_usarPrecoAVista,
      p_item_precoPautaTabelado,
      p_item_precoUnitarioBruto,
      p_item_acrescimoUnitarioCompos,
      p_item_precoUnitario,
      p_item_precoUnitarioConvertido,
      p_item_valorProdutoServicoBrut,
      p_item_valorProdutoServico,
      p_item_percDescontoItem,
      p_item_valorDescontoItem,
      p_item_percAcrescimoItem,
      p_item_valorAcrescimoItem,
      p_item_valorFreteItem,
      p_item_valorSeguroItem,
      p_item_valorAdicFreteMarItem,
      p_item_valorDespesasAduanItem,
      p_item_valorFreteGeral,
      p_item_valorSeguroGeral,
      v_item_valorDescontoGeral,
      v_item_valorOutrasDespGeral,
      p_item_valorAdicFreteMarGeral,
      p_item_valorDespesasAduanGeral,
      r_item_valorBasePagamento,
      0,
      0,
      0,
      p_item_valorFreteTotal,
      p_item_valorSeguroTotal,
      p_item_valorDescontoTotal,
      p_item_valorOutrasDespTotal,
      p_item_valorAdicFreteMarTotal,
      p_item_valorDespesasAduanTotal,
      v_opFisc_cfop,
      v_opFisc_indicadorISSQN,
      v_opFisc_aliquotaISSQN,
      v_item_baseISSQN,
      v_item_valorISSQN,
      v_opFisc_aliquotaIRRF,
      v_item_baseIRRF,
      v_item_valorIRRF,
      v_opFisc_aliquotaINSS,
      v_item_baseINSS,
      v_item_valorINSS,
      v_opFisc_retencaoPIS,
      v_item_baseRetPIS,
      v_item_valorRetPIS,
      v_opFisc_retencaoCOFINS,
      v_item_baseRetCOFINS,
      v_item_valorRetCOFINS,
      v_opFisc_retencaoCSLL,
      v_item_baseRetCSLL,
      v_item_valorRetCSLL,
      v_opFisc_aliquotaII,
      v_item_baseII,
      v_item_valorII,
      v_opFisc_aliquotaIOF,
      v_item_baseIOF,
      v_item_valorIOF,
      v_opFisc_codigoEnquadramIPI,
      v_opFisc_stIPI,
      v_opFisc_aliquotaIPI,
      v_opFisc_valorAliquotaIPI,
      v_item_baseIPI,
      v_item_valorIPI,
      v_opFisc_stPIS,
      v_opFisc_aliquotaPIS,
      v_opFisc_valorAliquotaPIS,
      v_item_basePIS,
      v_item_valorPIS,
      v_opFisc_aliquotaPISST,
      v_opFisc_valorAliquotaPISST,
      v_item_basePISST,
      v_item_valorPISST,
      v_opFisc_stCOFINS,
      v_opFisc_aliquotaCOFINS,
      v_opFisc_valorAliquotaCOFINS,
      v_item_baseCOFINS,
      v_item_valorCOFINS,
      v_opFisc_aliquotaCOFINSST,
      v_opFisc_valorAliquotaCOFINSST,
      v_item_baseCOFINSST,
      v_item_valorCOFINSST,
      v_opFisc_stSimplesNacional,
      v_opFisc_creditoSimplesNac,
      v_item_baseCreditoSimplesNac,
      v_item_valorCreditoSimplesNac,
      v_opFisc_stICMS,
      v_opFisc_modalBaseCalcICMS,
      v_opFisc_reducaoBaseICMS,
      v_opFisc_aliquotaICMS,
      v_opFisc_diferimentoICMS,
      v_opFisc_motivoDesoneracaoICMS,
      v_item_baseICMS,
      v_item_valorICMSOperacao,
      v_item_valorICMSDiferido,
      v_item_valorICMS,
      v_item_valorICMSDesoneracao,
      v_opFisc_modalBaseCalcICMSST,
      v_opFisc_margemValorAdicST,
      v_opFisc_reducaoBaseST,
      v_opFisc_aliquotaICMSST,
      v_opFisc_aliquotaSTSuportConsF,
      v_item_baseICMSST,
      v_item_valorICMSST,
      v_item_baseICMSSTAnteriormente,
      v_item_valorICMSSTAnteriorment,
      v_item_valorICMSProprioSubstit,
      v_opFisc_reducaoBaseICMSEfetiv,
      v_opFisc_aliquotaICMSEfetivo,
      v_item_baseICMSEfetivo,
      v_item_valorICMSEfetivo,
      (CASE WHEN v_munEndEst_uf <> v_munEndPess_uf AND v_munEndEst_uf <> 'EX' AND v_munEndPess_uf <> 'EX' AND v_cab_indicadorConsumidorFinal = '1' THEN v_opFisc_aliquotaICMSUFDestin ELSE 0 END),
      (CASE WHEN v_munEndEst_uf <> v_munEndPess_uf AND v_munEndEst_uf <> 'EX' AND v_munEndPess_uf <> 'EX' AND v_cab_indicadorConsumidorFinal = '1' THEN v_opFisc_aliquotaICMSInterest ELSE 0 END),
      (CASE WHEN v_munEndEst_uf <> v_munEndPess_uf AND v_munEndEst_uf <> 'EX' AND v_munEndPess_uf <> 'EX' AND v_cab_indicadorConsumidorFinal = '1' THEN v_opFisc_partilhaICMSInterest ELSE 0 END),
      v_item_baseICMSUFDestinatario,
      v_item_valorICMSUFDestinatario,
      v_item_baseICMSUFRemetente,
      v_item_valorICMSUFRemetente,
      v_opFisc_aliquotaFCP,
      v_item_baseFCP,
      v_item_valorFCP,
      v_opFisc_aliquotaFCPST,
      v_item_baseFCPST,
      v_item_valorFCPST,
      v_opFisc_aliquotaFCPSTAnterior,
      v_item_baseFCPSTAnteriormente,
      v_item_valorFCPSTAnteriormente,
      v_opFisc_aliquotaFCPUFDestin,
      v_item_baseFCPUFDestinatario,
      v_item_valorFCPUFDestinatario,
      v_item_aliquotaEstImpFederais,
      v_item_aliquotaEstImpEstaduais,
      v_item_aliquotaEstImpMunicipai,
      v_item_baseEstimadaImpostos,
      v_item_valorEstImpFederais,
      v_item_valorEstImpEstaduais,
      v_item_valorEstImpMunicipais,
      v_item_valorImpostosSomaPag,
      v_item_valorImpostosDiminuiPag,
      v_item_valorLiquidoItem,
      p_item_observacoesDigitadas,
      p_item_observacoes,
      /* Retornos */
      r_obrigaFinalizar,
      r_idItemOrcamento
    );    
    IF v_modDoc_habilitaAmbiente = 1 THEN
      MERGE INTO MOORCAMENTOXAMBIENTES a
      USING (
        SELECT
          r_idItemOrcamento      idItemOrcamento,
          p_item_ambiente        ambiente,
          p_item_amb_observacoes observacoes
        FROM DUAL
      ) b ON (a.idItemOrcamento = b.idItemOrcamento)
      WHEN MATCHED THEN
        UPDATE SET
          a.ambiente    = b.ambiente,
          a.observacoes = b.observacoes
      WHEN NOT MATCHED THEN
        INSERT (
          idItemOrcamento,
          ambiente,
          observacoes
        ) VALUES (
          b.idItemOrcamento,
          b.ambiente,
          b.observacoes
        );
    END IF;
    IF p_idItemOrcamentoReferenciado > 0 THEN
      ADD_ORCAMENTO_ITEM_ORC_GRAVA (
        p_estabelecimentoAtivo,
        r_idItemOrcamento,
        p_idItemOrcamentoReferenciado,
        p_item_quantidade
      );
    ELSE
      IF p_nomeTempComposicao <> ' ' THEN
        ADD_ORCAMENTO_ITEM_COMP_TEMP (
          p_uniqueMachineID,
          p_estabelecimentoAtivo,
          p_nomeTempComposicao,
          p_temp_sequencia,
          r_idItemOrcamento
        );
      END IF;
    END IF;
    IF p_idItemDocTransferencia > 0 THEN
      ADD_ORCAMENTO_ITEM_TRANS_GRAVA (
        p_estabelecimentoAtivo,
        v_cab_entradaSaida,
        p_idItemDocTransferencia,
        r_idItemOrcamento,
        p_item_quantidade
      );
    END IF;
    v_idEnderecoEstoqueOrcamento := 0;
    IF p_idEnderecoEstoque > 0 THEN
      ADD_ORCAMENTO_ITEM_ENDER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_idItemOrcamento,
        p_idEnderecoEstoque,
        p_item_quantidade,
        p_item_quantidade,
        p_item_observacoes,
        /* Retornos */
        v_idEnderecoEstoqueOrcamento
      );
    END IF;
    IF p_idNumeroSerie > 0 THEN
      ADD_ORCAMENTO_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_idItemOrcamento,
        v_idEnderecoEstoqueOrcamento,
        p_item_gradeProduto,
        p_idNumeroSerie,
        0,
        /* Retornos */
        v_auxNumber
      );
    END IF;
    IF p_item_servico = 1 AND p_item_atividadeServico > 0 AND v_ativServ_habilitaAtivPrev = 1 THEN
      ADD_ORCAMENTO_ITEM_PREV_INSERE (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        r_idItemOrcamento,
        p_item_atividadeServico,
        v_ativServ_validoPrevisto
      );
    END IF;
    IF p_atualizarTempMargem = 1
      AND (p_regMarg_exibPercMargemCab = 1
        OR p_regMarg_exibImagemMargemCab = 1
        OR p_regMarg_exibPercMargemItem = 1
        OR p_regMarg_exibImagemMargemItem = 1
        OR p_regMarg_exibDetMargemItem = 1)
      AND v_cab_tipoDocumento IN (101,102,301,501,503) THEN
      ADD_TEMP_MARGEM_ITEM_GRAVA (
        p_uniqueMachineID,
        p_config_65_casasDecEntrada,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_regMarg_tipoPreco,
        p_regMarg_tabelaPreco,
        p_regMarg_fatorMultiplicador,
        p_regMarg_tipoPrecoB,
        p_regMarg_tabelaPrecoB,
        p_regMarg_fatorMultiplicadorB,
        p_regMarg_reduzirImpostos,
        p_regMarg_reduzirTarifaCartao,
        p_regMarg_taxaCapitacaoCustoFi,
        p_regMarg_exibImagemMargemCab,
        p_regMarg_regraImagemCab,
        p_regMarg_exibImagemMargemItem,
        p_regMarg_regraImagemItem,
        'O',
        p_cab_orcamento,
        v_cab_estabelecimento,
        v_cab_dataPreco,
        v_cab_prazoMedioPonderado,
        r_cab_valorFreteTotal,
        r_cab_valorSeguroTotal,
        r_cab_valorAdicFreteMarTotal,
        r_cab_valorDespesasAduanTotal,
        r_cab_valorLiquidoItem,
        p_cab_valorTarifaCartao,
        r_cab_valorMargem,
        v_munEndEst_uf,
        v_item_sequencia,
        0,
        0,
        p_item_idFormulaTinta,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_valorFreteTotal,
        p_item_valorSeguroTotal,
        p_item_valorAdicFreteMarTotal,
        p_item_valorDespesasAduanTotal,
        v_item_valorII,
        v_item_valorIOF,
        v_item_valorIPI,
        0,
        v_item_valorPIS,
        v_item_valorPISST,
        v_item_valorCOFINS,
        v_item_valorCOFINSST,
        v_item_valorCreditoSimplesNac,
        v_item_valorICMSOperacao,
        v_item_valorICMSDiferido,
        v_item_valorICMS,
        v_item_valorICMSDesoneracao,
        v_item_valorICMSST,
        v_item_valorICMSSTAnteriorment,
        v_item_valorICMSUFDestinatario,
        v_item_valorICMSUFRemetente,
        v_item_valorFCP,
        v_item_valorFCPST,
        v_item_valorFCPSTAnteriormente,
        v_item_valorFCPUFDestinatario,
        v_item_valorLiquidoItem,
        p_gradProd_produto,
        p_gradProd_cor,
        p_gradProd_tamanho,
        p_prod_controleEstoque,
        p_locEst_indicadorPropPosseIt,
        /* Retornos */
        r_cab_valorMargem,
        r_cab_percentualMargem,
        r_cab_imagemMargem,
        r_item_valorLiquidoSemFreteSeg,
        r_item_valorCaptacao,
        r_item_valorTarifaCartao,
        r_item_valorImpostos,
        r_item_precoCusto,
        r_item_valorCusto,
        r_item_valorMargem,
        r_item_percentualMargem,
        r_item_imagemMargem);
    END IF;
  END IF;
  IF p_manterFinanceiro = 0
    AND (r_cab_valorFreteGeral <> 0
      OR r_cab_valorSeguroGeral <> 0
      OR r_cab_valorDescontoGeral <> 0
      OR r_cab_valorOutrasDespGeral <> 0
      OR r_cab_valorAdicFreteMarGeral <> 0
      OR r_cab_valorDespesasAduanGeral <> 0) THEN
    r_calculoImpostosPendente := 1;
  END IF;
  UPDATE MOORCAMENTOS SET
    modalidadeFrete               = r_cab_modalidadeFrete,
    ultimoVendedorItem            = r_cab_ultimoVendedorItem,
    quantidade                    = r_cab_quantidade,
    pesoLiquido                   = r_cab_pesoLiquido,
    pesoBruto                     = r_cab_pesoBruto,
    valorProdutosBruto            = r_cab_valorProdutosBruto,
    valorProdutos                 = r_cab_valorProdutos,
    valorDescontoProdutos         = r_cab_valorDescontoProdutos,
    valorAcrescimoProdutos        = r_cab_valorAcrescimoProdutos,
    valorServicosBruto            = r_cab_valorServicosBruto,
    valorServicos                 = r_cab_valorServicos,
    valorDescontoServicos         = r_cab_valorDescontoServicos,
    valorAcrescimoServicos        = r_cab_valorAcrescimoServicos,
    valorFreteItem                = r_cab_valorFreteItem,
    valorSeguroItem               = r_cab_valorSeguroItem,
    valorAdicFreteMarinhaMerItem  = r_cab_valorAdicFreteMarItem,
    valorDespesasAduaneirasItem   = r_cab_valorDespesasAduanItem,
    valorFreteGeral               = r_cab_valorFreteGeral,
    valorSeguroGeral              = r_cab_valorSeguroGeral,
    valorDescontoGeral            = r_cab_valorDescontoGeral,
    valorOutrasDespesasGeral      = r_cab_valorOutrasDespGeral,
    valorAdicFreteMarinhaMerGeral = r_cab_valorAdicFreteMarGeral,
    valorDespesasAduaneirasGeral  = r_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            = r_cab_valorBasePagamento,
    valorAVistaMinimo             = r_cab_valorAVistaMinimo,
    valorEntradaMinima            = v_cab_valorEntradaMinima,
    valorAVistaEntrada            = v_cab_valorAVistaEntrada,
    valorPagamentoBruto           = r_cab_valorPagamentoBruto,
    valorDescontoPagamento        = v_cab_valorDescontoPagamento,
    valorOutrasDespesasPagamento  = v_cab_valorOutrasDespPag,
    valorJurosPagamento           = v_cab_valorJurosPagamento,
    valorPagamentoLiquido         = r_cab_valorPagamentoLiquido,
    valorTroco                    = r_cab_valorTroco,
    valorFreteTotal               = r_cab_valorFreteTotal,
    valorSeguroTotal              = r_cab_valorSeguroTotal,
    valorDescontoTotal            = v_cab_valorDescontoTotal,
    valorOutrasDespesasTotal      = v_cab_valorOutrasDespTotal,
    valorAdicFreteMarinhaMerTotal = r_cab_valorAdicFreteMarTotal,
    valorDespesasAduaneirasTotal  = r_cab_valorDespesasAduanTotal,
    valorImpostosSomaPagamento    = r_cab_valorImpostosSomaPag,
    valorImpostosDiminuiPagamento = r_cab_valorImpostosDiminuiPag,
    valorLiquidoItem              = r_cab_valorLiquidoItem
  WHERE orcamento = p_cab_orcamento;
END ADD_ORCAMENTO_ITEM_INSERE;

/

create or replace PROCEDURE ADD_ORCAMENTO_CAB_INSERE (
    p_SYS_VER                      IN VARCHAR2,
    p_config_361_idDocumentoPorEst IN NUMBER,
    p_estabelecimentoAtivo         IN NUMBER,
    p_cab_origemDocumento          IN NUMBER,
    p_cab_tipoDocumento            IN NUMBER,
    p_cab_modeloDocumento          IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_finalidadeNota           IN CHAR,
    p_cab_atualizaCustoMedio       IN NUMBER,
    p_cab_atualizaUltimaCompra     IN NUMBER,
    p_cab_validoFaturamento        IN NUMBER,
    p_cab_usarPrecoAVista          IN NUMBER,
    p_cab_sessao                   IN NUMBER,
    p_cab_idTerminalSiTef          IN VARCHAR2,
    p_cab_estabelecimentoOriginal  IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_enderecoRetiradaEstab    IN NUMBER,
    p_cab_indicadorPresencaComprad IN CHAR,
    p_cab_controlaSeparacaoConfer  IN NUMBER,
    p_cab_dataEmissao              IN DATE,
    p_cab_timezoneEmissao          IN VARCHAR2,
    p_cab_dataPreco                IN DATE,
    p_cab_dataValidade             IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_cab_autorizadoPessoa         IN NUMBER,
    p_cab_enderecoEntregaPessoa    IN NUMBER,
    p_cab_dataEntrega              IN DATE,
    p_cab_municipioFatoGerador     IN NUMBER,
    p_cab_localDestinoOperacao     IN CHAR,
    p_cab_indicadorConsumidorFinal IN CHAR,
    p_cab_projeto                  IN VARCHAR2,
    p_cab_contratoCompra           IN NUMBER,
    p_cab_colaboradorResponsavel   IN NUMBER,
    p_cab_tipoServico              IN NUMBER,
    p_cab_solicitado               IN VARCHAR2,
    p_cab_solucao                  IN VARCHAR2,
    p_cab_comissionadoB            IN NUMBER,
    p_cab_comissionadoC            IN NUMBER,
    p_cab_modalidadeFrete          IN CHAR,
    p_cab_tipoPagamentoFrete       IN CHAR,
    p_cab_transportadora           IN NUMBER,
    p_cab_motorista                IN NUMBER,
    p_cab_placa                    IN VARCHAR2,
    p_cab_vagao                    IN VARCHAR2,
    p_cab_balsa                    IN VARCHAR2,
    p_cab_quantidadeVolume         IN NUMBER,
    p_cab_especieVolume            IN VARCHAR2,
    p_cab_descricaoMarca           IN VARCHAR2,
    p_cab_numeracaoVolume          IN VARCHAR2,
    p_cab_codigoIntegracao         IN VARCHAR2,
    p_cab_atendimento              IN VARCHAR2,
    p_cab_prioridadeDocumento      IN NUMBER,
    p_cab_etapaOrcamento           IN NUMBER,
    p_cab_ultimoVendedorItem       IN NUMBER,
    p_cab_condicaoPagamento        IN NUMBER,
    p_cab_contaFinanceira          IN VARCHAR2,
    p_cab_impostosEditados         IN NUMBER,
    /* Retornos */
    r_cab_orcamento                OUT NUMBER,
    r_cab_idDocumento              OUT NUMBER)    
IS
BEGIN
  r_cab_orcamento   := FUNC_BUSCA_PROXIMO_ID ('MOORCAMENTOS', p_estabelecimentoAtivo, NULL);
  r_cab_idDocumento := FUNC_BUSCA_PROXIMO_ID ('MOORCAMENTOS|' || LPAD (TO_CHAR (p_cab_tipoDocumento),3,'0'), CASE WHEN p_config_361_idDocumentoPorEst = 1 THEN p_estabelecimentoAtivo ELSE 0 END, NULL);
  INSERT INTO MOORCAMENTOS (
    orcamento,
    origemDocumento,
    tipoDocumento,
    idDocumento,
    modeloDocumento,
    entradaSaida,
    finalidadeNota,
    atualizaCustoMedio,
    atualizaUltimaCompra,
    validoFaturamento,
    usarPrecoAVista,
    sessao,
    idTerminalSiTef,
    estabelecimentoOriginal,
    estabelecimento,
    enderecoRetiradaEstabeleciment,
    indicadorPresencaComprador,
    controlaSeparacaoConferencia,
    dataEmissao,
    timezoneEmissao,
    dataPreco,
    dataValidade,
    pessoa,
    autorizadoPessoa,
    enderecoEntregaPessoa,
    dataEntrega,
    municipioFatoGerador,
    localDestinoOperacao,
    indicadorConsumidorFinal,
    projeto,
    contratoCompra,
    colaboradorResponsavel,
    tipoServico,
    solicitado,
    solucao,
    comissionadoB,
    comissionadoC,
    modalidadeFrete,
    tipoPagamentoFrete,
    transportadora,
    motorista,
    placa,
    vagao,
    balsa,
    quantidadeVolume,
    especieVolume,
    descricaoMarca,
    numeracaoVolume,
    codigoIntegracao,
    atendimento,
    prioridadeDocumento,
    etapaOrcamento,
    ultimoVendedorItem,
    condicaoPagamento,
    contaFinanceira,
    impostosEditados,
    versaoAplicativo)
  VALUES (
    r_cab_orcamento,
    p_cab_origemDocumento,
    p_cab_tipoDocumento,
    r_cab_idDocumento,
    p_cab_modeloDocumento,
    p_cab_entradaSaida,
    p_cab_finalidadeNota,
    p_cab_atualizaCustoMedio,
    p_cab_atualizaUltimaCompra,
    p_cab_validoFaturamento,
    p_cab_usarPrecoAVista,
    p_cab_sessao,
    p_cab_idTerminalSiTef,
    p_cab_estabelecimentoOriginal,
    p_cab_estabelecimento,
    p_cab_enderecoRetiradaEstab,
    p_cab_indicadorPresencaComprad,
    p_cab_controlaSeparacaoConfer,
    p_cab_dataEmissao,
    p_cab_timezoneEmissao,
    p_cab_dataPreco,
    p_cab_dataValidade,
    p_cab_pessoa,
    p_cab_autorizadoPessoa,
    p_cab_enderecoEntregaPessoa,
    p_cab_dataEntrega,
    p_cab_municipioFatoGerador,
    p_cab_localDestinoOperacao,
    p_cab_indicadorConsumidorFinal,
    p_cab_projeto,
    p_cab_contratoCompra,
    p_cab_colaboradorResponsavel,
    p_cab_tipoServico,
    p_cab_solicitado,
    p_cab_solucao,
    p_cab_comissionadoB,
    p_cab_comissionadoC,
    p_cab_modalidadeFrete,
    p_cab_tipoPagamentoFrete,
    p_cab_transportadora,
    p_cab_motorista,
    p_cab_placa,
    p_cab_vagao,
    p_cab_balsa,
    p_cab_quantidadeVolume,
    p_cab_especieVolume,
    p_cab_descricaoMarca,
    p_cab_numeracaoVolume,
    p_cab_codigoIntegracao,
    p_cab_atendimento,
    p_cab_prioridadeDocumento,
    p_cab_etapaOrcamento,
    p_cab_ultimoVendedorItem,
    p_cab_condicaoPagamento,
    p_cab_contaFinanceira,
    p_cab_impostosEditados,
    p_SYS_VER);
END ADD_ORCAMENTO_CAB_INSERE;

/

create or replace PROCEDURE ADD_ORCAMENTO_TOTALIZADORES (
    p_orcamento           IN NUMBER,
    /* Retornos */
    r_idDocumento         OUT NUMBER,
    r_quantidadeTotal     OUT NUMBER,
    r_valorBasePagamento  OUT NUMBER,
    r_valorPagamentoBruto OUT NUMBER,
    r_valorLiquidoTotal   OUT NUMBER
)
IS
  
BEGIN
  
  SELECT
    COALESCE (MAX (idDocumento), 0),
    COALESCE (MAX (quantidade), 0),
    COALESCE (MAX (valorBasePagamento), 0),
    COALESCE (MAX (valorPagamentoBruto), 0),
    COALESCE (MAX (valorLiquidoItem), 0)
  INTO
    r_idDocumento,
    r_quantidadeTotal,
    r_valorBasePagamento,
    r_valorPagamentoBruto,
    r_valorLiquidoTotal
  FROM MOORCAMENTOS a
  WHERE a.orcamento = p_orcamento;
  
END ADD_ORCAMENTO_TOTALIZADORES;

/

create or replace PROCEDURE ADD_ORCAMENTO_GERA_TEMP_MARGEM (
    p_uniqueMachineID              IN VARCHAR2,
    p_config_65_casasDecEntrada    IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_regMarg_tipoPreco            IN CHAR,
    p_regMarg_tabelaPreco          IN VARCHAR2,
    p_regMarg_fatorMultiplicador   IN NUMBER,
    p_regMarg_tipoPrecoB           IN CHAR,
    p_regMarg_tabelaPrecoB         IN VARCHAR2,
    p_regMarg_fatorMultiplicadorB  IN NUMBER,
    p_regMarg_reduzirImpostos      IN NUMBER,
    p_regMarg_reduzirTarifaCartao  IN NUMBER,
    p_regMarg_taxaCapitacaoCustoFi IN NUMBER,
    p_regMarg_exibImagemMargemCab  IN NUMBER,
    p_regMarg_regraImagemCab       IN NUMBER,
    p_regMarg_exibImagemMargemItem IN NUMBER,
    p_regMarg_regraImagemItem      IN NUMBER,
    p_cab_orcamento                IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataPreco                IN DATE,
    p_cab_prazoMedioPonderado      IN NUMBER,
    p_cab_valorFreteTotal          IN NUMBER,
    p_cab_valorSeguroTotal         IN NUMBER,
    p_cab_valorAdicFreteMarinTotal IN NUMBER,
    p_cab_valorDespesasAduanTotal  IN NUMBER,
    p_cab_valorLiquidoItem         IN NUMBER,
    p_cab_valorTarifaCartao        IN NUMBER,
    p_munEndEst_uf                 IN CHAR,
    /* Retornos */
    r_cab_valorMargem              OUT NUMBER,
    r_cab_percentualMargem         OUT NUMBER,
    r_cab_imagemMargem             OUT VARCHAR2)
IS
    v_valorLiquidoSemFreteSeguro   NUMBER;
    v_valorCaptacao                NUMBER;
    v_valorTarifaCartao            NUMBER;
    v_valorImpostos                NUMBER;
    v_precoCusto                   NUMBER;
    v_valorCusto                   NUMBER;
    v_valorMargem                  NUMBER;
    v_percentualMargem             NUMBER;
    v_imagemMargem                 VARCHAR2(256);
    CURSOR c_item IS
      SELECT
        a.sequencia,
        a.cancelado,
        a.idFormulaTinta,
        a.personalizacao,
        a.localEstoque,
        a.pessoaParticipante,
        a.quantidade,
        a.valorFreteTotal,
        a.valorSeguroTotal,
        a.valorAdicFreteMarinhaMerTotal,
        a.valorDespesasAduaneirasTotal,
        a.valorII,
        a.valorIOF,
        a.valorIPI,
        a.valorPIS,
        a.valorPISST,
        a.valorCOFINS,
        a.valorCOFINSST,
        a.valorCreditoSimplesNacional,
        a.valorICMSOperacao,
        a.valorICMSDiferido,
        a.valorICMS,
        a.valorICMSDesoneracao,
        a.valorICMSST,
        a.valorICMSSTAnteriormente,
        a.valorICMSUFDestinatario,
        a.valorICMSUFRemetente,
        a.valorFCP,
        a.valorFCPST,
        a.valorFCPSTAnteriormente,
        a.valorFCPUFDestinatario,
        a.valorLiquidoItem,
        gradProd.produto,
        gradProd.cor,
        gradProd.tamanho,
        prod.controleEstoque,
        locEst.indicadorPropriedadePosseItem
      FROM MOORCAMENTOXITENS a
      JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
      JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = a.localEstoque
      WHERE orcamento = p_cab_orcamento;
BEGIN
  r_cab_valorMargem      := 0;
  r_cab_percentualMargem := 0;
  r_cab_imagemMargem     := ' ';
  FOR item IN c_item LOOP
    ADD_CALCULA_MARGEM_CONTRIB (
      p_config_65_casasDecEntrada,
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_regMarg_tipoPreco,
      p_regMarg_tabelaPreco,
      p_regMarg_fatorMultiplicador,
      p_regMarg_tipoPrecoB,
      p_regMarg_tabelaPrecoB,
      p_regMarg_fatorMultiplicadorB,
      p_regMarg_reduzirImpostos,
      p_regMarg_reduzirTarifaCartao,
      p_regMarg_taxaCapitacaoCustoFi,
      p_regMarg_exibImagemMargemItem,
      p_regMarg_regraImagemItem,
      p_cab_estabelecimento,
      p_cab_dataPreco,
      p_cab_prazoMedioPonderado,
      p_cab_valorLiquidoItem,
      p_cab_valorTarifaCartao,
      p_munEndEst_uf,
      item.idFormulaTinta,
      item.personalizacao,
      item.localEstoque,
      item.pessoaParticipante,
      item.quantidade,
      item.valorFreteTotal,
      item.valorSeguroTotal,
      item.valorAdicFreteMarinhaMerTotal,
      item.valorDespesasAduaneirasTotal,
      item.valorII,
      item.valorIOF,
      item.valorIPI,
      0,
      item.valorPIS,
      item.valorPISST,
      item.valorCOFINS,
      item.valorCOFINSST,
      item.valorCreditoSimplesNacional,
      item.valorICMSOperacao,
      item.valorICMSDiferido,
      item.valorICMS,
      item.valorICMSDesoneracao,
      item.valorICMSST,
      item.valorICMSSTAnteriormente,
      item.valorICMSUFDestinatario,
      item.valorICMSUFRemetente,
      item.valorFCP,
      item.valorFCPST,
      item.valorFCPSTAnteriormente,
      item.valorFCPUFDestinatario,
      item.valorLiquidoItem,
      item.produto,
      item.cor,
      item.tamanho,
      item.controleEstoque,
      item.indicadorPropriedadePosseItem,
      /* Retornos */
      v_valorLiquidoSemFreteSeguro,
      v_valorCaptacao,
      v_valorTarifaCartao,
      v_valorImpostos,
      v_precoCusto,
      v_valorCusto,
      v_valorMargem,
      v_percentualMargem);
    IF p_regMarg_exibImagemMargemItem = 1 AND p_regMarg_regraImagemItem <> 0 THEN
      v_imagemMargem := FUNC_ADD_BUSCA_IMAGEM_FAIXA (p_regMarg_regraImagemItem, v_percentualMargem);
    ELSE
      v_imagemMargem := ' ';
    END IF;
    IF item.cancelado = 0 THEN
      r_cab_valorMargem := r_cab_valorMargem + v_valorMargem;
    END IF;
    INSERT INTO TEMPMARGEMCONTRIBUICAO (
      uniqueMachineID,
      orcamentoPredocumentoDocumento,
      idCabecalho,
      sequencia,
      valorLiquidoSemFreteSeguro,
      valorCaptacao,
      valorTarifaCartao,
      valorImpostos,
      precoCusto,
      valorCusto,
      valorMargem,
      percentualMargem,
      imagemMargem
    ) VALUES (
      p_uniqueMachineID,
      'O',
      p_cab_orcamento,
      item.sequencia,
      v_valorLiquidoSemFreteSeguro,
      v_valorCaptacao,
      v_valorTarifaCartao,
      v_valorImpostos,
      v_precoCusto,
      v_valorCusto,
      v_valorMargem,
      v_percentualMargem,
      v_imagemMargem);
  END LOOP;
  r_cab_percentualMargem := CASE WHEN p_cab_valorLiquidoItem - p_cab_valorFreteTotal - p_cab_valorSeguroTotal - p_cab_valorAdicFreteMarinTotal - p_cab_valorDespesasAduanTotal = 0 THEN 0 ELSE ROUND ((100 * r_cab_valorMargem / (p_cab_valorLiquidoItem - p_cab_valorFreteTotal - p_cab_valorSeguroTotal - p_cab_valorAdicFreteMarinTotal - p_cab_valorDespesasAduanTotal)), 8) END;
  IF p_regMarg_exibImagemMargemCab = 1 AND p_regMarg_regraImagemCab <> 0 THEN
    r_cab_imagemMargem := FUNC_ADD_BUSCA_IMAGEM_FAIXA (p_regMarg_regraImagemCab, r_cab_percentualMargem);
  END IF;
END ADD_ORCAMENTO_GERA_TEMP_MARGEM;

/

create or replace PROCEDURE ADD_ORCAMENTO_CAB_RESERVA_GRAV(
    p_orcamento            IN NUMBER,
    p_estabelecimentoAtivo IN NUMBER
  )
IS
  v_bufferIdReservaEstoque        VARCHAR2 (32000);
  CURSOR c_resEstAnt
  IS 
    SELECT a.idReservaEstoque
    FROM MORESERVASESTOQUE a
    JOIN MOORCAMENTOXRESERVAESTOQ b ON b.idReservaEstoque = a.idReservaEstoque
    JOIN MOORCAMENTOXITENS c ON c.idItemOrcamento = b.idItemOrcamento
    WHERE c.orcamento = p_orcamento
    ORDER BY a.idReservaEstoque;
  CURSOR c_itens
  IS 
    SELECT 
      cab.modeloDocumento,
      cab.entradaSaida,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntrega,
      etOrc.situacaoOrcamento,
      item.idItemOrcamento,
      item.cancelado,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.movimentaEstoque,
      item.localEstoque,
      item.pessoaParticipante,
      item.quantidadeSaldo,
      item.controleEntrega,
      item.observacoes
    FROM MOORCAMENTOXITENS item
    JOIN MOORCAMENTOS cab ON cab.orcamento = item.orcamento
    JOIN PAETAPASORCAMENTO etOrc ON etOrc.etapaOrcamento = cab.etapaOrcamento
    WHERE item.orcamento = p_orcamento
    AND item.cancelado = 0
    AND item.movimentaEstoque = 1
    AND (etOrc.situacaoOrcamento BETWEEN 41 AND 63 AND item.quantidadeSaldo > 0
      OR etOrc.situacaoOrcamento BETWEEN 64 AND 89 AND item.controleEntrega > 0)
    ORDER BY item.sequencia;
BEGIN
  v_bufferIdReservaEstoque := '';
  FOR resEstAnt IN c_resEstAnt
  LOOP
    v_bufferIdReservaEstoque := CASE WHEN (v_bufferIdReservaEstoque IS NULL OR v_bufferIdReservaEstoque = '' OR v_bufferIdReservaEstoque = ' ') THEN '' ELSE RTRIM (v_bufferIdReservaEstoque) || ';' END || TO_CHAR (LPAD(resEstAnt.idReservaEstoque,14,'0'));
    DELETE MOORCAMENTOXRESERVAESTOQ a WHERE a.idReservaEstoque = resEstAnt.idReservaEstoque;
    DELETE MORESERVASESTOQUE a WHERE a.idReservaEstoque = resEstAnt.idReservaEstoque;
  END LOOP;  
  FOR itens IN c_itens
  LOOP
    ADD_ORCAMENTO_ITEM_RES_ITEM(
      v_bufferIdReservaEstoque, 
      p_estabelecimentoAtivo, 
      itens.modeloDocumento,
      itens.entradaSaida,
      itens.estabelecimento,
      itens.dataEmissao,
      itens.dataEntrega,
      itens.situacaoOrcamento,
      itens.idItemOrcamento,
      itens.cancelado,
      itens.gradeProduto,
      itens.idFormulaTinta,
      itens.personalizacao,
      itens.idLoteEstoque,
      itens.movimentaEstoque,
      itens.localEstoque,
      itens.pessoaParticipante,
      itens.quantidadeSaldo,
      itens.controleEntrega,
      itens.observacoes,
      v_bufferIdReservaEstoque
    );
  END LOOP;
END ADD_ORCAMENTO_CAB_RESERVA_GRAV;

/

create or replace PROCEDURE ADD_ORCAMENTO_CALC_IMP_ITENS (
    p_config_64_casasDecSaidas     IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_330_redIcmsBasePisCof IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_cab_orcamento                IN NUMBER,
    p_cab_modeloDocumento          IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_atualizaCustoMedio       IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEntradaSaida         IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_cab_localDestinoOperacao     IN CHAR,
    p_cab_indicadorConsumidorFinal IN CHAR,
    p_a_cab_tipoPagamentoFrete     IN CHAR,
    p_cab_tipoPagamentoFrete       IN CHAR,
    p_cab_valorProdutosBruto       IN NUMBER,
    p_cab_valorDescontoProdutos    IN NUMBER,
    p_cab_valorAcrescimoProdutos   IN NUMBER,
    p_cab_valorServicosBruto       IN NUMBER,
    p_cab_valorDescontoServicos    IN NUMBER,
    p_cab_valorAcrescimoServicos   IN NUMBER,
    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_modDoc_diminuiDescontoPrUnit IN NUMBER,
    p_modDoc_somaAcrescimosPrUnit  IN NUMBER,
    p_modDoc_somaFreteSeguroPrUnit IN NUMBER,
    p_pess_indicadorInscricaoEstad IN CHAR,
    /* Retornos */
    r_cab_valorProdutos            OUT NUMBER,
    r_cab_valorServicos            OUT NUMBER,
    r_cab_valorBasePagamento       OUT NUMBER,
    r_cab_valorAVistaMinimo        OUT NUMBER,
    r_cab_valorFreteTotal          OUT NUMBER,
    r_cab_valorSeguroTotal         OUT NUMBER,
    r_cab_valorDescontoTotal       OUT NUMBER,
    r_cab_valorOutrasDespesasTotal OUT NUMBER,
    r_cab_valorAdicFreteMarinTotal OUT NUMBER,
    r_cab_valorDespesasAduanTotal  OUT NUMBER,
    r_cab_valorImpSomaPagamento    OUT NUMBER,
    r_cab_valorImpDiminuiPagamento OUT NUMBER,
    r_cab_valorLiquidoItem         OUT NUMBER)
IS
    v_auxNumber                    NUMBER;
    v_acrescimoUnitarioComposicao  NUMBER;
    v_precoUnitario                NUMBER;
    v_precoUnitarioConvertido      NUMBER;
    v_valorProdutoServico          NUMBER;
    v_valorBasePagamento           NUMBER;
    v_valorFreteTotal              NUMBER;
    v_valorSeguroTotal             NUMBER;
    v_valorDescontoTotal           NUMBER;
    v_valorOutrasDespesasTotal     NUMBER;
    v_valorAdicFreteMarinMerTotal  NUMBER;
    v_valorDespesasAduaneirasTotal NUMBER;
    v_baseISSQN                    NUMBER;
    v_valorISSQN                   NUMBER;
    v_baseIRRF                     NUMBER;
    v_valorIRRF                    NUMBER;
    v_baseINSS                     NUMBER;
    v_valorINSS                    NUMBER;
    v_baseRetPIS                   NUMBER;
    v_valorRetPIS                  NUMBER;
    v_baseRetCOFINS                NUMBER;
    v_valorRetCOFINS               NUMBER;
    v_baseRetCSLL                  NUMBER;
    v_valorRetCSLL                 NUMBER;
    v_baseII                       NUMBER;
    v_valorII                      NUMBER;
    v_baseIOF                      NUMBER;
    v_valorIOF                     NUMBER;
    v_baseIPI                      NUMBER;
    v_valorIPI                     NUMBER;
    v_basePIS                      NUMBER;
    v_valorPIS                     NUMBER;
    v_basePISST                    NUMBER;
    v_valorPISST                   NUMBER;
    v_baseCOFINS                   NUMBER;
    v_valorCOFINS                  NUMBER;
    v_baseCOFINSST                 NUMBER;
    v_valorCOFINSST                NUMBER;
    v_baseCreditoSimplesNacional   NUMBER;
    v_valorCreditoSimplesNacional  NUMBER;
    v_baseICMS                     NUMBER;
    v_valorICMSOperacao            NUMBER;
    v_valorICMSDiferido            NUMBER;
    v_valorICMS                    NUMBER;
    v_valorICMSDesoneracao         NUMBER;
    v_baseICMSST                   NUMBER;
    v_valorICMSST                  NUMBER;
    v_baseICMSSTAnteriormente      NUMBER;
    v_valorICMSSTAnteriormente     NUMBER;
    v_valorICMSProprioSubstituto   NUMBER;
    v_baseICMSEfetivo              NUMBER;
    v_valorICMSEfetivo             NUMBER;
    v_baseICMSUFDestinatario       NUMBER;
    v_valorICMSUFDestinatario      NUMBER;
    v_baseICMSUFRemetente          NUMBER;
    v_valorICMSUFRemetente         NUMBER;
    v_baseFCP                      NUMBER;
    v_valorFCP                     NUMBER;
    v_baseFCPST                    NUMBER;
    v_valorFCPST                   NUMBER;
    v_baseFCPSTAnteriormente       NUMBER;
    v_valorFCPSTAnteriormente      NUMBER;
    v_baseFCPUFDestinatario        NUMBER;
    v_valorFCPUFDestinatario       NUMBER;
    v_baseEstimadaImpostos         NUMBER;
    v_valorEstimadoImpFederais     NUMBER;
    v_valorEstimadoImpEstaduais    NUMBER;
    v_valorEstimadoImpMunicipais   NUMBER;
    v_valorImpSomaPagamento        NUMBER;
    v_valorImpDiminuiPagamento     NUMBER;
    v_valorLiquidoItem             NUMBER;
    CURSOR c_item IS
      SELECT
        a.*,
        gradProd.produto,
        gradProd.cor,
        gradProd.tamanho,
        prod.controleEstoque,
        prod.tipoProduto
      FROM MOORCAMENTOXITENS a
      JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
      WHERE a.orcamento = p_cab_orcamento
      AND a.cancelado = 0
      ORDER BY a.sequencia;
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_valorImpSomaPagamento    := 0;
  r_cab_valorImpDiminuiPagamento := 0;
  r_cab_valorLiquidoItem         := 0;
  FOR item IN c_item LOOP
    v_acrescimoUnitarioComposicao  := item.acrescimoUnitarioComposicao;
    v_precoUnitario                := item.precoUnitario;
    v_precoUnitarioConvertido      := item.precoUnitarioConvertido;
    v_valorProdutoServico          := item.valorProdutoServico;
    v_valorBasePagamento           := item.valorBasePagamento;
    v_valorFreteTotal              := item.valorFreteTotal;
    v_valorSeguroTotal             := item.valorSeguroTotal;
    v_valorDescontoTotal           := item.valorDescontoTotal;
    v_valorOutrasDespesasTotal     := item.valorOutrasDespesasTotal;
    v_valorAdicFreteMarinMerTotal  := item.valorAdicFreteMarinhaMerTotal;
    v_valorDespesasAduaneirasTotal := item.valorDespesasAduaneirasTotal;
    v_baseISSQN                    := item.baseISSQN;
    v_valorISSQN                   := item.valorISSQN;
    v_baseIRRF                     := item.baseIRRF;
    v_valorIRRF                    := item.valorIRRF;
    v_baseINSS                     := item.baseINSS;
    v_valorINSS                    := item.valorINSS;
    v_baseRetPIS                   := item.baseRetPIS;
    v_valorRetPIS                  := item.valorRetPIS;
    v_baseRetCOFINS                := item.baseRetCOFINS;
    v_valorRetCOFINS               := item.valorRetCOFINS;
    v_baseRetCSLL                  := item.baseRetCSLL;
    v_valorRetCSLL                 := item.valorRetCSLL;
    v_baseII                       := item.baseII;
    v_valorII                      := item.valorII;
    v_baseIOF                      := item.baseIOF;
    v_valorIOF                     := item.valorIOF;
    v_baseIPI                      := item.baseIPI;
    v_valorIPI                     := item.valorIPI;
    v_basePIS                      := item.basePIS;
    v_valorPIS                     := item.valorPIS;
    v_basePISST                    := item.basePISST;
    v_valorPISST                   := item.valorPISST;
    v_baseCOFINS                   := item.baseCOFINS;
    v_valorCOFINS                  := item.valorCOFINS;
    v_baseCOFINSST                 := item.baseCOFINSST;
    v_valorCOFINSST                := item.valorCOFINSST;
    v_baseCreditoSimplesNacional   := item.baseCreditoSimplesNacional;
    v_valorCreditoSimplesNacional  := item.valorCreditoSimplesNacional;
    v_baseICMS                     := item.baseICMS;
    v_valorICMSOperacao            := item.valorICMSOperacao;
    v_valorICMSDiferido            := item.valorICMSDiferido;
    v_valorICMS                    := item.valorICMS;
    v_valorICMSDesoneracao         := item.valorICMSDesoneracao;
    v_baseICMSST                   := item.baseICMSST;
    v_valorICMSST                  := item.valorICMSST;
    v_baseICMSSTAnteriormente      := item.baseICMSSTAnteriormente;
    v_valorICMSSTAnteriormente     := item.valorICMSSTAnteriormente;
    v_valorICMSProprioSubstituto   := item.valorICMSProprioSubstituto;
    v_baseICMSEfetivo              := item.baseICMSEfetivo;
    v_valorICMSEfetivo             := item.valorICMSEfetivo;
    v_baseICMSUFDestinatario       := item.baseICMSUFDestinatario;
    v_valorICMSUFDestinatario      := item.valorICMSUFDestinatario;
    v_baseICMSUFRemetente          := item.baseICMSUFRemetente;
    v_valorICMSUFRemetente         := item.valorICMSUFRemetente;
    v_baseFCP                      := item.baseFCP;
    v_valorFCP                     := item.valorFCP;
    v_baseFCPST                    := item.baseFCPST;
    v_valorFCPST                   := item.valorFCPST;
    v_baseFCPSTAnteriormente       := item.baseFCPSTAnteriormente;
    v_valorFCPSTAnteriormente      := item.valorFCPSTAnteriormente;
    v_baseFCPUFDestinatario        := item.baseFCPUFDestinatario;
    v_valorFCPUFDestinatario       := item.valorFCPUFDestinatario;
    v_baseEstimadaImpostos         := item.baseEstimadaImpostos;
    v_valorEstimadoImpFederais     := item.valorEstimadoImpFederais;
    v_valorEstimadoImpEstaduais    := item.valorEstimadoImpEstaduais;
    v_valorEstimadoImpMunicipais   := item.valorEstimadoImpMunicipais;
    v_valorImpSomaPagamento        := item.valorImpostosSomaPagamento;
    v_valorImpDiminuiPagamento     := item.valorImpostosDiminuiPagamento;
    v_valorLiquidoItem             := item.valorLiquidoItem;
    ADD_CALCULA_TOTAIS_ITEM(
      ' ',
      ' ',
      0,
      0,
      0,
      0,
      'O',
      p_cab_entradaSaida,
      0,
      p_a_cab_tipoPagamentoFrete,
      p_cab_tipoPagamentoFrete,
      p_cab_impostosEditados,
      p_modDoc_diminuiDescontoPrUnit,
      p_modDoc_somaAcrescimosPrUnit,
      p_modDoc_somaFreteSeguroPrUnit,
      item.idItemOrcamento,
      item.quantidade,
      item.quantidadeConvertida,
      item.precoUnitarioBruto,
      v_precoUnitario,
      item.valorProdutoServicoBruto,
      v_valorProdutoServico,
      item.valorDescontoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      item.valorFreteGeral,
      item.valorSeguroGeral,
      item.valorDescontoGeral,
      item.valorOutrasDespesasGeral,
      item.valorAdicFreteMarinhaMerGeral,
      item.valorDespesasAduaneirasGeral,
      item.valorDescontoPagamento,
      item.valorOutrasDespesasPagamento,
      item.valorJurosPagamento,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal,
      0,
      0,
      0,
      0,
      0,
      /* Retornos */
      v_acrescimoUnitarioComposicao,
      v_auxNumber,
      v_precoUnitario,
      v_auxNumber,
      v_precoUnitarioConvertido,
      v_auxNumber,
      v_valorProdutoServico,
      v_auxNumber,
      v_auxNumber,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber);
    ADD_CALCULA_IMPOSTOS_ITEM (
      p_config_64_casasDecSaidas,
      p_config_209_filtrarGrupoEcon,
      p_config_330_redIcmsBasePisCof,
      p_config_362_calcCustoPorGrade,
      p_cab_entradaSaida,
      0,
      p_cab_estabelecimento,
      0,
      p_cab_dataEntradaSaida,
      p_cab_pessoa,
      p_cab_localDestinoOperacao,
      p_cab_indicadorConsumidorFinal,
      p_cab_tipoPagamentoFrete,
      p_pess_indicadorInscricaoEstad,
      item.personalizacao,
      item.quantidade,
      item.precoPautaTabelado,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal,
      item.cfop,
      1,
      item.indicadorISSQN,
      item.aliquotaISSQN,
      v_baseISSQN,
      v_valorISSQN,
      1,
      item.aliquotaIRRF,
      v_baseIRRF,
      v_valorIRRF,
      1,
      item.aliquotaINSS,
      v_baseINSS,
      v_valorINSS,
      1,
      item.retencaoPIS,
      v_baseRetPIS,
      v_valorRetPIS,
      1,
      item.retencaoCOFINS,
      v_baseRetCOFINS,
      v_valorRetCOFINS,
      1,
      item.retencaoCSLL,
      v_baseRetCSLL,
      v_valorRetCSLL,
      1,
      item.aliquotaII,
      v_baseII,
      v_valorII,
      1,
      item.aliquotaIOF,
      v_baseIOF,
      v_valorIOF,
      1,
      item.aliquotaIPI,
      item.valorAliquotaIPI,
      v_baseIPI,
      v_valorIPI,
      0,
      1,
      item.aliquotaPIS,
      item.valorAliquotaPIS,
      v_basePIS,
      v_valorPIS,
      1,
      item.aliquotaPISST,
      item.valorAliquotaPISST,
      v_basePISST,
      v_valorPISST,
      1,
      item.aliquotaCOFINS,
      item.valorAliquotaCOFINS,
      v_baseCOFINS,
      v_valorCOFINS,
      1,
      item.aliquotaCOFINSST,
      item.valorAliquotaCOFINSST,
      v_baseCOFINSST,
      v_valorCOFINSST,
      1,
      item.stSimplesNacional,
      item.creditoSimplesNacional,
      v_baseCreditoSimplesNacional,
      v_valorCreditoSimplesNacional,
      1,
      item.stICMS,
      item.modalidadeBaseCalcICMS,
      item.reducaoBaseICMS,
      item.aliquotaICMS,
      item.diferimentoICMS,
      v_baseICMS,
      v_valorICMSOperacao,
      v_valorICMSDiferido,
      v_valorICMS,
      v_valorICMSDesoneracao,
      1,
      item.modalidadeBaseCalcICMSST,
      item.margemValorAdicionadoST,
      item.reducaoBaseST,
      item.aliquotaICMSST,
      v_baseICMSST,
      v_valorICMSST,
      1,
      v_baseICMSSTAnteriormente,
      v_valorICMSSTAnteriormente,
      v_valorICMSProprioSubstituto,
      item.reducaoBaseICMSEfetivo,
      item.aliquotaICMSEfetivo,
      v_baseICMSEfetivo,
      v_valorICMSEfetivo,
      0,
      '  ',
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      1,
      item.aliquotaICMSUFDestinatario,
      item.aliquotaICMSInterestadual,
      item.partilhaICMSInterestadual,
      v_baseICMSUFDestinatario,
      v_valorICMSUFDestinatario,
      v_baseICMSUFRemetente,
      v_valorICMSUFRemetente,
      1,
      item.aliquotaFCP,
      v_baseFCP,
      v_valorFCP,
      item.aliquotaFCPST,
      v_baseFCPST,
      v_valorFCPST,
      item.aliquotaFCPSTAnteriormente,
      v_baseFCPSTAnteriormente,
      v_valorFCPSTAnteriormente,
      item.aliquotaFCPUFDestinatario,
      v_baseFCPUFDestinatario,
      v_valorFCPUFDestinatario,
      1,
      item.aliquotaEstimadaImpFederais,
      item.aliquotaEstimadaImpEstaduais,
      item.aliquotaEstimadaImpMunicipais,
      v_baseEstimadaImpostos,
      v_valorEstimadoImpFederais,
      v_valorEstimadoImpEstaduais,
      v_valorEstimadoImpMunicipais,
      item.produto,
      item.cor,
      item.tamanho,
      item.controleEstoque,
      item.tipoProduto,
      /* Retornos */
      v_baseISSQN,
      v_valorISSQN,
      v_baseIRRF,
      v_valorIRRF,
      v_baseINSS,
      v_valorINSS,
      v_baseRetPIS,
      v_valorRetPIS,
      v_baseRetCOFINS,
      v_valorRetCOFINS,
      v_baseRetCSLL,
      v_valorRetCSLL,
      v_baseII,
      v_valorII,
      v_baseIOF,
      v_valorIOF,
      v_baseIPI,
      v_valorIPI,
      v_basePIS,
      v_valorPIS,
      v_basePISST,
      v_valorPISST,
      v_baseCOFINS,
      v_valorCOFINS,
      v_baseCOFINSST,
      v_valorCOFINSST,
      v_baseCreditoSimplesNacional,
      v_valorCreditoSimplesNacional,
      v_baseICMS,
      v_valorICMSOperacao,
      v_valorICMSDiferido,
      v_valorICMS,
      v_valorICMSDesoneracao,
      v_baseICMSST,
      v_valorICMSST,
      v_baseICMSSTAnteriormente,
      v_valorICMSSTAnteriormente,
      v_valorICMSProprioSubstituto,
      v_baseICMSEfetivo,
      v_valorICMSEfetivo,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_baseICMSUFDestinatario,
      v_valorICMSUFDestinatario,
      v_baseICMSUFRemetente,
      v_valorICMSUFRemetente,
      v_baseFCP,
      v_valorFCP,
      v_baseFCPST,
      v_valorFCPST,
      v_baseFCPSTAnteriormente,
      v_valorFCPSTAnteriormente,
      v_baseFCPUFDestinatario,
      v_valorFCPUFDestinatario,
      v_baseEstimadaImpostos,
      v_valorEstimadoImpFederais,
      v_valorEstimadoImpEstaduais,
      v_valorEstimadoImpMunicipais);
    ADD_CALCULA_VALOR_LIQUIDO (
      0,
      p_cab_tipoPagamentoFrete,
      item.geraFinanceiro,
      v_valorProdutoServico,
      item.valorDescontoPagamento,
      item.valorOutrasDespesasPagamento,
      item.valorJurosPagamento,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorIRRF,
      v_valorINSS,
      v_valorRetPIS,
      v_valorRetCOFINS,
      v_valorRetCSLL,
      v_valorII,
      v_valorIOF,
      v_valorIPI,
      0,
      v_valorICMSST,
      0,
      0,
      0,
      /* Retornos */
      v_valorBasePagamento,
      v_valorImpSomaPagamento,
      v_valorImpDiminuiPagamento,
      v_valorLiquidoItem);
    UPDATE MOORCAMENTOXITENS SET
      acrescimoUnitarioComposicao   = v_acrescimoUnitarioComposicao,
      precoUnitario                 = v_precoUnitario,
      precoUnitarioConvertido       = v_precoUnitarioConvertido,
      valorProdutoServico           = v_valorProdutoServico,
      valorBasePagamento            = v_valorBasePagamento,
      valorFreteTotal               = v_valorFreteTotal,
      valorSeguroTotal              = v_valorSeguroTotal,
      valorDescontoTotal            = v_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
      valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
      baseISSQN                     = v_baseISSQN,
      valorISSQN                    = v_valorISSQN,
      baseIRRF                      = v_baseIRRF,
      valorIRRF                     = v_valorIRRF,
      baseINSS                      = v_baseINSS,
      valorINSS                     = v_valorINSS,
      baseRetPIS                    = v_baseRetPIS,
      valorRetPIS                   = v_valorRetPIS,
      baseRetCOFINS                 = v_baseRetCOFINS,
      valorRetCOFINS                = v_valorRetCOFINS,
      baseRetCSLL                   = v_baseRetCSLL,
      valorRetCSLL                  = v_valorRetCSLL,
      baseII                        = v_baseII,
      valorII                       = v_valorII,
      baseIOF                       = v_baseIOF,
      valorIOF                      = v_valorIOF,
      baseIPI                       = v_baseIPI,
      valorIPI                      = v_valorIPI,
      basePIS                       = v_basePIS,
      valorPIS                      = v_valorPIS,
      basePISST                     = v_basePISST,
      valorPISST                    = v_valorPISST,
      baseCOFINS                    = v_baseCOFINS,
      valorCOFINS                   = v_valorCOFINS,
      baseCOFINSST                  = v_baseCOFINSST,
      valorCOFINSST                 = v_valorCOFINSST,
      baseCreditoSimplesNacional    = v_baseCreditoSimplesNacional,
      valorCreditoSimplesNacional   = v_valorCreditoSimplesNacional,
      baseICMS                      = v_baseICMS,
      valorICMSOperacao             = v_valorICMSOperacao,
      valorICMSDiferido             = v_valorICMSDiferido,
      valorICMS                     = v_valorICMS,
      valorICMSDesoneracao          = v_valorICMSDesoneracao,
      baseICMSST                    = v_baseICMSST,
      valorICMSST                   = v_valorICMSST,
      baseICMSSTAnteriormente       = v_baseICMSSTAnteriormente,
      valorICMSSTAnteriormente      = v_valorICMSSTAnteriormente,
      valorICMSProprioSubstituto    = v_valorICMSProprioSubstituto,
      baseICMSEfetivo               = v_baseICMSEfetivo,
      valorICMSEfetivo              = v_valorICMSEfetivo,
      baseICMSUFDestinatario        = v_baseICMSUFDestinatario,
      valorICMSUFDestinatario       = v_valorICMSUFDestinatario,
      baseICMSUFRemetente           = v_baseICMSUFRemetente,
      valorICMSUFRemetente          = v_valorICMSUFRemetente,
      baseFCP                       = v_baseFCP,
      valorFCP                      = v_valorFCP,
      baseFCPST                     = v_baseFCPST,
      valorFCPST                    = v_valorFCPST,
      baseFCPSTAnteriormente        = v_baseFCPSTAnteriormente,
      valorFCPSTAnteriormente       = v_valorFCPSTAnteriormente,
      baseFCPUFDestinatario         = v_baseFCPUFDestinatario,
      valorFCPUFDestinatario        = v_valorFCPUFDestinatario,
      baseEstimadaImpostos          = v_baseEstimadaImpostos,
      valorEstimadoImpFederais      = v_valorEstimadoImpFederais,
      valorEstimadoImpEstaduais     = v_valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais    = v_valorEstimadoImpMunicipais,
      valorImpostosSomaPagamento    = v_valorImpSomaPagamento,
      valorImpostosDiminuiPagamento = v_valorImpDiminuiPagamento,
      valorLiquidoItem              = v_valorLiquidoItem
    WHERE idItemOrcamento           = item.idItemOrcamento;
    IF item.servico = 1 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 item.usarPrecoAVista = 1 AND item.geraFinanceiro = 1 THEN
      r_cab_valorAVistaMinimo        := r_cab_valorAVistaMinimo + v_valorProdutoServico + item.valorDescontoPagamento - item.valorOutrasDespesasPagamento - item.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_valorImpSomaPagamento    := r_cab_valorImpSomaPagamento + v_valorImpSomaPagamento;
    r_cab_valorImpDiminuiPagamento := r_cab_valorImpDiminuiPagamento + v_valorImpDiminuiPagamento;
    r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem + v_valorLiquidoItem;
  END LOOP;
END ADD_ORCAMENTO_CALC_IMP_ITENS;

/

create or replace PROCEDURE ADD_ORCAMENTO_CALC_IMP_CAB (
    p_uniqueMachineID              IN VARCHAR2,
    p_config_64_casasDecSaidas     IN CHAR,
    p_config_65_casasDecEntrada    IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_330_redIcmsBasePisCof IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_regMarg_tipoPreco            IN CHAR,
    p_regMarg_tabelaPreco          IN VARCHAR2,
    p_regMarg_fatorMultiplicador   IN NUMBER,
    p_regMarg_tipoPrecoB           IN CHAR,
    p_regMarg_tabelaPrecoB         IN VARCHAR2,
    p_regMarg_fatorMultiplicadorB  IN NUMBER,
    p_regMarg_reduzirImpostos      IN NUMBER,
    p_regMarg_reduzirTarifaCartao  IN NUMBER,
    p_regMarg_taxaCapitacaoCustoFi IN NUMBER,
    p_regMarg_exibPercMargemCab    IN NUMBER,
    p_regMarg_exibImagemMargemCab  IN NUMBER,
    p_regMarg_regraImagemCab       IN NUMBER,
    p_regMarg_bloqPercMargemCab    IN NUMBER,
    p_regMarg_exibPercMargemItem   IN NUMBER,
    p_regMarg_exibImagemMargemItem IN NUMBER,
    p_regMarg_regraImagemItem      IN NUMBER,
    p_regMarg_exibDetMargemItem    IN NUMBER,
    p_regMarg_bloqPercMargemItem   IN NUMBER,
    p_calcularMargemContribuicao   IN NUMBER,
    p_cab_orcamento                IN NUMBER,
    p_a_cab_tipoPagamentoFrete     IN CHAR,
    /* Retornos */
    r_cab_valorProdutos            OUT NUMBER,
    r_cab_valorServicos            OUT NUMBER,
    r_cab_valorBasePagamento       OUT NUMBER,
    r_cab_valorAVistaMinimo        OUT NUMBER,
    r_cab_valorFreteTotal          OUT NUMBER,
    r_cab_valorSeguroTotal         OUT NUMBER,
    r_cab_valorAdicFreteMarinTotal OUT NUMBER,
    r_cab_valorDespesasAduanTotal  OUT NUMBER,
    r_cab_valorImpSomaPagamento    OUT NUMBER,
    r_cab_valorImpDiminuiPagamento OUT NUMBER,
    r_cab_valorLiquidoItem         OUT NUMBER,
    r_cab_valorTarifaCartao        OUT NUMBER,
    r_cab_valorMargem              OUT NUMBER,
    r_cab_percentualMargem         OUT NUMBER,
    r_cab_imagemMargem             OUT VARCHAR2)
IS
    v_cab_valorDescontoTotal       NUMBER;
    v_cab_valorOutrasDespesasTotal NUMBER;
    v_calcularImpostosItem         NUMBER;
    CURSOR c_cab IS
      SELECT a.*,
        modDoc.diminuiDescontoPrUnit,
        modDoc.somaAcrescimosPrUnit,
        modDoc.somaFreteSeguroPrUnit,
        modDoc.habilitaControleEntrega,
        pess.indicadorInscricaoEstadual,
        COALESCE((
          SELECT MIN(munEndEst.uf)
          FROM PAESTABELECIMENTOS est
          JOIN CAENDERECOSPESSOA endEst ON endEst.pessoa = est.pessoaEstabelecimento
          JOIN SIMUNICIPIOS munEndEst on munEndEst.municipio = endEst.municipio
          WHERE est.estabelecimento = a.estabelecimento
          AND endEst.ativo = 1
          AND endEst.principal = 1
          ),'  ') munEndEst_uf
      FROM MOORCAMENTOS a
      JOIN PAMODELOSDOCUMENTO modDoc ON modDoc.modeloDocumento = a.modeloDocumento
      JOIN CAPESSOAS pess ON pess.pessoa = a.pessoa
      WHERE a.orcamento = p_cab_orcamento;
BEGIN
  FOR cab IN c_cab LOOP
    r_cab_valorProdutos            := cab.valorProdutos;
    r_cab_valorServicos            := cab.valorServicos;
    r_cab_valorBasePagamento       := cab.valorBasePagamento;
    r_cab_valorAVistaMinimo        := cab.valorAVistaMinimo;
    r_cab_valorFreteTotal          := cab.valorFreteTotal;
    r_cab_valorSeguroTotal         := cab.valorSeguroTotal;
    v_cab_valorDescontoTotal       := cab.valorDescontoTotal;
    v_cab_valorOutrasDespesasTotal := cab.valorOutrasDespesasTotal;
    r_cab_valorAdicFreteMarinTotal := cab.valorAdicFreteMarinhaMerTotal;
    r_cab_valorDespesasAduanTotal  := cab.valorDespesasAduaneirasTotal;
    r_cab_valorImpSomaPagamento    := cab.valorImpostosSomaPagamento;
    r_cab_valorImpDiminuiPagamento := cab.valorImpostosDiminuiPagamento;
    r_cab_valorLiquidoItem         := cab.valorLiquidoItem;
    r_cab_valorTarifaCartao        := 0;
    r_cab_valorMargem              := 0;
    r_cab_percentualMargem         := 0;
    r_cab_imagemMargem             := ' ';
    v_calcularImpostosItem         := 0;
    ADD_ORCAMENTO_CALC_IMP_RATEIO (
      cab.orcamento,
      cab.modeloDocumento,
      cab.entradaSaida,
      cab.atualizaCustoMedio,
      p_a_cab_tipoPagamentoFrete,
      cab.tipoPagamentoFrete,
      cab.valorFreteGeral,
      cab.valorSeguroGeral,
      cab.valorDescontoGeral,
      cab.valorOutrasDespesasGeral,
      cab.valorAdicFreteMarinhaMerGeral,
      cab.valorDespesasAduaneirasGeral,
      cab.valorDescontoPagamento,
      cab.valorOutrasDespesasPagamento,
      cab.valorJurosPagamento,
      cab.impostosEditados,
      cab.diminuiDescontoPrUnit,
      cab.somaAcrescimosPrUnit,
      cab.somaFreteSeguroPrUnit,
      cab.habilitaControleEntrega,
      /* Retornos */
      r_cab_valorProdutos,
      r_cab_valorServicos,
      r_cab_valorBasePagamento,
      r_cab_valorAVistaMinimo,
      r_cab_valorFreteTotal,
      r_cab_valorSeguroTotal,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespesasTotal,
      r_cab_valorAdicFreteMarinTotal,
      r_cab_valorDespesasAduanTotal,
      r_cab_valorImpSomaPagamento,
      r_cab_valorImpDiminuiPagamento,
      r_cab_valorLiquidoItem,
      v_calcularImpostosItem);
    IF v_calcularImpostosItem = 1 THEN
      ADD_ORCAMENTO_CALC_IMP_ITENS(
        p_config_64_casasDecSaidas,
        p_config_209_filtrarGrupoEcon,
        p_config_330_redIcmsBasePisCof,
        p_config_362_calcCustoPorGrade,
        cab.orcamento,
        cab.modeloDocumento,
        cab.entradaSaida,
        cab.atualizaCustoMedio,
        cab.estabelecimento,
        cab.dataEmissao,
        cab.pessoa,
        cab.localDestinoOperacao,
        cab.indicadorConsumidorFinal,
        p_a_cab_tipoPagamentoFrete,
        cab.tipoPagamentoFrete,
        cab.valorProdutosBruto,
        cab.valorDescontoProdutos,
        cab.valorAcrescimoProdutos,
        cab.valorServicosBruto,
        cab.valorDescontoServicos,
        cab.valorAcrescimoServicos,
        cab.valorFreteGeral,
        cab.valorSeguroGeral,
        cab.valorDescontoGeral,
        cab.valorOutrasDespesasGeral,
        cab.valorAdicFreteMarinhaMerGeral,
        cab.valorDespesasAduaneirasGeral,
        cab.valorDescontoPagamento,
        cab.valorOutrasDespesasPagamento,
        cab.valorJurosPagamento,
        cab.impostosEditados,
        cab.diminuiDescontoPrUnit,
        cab.somaAcrescimosPrUnit,
        cab.somaFreteSeguroPrUnit,
        cab.indicadorInscricaoEstadual,
        /* Retornos */
        r_cab_valorProdutos,
        r_cab_valorServicos,
        r_cab_valorBasePagamento,
        r_cab_valorAVistaMinimo,
        r_cab_valorFreteTotal,
        r_cab_valorSeguroTotal,
        v_cab_valorDescontoTotal,
        v_cab_valorOutrasDespesasTotal,
        r_cab_valorAdicFreteMarinTotal,
        r_cab_valorDespesasAduanTotal,
        r_cab_valorImpSomaPagamento,
        r_cab_valorImpDiminuiPagamento,
        r_cab_valorLiquidoItem);
    END IF;
    IF p_calcularMargemContribuicao = 1 AND (p_regMarg_exibPercMargemCab = 1 OR p_regMarg_exibImagemMargemCab = 1 OR p_regMarg_bloqPercMargemCab = 1 OR p_regMarg_exibPercMargemItem = 1 OR p_regMarg_exibImagemMargemItem = 1 OR p_regMarg_exibDetMargemItem = 1 OR p_regMarg_bloqPercMargemItem = 1) AND cab.tipoDocumento IN (101,102,301,501,503) THEN
      r_cab_valorTarifaCartao := FUNC_ADD_TARIFA_CART_ORCAMENTO (cab.orcamento);
    END IF;
    IF p_calcularMargemContribuicao = 1 AND (p_regMarg_exibPercMargemCab = 1 OR p_regMarg_exibImagemMargemCab = 1 OR p_regMarg_exibPercMargemItem = 1 OR p_regMarg_exibImagemMargemItem = 1 OR p_regMarg_exibDetMargemItem = 1) AND cab.tipoDocumento IN (101,102,301,501,503) THEN
      EXECUTE IMMEDIATE '
        DELETE TEMPMARGEMCONTRIBUICAO
        WHERE uniqueMachineID = :1
        AND orcamentoPredocumentoDocumento = :2
        AND idCabecalho = :3'
        USING 
          p_uniqueMachineID,
          'O',
          cab.orcamento;
      ADD_ORCAMENTO_GERA_TEMP_MARGEM(
        p_uniqueMachineID,
        p_config_65_casasDecEntrada,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_regMarg_tipoPreco,
        p_regMarg_tabelaPreco,
        p_regMarg_fatorMultiplicador,
        p_regMarg_tipoPrecoB,
        p_regMarg_tabelaPrecoB,
        p_regMarg_fatorMultiplicadorB,
        p_regMarg_reduzirImpostos,
        p_regMarg_reduzirTarifaCartao,
        p_regMarg_taxaCapitacaoCustoFi,
        p_regMarg_exibImagemMargemCab,
        p_regMarg_regraImagemCab,
        p_regMarg_exibImagemMargemItem,
        p_regMarg_regraImagemItem,
        cab.orcamento,
        cab.estabelecimento,
        cab.dataEmissao,
        cab.prazoMedioPonderado,
        r_cab_valorFreteTotal,
        r_cab_valorSeguroTotal,
        r_cab_valorAdicFreteMarinTotal,
        r_cab_valorDespesasAduanTotal,
        r_cab_valorLiquidoItem,
        r_cab_valorTarifaCartao,
        cab.munEndEst_uf,
        /* Retornos */
        r_cab_valorMargem,
        r_cab_percentualMargem,
        r_cab_imagemMargem);
    END IF;
    UPDATE MOORCAMENTOS SET 
      valorProdutos                 = r_cab_valorProdutos,
      valorServicos                 = r_cab_valorServicos,
      valorBasePagamento            = r_cab_valorBasePagamento,
      valorAVistaMinimo             = r_cab_valorAVistaMinimo,
      valorFreteTotal               = r_cab_valorFreteTotal,
      valorSeguroTotal              = r_cab_valorSeguroTotal,
      valorDescontoTotal            = v_cab_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = r_cab_valorAdicFreteMarinTotal,
      valorDespesasAduaneirasTotal  = r_cab_valorDespesasAduanTotal,
      valorImpostosSomaPagamento    = r_cab_valorImpSomaPagamento,
      valorImpostosDiminuiPagamento = r_cab_valorImpDiminuiPagamento,
      valorLiquidoItem              = r_cab_valorLiquidoItem
    WHERE orcamento                 = cab.orcamento;
  END LOOP;
END ADD_ORCAMENTO_CALC_IMP_CAB;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_EST_ATUALIZA(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_idItemPreDocumento           IN NUMBER,
    p_estabelecimentoAtivo         IN NUMBER
  )
IS
  v_bufferIdEstoque        VARCHAR2 (32000);
  CURSOR c_estoqueExcluir
  IS 
    SELECT a.idEstoque
    FROM MOESTOQUES a
    JOIN MOPREDOCUMXESTOQUE b ON b.idEstoque = a.idEstoque
    WHERE b.idItemPreDocumento = p_idItemPreDocumento
    ORDER BY a.idEstoque;
  CURSOR c_item
  IS 
    SELECT
      cab.modeloDocumento,
      cab.entradaSaida,
      cab.atualizaCustoMedio,
      cab.atualizaUltimaCompra,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      modDoc.geraTransferencia,
      modDoc.geraOperacaoEmTransito,
      modDoc.transitoLocalEstoque,
      locEstTransito.indicadorPropriedadePosseItem locEstTransito_indicProprPos,
      item.idItemPreDocumento,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoque,
      item.pessoaParticipante,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem locEst_indicProprPosseItem,
      COALESCE (estXLoc.solicitaEnderecoEstoque,0) estXLoc_solicitaEnderecoEst,
      COALESCE (cabTransf.estabelecimentoEntrada,0) docTransf_estabelecEntrada,
      COALESCE (cabTransf.estabelecimentoSaida,0) docTransf_estabelecSaida
    FROM MOPREDOCUMXITENS item
    JOIN MOPREDOCUMENTOS cab ON cab.preDocumento = item.preDocumento
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
    JOIN PAMODELOSDOCUMENTO modDoc ON modDoc.modeloDocumento = cab.modeloDocumento
    JOIN PALOCAISESTOQUE locEstTransito ON locEstTransito.localEstoque = modDoc.transitoLocalEstoque 
    JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = item.localEstoque
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc ON estXLoc.estabelecimento = cab.estabelecimento AND estXLoc.localEstoque = item.localEstoque
    LEFT JOIN MODOCTRANSFXPREDOCUM transfXDoc ON transfXDoc.idItemPreDocumento = item.idItemPreDocumento AND transfXDoc.entradaSaidaOriginal IN ('E','S')
    LEFT JOIN MODOCUMENTOTRANSFXITENS itemTransf ON itemTransf.idItemDocTransferencia = transfXDoc.idItemDocTransferencia
    LEFT JOIN MODOCUMENTOSTRANSFERENCIA cabTransf ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
    WHERE item.idItemPreDocumento = p_idItemPreDocumento
    AND item.cancelado = 0
    AND item.quantidade+item.quantidadeExtemporanea > 0
    AND item.movimentaEstoque = 1
    AND cab.statusPreDocumento = 'A';
BEGIN
  v_bufferIdEstoque := '';
  FOR estoqueExcluir IN c_estoqueExcluir
  LOOP
    v_bufferIdEstoque := CASE WHEN (v_bufferIdEstoque IS NULL OR v_bufferIdEstoque = '' OR v_bufferIdEstoque = ' ') THEN '' ELSE RTRIM (v_bufferIdEstoque) || ';' END || TO_CHAR (LPAD(estoqueExcluir.idEstoque,14,'0'));
    DELETE MODOCFISCALXESTOQUE a WHERE a.idEstoque = estoqueExcluir.idEstoque;
    DELETE MOESTOQUES a WHERE a.idEstoque = estoqueExcluir.idEstoque;
  END LOOP;
  FOR item IN c_item
  LOOP
    ADD_PRE_DOC_ITEM_EST_GRAVA(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_bufferIdEstoque,
      p_estabelecimentoAtivo,
      item.modeloDocumento,
      item.atualizaCustoMedio,
      item.atualizaUltimaCompra,
      item.entradaSaida,
      item.estabelecimento,
      item.dataEmissao,
      item.dataEntradaSaida,
      item.geraTransferencia,
      item.geraOperacaoEmTransito,
      item.transitoLocalEstoque,
      item.locEstTransito_indicProprPos,
      item.idItemPreDocumento,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoque,
      item.pessoaParticipante,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.observacoes,
      item.controlaNumeroSerie,
      item.controleEstoque,
      item.locEst_indicProprPosseItem,
      item.estXLoc_solicitaEnderecoEst,
      item.docTransf_estabelecEntrada,
      item.docTransf_estabelecSaida,
      v_bufferIdEstoque);
  END LOOP;  
END ADD_PRE_DOC_ITEM_EST_ATUALIZA;

/

create or replace PROCEDURE ADD_PRE_DOC_GERA_TEMP_MARGEM (
    p_uniqueMachineID              IN VARCHAR2,
    p_config_65_casasDecEntrada    IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_regMarg_tipoPreco            IN CHAR,
    p_regMarg_tabelaPreco          IN VARCHAR2,
    p_regMarg_fatorMultiplicador   IN NUMBER,
    p_regMarg_tipoPrecoB           IN CHAR,
    p_regMarg_tabelaPrecoB         IN VARCHAR2,
    p_regMarg_fatorMultiplicadorB  IN NUMBER,
    p_regMarg_reduzirImpostos      IN NUMBER,
    p_regMarg_reduzirTarifaCartao  IN NUMBER,
    p_regMarg_taxaCapitacaoCustoFi IN NUMBER,
    p_regMarg_exibImagemMargemCab  IN NUMBER,
    p_regMarg_regraImagemCab       IN NUMBER,
    p_regMarg_exibImagemMargemItem IN NUMBER,
    p_regMarg_regraImagemItem      IN NUMBER,
    p_cab_preDocumento             IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEmissao              IN DATE,
    p_cab_prazoMedioPonderado      IN NUMBER,
    p_cab_valorFreteTotal          IN NUMBER,
    p_cab_valorSeguroTotal         IN NUMBER,
    p_cab_valorAdicFreteMarinTotal IN NUMBER,
    p_cab_valorDespesasAduanTotal  IN NUMBER,
    p_cab_valorLiquidoItem         IN NUMBER,
    p_cab_valorTarifaCartao        IN NUMBER,
    p_munEndEst_uf                 IN CHAR,
    /* Retornos */
    r_cab_valorMargem              OUT NUMBER,
    r_cab_percentualMargem         OUT NUMBER,
    r_cab_imagemMargem             OUT VARCHAR2)
IS
    v_valorLiquidoSemFreteSeguro   NUMBER;
    v_valorCaptacao                NUMBER;
    v_valorTarifaCartao            NUMBER;
    v_valorImpostos                NUMBER;
    v_precoCusto                   NUMBER;
    v_valorCusto                   NUMBER;
    v_valorMargem                  NUMBER;
    v_percentualMargem             NUMBER;
    v_imagemMargem                 VARCHAR2(256);
    CURSOR c_item IS
      SELECT
        a.sequencia,
        a.cancelado,
        a.idFormulaTinta,
        a.personalizacao,
        a.localEstoque,
        a.pessoaParticipante,
        a.quantidade,
        a.valorFreteTotal,
        a.valorSeguroTotal,
        a.valorAdicFreteMarinhaMerTotal,
        a.valorDespesasAduaneirasTotal,
        a.valorII,
        a.valorIOF,
        a.valorIPI,
        a.valorIPIDevolucao,
        a.valorPIS,
        a.valorPISST,
        a.valorCOFINS,
        a.valorCOFINSST,
        a.valorCreditoSimplesNacional,
        a.valorICMSOperacao,
        a.valorICMSDiferido,
        a.valorICMS,
        a.valorICMSDesoneracao,
        a.valorICMSST,
        a.valorICMSSTAnteriormente,
        a.valorICMSUFDestinatario,
        a.valorICMSUFRemetente,
        a.valorFCP,
        a.valorFCPST,
        a.valorFCPSTAnteriormente,
        a.valorFCPUFDestinatario,
        a.valorLiquidoItem,
        gradProd.produto,
        gradProd.cor,
        gradProd.tamanho,
        prod.controleEstoque,
        locEst.indicadorPropriedadePosseItem
      FROM MOPREDOCUMXITENS a
      JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
      JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = a.localEstoque
      WHERE preDocumento = p_cab_preDocumento;
BEGIN
  r_cab_valorMargem      := 0;
  r_cab_percentualMargem := 0;
  r_cab_imagemMargem     := ' ';
  FOR item IN c_item LOOP
    ADD_CALCULA_MARGEM_CONTRIB (
      p_config_65_casasDecEntrada,
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_regMarg_tipoPreco,
      p_regMarg_tabelaPreco,
      p_regMarg_fatorMultiplicador,
      p_regMarg_tipoPrecoB,
      p_regMarg_tabelaPrecoB,
      p_regMarg_fatorMultiplicadorB,
      p_regMarg_reduzirImpostos,
      p_regMarg_reduzirTarifaCartao,
      p_regMarg_taxaCapitacaoCustoFi,
      p_regMarg_exibImagemMargemItem,
      p_regMarg_regraImagemItem,
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_cab_prazoMedioPonderado,
      p_cab_valorLiquidoItem,
      p_cab_valorTarifaCartao,
      p_munEndEst_uf,
      item.idFormulaTinta,
      item.personalizacao,
      item.localEstoque,
      item.pessoaParticipante,
      item.quantidade,
      item.valorFreteTotal,
      item.valorSeguroTotal,
      item.valorAdicFreteMarinhaMerTotal,
      item.valorDespesasAduaneirasTotal,
      item.valorII,
      item.valorIOF,
      item.valorIPI,
      item.valorIPIDevolucao,
      item.valorPIS,
      item.valorPISST,
      item.valorCOFINS,
      item.valorCOFINSST,
      item.valorCreditoSimplesNacional,
      item.valorICMSOperacao,
      item.valorICMSDiferido,
      item.valorICMS,
      item.valorICMSDesoneracao,
      item.valorICMSST,
      item.valorICMSSTAnteriormente,
      item.valorICMSUFDestinatario,
      item.valorICMSUFRemetente,
      item.valorFCP,
      item.valorFCPST,
      item.valorFCPSTAnteriormente,
      item.valorFCPUFDestinatario,
      item.valorLiquidoItem,
      item.produto,
      item.cor,
      item.tamanho,
      item.controleEstoque,
      item.indicadorPropriedadePosseItem,
      /* Retornos */
      v_valorLiquidoSemFreteSeguro,
      v_valorCaptacao,
      v_valorTarifaCartao,
      v_valorImpostos,
      v_precoCusto,
      v_valorCusto,
      v_valorMargem,
      v_percentualMargem);
    IF p_regMarg_exibImagemMargemItem = 1 AND p_regMarg_regraImagemItem <> 0 THEN
      v_imagemMargem := FUNC_ADD_BUSCA_IMAGEM_FAIXA (p_regMarg_regraImagemItem, v_percentualMargem);
    ELSE
      v_imagemMargem := ' ';
    END IF;
    IF item.cancelado = 0 THEN
      r_cab_valorMargem := r_cab_valorMargem + v_valorMargem;
    END IF;
    INSERT INTO TEMPMARGEMCONTRIBUICAO (
      uniqueMachineID,
      orcamentoPredocumentoDocumento,
      idCabecalho,
      sequencia,
      valorLiquidoSemFreteSeguro,
      valorCaptacao,
      valorTarifaCartao,
      valorImpostos,
      precoCusto,
      valorCusto,
      valorMargem,
      percentualMargem,
      imagemMargem
    ) VALUES (
      p_uniqueMachineID,
      'P',
      p_cab_preDocumento,
      item.sequencia,
      v_valorLiquidoSemFreteSeguro,
      v_valorCaptacao,
      v_valorTarifaCartao,
      v_valorImpostos,
      v_precoCusto,
      v_valorCusto,
      v_valorMargem,
      v_percentualMargem,
      v_imagemMargem);
  END LOOP;
  r_cab_percentualMargem := CASE WHEN p_cab_valorLiquidoItem - p_cab_valorFreteTotal - p_cab_valorSeguroTotal - p_cab_valorAdicFreteMarinTotal - p_cab_valorDespesasAduanTotal = 0 THEN 0 ELSE ROUND ((100 * r_cab_valorMargem / (p_cab_valorLiquidoItem - p_cab_valorFreteTotal - p_cab_valorSeguroTotal - p_cab_valorAdicFreteMarinTotal - p_cab_valorDespesasAduanTotal)), 8) END;
  IF p_regMarg_exibImagemMargemCab = 1 AND p_regMarg_regraImagemCab <> 0 THEN
    r_cab_imagemMargem := FUNC_ADD_BUSCA_IMAGEM_FAIXA (p_regMarg_regraImagemCab, r_cab_percentualMargem);
  END IF;
END ADD_PRE_DOC_GERA_TEMP_MARGEM;

/

create or replace PROCEDURE ADD_PRE_DOC_CAB_EST_ATUALIZA(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_preDocumento                 IN NUMBER,
    p_estabelecimentoAtivo         IN NUMBER
  )
IS
  v_bufferIdEstoque        VARCHAR2 (32000);
  CURSOR c_estoqueExcluir IS 
    SELECT a.idEstoque
    FROM MOESTOQUES a
    JOIN MOPREDOCUMXESTOQUE b ON b.idEstoque = a.idEstoque
    JOIN MOPREDOCUMXITENS c ON c.idItemPreDocumento = b.idItemPreDocumento
    WHERE c.preDocumento = p_preDocumento
    ORDER BY a.idEstoque;
  CURSOR c_item
  IS 
    SELECT 
      cab.modeloDocumento,
      cab.entradaSaida,
      cab.atualizaCustoMedio,
      cab.atualizaUltimaCompra,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      modDoc.geraTransferencia,
      modDoc.geraOperacaoEmTransito,
      modDoc.transitoLocalEstoque,
      locEstTransito.indicadorPropriedadePosseItem locEstTransito_indicProprPos,
      item.idItemPreDocumento,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoque,
      item.pessoaParticipante,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem locEst_indicProprPosseItem,
      COALESCE (estXLoc.solicitaEnderecoEstoque,0) estXLoc_solicitaEnderecoEst,
      COALESCE (cabTransf.estabelecimentoEntrada,0) docTransf_estabelecEntrada,
      COALESCE (cabTransf.estabelecimentoSaida,0) docTransf_estabelecSaida
    FROM MOPREDOCUMXITENS item
    JOIN MOPREDOCUMENTOS cab ON cab.preDocumento = item.preDocumento
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
    JOIN PAMODELOSDOCUMENTO modDoc ON modDoc.modeloDocumento = cab.modeloDocumento
    JOIN PALOCAISESTOQUE locEstTransito ON locEstTransito.localEstoque = modDoc.transitoLocalEstoque 
    JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = item.localEstoque
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc ON estXLoc.estabelecimento = cab.estabelecimento AND estXLoc.localEstoque = item.localEstoque
    LEFT JOIN MODOCTRANSFXPREDOCUM transfXDoc ON transfXDoc.idItemPreDocumento = item.idItemPreDocumento AND transfXDoc.entradaSaidaOriginal IN ('E','S')
    LEFT JOIN MODOCUMENTOTRANSFXITENS itemTransf ON itemTransf.idItemDocTransferencia = transfXDoc.idItemDocTransferencia
    LEFT JOIN MODOCUMENTOSTRANSFERENCIA cabTransf ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
    WHERE item.preDocumento = p_preDocumento
    AND item.cancelado = 0
    AND item.quantidade+item.quantidadeExtemporanea > 0
    AND item.movimentaEstoque = 1
    AND cab.statusPreDocumento = 'A';
BEGIN
  v_bufferIdEstoque := '';
  FOR estoqueExcluir IN c_estoqueExcluir
  LOOP
    v_bufferIdEstoque := CASE WHEN (v_bufferIdEstoque IS NULL OR v_bufferIdEstoque = '' OR v_bufferIdEstoque = ' ') THEN '' ELSE RTRIM (v_bufferIdEstoque) || ';' END || TO_CHAR (LPAD(estoqueExcluir.idEstoque,14,'0'));
    DELETE MOPREDOCUMXESTOQUE a WHERE a.idEstoque = estoqueExcluir.idEstoque;
    DELETE MOESTOQUES a WHERE a.idEstoque = estoqueExcluir.idEstoque;
  END LOOP;
  FOR item IN c_item
  LOOP
    ADD_PRE_DOC_ITEM_EST_GRAVA(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_bufferIdEstoque,
      p_estabelecimentoAtivo,
      item.modeloDocumento,
      item.atualizaCustoMedio,
      item.atualizaUltimaCompra,
      item.entradaSaida,
      item.estabelecimento,
      item.dataEmissao,
      item.dataEntradaSaida,
      item.geraTransferencia,
      item.geraOperacaoEmTransito,
      item.transitoLocalEstoque,
      item.locEstTransito_indicProprPos,
      item.idItemPreDocumento,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoque,
      item.pessoaParticipante,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.observacoes,
      item.controlaNumeroSerie,
      item.controleEstoque,
      item.locEst_indicProprPosseItem,
      item.estXLoc_solicitaEnderecoEst,
      item.docTransf_estabelecEntrada,
      item.docTransf_estabelecSaida,
      v_bufferIdEstoque);
  END LOOP;  
END ADD_PRE_DOC_CAB_EST_ATUALIZA;

/

create or replace PROCEDURE ADD_PRE_DOC_CALC_IMP_ITENS (
    p_config_64_casasDecSaidas     IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_330_redIcmsBasePisCof IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_cab_preDocumento             IN NUMBER,
    p_cab_modeloDocumento          IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_devolucaoAnulacaoRetorno IN NUMBER,
    p_cab_atualizaCustoMedio       IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEntradaSaida         IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_cab_localDestinoOperacao     IN CHAR,
    p_cab_indicadorConsumidorFinal IN CHAR,
    p_a_cab_tipoPagamentoFrete     IN CHAR,
    p_cab_tipoPagamentoFrete       IN CHAR,
    p_cab_valorProdutosBruto       IN NUMBER,
    p_cab_valorDescontoProdutos    IN NUMBER,
    p_cab_valorAcrescimoProdutos   IN NUMBER,
    p_cab_valorServicosBruto       IN NUMBER,
    p_cab_valorDescontoServicos    IN NUMBER,
    p_cab_valorAcrescimoServicos   IN NUMBER,
    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_modDoc_diminuiDescontoPrUnit IN NUMBER,
    p_modDoc_somaAcrescimosPrUnit  IN NUMBER,
    p_modDoc_somaFreteSeguroPrUnit IN NUMBER,
    p_pess_indicadorInscricaoEstad IN CHAR,
    /* Retornos */
    r_cab_valorProdutos            OUT NUMBER,
    r_cab_valorServicos            OUT NUMBER,
    r_cab_valorBasePagamento       OUT NUMBER,
    r_cab_valorAVistaMinimo        OUT NUMBER,
    r_cab_valorFreteTotal          OUT NUMBER,
    r_cab_valorSeguroTotal         OUT NUMBER,
    r_cab_valorDescontoTotal       OUT NUMBER,
    r_cab_valorOutrasDespesasTotal OUT NUMBER,
    r_cab_valorAdicFreteMarinTotal OUT NUMBER,
    r_cab_valorDespesasAduanTotal  OUT NUMBER,
    r_cab_valorImpSomaPagamento    OUT NUMBER,
    r_cab_valorImpDiminuiPagamento OUT NUMBER,
    r_cab_valorLiquidoItem         OUT NUMBER,
    r_cab_valorDescCustoOpTotal    OUT NUMBER,
    r_cab_valorAcrescCustoOpTotal  OUT NUMBER,
    r_cab_valorCustoOperacao       OUT NUMBER,
    r_cab_valorCMV                 OUT NUMBER,
    r_cab_valorAcrescExtempTotal   OUT NUMBER)
IS
    v_auxNumber                    NUMBER;
    v_acrescimoUnitarioComposicao  NUMBER;
    v_precoUnitario                NUMBER;
    v_precoUnitarioConvertido      NUMBER;
    v_valorProdutoServico          NUMBER;
    v_valorBasePagamento           NUMBER;
    v_valorFreteTotal              NUMBER;
    v_valorSeguroTotal             NUMBER;
    v_valorDescontoTotal           NUMBER;
    v_valorOutrasDespesasTotal     NUMBER;
    v_valorAdicFreteMarinMerTotal  NUMBER;
    v_valorDespesasAduaneirasTotal NUMBER;
    v_baseISSQN                    NUMBER;
    v_valorISSQN                   NUMBER;
    v_baseIRRF                     NUMBER;
    v_valorIRRF                    NUMBER;
    v_baseINSS                     NUMBER;
    v_valorINSS                    NUMBER;
    v_baseRetPIS                   NUMBER;
    v_valorRetPIS                  NUMBER;
    v_baseRetCOFINS                NUMBER;
    v_valorRetCOFINS               NUMBER;
    v_baseRetCSLL                  NUMBER;
    v_valorRetCSLL                 NUMBER;
    v_baseII                       NUMBER;
    v_valorII                      NUMBER;
    v_baseIOF                      NUMBER;
    v_valorIOF                     NUMBER;
    v_baseIPI                      NUMBER;
    v_valorIPI                     NUMBER;
    v_basePIS                      NUMBER;
    v_valorPIS                     NUMBER;
    v_basePISST                    NUMBER;
    v_valorPISST                   NUMBER;
    v_baseCOFINS                   NUMBER;
    v_valorCOFINS                  NUMBER;
    v_baseCOFINSST                 NUMBER;
    v_valorCOFINSST                NUMBER;
    v_baseCreditoSimplesNacional   NUMBER;
    v_valorCreditoSimplesNacional  NUMBER;
    v_baseICMS                     NUMBER;
    v_valorICMSOperacao            NUMBER;
    v_valorICMSDiferido            NUMBER;
    v_valorICMS                    NUMBER;
    v_valorICMSDesoneracao         NUMBER;
    v_baseICMSST                   NUMBER;
    v_valorICMSST                  NUMBER;
    v_baseICMSSTAnteriormente      NUMBER;
    v_valorICMSSTAnteriormente     NUMBER;
    v_valorICMSProprioSubstituto   NUMBER;
    v_baseICMSEfetivo              NUMBER;
    v_valorICMSEfetivo             NUMBER;
    v_baseICMSUFDestinatario       NUMBER;
    v_valorICMSUFDestinatario      NUMBER;
    v_baseICMSUFRemetente          NUMBER;
    v_valorICMSUFRemetente         NUMBER;
    v_baseFCP                      NUMBER;
    v_valorFCP                     NUMBER;
    v_baseFCPST                    NUMBER;
    v_valorFCPST                   NUMBER;
    v_baseFCPSTAnteriormente       NUMBER;
    v_valorFCPSTAnteriormente      NUMBER;
    v_baseFCPUFDestinatario        NUMBER;
    v_valorFCPUFDestinatario       NUMBER;
    v_baseEstimadaImpostos         NUMBER;
    v_valorEstimadoImpFederais     NUMBER;
    v_valorEstimadoImpEstaduais    NUMBER;
    v_valorEstimadoImpMunicipais   NUMBER;
    v_valorImpSomaPagamento        NUMBER;
    v_valorImpDiminuiPagamento     NUMBER;
    v_valorLiquidoItem             NUMBER;
    v_valorDescontoCustoOpTotal    NUMBER;
    v_valorAcrescimoCustoOpTotal   NUMBER;
    v_precoCustoOperacao           NUMBER;
    v_valorCustoOperacao           NUMBER;
    v_precoCMV                     NUMBER;
    v_valorCMV                     NUMBER;
    v_valorAcrescimoExtempSubtotal NUMBER;
    v_valorAcrescimoExtempTotal    NUMBER;
    CURSOR c_item IS
      SELECT
        a.*,
        gradProd.produto,
        gradProd.cor,
        gradProd.tamanho,
        prod.controleEstoque,
        prod.tipoProduto
      FROM MOPREDOCUMXITENS a
      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;
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_valorImpSomaPagamento    := 0;
  r_cab_valorImpDiminuiPagamento := 0;
  r_cab_valorLiquidoItem         := 0;
  r_cab_valorDescCustoOpTotal    := 0;
  r_cab_valorAcrescCustoOpTotal  := 0;
  r_cab_valorCustoOperacao       := 0;
  r_cab_valorCMV                 := 0;
  r_cab_valorAcrescExtempTotal   := 0;  
  FOR item IN c_item LOOP
    v_acrescimoUnitarioComposicao  := item.acrescimoUnitarioComposicao;
    v_precoUnitario                := item.precoUnitario;
    v_precoUnitarioConvertido      := item.precoUnitarioConvertido;
    v_valorProdutoServico          := item.valorProdutoServico;
    v_valorBasePagamento           := item.valorBasePagamento;
    v_valorFreteTotal              := item.valorFreteTotal;
    v_valorSeguroTotal             := item.valorSeguroTotal;
    v_valorDescontoTotal           := item.valorDescontoTotal;
    v_valorOutrasDespesasTotal     := item.valorOutrasDespesasTotal;
    v_valorAdicFreteMarinMerTotal  := item.valorAdicFreteMarinhaMerTotal;
    v_valorDespesasAduaneirasTotal := item.valorDespesasAduaneirasTotal;
    v_baseISSQN                    := item.baseISSQN;
    v_valorISSQN                   := item.valorISSQN;
    v_baseIRRF                     := item.baseIRRF;
    v_valorIRRF                    := item.valorIRRF;
    v_baseINSS                     := item.baseINSS;
    v_valorINSS                    := item.valorINSS;
    v_baseRetPIS                   := item.baseRetPIS;
    v_valorRetPIS                  := item.valorRetPIS;
    v_baseRetCOFINS                := item.baseRetCOFINS;
    v_valorRetCOFINS               := item.valorRetCOFINS;
    v_baseRetCSLL                  := item.baseRetCSLL;
    v_valorRetCSLL                 := item.valorRetCSLL;
    v_baseII                       := item.baseII;
    v_valorII                      := item.valorII;
    v_baseIOF                      := item.baseIOF;
    v_valorIOF                     := item.valorIOF;
    v_baseIPI                      := item.baseIPI;
    v_valorIPI                     := item.valorIPI;
    v_basePIS                      := item.basePIS;
    v_valorPIS                     := item.valorPIS;
    v_basePISST                    := item.basePISST;
    v_valorPISST                   := item.valorPISST;
    v_baseCOFINS                   := item.baseCOFINS;
    v_valorCOFINS                  := item.valorCOFINS;
    v_baseCOFINSST                 := item.baseCOFINSST;
    v_valorCOFINSST                := item.valorCOFINSST;
    v_baseCreditoSimplesNacional   := item.baseCreditoSimplesNacional;
    v_valorCreditoSimplesNacional  := item.valorCreditoSimplesNacional;
    v_baseICMS                     := item.baseICMS;
    v_valorICMSOperacao            := item.valorICMSOperacao;
    v_valorICMSDiferido            := item.valorICMSDiferido;
    v_valorICMS                    := item.valorICMS;
    v_valorICMSDesoneracao         := item.valorICMSDesoneracao;
    v_baseICMSST                   := item.baseICMSST;
    v_valorICMSST                  := item.valorICMSST;
    v_baseICMSSTAnteriormente      := item.baseICMSSTAnteriormente;
    v_valorICMSSTAnteriormente     := item.valorICMSSTAnteriormente;
    v_valorICMSProprioSubstituto   := item.valorICMSProprioSubstituto;
    v_baseICMSEfetivo              := item.baseICMSEfetivo;
    v_valorICMSEfetivo             := item.valorICMSEfetivo;
    v_baseICMSUFDestinatario       := item.baseICMSUFDestinatario;
    v_valorICMSUFDestinatario      := item.valorICMSUFDestinatario;
    v_baseICMSUFRemetente          := item.baseICMSUFRemetente;
    v_valorICMSUFRemetente         := item.valorICMSUFRemetente;
    v_baseFCP                      := item.baseFCP;
    v_valorFCP                     := item.valorFCP;
    v_baseFCPST                    := item.baseFCPST;
    v_valorFCPST                   := item.valorFCPST;
    v_baseFCPSTAnteriormente       := item.baseFCPSTAnteriormente;
    v_valorFCPSTAnteriormente      := item.valorFCPSTAnteriormente;
    v_baseFCPUFDestinatario        := item.baseFCPUFDestinatario;
    v_valorFCPUFDestinatario       := item.valorFCPUFDestinatario;
    v_baseEstimadaImpostos         := item.baseEstimadaImpostos;
    v_valorEstimadoImpFederais     := item.valorEstimadoImpFederais;
    v_valorEstimadoImpEstaduais    := item.valorEstimadoImpEstaduais;
    v_valorEstimadoImpMunicipais   := item.valorEstimadoImpMunicipais;
    v_valorImpSomaPagamento        := item.valorImpostosSomaPagamento;
    v_valorImpDiminuiPagamento     := item.valorImpostosDiminuiPagamento;
    v_valorLiquidoItem             := item.valorLiquidoItem;
    v_valorDescontoCustoOpTotal    := item.valorDescontoCustoOpTotal;
    v_valorAcrescimoCustoOpTotal   := item.valorAcrescimoCustoOpTotal;
    v_precoCustoOperacao           := item.precoCustoOperacao;
    v_valorCustoOperacao           := item.valorCustoOperacao;
    v_precoCMV                     := item.precoCMV;
    v_valorCMV                     := item.valorCMV;
    v_valorAcrescimoExtempSubtotal := item.valorAcrescimoExtempSubtotal;
    v_valorAcrescimoExtempTotal    := item.valorAcrescimoExtempTotal;
    ADD_CALCULA_TOTAIS_ITEM(
      ' ',
      ' ',
      0,
      0,
      0,
      0,
      'P',
      p_cab_entradaSaida,
      p_cab_devolucaoAnulacaoRetorno,
      p_a_cab_tipoPagamentoFrete,
      p_cab_tipoPagamentoFrete,
      p_cab_impostosEditados,
      p_modDoc_diminuiDescontoPrUnit,
      p_modDoc_somaAcrescimosPrUnit,
      p_modDoc_somaFreteSeguroPrUnit,
      item.idItemPreDocumento,
      item.quantidade,
      item.quantidadeConvertida,
      item.precoUnitarioBruto,
      v_precoUnitario,
      item.valorProdutoServicoBruto,
      v_valorProdutoServico,
      item.valorDescontoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      item.valorFreteGeral,
      item.valorSeguroGeral,
      item.valorDescontoGeral,
      item.valorOutrasDespesasGeral,
      item.valorAdicFreteMarinhaMerGeral,
      item.valorDespesasAduaneirasGeral,
      item.valorDescontoPagamento,
      item.valorOutrasDespesasPagamento,
      item.valorJurosPagamento,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal,
      item.quantidadeExtemporanea,
      item.acrescimoUnitarioExtemporaneo,
      item.valorAcrescimoExtempItem,
      item.valorAcrescimoExtempGeral,
      0,
      /* Retornos */
      v_acrescimoUnitarioComposicao,
      v_auxNumber,
      v_precoUnitario,
      v_auxNumber,
      v_precoUnitarioConvertido,
      v_auxNumber,
      v_valorProdutoServico,
      v_auxNumber,
      v_auxNumber,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal,
      v_valorAcrescimoExtempSubtotal,
      v_valorAcrescimoExtempTotal,
      v_auxNumber);
    ADD_CALCULA_IMPOSTOS_ITEM (
      p_config_64_casasDecSaidas,
      p_config_209_filtrarGrupoEcon,
      p_config_330_redIcmsBasePisCof,
      p_config_362_calcCustoPorGrade,
      p_cab_entradaSaida,
      p_cab_devolucaoAnulacaoRetorno,
      p_cab_estabelecimento,
      0,
      p_cab_dataEntradaSaida,
      p_cab_pessoa,
      p_cab_localDestinoOperacao,
      p_cab_indicadorConsumidorFinal,
      p_cab_tipoPagamentoFrete,
      p_pess_indicadorInscricaoEstad,
      item.personalizacao,
      item.quantidade,
      item.precoPautaTabelado,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal,
      item.cfop,
      1,
      item.indicadorISSQN,
      item.aliquotaISSQN,
      v_baseISSQN,
      v_valorISSQN,
      1,
      item.aliquotaIRRF,
      v_baseIRRF,
      v_valorIRRF,
      1,
      item.aliquotaINSS,
      v_baseINSS,
      v_valorINSS,
      1,
      item.retencaoPIS,
      v_baseRetPIS,
      v_valorRetPIS,
      1,
      item.retencaoCOFINS,
      v_baseRetCOFINS,
      v_valorRetCOFINS,
      1,
      item.retencaoCSLL,
      v_baseRetCSLL,
      v_valorRetCSLL,
      1,
      item.aliquotaII,
      v_baseII,
      v_valorII,
      1,
      item.aliquotaIOF,
      v_baseIOF,
      v_valorIOF,
      1,
      item.aliquotaIPI,
      item.valorAliquotaIPI,
      v_baseIPI,
      v_valorIPI,
      item.valorIPIDevolucao,
      1,
      item.aliquotaPIS,
      item.valorAliquotaPIS,
      v_basePIS,
      v_valorPIS,
      1,
      item.aliquotaPISST,
      item.valorAliquotaPISST,
      v_basePISST,
      v_valorPISST,
      1,
      item.aliquotaCOFINS,
      item.valorAliquotaCOFINS,
      v_baseCOFINS,
      v_valorCOFINS,
      1,
      item.aliquotaCOFINSST,
      item.valorAliquotaCOFINSST,
      v_baseCOFINSST,
      v_valorCOFINSST,
      1,
      item.stSimplesNacional,
      item.creditoSimplesNacional,
      v_baseCreditoSimplesNacional,
      v_valorCreditoSimplesNacional,
      1,
      item.stICMS,
      item.modalidadeBaseCalcICMS,
      item.reducaoBaseICMS,
      item.aliquotaICMS,
      item.diferimentoICMS,
      v_baseICMS,
      v_valorICMSOperacao,
      v_valorICMSDiferido,
      v_valorICMS,
      v_valorICMSDesoneracao,
      1,
      item.modalidadeBaseCalcICMSST,
      item.margemValorAdicionadoST,
      item.reducaoBaseST,
      item.aliquotaICMSST,
      v_baseICMSST,
      v_valorICMSST,
      1,
      v_baseICMSSTAnteriormente,
      v_valorICMSSTAnteriormente,
      v_valorICMSProprioSubstituto,
      item.reducaoBaseICMSEfetivo,
      item.aliquotaICMSEfetivo,
      v_baseICMSEfetivo,
      v_valorICMSEfetivo,
      0,
      '  ',
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      1,
      item.aliquotaICMSUFDestinatario,
      item.aliquotaICMSInterestadual,
      item.partilhaICMSInterestadual,
      v_baseICMSUFDestinatario,
      v_valorICMSUFDestinatario,
      v_baseICMSUFRemetente,
      v_valorICMSUFRemetente,
      1,
      item.aliquotaFCP,
      v_baseFCP,
      v_valorFCP,
      item.aliquotaFCPST,
      v_baseFCPST,
      v_valorFCPST,
      item.aliquotaFCPSTAnteriormente,
      v_baseFCPSTAnteriormente,
      v_valorFCPSTAnteriormente,
      item.aliquotaFCPUFDestinatario,
      v_baseFCPUFDestinatario,
      v_valorFCPUFDestinatario,
      1,
      item.aliquotaEstimadaImpFederais,
      item.aliquotaEstimadaImpEstaduais,
      item.aliquotaEstimadaImpMunicipais,
      v_baseEstimadaImpostos,
      v_valorEstimadoImpFederais,
      v_valorEstimadoImpEstaduais,
      v_valorEstimadoImpMunicipais,
      item.produto,
      item.cor,
      item.tamanho,
      item.controleEstoque,
      item.tipoProduto,
      /* Retornos */
      v_baseISSQN,
      v_valorISSQN,
      v_baseIRRF,
      v_valorIRRF,
      v_baseINSS,
      v_valorINSS,
      v_baseRetPIS,
      v_valorRetPIS,
      v_baseRetCOFINS,
      v_valorRetCOFINS,
      v_baseRetCSLL,
      v_valorRetCSLL,
      v_baseII,
      v_valorII,
      v_baseIOF,
      v_valorIOF,
      v_baseIPI,
      v_valorIPI,
      v_basePIS,
      v_valorPIS,
      v_basePISST,
      v_valorPISST,
      v_baseCOFINS,
      v_valorCOFINS,
      v_baseCOFINSST,
      v_valorCOFINSST,
      v_baseCreditoSimplesNacional,
      v_valorCreditoSimplesNacional,
      v_baseICMS,
      v_valorICMSOperacao,
      v_valorICMSDiferido,
      v_valorICMS,
      v_valorICMSDesoneracao,
      v_baseICMSST,
      v_valorICMSST,
      v_baseICMSSTAnteriormente,
      v_valorICMSSTAnteriormente,
      v_valorICMSProprioSubstituto,
      v_baseICMSEfetivo,
      v_valorICMSEfetivo,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_baseICMSUFDestinatario,
      v_valorICMSUFDestinatario,
      v_baseICMSUFRemetente,
      v_valorICMSUFRemetente,
      v_baseFCP,
      v_valorFCP,
      v_baseFCPST,
      v_valorFCPST,
      v_baseFCPSTAnteriormente,
      v_valorFCPSTAnteriormente,
      v_baseFCPUFDestinatario,
      v_valorFCPUFDestinatario,
      v_baseEstimadaImpostos,
      v_valorEstimadoImpFederais,
      v_valorEstimadoImpEstaduais,
      v_valorEstimadoImpMunicipais);
    ADD_CALCULA_VALOR_LIQUIDO (
      0,
      p_cab_tipoPagamentoFrete,
      item.geraFinanceiro,
      v_valorProdutoServico,
      item.valorDescontoPagamento,
      item.valorOutrasDespesasPagamento,
      item.valorJurosPagamento,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorIRRF,
      v_valorINSS,
      v_valorRetPIS,
      v_valorRetCOFINS,
      v_valorRetCSLL,
      v_valorII,
      v_valorIOF,
      v_valorIPI,
      item.valorIPIDevolucao,
      v_valorICMSST,
      0,
      0,
      v_valorAcrescimoExtempTotal,
      /* Retornos */
      v_valorBasePagamento,
      v_valorImpSomaPagamento,
      v_valorImpDiminuiPagamento,
      v_valorLiquidoItem);
    ADD_CALCULA_CUSTO_CMV (
      p_cab_modeloDocumento,
      p_cab_atualizaCustoMedio,
      0,
      item.quantidade,
      v_valorII,
      v_valorIOF,
      v_valorIPI,
      item.valorIPIDevolucao,
      v_valorPIS,
      v_valorPISST,
      v_valorCOFINS,
      v_valorCOFINSST,
      v_valorCreditoSimplesNacional,
      v_valorICMS,
      v_valorICMSST,
      0,
      v_valorLiquidoItem,
      item.valorDescontoCustoOpItem,
      item.valorDescontoCustoOpGeral,
      item.valorAcrescimoCustoOpItem,
      item.valorAcrescimoCustoOpGeral,
      v_valorAcrescimoExtempTotal,
      /* Retornos */
      v_valorDescontoCustoOpTotal,
      v_valorAcrescimoCustoOpTotal,
      v_precoCustoOperacao,
      v_valorCustoOperacao,
      v_precoCMV,
      v_valorCMV);
    UPDATE MOPREDOCUMXITENS SET
      acrescimoUnitarioComposicao   = v_acrescimoUnitarioComposicao,
      precoUnitario                 = v_precoUnitario,
      precoUnitarioConvertido       = v_precoUnitarioConvertido,
      valorProdutoServico           = v_valorProdutoServico,
      valorBasePagamento            = v_valorBasePagamento,
      valorFreteTotal               = v_valorFreteTotal,
      valorSeguroTotal              = v_valorSeguroTotal,
      valorDescontoTotal            = v_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
      valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
      baseISSQN                     = v_baseISSQN,
      valorISSQN                    = v_valorISSQN,
      baseIRRF                      = v_baseIRRF,
      valorIRRF                     = v_valorIRRF,
      baseINSS                      = v_baseINSS,
      valorINSS                     = v_valorINSS,
      baseRetPIS                    = v_baseRetPIS,
      valorRetPIS                   = v_valorRetPIS,
      baseRetCOFINS                 = v_baseRetCOFINS,
      valorRetCOFINS                = v_valorRetCOFINS,
      baseRetCSLL                   = v_baseRetCSLL,
      valorRetCSLL                  = v_valorRetCSLL,
      baseII                        = v_baseII,
      valorII                       = v_valorII,
      baseIOF                       = v_baseIOF,
      valorIOF                      = v_valorIOF,
      baseIPI                       = v_baseIPI,
      valorIPI                      = v_valorIPI,
      basePIS                       = v_basePIS,
      valorPIS                      = v_valorPIS,
      basePISST                     = v_basePISST,
      valorPISST                    = v_valorPISST,
      baseCOFINS                    = v_baseCOFINS,
      valorCOFINS                   = v_valorCOFINS,
      baseCOFINSST                  = v_baseCOFINSST,
      valorCOFINSST                 = v_valorCOFINSST,
      baseCreditoSimplesNacional    = v_baseCreditoSimplesNacional,
      valorCreditoSimplesNacional   = v_valorCreditoSimplesNacional,
      baseICMS                      = v_baseICMS,
      valorICMSOperacao             = v_valorICMSOperacao,
      valorICMSDiferido             = v_valorICMSDiferido,
      valorICMS                     = v_valorICMS,
      valorICMSDesoneracao          = v_valorICMSDesoneracao,
      baseICMSST                    = v_baseICMSST,
      valorICMSST                   = v_valorICMSST,
      baseICMSSTAnteriormente       = v_baseICMSSTAnteriormente,
      valorICMSSTAnteriormente      = v_valorICMSSTAnteriormente,
      valorICMSProprioSubstituto    = v_valorICMSProprioSubstituto,
      baseICMSEfetivo               = v_baseICMSEfetivo,
      valorICMSEfetivo              = v_valorICMSEfetivo,
      baseICMSUFDestinatario        = v_baseICMSUFDestinatario,
      valorICMSUFDestinatario       = v_valorICMSUFDestinatario,
      baseICMSUFRemetente           = v_baseICMSUFRemetente,
      valorICMSUFRemetente          = v_valorICMSUFRemetente,
      baseFCP                       = v_baseFCP,
      valorFCP                      = v_valorFCP,
      baseFCPST                     = v_baseFCPST,
      valorFCPST                    = v_valorFCPST,
      baseFCPSTAnteriormente        = v_baseFCPSTAnteriormente,
      valorFCPSTAnteriormente       = v_valorFCPSTAnteriormente,
      baseFCPUFDestinatario         = v_baseFCPUFDestinatario,
      valorFCPUFDestinatario        = v_valorFCPUFDestinatario,
      baseEstimadaImpostos          = v_baseEstimadaImpostos,
      valorEstimadoImpFederais      = v_valorEstimadoImpFederais,
      valorEstimadoImpEstaduais     = v_valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais    = v_valorEstimadoImpMunicipais,
      valorImpostosSomaPagamento    = v_valorImpSomaPagamento,
      valorImpostosDiminuiPagamento = v_valorImpDiminuiPagamento,
      valorLiquidoItem              = v_valorLiquidoItem,
      valorDescontoCustoOpTotal     = v_valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpTotal    = v_valorAcrescimoCustoOpTotal,
      precoCustoOperacao            = v_precoCustoOperacao,
      valorCustoOperacao            = v_valorCustoOperacao,
      precoCMV                      = v_precoCMV,
      valorCMV                      = v_valorCMV,
      valorAcrescimoExtempSubtotal  = v_valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempTotal     = v_valorAcrescimoExtempTotal
    WHERE idItemPreDocumento        = item.idItemPreDocumento;
    IF item.servico = 1 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 item.usarPrecoAVista = 1 AND item.geraFinanceiro = 1 THEN
      r_cab_valorAVistaMinimo        := r_cab_valorAVistaMinimo + v_valorProdutoServico + item.valorDescontoPagamento - item.valorOutrasDespesasPagamento - item.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_valorImpSomaPagamento    := r_cab_valorImpSomaPagamento + v_valorImpSomaPagamento;
    r_cab_valorImpDiminuiPagamento := r_cab_valorImpDiminuiPagamento + v_valorImpDiminuiPagamento;
    r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem + v_valorLiquidoItem;
    r_cab_valorDescCustoOpTotal    := r_cab_valorDescCustoOpTotal + v_valorDescontoCustoOpTotal;
    r_cab_valorAcrescCustoOpTotal  := r_cab_valorAcrescCustoOpTotal + v_valorAcrescimoCustoOpTotal;
    r_cab_valorCustoOperacao       := r_cab_valorCustoOperacao + v_valorCustoOperacao;
    r_cab_valorCMV                 := r_cab_valorCMV + v_valorCMV;
    r_cab_valorAcrescExtempTotal   := r_cab_valorAcrescExtempTotal + v_valorAcrescimoExtempTotal;
  END LOOP;
END ADD_PRE_DOC_CALC_IMP_ITENS;

/

create or replace PROCEDURE ADD_PRE_DOC_CALC_IMP_CAB (
    p_uniqueMachineID              IN VARCHAR2,
    p_config_64_casasDecSaidas     IN CHAR,
    p_config_65_casasDecEntrada    IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_330_redIcmsBasePisCof IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_regMarg_tipoPreco            IN CHAR,
    p_regMarg_tabelaPreco          IN VARCHAR2,
    p_regMarg_fatorMultiplicador   IN NUMBER,
    p_regMarg_tipoPrecoB           IN CHAR,
    p_regMarg_tabelaPrecoB         IN VARCHAR2,
    p_regMarg_fatorMultiplicadorB  IN NUMBER,
    p_regMarg_reduzirImpostos      IN NUMBER,
    p_regMarg_reduzirTarifaCartao  IN NUMBER,
    p_regMarg_taxaCapitacaoCustoFi IN NUMBER,
    p_regMarg_exibPercMargemCab    IN NUMBER,
    p_regMarg_exibImagemMargemCab  IN NUMBER,
    p_regMarg_regraImagemCab       IN NUMBER,
    p_regMarg_bloqPercMargemCab    IN NUMBER,
    p_regMarg_exibPercMargemItem   IN NUMBER,
    p_regMarg_exibImagemMargemItem IN NUMBER,
    p_regMarg_regraImagemItem      IN NUMBER,
    p_regMarg_exibDetMargemItem    IN NUMBER,
    p_regMarg_bloqPercMargemItem   IN NUMBER,
    p_calcularMargemContribuicao   IN NUMBER,
    p_cab_preDocumento             IN NUMBER,
    p_a_cab_tipoPagamentoFrete     IN CHAR,
    /* Retornos */
    r_cab_valorProdutos            OUT NUMBER,
    r_cab_valorServicos            OUT NUMBER,
    r_cab_valorBasePagamento       OUT NUMBER,
    r_cab_valorAVistaMinimo        OUT NUMBER,
    r_cab_valorFreteTotal          OUT NUMBER,
    r_cab_valorSeguroTotal         OUT NUMBER,
    r_cab_valorAdicFreteMarinTotal OUT NUMBER,
    r_cab_valorDespesasAduanTotal  OUT NUMBER,
    r_cab_valorImpSomaPagamento    OUT NUMBER,
    r_cab_valorImpDiminuiPagamento OUT NUMBER,
    r_cab_valorLiquidoItem         OUT NUMBER,
    r_cab_valorAcrescExtempTotal   OUT NUMBER,
    r_cab_valorTarifaCartao        OUT NUMBER,
    r_cab_valorMargem              OUT NUMBER,
    r_cab_percentualMargem         OUT NUMBER,
    r_cab_imagemMargem             OUT VARCHAR2)    
IS
    v_cab_valorDescontoTotal       NUMBER;
    v_cab_valorOutrasDespesasTotal NUMBER;
    v_cab_valorCustoOperacao       NUMBER;
    v_cab_valorCMV                 NUMBER;
    v_cab_valorDescCustoOpTotal    NUMBER;
    v_cab_valorAcrescCustoOpTotal  NUMBER;
    v_calcularImpostosItem         NUMBER;
    CURSOR c_cab IS
      SELECT a.*,
        modDoc.diminuiDescontoPrUnit,
        modDoc.somaAcrescimosPrUnit,
        modDoc.somaFreteSeguroPrUnit,
        modDoc.habilitaControleEntrega,
        pess.indicadorInscricaoEstadual,
        COALESCE((
          SELECT MIN(munEndEst.uf)
          FROM PAESTABELECIMENTOS est
          JOIN CAENDERECOSPESSOA endEst ON endEst.pessoa = est.pessoaEstabelecimento
          JOIN SIMUNICIPIOS munEndEst on munEndEst.municipio = endEst.municipio
          WHERE est.estabelecimento = a.estabelecimento
          AND endEst.ativo = 1
          AND endEst.principal = 1
          ),'  ') munEndEst_uf
      FROM MOPREDOCUMENTOS a
      JOIN PAMODELOSDOCUMENTO modDoc ON modDoc.modeloDocumento = a.modeloDocumento
      JOIN CAPESSOAS pess ON pess.pessoa = a.pessoa
      WHERE a.preDocumento = p_cab_preDocumento;
BEGIN
  FOR cab IN c_cab LOOP
    r_cab_valorProdutos            := cab.valorProdutos;
    r_cab_valorServicos            := cab.valorServicos;
    r_cab_valorBasePagamento       := cab.valorBasePagamento;
    r_cab_valorAVistaMinimo        := cab.valorAVistaMinimo;
    r_cab_valorFreteTotal          := cab.valorFreteTotal;
    r_cab_valorSeguroTotal         := cab.valorSeguroTotal;
    v_cab_valorDescontoTotal       := cab.valorDescontoTotal;
    v_cab_valorOutrasDespesasTotal := cab.valorOutrasDespesasTotal;
    r_cab_valorAdicFreteMarinTotal := cab.valorAdicFreteMarinhaMerTotal;
    r_cab_valorDespesasAduanTotal  := cab.valorDespesasAduaneirasTotal;
    r_cab_valorImpSomaPagamento    := cab.valorImpostosSomaPagamento;
    r_cab_valorImpDiminuiPagamento := cab.valorImpostosDiminuiPagamento;
    r_cab_valorLiquidoItem         := cab.valorLiquidoItem;
    v_cab_valorDescCustoOpTotal    := cab.valorDescontoCustoOpTotal;
    v_cab_valorAcrescCustoOpTotal  := cab.valorAcrescimoCustoOpTotal;
    v_cab_valorCustoOperacao       := cab.valorCustoOperacao;
    v_cab_valorCMV                 := cab.valorCMV;
    r_cab_valorAcrescExtempTotal   := cab.valorAcrescimoExtempTotal;    
    r_cab_valorTarifaCartao        := 0;
    r_cab_valorMargem              := 0;
    r_cab_percentualMargem         := 0;
    r_cab_imagemMargem             := ' ';
    v_calcularImpostosItem         := 0;
    ADD_PRE_DOC_CALC_IMP_RATEIO (
      cab.preDocumento,
      cab.modeloDocumento,
      cab.entradaSaida,
      cab.devolucaoAnulacaoRetorno,
      cab.atualizaCustoMedio,
      p_a_cab_tipoPagamentoFrete,
      cab.tipoPagamentoFrete,
      cab.valorFreteGeral,
      cab.valorSeguroGeral,
      cab.valorDescontoGeral,
      cab.valorOutrasDespesasGeral,
      cab.valorAdicFreteMarinhaMerGeral,
      cab.valorDespesasAduaneirasGeral,
      cab.valorDescontoPagamento,
      cab.valorOutrasDespesasPagamento,
      cab.valorJurosPagamento,
      cab.impostosEditados,
      cab.valorDescontoCustoOpGeral,
      cab.valorAcrescimoCustoOpGeral,
      cab.valorAcrescimoExtempGeral,
      cab.diminuiDescontoPrUnit,
      cab.somaAcrescimosPrUnit,
      cab.somaFreteSeguroPrUnit,
      cab.habilitaControleEntrega,
      /* Retornos */
      r_cab_valorProdutos,
      r_cab_valorServicos,
      r_cab_valorBasePagamento,
      r_cab_valorAVistaMinimo,
      r_cab_valorFreteTotal,
      r_cab_valorSeguroTotal,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespesasTotal,
      r_cab_valorAdicFreteMarinTotal,
      r_cab_valorDespesasAduanTotal,
      r_cab_valorImpSomaPagamento,
      r_cab_valorImpDiminuiPagamento,
      r_cab_valorLiquidoItem,
      v_cab_valorDescCustoOpTotal,
      v_cab_valorAcrescCustoOpTotal,
      v_cab_valorCustoOperacao,
      v_cab_valorCMV,
      r_cab_valorAcrescExtempTotal,
      v_calcularImpostosItem);
    IF v_calcularImpostosItem = 1 THEN
      ADD_PRE_DOC_CALC_IMP_ITENS(
        p_config_64_casasDecSaidas,
        p_config_209_filtrarGrupoEcon,
        p_config_330_redIcmsBasePisCof,
        p_config_362_calcCustoPorGrade,
        cab.preDocumento,
        cab.modeloDocumento,
        cab.entradaSaida,
        cab.devolucaoAnulacaoRetorno,
        cab.atualizaCustoMedio,
        cab.estabelecimento,
        cab.dataEntradaSaida,
        cab.pessoa,
        cab.localDestinoOperacao,
        cab.indicadorConsumidorFinal,
        p_a_cab_tipoPagamentoFrete,
        cab.tipoPagamentoFrete,
        cab.valorProdutosBruto,
        cab.valorDescontoProdutos,
        cab.valorAcrescimoProdutos,
        cab.valorServicosBruto,
        cab.valorDescontoServicos,
        cab.valorAcrescimoServicos,
        cab.valorFreteGeral,
        cab.valorSeguroGeral,
        cab.valorDescontoGeral,
        cab.valorOutrasDespesasGeral,
        cab.valorAdicFreteMarinhaMerGeral,
        cab.valorDespesasAduaneirasGeral,
        cab.valorDescontoPagamento,
        cab.valorOutrasDespesasPagamento,
        cab.valorJurosPagamento,
        cab.impostosEditados,
        cab.valorDescontoCustoOpGeral,
        cab.valorAcrescimoCustoOpGeral,
        cab.valorAcrescimoExtempGeral,
        cab.diminuiDescontoPrUnit,
        cab.somaAcrescimosPrUnit,
        cab.somaFreteSeguroPrUnit,
        cab.indicadorInscricaoEstadual,
        /* Retornos */
        r_cab_valorProdutos,
        r_cab_valorServicos,
        r_cab_valorBasePagamento,
        r_cab_valorAVistaMinimo,
        r_cab_valorFreteTotal,
        r_cab_valorSeguroTotal,
        v_cab_valorDescontoTotal,
        v_cab_valorOutrasDespesasTotal,
        r_cab_valorAdicFreteMarinTotal,
        r_cab_valorDespesasAduanTotal,
        r_cab_valorImpSomaPagamento,
        r_cab_valorImpDiminuiPagamento,
        r_cab_valorLiquidoItem,
        v_cab_valorDescCustoOpTotal,
        v_cab_valorAcrescCustoOpTotal,
        v_cab_valorCustoOperacao,
        v_cab_valorCMV,
        r_cab_valorAcrescExtempTotal);
    END IF;
    IF p_calcularMargemContribuicao = 1 AND (p_regMarg_exibPercMargemCab = 1 OR p_regMarg_exibImagemMargemCab = 1 OR p_regMarg_bloqPercMargemCab = 1 OR p_regMarg_exibPercMargemItem = 1 OR p_regMarg_exibImagemMargemItem = 1 OR p_regMarg_exibDetMargemItem = 1 OR p_regMarg_bloqPercMargemItem = 1) AND cab.tipoDocumento IN (101,102,301,501,503) THEN
      r_cab_valorTarifaCartao := FUNC_ADD_TARIFA_CART_PRE_DOC (cab.preDocumento);
    END IF;
    IF p_calcularMargemContribuicao = 1 AND (p_regMarg_exibPercMargemCab = 1 OR p_regMarg_exibImagemMargemCab = 1 OR p_regMarg_exibPercMargemItem = 1 OR p_regMarg_exibImagemMargemItem = 1 OR p_regMarg_exibDetMargemItem = 1) AND cab.tipoDocumento IN (101,102,301,501,503) THEN
      EXECUTE IMMEDIATE '
        DELETE TEMPMARGEMCONTRIBUICAO
        WHERE uniqueMachineID = :1
        AND orcamentoPredocumentoDocumento = :2
        AND idCabecalho = :3'
        USING 
          p_uniqueMachineID,
          'P',
          cab.preDocumento;
      ADD_PRE_DOC_GERA_TEMP_MARGEM(
        p_uniqueMachineID,
        p_config_65_casasDecEntrada,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_regMarg_tipoPreco,
        p_regMarg_tabelaPreco,
        p_regMarg_fatorMultiplicador,
        p_regMarg_tipoPrecoB,
        p_regMarg_tabelaPrecoB,
        p_regMarg_fatorMultiplicadorB,
        p_regMarg_reduzirImpostos,
        p_regMarg_reduzirTarifaCartao,
        p_regMarg_taxaCapitacaoCustoFi,
        p_regMarg_exibImagemMargemCab,
        p_regMarg_regraImagemCab,
        p_regMarg_exibImagemMargemItem,
        p_regMarg_regraImagemItem,
        cab.preDocumento,
        cab.estabelecimento,
        cab.dataEmissao,
        cab.prazoMedioPonderado,
        r_cab_valorFreteTotal,
        r_cab_valorSeguroTotal,
        r_cab_valorAdicFreteMarinTotal,
        r_cab_valorDespesasAduanTotal,
        r_cab_valorLiquidoItem,
        r_cab_valorTarifaCartao,
        cab.munEndEst_uf,
        /* Retornos */
        r_cab_valorMargem,
        r_cab_percentualMargem,
        r_cab_imagemMargem
      );
    END IF;
    UPDATE MOPREDOCUMENTOS SET 
      valorProdutos                 = r_cab_valorProdutos,
      valorServicos                 = r_cab_valorServicos,
      valorBasePagamento            = r_cab_valorBasePagamento,
      valorAVistaMinimo             = r_cab_valorAVistaMinimo,
      valorFreteTotal               = r_cab_valorFreteTotal,
      valorSeguroTotal              = r_cab_valorSeguroTotal,
      valorDescontoTotal            = v_cab_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = r_cab_valorAdicFreteMarinTotal,
      valorDespesasAduaneirasTotal  = r_cab_valorDespesasAduanTotal,
      valorImpostosSomaPagamento    = r_cab_valorImpSomaPagamento,
      valorImpostosDiminuiPagamento = r_cab_valorImpDiminuiPagamento,
      valorLiquidoItem              = r_cab_valorLiquidoItem,
      valorDescontoCustoOpTotal     = v_cab_valorDescCustoOpTotal,
      valorAcrescimoCustoOpTotal    = v_cab_valorAcrescCustoOpTotal,
      valorCustoOperacao            = v_cab_valorCustoOperacao,
      valorCMV                      = v_cab_valorCMV,
      valorAcrescimoExtempTotal     = r_cab_valorAcrescExtempTotal
    WHERE preDocumento              = cab.preDocumento;
  END LOOP;
END ADD_PRE_DOC_CALC_IMP_CAB;

/

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_documentoFiscalRef           NUMBER;
  v_dataEmissaoRef               DATE;
  v_valorPagamentoBruto          NUMBER;
  v_creditoSimplesNacional       NUMBER;
  v_valorCreditoSimplesNacional  NUMBER;
  v_valorFCP                     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);
  v_sequenciaMD5                 NUMBER;
  v_sequenciaFCP                 NUMBER;
  v_sequenciaDestino             NUMBER;
  v_sequenciaRemetente           NUMBER;
  v_sequenciaTributosAprox       NUMBER;
  v_sequenciaVendaConsumidor     NUMBER;
  v_sequenciaNfTransporte        NUMBER;
  v_sequenciaAproveitamentoCred  NUMBER;
  v_sequenciaCreditoIPI          NUMBER;
  v_sequenciaMercadoriaDemo      NUMBER;
  v_sequenciaSuspensoSINIEF      NUMBER;
  v_sequenciaMotorista           NUMBER;
  CURSOR c_obs IS
    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,
            gradProd.produto,
            prod.origemMercadoria,
            prod.idNcm)))
    ORDER BY a.informacaoComplementar;
  CURSOR c_nfe IS
    SELECT chaveNfe
    FROM MODOCFISCALXNFREF
    WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal;
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;
    IF v_md5 <> ' ' THEN
      SELECT COALESCE (MAX (sequencia), 0) INTO v_sequenciaMD5
      FROM MODOCFISCALXINFOCOMPLEMEN
      WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
      AND geradoPeloSistema = 1
      AND descInformacaoComplementar LIKE 'MD5:%';
      
      DELETE FROM MODOCFISCALXINFOCOMPLEMEN
      WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
      AND geradoPeloSistema = 1
      AND descInformacaoComplementar LIKE 'MD5:%';
    ELSE
      v_sequenciaMD5 := 0;
    END IF;  
  ELSE
    v_md5 := ' ';
    v_sequenciaMD5 := 0;
  END IF;
  SELECT
    COALESCE(MAX(docRef.documentoFiscal),0),
    MAX(TRUNC(doc.dataEmissao))
  INTO
    v_documentoFiscalRef,
    v_dataEmissaoRef
  FROM MODOCFISCALXITENS item
  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 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.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_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.:%';
  
  SELECT COALESCE (MAX (sequencia), 0) INTO v_sequenciaFCP
  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 relativo ao Fundo de Combate a Pobreza - FCP da UF de destino: R$%';
  
  SELECT COALESCE (MAX (sequencia), 0) INTO v_sequenciaDestino
  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 de destino: R$%';
  
  SELECT COALESCE (MAX (sequencia), 0) INTO v_sequenciaRemetente
  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 do ICMS Interestadual para a UF do remetente: R$%';
  
  SELECT COALESCE (MAX (sequencia), 0) INTO v_sequenciaTributosAprox
  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 LIKE 'Valor Aproximado Tributos: R$%';
  
  SELECT COALESCE (MAX (sequencia), 0) INTO v_sequenciaVendaConsumidor
  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 = 'Venda destinada a consumidor final sem fins comerciais.';
  
  SELECT COALESCE (MAX (sequencia), 0) INTO v_sequenciaNfTransporte
  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 antecipação de faturamento%';
  
  SELECT COALESCE (MAX (sequencia), 0) INTO v_sequenciaAproveitamentoCred
  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 LIKE 'Permite aproveitamento de credito de ICMS no valor de R$%';
  
  SELECT COALESCE (MAX (sequencia), 0) INTO v_sequenciaCreditoIPI
  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 = 'Documento emitido por ME ou EPP optante pelo Simples Nacional; Nao gera direito a credito fiscal de IPI.';
  
  SELECT COALESCE (MAX (sequencia), 0) INTO v_sequenciaMercadoriaDemo
  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 = 'Mercadoria remetida para demonstracao.';
  
  SELECT COALESCE (MAX (sequencia), 0) INTO v_sequenciaSuspensoSINIEF
  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 = 'Imposto suspenso nos termos do Ajuste SINIEF 02/18.';
  
  SELECT COALESCE (MAX (sequencia), 0) INTO v_sequenciaMotorista
  FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar LIKE 'Motorista:%';
  
  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;

  IF v_md5 <> ' ' THEN  
    IF v_sequenciaMD5 > 0 THEN
      ADD_DOC_FISC_INFO_GRAVA_SEQ (
        p_estabelecimentoAtivo,
        p_cab_idDocumentoFiscal,
        v_sequenciaMD5,
        1,
        1,
        0,
        0,
        'MD5: ' || RTRIM(v_md5)
      );
    ELSE
      ADD_DOC_FISC_INFO_CRIA (
        p_estabelecimentoAtivo,
        p_cab_idDocumentoFiscal,
        1,
        1,
        0,
        0,
        'MD5: ' || RTRIM(v_md5)
      );
    END IF;
  END IF;
  IF v_modeloDocumentoFiscal <> '58' THEN
    FOR nfe IN c_nfe LOOP      
      ADD_DOC_FISC_INFO_GRAVA_DESCR (
        p_estabelecimentoAtivo,
        p_cab_idDocumentoFiscal,
        1,
        1,
        0,
        0,
        'NF-e Ref.: '
        || SUBSTR(nfe.chaveNfe,1,2)
        || '-' || SUBSTR(nfe.chaveNfe,3,4)
        || '-' || SUBSTR(nfe.chaveNfe,7,2)
        || '.' || SUBSTR(nfe.chaveNfe,9,3)
        || '.' || SUBSTR(nfe.chaveNfe,12,3)
        || '/' || SUBSTR(nfe.chaveNfe,15,4)
        || '-' || SUBSTR(nfe.chaveNfe,19,2)
        || '-' || SUBSTR(nfe.chaveNfe,21,2)
        || '-' || SUBSTR(nfe.chaveNfe,23,3)
        || '-' || SUBSTR(nfe.chaveNfe,26,3)
        || '.' || SUBSTR(nfe.chaveNfe,29,3)
        || '.' || SUBSTR(nfe.chaveNfe,32,3)
        || '-' || SUBSTR(nfe.chaveNfe,35,3)
        || '.' || SUBSTR(nfe.chaveNfe,38,3)
        || '.' || SUBSTR(nfe.chaveNfe,41,3)
        || '-' || SUBSTR(nfe.chaveNfe,44,1)
      );
    END LOOP;
  END IF;
  IF v_valorFCP > 0 THEN  
    IF v_sequenciaFCP > 0 THEN
      ADD_DOC_FISC_INFO_GRAVA_SEQ (
        p_estabelecimentoAtivo,
        p_cab_idDocumentoFiscal,
        v_sequenciaFCP,
        1,
        1,
        0,
        0,
        'Valor do ICMS relativo ao Fundo de Combate a Pobreza - FCP da UF de destino: R$ ' || TRIM (TO_CHAR (v_valorFCP, 'FM999G999G999G999G999G990D00')) || '.'
      );
    ELSE
      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_valorFCP, 'FM999G999G999G999G999G990D00')) || '.'
      );
    END IF;
  END IF;
    
  IF v_valorICMSUFDestinatario > 0 OR v_valorICMSUFRemetente > 0 THEN
    IF v_sequenciaDestino > 0 THEN
      ADD_DOC_FISC_INFO_GRAVA_SEQ (
        p_estabelecimentoAtivo,
        p_cab_idDocumentoFiscal,
        v_sequenciaDestino,
        1,
        1,
        0,
        0,
        'Valor do ICMS  Interestadual para a UF de destino: R$ ' || TRIM (TO_CHAR (v_valorICMSUFDestinatario, 'FM999G999G999G999G999G990D00')) || '.'
      );
    ELSE
      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;
  END IF;
    
  IF v_valorICMSUFDestinatario > 0 OR v_valorICMSUFRemetente > 0 THEN
    IF v_sequenciaRemetente > 0 THEN
      ADD_DOC_FISC_INFO_GRAVA_SEQ (
        p_estabelecimentoAtivo,
        p_cab_idDocumentoFiscal,
        v_sequenciaRemetente,
        1,
        1,
        0,
        0,
        'Valor do ICMS Interestadual para a UF do remetente: R$ ' || TRIM (TO_CHAR (v_valorICMSUFRemetente, 'FM999G999G999G999G999G990D00')) || '.'
      );
    ELSE
      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;
  END IF;
    
  IF v_valorEstimadoImpostos > 0 THEN
    IF v_sequenciaTributosAprox > 0 THEN
      ADD_DOC_FISC_INFO_GRAVA_SEQ (
        p_estabelecimentoAtivo,
        p_cab_idDocumentoFiscal,
        v_sequenciaTributosAprox,
        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.'
      );
    ELSE
      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;
  END IF;
    
  IF v_indicadorConsumidorFinal = '1' THEN
    IF v_sequenciaVendaConsumidor > 0 THEN
      ADD_DOC_FISC_INFO_GRAVA_SEQ (
        p_estabelecimentoAtivo,
        p_cab_idDocumentoFiscal,
        v_sequenciaVendaConsumidor,
        1,
        1,
        0,
        0,
        'Venda destinada a consumidor final sem fins comerciais.'
      );
    ELSE
      ADD_DOC_FISC_INFO_CRIA (
        p_estabelecimentoAtivo,
        p_cab_idDocumentoFiscal,
        1,
        1,
        0,
        0,
        'Venda destinada a consumidor final sem fins comerciais.'
      );
    END IF;
  END IF;
    
  IF v_documentoFiscalRef > 0 THEN
    IF v_sequenciaNfTransporte > 0 THEN
      ADD_DOC_FISC_INFO_GRAVA_SEQ (
        p_estabelecimentoAtivo,
        p_cab_idDocumentoFiscal,
        v_sequenciaNfTransporte,
        1,
        1,
        0,
        0,
        'Nota de transporte referente a nota de antecipação de faturamento ' || TRIM (TO_CHAR (v_documentoFiscalRef)) || CASE WHEN v_dataEmissaoRef IS NULL THEN '' ELSE ' gerada na data ' || TO_CHAR(v_dataEmissaoRef,'DD/MM/YYYY') END || '.'
      );
    ELSE
      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_documentoFiscalRef)) || CASE WHEN v_dataEmissaoRef IS NULL THEN '' ELSE ' gerada na data ' || TO_CHAR(v_dataEmissaoRef,'DD/MM/YYYY') END || '.'
      );
    END IF;
  END IF;
    
  IF v_regimeTributario IN ('1','2') AND v_valorCreditoSimplesNacional > 0 THEN
    IF v_sequenciaAproveitamentoCred > 0 THEN
      ADD_DOC_FISC_INFO_GRAVA_SEQ (
        p_estabelecimentoAtivo,
        p_cab_idDocumentoFiscal,
        v_sequenciaAproveitamentoCred,
        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.'
      );
    ELSE
      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;
  END IF;
    
  IF v_regimeTributario IN ('1','2') THEN
    IF v_sequenciaCreditoIPI > 0 THEN
      ADD_DOC_FISC_INFO_GRAVA_SEQ (
        p_estabelecimentoAtivo,
        p_cab_idDocumentoFiscal,
        v_sequenciaCreditoIPI,
        1,
        1,
        0,
        0,
        'Documento emitido por ME ou EPP optante pelo Simples Nacional; Nao gera direito a credito fiscal de IPI.'
      );
    ELSE
      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;
  END IF;
  
  FOR obs IN c_obs 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
    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';
    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_DOC_FISC_ITEM_EST_ATUALIZA(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_idItemDocFiscal              IN NUMBER,
    p_estabelecimentoAtivo         IN NUMBER
  )
IS
  v_bufferIdEstoque        VARCHAR2 (32000);
  CURSOR c_estoqueExcluir
  IS 
    SELECT a.idEstoque
    FROM MOESTOQUES a
    JOIN MODOCFISCALXESTOQUE b ON b.idEstoque = a.idEstoque
    WHERE b.idItemDocFiscal = p_idItemDocFiscal
    ORDER BY a.idEstoque;
  CURSOR c_item
  IS 
    SELECT 
      cab.modeloDocumento,
      cab.entradaSaida,
      cab.atualizaCustoMedio,
      cab.atualizaUltimaCompra,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      modDoc.geraTransferencia,
      modDoc.geraOperacaoEmTransito,
      modDoc.transitoLocalEstoque,
      locEstTransito.indicadorPropriedadePosseItem locEstTransito_indicProprPos,
      item.idItemDocFiscal,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoque,
      item.pessoaParticipante,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem locEst_indicProprPosseItem,
      COALESCE (estXLoc.solicitaEnderecoEstoque,0) estXLoc_solicitaEnderecoEst,
      COALESCE (cabTransf.estabelecimentoEntrada,0) docTransf_estabelecEntrada,
      COALESCE (cabTransf.estabelecimentoSaida,0) docTransf_estabelecSaida
    FROM MODOCFISCALXITENS item
    JOIN MODOCUMENTOSFISCAIS cab ON cab.idDocumentoFiscal = item.idDocumentoFiscal
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
    JOIN PAMODELOSDOCUMENTO modDoc ON modDoc.modeloDocumento = cab.modeloDocumento
    JOIN PALOCAISESTOQUE locEstTransito ON locEstTransito.localEstoque = modDoc.transitoLocalEstoque 
    JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = item.localEstoque
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc ON estXLoc.estabelecimento = cab.estabelecimento AND estXLoc.localEstoque = item.localEstoque
    LEFT JOIN MODOCTRANSFXDOCFISCAL transfXDoc ON transfXDoc.idItemDocFiscal = item.idItemDocFiscal AND transfXDoc.entradaSaidaOriginal IN ('E','S')
    LEFT JOIN MODOCUMENTOTRANSFXITENS itemTransf ON itemTransf.idItemDocTransferencia = transfXDoc.idItemDocTransferencia
    LEFT JOIN MODOCUMENTOSTRANSFERENCIA cabTransf ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
    WHERE item.idItemDocFiscal = p_idItemDocFiscal
    AND item.cancelado = 0
    AND item.quantidade+item.quantidadeExtemporanea > 0
    AND item.movimentaEstoque = 1
    AND cab.situacaoDocumentoFiscal BETWEEN 21 AND 23;
BEGIN
  v_bufferIdEstoque := '';
  FOR estoqueExcluir IN c_estoqueExcluir
  LOOP
    v_bufferIdEstoque := CASE WHEN (v_bufferIdEstoque IS NULL OR v_bufferIdEstoque = '' OR v_bufferIdEstoque = ' ') THEN '' ELSE RTRIM (v_bufferIdEstoque) || ';' END || TO_CHAR (LPAD(estoqueExcluir.idEstoque,14,'0'));
    DELETE MODOCFISCALXESTOQUE a WHERE a.idEstoque = estoqueExcluir.idEstoque;
    DELETE MOESTOQUES a WHERE a.idEstoque = estoqueExcluir.idEstoque;
  END LOOP;
  FOR item IN c_item
  LOOP
    ADD_DOC_FISC_ITEM_EST_GRAVA(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_bufferIdEstoque,
      p_estabelecimentoAtivo,
      item.modeloDocumento,
      item.atualizaCustoMedio,
      item.atualizaUltimaCompra,
      item.entradaSaida,
      item.estabelecimento,
      item.dataEmissao,
      item.dataEntradaSaida,
      item.geraTransferencia,
      item.geraOperacaoEmTransito,
      item.transitoLocalEstoque,
      item.locEstTransito_indicProprPos,
      item.idItemDocFiscal,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoque,
      item.pessoaParticipante,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.observacoes,
      item.controlaNumeroSerie,
      item.controleEstoque,
      item.locEst_indicProprPosseItem,
      item.estXLoc_solicitaEnderecoEst,
      item.docTransf_estabelecEntrada,
      item.docTransf_estabelecSaida,
      v_bufferIdEstoque);
  END LOOP;
END ADD_DOC_FISC_ITEM_EST_ATUALIZA;

/

create or replace PROCEDURE ADD_DOC_FISC_CAB_EST_ATUALIZA(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_idDocumentoFiscal            IN NUMBER,
    p_estabelecimentoAtivo         IN NUMBER
  )
IS
  v_bufferIdEstoque        VARCHAR2 (32000);
  CURSOR c_estoqueExcluir
  IS 
    SELECT a.idEstoque
    FROM MOESTOQUES a
    JOIN MODOCFISCALXESTOQUE b ON b.idEstoque = a.idEstoque
    JOIN MODOCFISCALXITENS c ON c.idItemDocFiscal = b.idItemDocFiscal
    WHERE c.idDocumentoFiscal = p_idDocumentoFiscal
    ORDER BY a.idEstoque;
  CURSOR c_item
  IS 
    SELECT 
      cab.modeloDocumento,
      cab.entradaSaida,
      cab.atualizaCustoMedio,
      cab.atualizaUltimaCompra,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      modDoc.geraTransferencia,
      modDoc.geraOperacaoEmTransito,
      modDoc.transitoLocalEstoque,
      locEstTransito.indicadorPropriedadePosseItem locEstTransito_indicProprPos,
      item.idItemDocFiscal,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoque,
      item.pessoaParticipante,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem locEst_indicProprPosseItem,
      COALESCE (estXLoc.solicitaEnderecoEstoque,0) estXLoc_solicitaEnderecoEst,
      COALESCE (cabTransf.estabelecimentoEntrada,0) docTransf_estabelecEntrada,
      COALESCE (cabTransf.estabelecimentoSaida,0) docTransf_estabelecSaida
    FROM MODOCFISCALXITENS item
    JOIN MODOCUMENTOSFISCAIS cab ON cab.idDocumentoFiscal = item.idDocumentoFiscal
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
    JOIN PAMODELOSDOCUMENTO modDoc ON modDoc.modeloDocumento = cab.modeloDocumento
    JOIN PALOCAISESTOQUE locEstTransito ON locEstTransito.localEstoque = modDoc.transitoLocalEstoque 
    JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = item.localEstoque
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc ON estXLoc.estabelecimento = cab.estabelecimento AND estXLoc.localEstoque = item.localEstoque
    LEFT JOIN MODOCTRANSFXDOCFISCAL transfXDoc ON transfXDoc.idItemDocFiscal = item.idItemDocFiscal AND transfXDoc.entradaSaidaOriginal IN('E','S')
    LEFT JOIN MODOCUMENTOTRANSFXITENS itemTransf ON itemTransf.idItemDocTransferencia = transfXDoc.idItemDocTransferencia
    LEFT JOIN MODOCUMENTOSTRANSFERENCIA cabTransf ON cabTransf.documentoTransferencia = itemTransf.documentoTransferencia
    WHERE item.idDocumentoFiscal = p_idDocumentoFiscal
    AND item.cancelado = 0
    AND item.quantidade+item.quantidadeExtemporanea > 0
    AND item.movimentaEstoque = 1
    AND cab.situacaoDocumentoFiscal BETWEEN 21 AND 23;
BEGIN
  v_bufferIdEstoque := '';
  FOR estoqueExcluir IN c_estoqueExcluir
  LOOP
    v_bufferIdEstoque := CASE WHEN (v_bufferIdEstoque IS NULL OR v_bufferIdEstoque = '' OR v_bufferIdEstoque = ' ') THEN '' ELSE RTRIM (v_bufferIdEstoque) || ';' END || TO_CHAR (LPAD(estoqueExcluir.idEstoque,14,'0'));
    DELETE MODOCFISCALXESTOQUE a WHERE a.idEstoque = estoqueExcluir.idEstoque;
    DELETE MOESTOQUES a WHERE a.idEstoque = estoqueExcluir.idEstoque;
  END LOOP;
  FOR item IN c_item
  LOOP
    ADD_DOC_FISC_ITEM_EST_GRAVA(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_bufferIdEstoque,
      p_estabelecimentoAtivo,
      item.modeloDocumento,
      item.atualizaCustoMedio,
      item.atualizaUltimaCompra,
      item.entradaSaida,
      item.estabelecimento,
      item.dataEmissao,
      item.dataEntradaSaida,
      item.geraTransferencia,
      item.geraOperacaoEmTransito,
      item.transitoLocalEstoque,
      item.locEstTransito_indicProprPos,
      item.idItemDocFiscal,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.localEstoque,
      item.pessoaParticipante,
      item.quantidade,
      item.precoCustoOperacao,
      item.valorCustoOperacao,
      item.precoCMV,
      item.valorCMV,
      item.quantidadeExtemporanea,
      item.observacoes,
      item.controlaNumeroSerie,
      item.controleEstoque,
      item.locEst_indicProprPosseItem,
      item.estXLoc_solicitaEnderecoEst,
      item.docTransf_estabelecEntrada,
      item.docTransf_estabelecSaida,
      v_bufferIdEstoque);
  END LOOP;
END ADD_DOC_FISC_CAB_EST_ATUALIZA;

/

create or replace PROCEDURE ADD_DOC_FISC_GERA_TEMP_MARGEM (
    p_uniqueMachineID              IN VARCHAR2,
    p_config_65_casasDecEntrada    IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_regMarg_tipoPreco            IN CHAR,
    p_regMarg_tabelaPreco          IN VARCHAR2,
    p_regMarg_fatorMultiplicador   IN NUMBER,
    p_regMarg_tipoPrecoB           IN CHAR,
    p_regMarg_tabelaPrecoB         IN VARCHAR2,
    p_regMarg_fatorMultiplicadorB  IN NUMBER,
    p_regMarg_reduzirImpostos      IN NUMBER,
    p_regMarg_reduzirTarifaCartao  IN NUMBER,
    p_regMarg_taxaCapitacaoCustoFi IN NUMBER,
    p_regMarg_exibImagemMargemCab  IN NUMBER,
    p_regMarg_regraImagemCab       IN NUMBER,
    p_regMarg_exibImagemMargemItem IN NUMBER,
    p_regMarg_regraImagemItem      IN NUMBER,
    p_cab_idDocumentoFiscal        IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEmissao              IN DATE,
    p_cab_prazoMedioPonderado      IN NUMBER,
    p_cab_valorFreteTotal          IN NUMBER,
    p_cab_valorSeguroTotal         IN NUMBER,
    p_cab_valorAdicFreteMarinTotal IN NUMBER,
    p_cab_valorDespesasAduanTotal  IN NUMBER,
    p_cab_valorLiquidoItem         IN NUMBER,
    p_cab_valorTarifaCartao        IN NUMBER,
    p_munEndEst_uf                 IN CHAR,
    /* Retornos */
    r_cab_valorMargem              OUT NUMBER,
    r_cab_percentualMargem         OUT NUMBER,
    r_cab_imagemMargem             OUT VARCHAR2)
IS
    v_valorLiquidoSemFreteSeguro   NUMBER;
    v_valorCaptacao                NUMBER;
    v_valorTarifaCartao            NUMBER;
    v_valorImpostos                NUMBER;
    v_precoCusto                   NUMBER;
    v_valorCusto                   NUMBER;
    v_valorMargem                  NUMBER;
    v_percentualMargem             NUMBER;
    v_imagemMargem                 VARCHAR2(256);
    CURSOR c_item IS
      SELECT
        a.sequencia,
        a.cancelado,
        a.idFormulaTinta,
        a.personalizacao,
        a.localEstoque,
        a.pessoaParticipante,
        a.quantidade,
        a.valorFreteTotal,
        a.valorSeguroTotal,
        a.valorAdicFreteMarinhaMerTotal,
        a.valorDespesasAduaneirasTotal,
        a.valorII,
        a.valorIOF,
        a.valorIPI,
        a.valorIPIDevolucao,
        a.valorPIS,
        a.valorPISST,
        a.valorCOFINS,
        a.valorCOFINSST,
        a.valorCreditoSimplesNacional,
        a.valorICMSOperacao,
        a.valorICMSDiferido,
        a.valorICMS,
        a.valorICMSDesoneracao,
        a.valorICMSST,
        a.valorICMSSTAnteriormente,
        a.valorICMSUFDestinatario,
        a.valorICMSUFRemetente,
        a.valorFCP,
        a.valorFCPST,
        a.valorFCPSTAnteriormente,
        a.valorFCPUFDestinatario,
        a.valorLiquidoItem,
        gradProd.produto,
        gradProd.cor,
        gradProd.tamanho,
        prod.controleEstoque,
        locEst.indicadorPropriedadePosseItem
      FROM MODOCFISCALXITENS a
      JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
      JOIN PALOCAISESTOQUE locEst ON locEst.localEstoque = a.localEstoque
      WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal;
BEGIN
  r_cab_valorMargem      := 0;
  r_cab_percentualMargem := 0;
  r_cab_imagemMargem     := ' ';
  FOR item IN c_item LOOP
    ADD_CALCULA_MARGEM_CONTRIB (
      p_config_65_casasDecEntrada,
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_regMarg_tipoPreco,
      p_regMarg_tabelaPreco,
      p_regMarg_fatorMultiplicador,
      p_regMarg_tipoPrecoB,
      p_regMarg_tabelaPrecoB,
      p_regMarg_fatorMultiplicadorB,
      p_regMarg_reduzirImpostos,
      p_regMarg_reduzirTarifaCartao,
      p_regMarg_taxaCapitacaoCustoFi,
      p_regMarg_exibImagemMargemItem,
      p_regMarg_regraImagemItem,
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_cab_prazoMedioPonderado,
      p_cab_valorLiquidoItem,
      p_cab_valorTarifaCartao,
      p_munEndEst_uf,
      item.idFormulaTinta,
      item.personalizacao,
      item.localEstoque,
      item.pessoaParticipante,
      item.quantidade,
      item.valorFreteTotal,
      item.valorSeguroTotal,
      item.valorAdicFreteMarinhaMerTotal,
      item.valorDespesasAduaneirasTotal,
      item.valorII,
      item.valorIOF,
      item.valorIPI,
      item.valorIPIDevolucao,
      item.valorPIS,
      item.valorPISST,
      item.valorCOFINS,
      item.valorCOFINSST,
      item.valorCreditoSimplesNacional,
      item.valorICMSOperacao,
      item.valorICMSDiferido,
      item.valorICMS,
      item.valorICMSDesoneracao,
      item.valorICMSST,
      item.valorICMSSTAnteriormente,
      item.valorICMSUFDestinatario,
      item.valorICMSUFRemetente,
      item.valorFCP,
      item.valorFCPST,
      item.valorFCPSTAnteriormente,
      item.valorFCPUFDestinatario,
      item.valorLiquidoItem,
      item.produto,
      item.cor,
      item.tamanho,
      item.controleEstoque,
      item.indicadorPropriedadePosseItem,
      /* Retornos */
      v_valorLiquidoSemFreteSeguro,
      v_valorCaptacao,
      v_valorTarifaCartao,
      v_valorImpostos,
      v_precoCusto,
      v_valorCusto,
      v_valorMargem,
      v_percentualMargem);
    IF p_regMarg_exibImagemMargemItem = 1 AND p_regMarg_regraImagemItem <> 0 THEN
      v_imagemMargem := FUNC_ADD_BUSCA_IMAGEM_FAIXA (p_regMarg_regraImagemItem, v_percentualMargem);
    ELSE
      v_imagemMargem := ' ';
    END IF;
    IF item.cancelado = 0 THEN
      r_cab_valorMargem := r_cab_valorMargem + v_valorMargem;
    END IF;
    INSERT INTO TEMPMARGEMCONTRIBUICAO (
      uniqueMachineID,
      orcamentoPredocumentoDocumento,
      idCabecalho,
      sequencia,
      valorLiquidoSemFreteSeguro,
      valorCaptacao,
      valorTarifaCartao,
      valorImpostos,
      precoCusto,
      valorCusto,
      valorMargem,
      percentualMargem,
      imagemMargem
    ) VALUES (
      p_uniqueMachineID,
      'D',
      p_cab_idDocumentoFiscal,
      item.sequencia,
      v_valorLiquidoSemFreteSeguro,
      v_valorCaptacao,
      v_valorTarifaCartao,
      v_valorImpostos,
      v_precoCusto,
      v_valorCusto,
      v_valorMargem,
      v_percentualMargem,
      v_imagemMargem);
  END LOOP;
  r_cab_percentualMargem := CASE WHEN p_cab_valorLiquidoItem - p_cab_valorFreteTotal - p_cab_valorSeguroTotal - p_cab_valorAdicFreteMarinTotal - p_cab_valorDespesasAduanTotal = 0 THEN 0 ELSE ROUND ((100 * r_cab_valorMargem / (p_cab_valorLiquidoItem - p_cab_valorFreteTotal - p_cab_valorSeguroTotal - p_cab_valorAdicFreteMarinTotal - p_cab_valorDespesasAduanTotal)), 8) END;
  IF p_regMarg_exibImagemMargemCab = 1 AND p_regMarg_regraImagemCab <> 0 THEN
    r_cab_imagemMargem := FUNC_ADD_BUSCA_IMAGEM_FAIXA (p_regMarg_regraImagemCab, r_cab_percentualMargem);
  END IF;
END ADD_DOC_FISC_GERA_TEMP_MARGEM;

/

create or replace PROCEDURE ADD_DOC_FISC_CALC_IMP_ITENS (
    p_config_64_casasDecSaidas     IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_330_redIcmsBasePisCof IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_cab_idDocumentoFiscal        IN NUMBER,
    p_cab_modeloDocumento          IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_devolucaoAnulacaoRetorno IN NUMBER,
    p_cab_atualizaCustoMedio       IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_nfFornecedor             IN NUMBER,
    p_cab_dataEntradaSaida         IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_cab_localDestinoOperacao     IN CHAR,
    p_cab_indicadorConsumidorFinal IN CHAR,
    p_a_cab_tipoPagamentoFrete     IN CHAR,
    p_cab_tipoPagamentoFrete       IN CHAR,
    p_cab_valorProdutosBruto       IN NUMBER,
    p_cab_valorDescontoProdutos    IN NUMBER,
    p_cab_valorAcrescimoProdutos   IN NUMBER,
    p_cab_valorServicosBruto       IN NUMBER,
    p_cab_valorDescontoServicos    IN NUMBER,
    p_cab_valorAcrescimoServicos   IN NUMBER,
    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_modDoc_diminuiDescontoPrUnit IN NUMBER,
    p_modDoc_somaAcrescimosPrUnit  IN NUMBER,
    p_modDoc_somaFreteSeguroPrUnit IN NUMBER,
    p_pess_indicadorInscricaoEstad IN CHAR,
    /* Retornos */
    r_cab_valorProdutos            OUT NUMBER,
    r_cab_valorServicos            OUT NUMBER,
    r_cab_valorBasePagamento       OUT NUMBER,
    r_cab_valorAVistaMinimo        OUT NUMBER,
    r_cab_valorFreteTotal          OUT NUMBER,
    r_cab_valorSeguroTotal         OUT NUMBER,
    r_cab_valorDescontoTotal       OUT NUMBER,
    r_cab_valorOutrasDespesasTotal OUT NUMBER,
    r_cab_valorAdicFreteMarinTotal OUT NUMBER,
    r_cab_valorDespesasAduanTotal  OUT NUMBER,
    r_cab_valorImpSomaPagamento    OUT NUMBER,
    r_cab_valorImpDiminuiPagamento OUT NUMBER,
    r_cab_valorLiquidoItem         OUT NUMBER,
    r_cab_valorDescCustoOpTotal    OUT NUMBER,
    r_cab_valorAcrescCustoOpTotal  OUT NUMBER,
    r_cab_valorCustoOperacao       OUT NUMBER,
    r_cab_valorCMV                 OUT NUMBER,
    r_cab_valorAcrescExtempTotal   OUT NUMBER)
IS
    v_auxNumber                    NUMBER;
    v_acrescimoUnitarioComposicao  NUMBER;
    v_precoUnitario                NUMBER;
    v_precoUnitarioConvertido      NUMBER;
    v_valorProdutoServico          NUMBER;
    v_valorBasePagamento           NUMBER;
    v_valorFreteTotal              NUMBER;
    v_valorSeguroTotal             NUMBER;
    v_valorDescontoTotal           NUMBER;
    v_valorOutrasDespesasTotal     NUMBER;
    v_valorAdicFreteMarinMerTotal  NUMBER;
    v_valorDespesasAduaneirasTotal NUMBER;
    v_baseISSQN                    NUMBER;
    v_valorISSQN                   NUMBER;
    v_baseIRRF                     NUMBER;
    v_valorIRRF                    NUMBER;
    v_baseINSS                     NUMBER;
    v_valorINSS                    NUMBER;
    v_baseRetPIS                   NUMBER;
    v_valorRetPIS                  NUMBER;
    v_baseRetCOFINS                NUMBER;
    v_valorRetCOFINS               NUMBER;
    v_baseRetCSLL                  NUMBER;
    v_valorRetCSLL                 NUMBER;
    v_baseII                       NUMBER;
    v_valorII                      NUMBER;
    v_baseIOF                      NUMBER;
    v_valorIOF                     NUMBER;
    v_baseIPI                      NUMBER;
    v_valorIPI                     NUMBER;
    v_basePIS                      NUMBER;
    v_valorPIS                     NUMBER;
    v_basePISST                    NUMBER;
    v_valorPISST                   NUMBER;
    v_baseCOFINS                   NUMBER;
    v_valorCOFINS                  NUMBER;
    v_baseCOFINSST                 NUMBER;
    v_valorCOFINSST                NUMBER;
    v_baseCreditoSimplesNacional   NUMBER;
    v_valorCreditoSimplesNacional  NUMBER;
    v_baseICMS                     NUMBER;
    v_valorICMSOperacao            NUMBER;
    v_valorICMSDiferido            NUMBER;
    v_valorICMS                    NUMBER;
    v_valorICMSDesoneracao         NUMBER;
    v_baseICMSST                   NUMBER;
    v_valorICMSST                  NUMBER;
    v_baseICMSSTAnteriormente      NUMBER;
    v_valorICMSSTAnteriormente     NUMBER;
    v_valorICMSProprioSubstituto   NUMBER;
    v_baseICMSEfetivo              NUMBER;
    v_valorICMSEfetivo             NUMBER;
    v_baseICMSEscrituracao         NUMBER;
    v_valorICMSEscrituracao        NUMBER;
    v_valorICMSDesonEscrituracao   NUMBER;
    v_baseICMSSTEscrituracao       NUMBER;
    v_valorICMSSTEscrituracao      NUMBER;
    v_baseICMSUFDestinatario       NUMBER;
    v_valorICMSUFDestinatario      NUMBER;
    v_baseICMSUFRemetente          NUMBER;
    v_valorICMSUFRemetente         NUMBER;
    v_baseFCP                      NUMBER;
    v_valorFCP                     NUMBER;
    v_baseFCPST                    NUMBER;
    v_valorFCPST                   NUMBER;
    v_baseFCPSTAnteriormente       NUMBER;
    v_valorFCPSTAnteriormente      NUMBER;
    v_baseFCPUFDestinatario        NUMBER;
    v_valorFCPUFDestinatario       NUMBER;
    v_baseEstimadaImpostos         NUMBER;
    v_valorEstimadoImpFederais     NUMBER;
    v_valorEstimadoImpEstaduais    NUMBER;
    v_valorEstimadoImpMunicipais   NUMBER;
    v_valorImpSomaPagamento        NUMBER;
    v_valorImpDiminuiPagamento     NUMBER;
    v_valorLiquidoItem             NUMBER;
    v_valorDescontoCustoOpTotal    NUMBER;
    v_valorAcrescimoCustoOpTotal   NUMBER;
    v_precoCustoOperacao           NUMBER;
    v_valorCustoOperacao           NUMBER;
    v_precoCMV                     NUMBER;
    v_valorCMV                     NUMBER;
    v_valorAcrescimoExtempSubtotal NUMBER;
    v_valorAcrescimoExtempTotal    NUMBER;
    CURSOR c_item IS
      SELECT
        a.*,
        gradProd.produto,
        gradProd.cor,
        gradProd.tamanho,
        prod.controleEstoque,
        prod.tipoProduto
      FROM MODOCFISCALXITENS a
      JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
      WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
      AND a.cancelado = 0
      ORDER BY a.sequencia;
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_valorImpSomaPagamento    := 0;
  r_cab_valorImpDiminuiPagamento := 0;
  r_cab_valorLiquidoItem         := 0;
  r_cab_valorDescCustoOpTotal    := 0;
  r_cab_valorAcrescCustoOpTotal  := 0;
  r_cab_valorCustoOperacao       := 0;
  r_cab_valorCMV                 := 0;
  r_cab_valorAcrescExtempTotal   := 0;
  FOR item IN c_item LOOP
    v_acrescimoUnitarioComposicao  := item.acrescimoUnitarioComposicao;
    v_precoUnitario                := item.precoUnitario;
    v_precoUnitarioConvertido      := item.precoUnitarioConvertido;
    v_valorProdutoServico          := item.valorProdutoServico;
    v_valorBasePagamento           := item.valorBasePagamento;
    v_valorFreteTotal              := item.valorFreteTotal;
    v_valorSeguroTotal             := item.valorSeguroTotal;
    v_valorDescontoTotal           := item.valorDescontoTotal;
    v_valorOutrasDespesasTotal     := item.valorOutrasDespesasTotal;
    v_valorAdicFreteMarinMerTotal  := item.valorAdicFreteMarinhaMerTotal;
    v_valorDespesasAduaneirasTotal := item.valorDespesasAduaneirasTotal;
    v_baseISSQN                    := item.baseISSQN;
    v_valorISSQN                   := item.valorISSQN;
    v_baseIRRF                     := item.baseIRRF;
    v_valorIRRF                    := item.valorIRRF;
    v_baseINSS                     := item.baseINSS;
    v_valorINSS                    := item.valorINSS;
    v_baseRetPIS                   := item.baseRetPIS;
    v_valorRetPIS                  := item.valorRetPIS;
    v_baseRetCOFINS                := item.baseRetCOFINS;
    v_valorRetCOFINS               := item.valorRetCOFINS;
    v_baseRetCSLL                  := item.baseRetCSLL;
    v_valorRetCSLL                 := item.valorRetCSLL;
    v_baseII                       := item.baseII;
    v_valorII                      := item.valorII;
    v_baseIOF                      := item.baseIOF;
    v_valorIOF                     := item.valorIOF;
    v_baseIPI                      := item.baseIPI;
    v_valorIPI                     := item.valorIPI;
    v_basePIS                      := item.basePIS;
    v_valorPIS                     := item.valorPIS;
    v_basePISST                    := item.basePISST;
    v_valorPISST                   := item.valorPISST;
    v_baseCOFINS                   := item.baseCOFINS;
    v_valorCOFINS                  := item.valorCOFINS;
    v_baseCOFINSST                 := item.baseCOFINSST;
    v_valorCOFINSST                := item.valorCOFINSST;
    v_baseCreditoSimplesNacional   := item.baseCreditoSimplesNacional;
    v_valorCreditoSimplesNacional  := item.valorCreditoSimplesNacional;
    v_baseICMS                     := item.baseICMS;
    v_valorICMSOperacao            := item.valorICMSOperacao;
    v_valorICMSDiferido            := item.valorICMSDiferido;
    v_valorICMS                    := item.valorICMS;
    v_valorICMSDesoneracao         := item.valorICMSDesoneracao;
    v_baseICMSST                   := item.baseICMSST;
    v_valorICMSST                  := item.valorICMSST;
    v_baseICMSSTAnteriormente      := item.baseICMSSTAnteriormente;
    v_valorICMSSTAnteriormente     := item.valorICMSSTAnteriormente;
    v_valorICMSProprioSubstituto   := item.valorICMSProprioSubstituto;
    v_baseICMSEfetivo              := item.baseICMSEfetivo;
    v_valorICMSEfetivo             := item.valorICMSEfetivo;
    v_baseICMSEscrituracao         := item.baseICMSEscrituracao;
    v_valorICMSEscrituracao        := item.valorICMSEscrituracao;
    v_valorICMSDesonEscrituracao   := item.valorICMSDesonEscrituracao;
    v_baseICMSSTEscrituracao       := item.baseICMSSTEscrituracao;
    v_valorICMSSTEscrituracao      := item.valorICMSSTEscrituracao;
    v_baseICMSUFDestinatario       := item.baseICMSUFDestinatario;
    v_valorICMSUFDestinatario      := item.valorICMSUFDestinatario;
    v_baseICMSUFRemetente          := item.baseICMSUFRemetente;
    v_valorICMSUFRemetente         := item.valorICMSUFRemetente;
    v_baseFCP                      := item.baseFCP;
    v_valorFCP                     := item.valorFCP;
    v_baseFCPST                    := item.baseFCPST;
    v_valorFCPST                   := item.valorFCPST;
    v_baseFCPSTAnteriormente       := item.baseFCPSTAnteriormente;
    v_valorFCPSTAnteriormente      := item.valorFCPSTAnteriormente;
    v_baseFCPUFDestinatario        := item.baseFCPUFDestinatario;
    v_valorFCPUFDestinatario       := item.valorFCPUFDestinatario;
    v_baseEstimadaImpostos         := item.baseEstimadaImpostos;
    v_valorEstimadoImpFederais     := item.valorEstimadoImpFederais;
    v_valorEstimadoImpEstaduais    := item.valorEstimadoImpEstaduais;
    v_valorEstimadoImpMunicipais   := item.valorEstimadoImpMunicipais;
    v_valorImpSomaPagamento        := item.valorImpostosSomaPagamento;
    v_valorImpDiminuiPagamento     := item.valorImpostosDiminuiPagamento;
    v_valorLiquidoItem             := item.valorLiquidoItem;
    v_valorDescontoCustoOpTotal    := item.valorDescontoCustoOpTotal;
    v_valorAcrescimoCustoOpTotal   := item.valorAcrescimoCustoOpTotal;
    v_precoCustoOperacao           := item.precoCustoOperacao;
    v_valorCustoOperacao           := item.valorCustoOperacao;
    v_precoCMV                     := item.precoCMV;
    v_valorCMV                     := item.valorCMV;
    v_valorAcrescimoExtempSubtotal := item.valorAcrescimoExtempSubtotal;
    v_valorAcrescimoExtempTotal    := item.valorAcrescimoExtempTotal;
    ADD_CALCULA_TOTAIS_ITEM(
      ' ',
      ' ',
      0,
      0,
      0,
      0,
      'D',
      p_cab_entradaSaida,
      p_cab_devolucaoAnulacaoRetorno,
      p_a_cab_tipoPagamentoFrete,
      p_cab_tipoPagamentoFrete,
      p_cab_impostosEditados,
      p_modDoc_diminuiDescontoPrUnit,
      p_modDoc_somaAcrescimosPrUnit,
      p_modDoc_somaFreteSeguroPrUnit,
      item.idItemDocFiscal,
      item.quantidade,
      item.quantidadeConvertida,
      item.precoUnitarioBruto,
      v_precoUnitario,
      item.valorProdutoServicoBruto,
      v_valorProdutoServico,
      item.valorDescontoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      item.valorFreteGeral,
      item.valorSeguroGeral,
      item.valorDescontoGeral,
      item.valorOutrasDespesasGeral,
      item.valorAdicFreteMarinhaMerGeral,
      item.valorDespesasAduaneirasGeral,
      item.valorDescontoPagamento,
      item.valorOutrasDespesasPagamento,
      item.valorJurosPagamento,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal,
      item.quantidadeExtemporanea,
      item.acrescimoUnitarioExtemporaneo,
      item.valorAcrescimoExtempItem,
      item.valorAcrescimoExtempGeral,
      0,
      /* Retornos */
      v_acrescimoUnitarioComposicao,
      v_auxNumber,
      v_precoUnitario,
      v_auxNumber,
      v_precoUnitarioConvertido,
      v_auxNumber,
      v_valorProdutoServico,
      v_auxNumber,
      v_auxNumber,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal,
      v_valorAcrescimoExtempSubtotal,
      v_valorAcrescimoExtempTotal,
      v_auxNumber);    
    ADD_CALCULA_IMPOSTOS_ITEM (
      p_config_64_casasDecSaidas,
      p_config_209_filtrarGrupoEcon,
      p_config_330_redIcmsBasePisCof,
      p_config_362_calcCustoPorGrade,
      p_cab_entradaSaida,
      p_cab_devolucaoAnulacaoRetorno,
      p_cab_estabelecimento,
      p_cab_nfFornecedor,
      p_cab_dataEntradaSaida,
      p_cab_pessoa,
      p_cab_localDestinoOperacao,
      p_cab_indicadorConsumidorFinal,
      p_cab_tipoPagamentoFrete,
      p_pess_indicadorInscricaoEstad,
      item.personalizacao,
      item.quantidade,
      item.precoPautaTabelado,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal,
      item.cfop,
      1,
      item.indicadorISSQN,
      item.aliquotaISSQN,
      v_baseISSQN,
      v_valorISSQN,
      1,
      item.aliquotaIRRF,
      v_baseIRRF,
      v_valorIRRF,
      1,
      item.aliquotaINSS,
      v_baseINSS,
      v_valorINSS,
      1,
      item.retencaoPIS,
      v_baseRetPIS,
      v_valorRetPIS,
      1,
      item.retencaoCOFINS,
      v_baseRetCOFINS,
      v_valorRetCOFINS,
      1,
      item.retencaoCSLL,
      v_baseRetCSLL,
      v_valorRetCSLL,
      1,
      item.aliquotaII,
      v_baseII,
      v_valorII,
      1,
      item.aliquotaIOF,
      v_baseIOF,
      v_valorIOF,
      1,
      item.aliquotaIPI,
      item.valorAliquotaIPI,
      v_baseIPI,
      v_valorIPI,
      item.valorIPIDevolucao,
      1,
      item.aliquotaPIS,
      item.valorAliquotaPIS,
      v_basePIS,
      v_valorPIS,
      1,
      item.aliquotaPISST,
      item.valorAliquotaPISST,
      v_basePISST,
      v_valorPISST,
      1,
      item.aliquotaCOFINS,
      item.valorAliquotaCOFINS,
      v_baseCOFINS,
      v_valorCOFINS,
      1,
      item.aliquotaCOFINSST,
      item.valorAliquotaCOFINSST,
      v_baseCOFINSST,
      v_valorCOFINSST,
      1,
      item.stSimplesNacional,
      item.creditoSimplesNacional,
      v_baseCreditoSimplesNacional,
      v_valorCreditoSimplesNacional,
      1,
      item.stICMS,
      item.modalidadeBaseCalcICMS,
      item.reducaoBaseICMS,
      item.aliquotaICMS,
      item.diferimentoICMS,
      v_baseICMS,
      v_valorICMSOperacao,
      v_valorICMSDiferido,
      v_valorICMS,
      v_valorICMSDesoneracao,
      1,
      item.modalidadeBaseCalcICMSST,
      item.margemValorAdicionadoST,
      item.reducaoBaseST,
      item.aliquotaICMSST,
      v_baseICMSST,
      v_valorICMSST,
      1,
      v_baseICMSSTAnteriormente,
      v_valorICMSSTAnteriormente,
      v_valorICMSProprioSubstituto,
      item.reducaoBaseICMSEfetivo,
      item.aliquotaICMSEfetivo,
      v_baseICMSEfetivo,
      v_valorICMSEfetivo,
      1,
      item.stICMSEscrituracao,
      item.reducaoBaseICMSEscrituracao,
      item.aliquotaICMSEscrituracao,
      v_baseICMSEscrituracao,
      v_valorICMSEscrituracao,
      v_valorICMSDesonEscrituracao,
      1,
      item.margemValorAdicSTEscrituracao,
      item.reducaoBaseSTEscrituracao,
      item.aliquotaICMSSTEscrituracao,
      v_baseICMSSTEscrituracao,
      v_valorICMSSTEscrituracao,
      1,
      item.aliquotaICMSUFDestinatario,
      item.aliquotaICMSInterestadual,
      item.partilhaICMSInterestadual,
      v_baseICMSUFDestinatario,
      v_valorICMSUFDestinatario,
      v_baseICMSUFRemetente,
      v_valorICMSUFRemetente,
      1,
      item.aliquotaFCP,
      v_baseFCP,
      v_valorFCP,
      item.aliquotaFCPST,
      v_baseFCPST,
      v_valorFCPST,
      item.aliquotaFCPSTAnteriormente,
      v_baseFCPSTAnteriormente,
      v_valorFCPSTAnteriormente,
      item.aliquotaFCPUFDestinatario,
      v_baseFCPUFDestinatario,
      v_valorFCPUFDestinatario,
      1,
      item.aliquotaEstimadaImpFederais,
      item.aliquotaEstimadaImpEstaduais,
      item.aliquotaEstimadaImpMunicipais,
      v_baseEstimadaImpostos,
      v_valorEstimadoImpFederais,
      v_valorEstimadoImpEstaduais,
      v_valorEstimadoImpMunicipais,
      item.produto,
      item.cor,
      item.tamanho,
      item.controleEstoque,
      item.tipoProduto,
      /* Retornos */
      v_baseISSQN,
      v_valorISSQN,
      v_baseIRRF,
      v_valorIRRF,
      v_baseINSS,
      v_valorINSS,
      v_baseRetPIS,
      v_valorRetPIS,
      v_baseRetCOFINS,
      v_valorRetCOFINS,
      v_baseRetCSLL,
      v_valorRetCSLL,
      v_baseII,
      v_valorII,
      v_baseIOF,
      v_valorIOF,
      v_baseIPI,
      v_valorIPI,
      v_basePIS,
      v_valorPIS,
      v_basePISST,
      v_valorPISST,
      v_baseCOFINS,
      v_valorCOFINS,
      v_baseCOFINSST,
      v_valorCOFINSST,
      v_baseCreditoSimplesNacional,
      v_valorCreditoSimplesNacional,
      v_baseICMS,
      v_valorICMSOperacao,
      v_valorICMSDiferido,
      v_valorICMS,
      v_valorICMSDesoneracao,
      v_baseICMSST,
      v_valorICMSST,
      v_baseICMSSTAnteriormente,
      v_valorICMSSTAnteriormente,
      v_valorICMSProprioSubstituto,
      v_baseICMSEfetivo,
      v_valorICMSEfetivo,
      v_baseICMSEscrituracao,
      v_valorICMSEscrituracao,
      v_valorICMSDesonEscrituracao,
      v_baseICMSSTEscrituracao,
      v_valorICMSSTEscrituracao,
      v_baseICMSUFDestinatario,
      v_valorICMSUFDestinatario,
      v_baseICMSUFRemetente,
      v_valorICMSUFRemetente,
      v_baseFCP,
      v_valorFCP,
      v_baseFCPST,
      v_valorFCPST,
      v_baseFCPSTAnteriormente,
      v_valorFCPSTAnteriormente,
      v_baseFCPUFDestinatario,
      v_valorFCPUFDestinatario,
      v_baseEstimadaImpostos,
      v_valorEstimadoImpFederais,
      v_valorEstimadoImpEstaduais,
      v_valorEstimadoImpMunicipais);    
    ADD_CALCULA_VALOR_LIQUIDO (
      p_cab_nfFornecedor,
      p_cab_tipoPagamentoFrete,
      item.geraFinanceiro,
      v_valorProdutoServico,
      item.valorDescontoPagamento,
      item.valorOutrasDespesasPagamento,
      item.valorJurosPagamento,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorIRRF,
      v_valorINSS,
      v_valorRetPIS,
      v_valorRetCOFINS,
      v_valorRetCSLL,
      v_valorII,
      v_valorIOF,
      v_valorIPI,
      item.valorIPIDevolucao,
      v_valorICMSST,
      v_valorICMSSTEscrituracao,
      item.somarICMSST,
      v_valorAcrescimoExtempTotal,
      /* Retornos */
      v_valorBasePagamento,
      v_valorImpSomaPagamento,
      v_valorImpDiminuiPagamento,
      v_valorLiquidoItem);
    ADD_CALCULA_CUSTO_CMV (
      p_cab_modeloDocumento,
      p_cab_atualizaCustoMedio,
      p_cab_nfFornecedor,
      item.quantidade,
      v_valorII,
      v_valorIOF,
      v_valorIPI,
      item.valorIPIDevolucao,
      v_valorPIS,
      v_valorPISST,
      v_valorCOFINS,
      v_valorCOFINSST,
      v_valorCreditoSimplesNacional,
      v_valorICMS,
      v_valorICMSST,
      v_valorICMSSTEscrituracao,
      v_valorLiquidoItem,
      item.valorDescontoCustoOpItem,
      item.valorDescontoCustoOpGeral,
      item.valorAcrescimoCustoOpItem,
      item.valorAcrescimoCustoOpGeral,
      v_valorAcrescimoExtempTotal,
      /* Retornos */
      v_valorDescontoCustoOpTotal,
      v_valorAcrescimoCustoOpTotal,
      v_precoCustoOperacao,
      v_valorCustoOperacao,
      v_precoCMV,
      v_valorCMV);
    UPDATE MODOCFISCALXITENS SET
      acrescimoUnitarioComposicao   = v_acrescimoUnitarioComposicao,
      precoUnitario                 = v_precoUnitario,
      precoUnitarioConvertido       = v_precoUnitarioConvertido,
      valorProdutoServico           = v_valorProdutoServico,
      valorBasePagamento            = v_valorBasePagamento,
      valorFreteTotal               = v_valorFreteTotal,
      valorSeguroTotal              = v_valorSeguroTotal,
      valorDescontoTotal            = v_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
      valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
      baseISSQN                     = v_baseISSQN,
      valorISSQN                    = v_valorISSQN,
      baseIRRF                      = v_baseIRRF,
      valorIRRF                     = v_valorIRRF,
      baseINSS                      = v_baseINSS,
      valorINSS                     = v_valorINSS,
      baseRetPIS                    = v_baseRetPIS,
      valorRetPIS                   = v_valorRetPIS,
      baseRetCOFINS                 = v_baseRetCOFINS,
      valorRetCOFINS                = v_valorRetCOFINS,
      baseRetCSLL                   = v_baseRetCSLL,
      valorRetCSLL                  = v_valorRetCSLL,
      baseII                        = v_baseII,
      valorII                       = v_valorII,
      baseIOF                       = v_baseIOF,
      valorIOF                      = v_valorIOF,
      baseIPI                       = v_baseIPI,
      valorIPI                      = v_valorIPI,
      basePIS                       = v_basePIS,
      valorPIS                      = v_valorPIS,
      basePISST                     = v_basePISST,
      valorPISST                    = v_valorPISST,
      baseCOFINS                    = v_baseCOFINS,
      valorCOFINS                   = v_valorCOFINS,
      baseCOFINSST                  = v_baseCOFINSST,
      valorCOFINSST                 = v_valorCOFINSST,
      baseCreditoSimplesNacional    = v_baseCreditoSimplesNacional,
      valorCreditoSimplesNacional   = v_valorCreditoSimplesNacional,
      baseICMS                      = v_baseICMS,
      valorICMSOperacao             = v_valorICMSOperacao,
      valorICMSDiferido             = v_valorICMSDiferido,
      valorICMS                     = v_valorICMS,
      valorICMSDesoneracao          = v_valorICMSDesoneracao,
      baseICMSST                    = v_baseICMSST,
      valorICMSST                   = v_valorICMSST,
      baseICMSSTAnteriormente       = v_baseICMSSTAnteriormente,
      valorICMSSTAnteriormente      = v_valorICMSSTAnteriormente,
      valorICMSProprioSubstituto    = v_valorICMSProprioSubstituto,
      baseICMSEfetivo               = v_baseICMSEfetivo,
      valorICMSEfetivo              = v_valorICMSEfetivo,
      baseICMSEscrituracao          = v_baseICMSEscrituracao,
      valorICMSEscrituracao         = v_valorICMSEscrituracao,
      valorICMSDesonEscrituracao    = v_valorICMSDesonEscrituracao,
      baseICMSSTEscrituracao        = v_baseICMSSTEscrituracao,
      valorICMSSTEscrituracao       = v_valorICMSSTEscrituracao,
      baseICMSUFDestinatario        = v_baseICMSUFDestinatario,
      valorICMSUFDestinatario       = v_valorICMSUFDestinatario,
      baseICMSUFRemetente           = v_baseICMSUFRemetente,
      valorICMSUFRemetente          = v_valorICMSUFRemetente,
      baseFCP                       = v_baseFCP,
      valorFCP                      = v_valorFCP,
      baseFCPST                     = v_baseFCPST,
      valorFCPST                    = v_valorFCPST,
      baseFCPSTAnteriormente        = v_baseFCPSTAnteriormente,
      valorFCPSTAnteriormente       = v_valorFCPSTAnteriormente,
      baseFCPUFDestinatario         = v_baseFCPUFDestinatario,
      valorFCPUFDestinatario        = v_valorFCPUFDestinatario,
      baseEstimadaImpostos          = v_baseEstimadaImpostos,
      valorEstimadoImpFederais      = v_valorEstimadoImpFederais,
      valorEstimadoImpEstaduais     = v_valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais    = v_valorEstimadoImpMunicipais,
      valorImpostosSomaPagamento    = v_valorImpSomaPagamento,
      valorImpostosDiminuiPagamento = v_valorImpDiminuiPagamento,
      valorLiquidoItem              = v_valorLiquidoItem,
      valorDescontoCustoOpTotal     = v_valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpTotal    = v_valorAcrescimoCustoOpTotal,
      precoCustoOperacao            = v_precoCustoOperacao,
      valorCustoOperacao            = v_valorCustoOperacao,
      precoCMV                      = v_precoCMV,
      valorCMV                      = v_valorCMV,
      valorAcrescimoExtempSubtotal  = v_valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempTotal     = v_valorAcrescimoExtempTotal
    WHERE idItemDocFiscal           = item.idItemDocFiscal;
    IF item.servico = 1 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 item.usarPrecoAVista = 1 AND item.geraFinanceiro = 1 THEN
      r_cab_valorAVistaMinimo        := r_cab_valorAVistaMinimo + v_valorProdutoServico + item.valorDescontoPagamento - item.valorOutrasDespesasPagamento - item.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_valorImpSomaPagamento    := r_cab_valorImpSomaPagamento + v_valorImpSomaPagamento;
    r_cab_valorImpDiminuiPagamento := r_cab_valorImpDiminuiPagamento + v_valorImpDiminuiPagamento;
    r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem + v_valorLiquidoItem;
    r_cab_valorDescCustoOpTotal    := r_cab_valorDescCustoOpTotal + v_valorDescontoCustoOpTotal;
    r_cab_valorAcrescCustoOpTotal  := r_cab_valorAcrescCustoOpTotal + v_valorAcrescimoCustoOpTotal;
    r_cab_valorCustoOperacao       := r_cab_valorCustoOperacao + v_valorCustoOperacao;
    r_cab_valorCMV                 := r_cab_valorCMV + v_valorCMV;
    r_cab_valorAcrescExtempTotal   := r_cab_valorAcrescExtempTotal + v_valorAcrescimoExtempTotal;
  END LOOP;
END ADD_DOC_FISC_CALC_IMP_ITENS;

/

create or replace PROCEDURE ADD_DOC_FISC_CALC_IMP_CAB (
    p_uniqueMachineID              IN VARCHAR2,
    p_config_64_casasDecSaidas     IN CHAR,
    p_config_65_casasDecEntrada    IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_330_redIcmsBasePisCof IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_regMarg_tipoPreco            IN CHAR,
    p_regMarg_tabelaPreco          IN VARCHAR2,
    p_regMarg_fatorMultiplicador   IN NUMBER,
    p_regMarg_tipoPrecoB           IN CHAR,
    p_regMarg_tabelaPrecoB         IN VARCHAR2,
    p_regMarg_fatorMultiplicadorB  IN NUMBER,
    p_regMarg_reduzirImpostos      IN NUMBER,
    p_regMarg_reduzirTarifaCartao  IN NUMBER,
    p_regMarg_taxaCapitacaoCustoFi IN NUMBER,
    p_regMarg_exibPercMargemCab    IN NUMBER,
    p_regMarg_exibImagemMargemCab  IN NUMBER,
    p_regMarg_regraImagemCab       IN NUMBER,
    p_regMarg_bloqPercMargemCab    IN NUMBER,
    p_regMarg_exibPercMargemItem   IN NUMBER,
    p_regMarg_exibImagemMargemItem IN NUMBER,
    p_regMarg_regraImagemItem      IN NUMBER,
    p_regMarg_exibDetMargemItem    IN NUMBER,
    p_regMarg_bloqPercMargemItem   IN NUMBER,
    p_calcularMargemContribuicao   IN NUMBER,
    p_cab_idDocumentoFiscal        IN NUMBER,
    p_a_cab_tipoPagamentoFrete     IN CHAR,
    /* Retornos */
    r_cab_valorProdutos            OUT NUMBER,
    r_cab_valorServicos            OUT NUMBER,
    r_cab_valorBasePagamento       OUT NUMBER,
    r_cab_valorAVistaMinimo        OUT NUMBER,
    r_cab_valorFreteTotal          OUT NUMBER,
    r_cab_valorSeguroTotal         OUT NUMBER,
    r_cab_valorAdicFreteMarinTotal OUT NUMBER,
    r_cab_valorDespesasAduanTotal  OUT NUMBER,
    r_cab_valorImpSomaPagamento    OUT NUMBER,
    r_cab_valorImpDiminuiPagamento OUT NUMBER,
    r_cab_valorLiquidoItem         OUT NUMBER,
    r_cab_valorAcrescExtempTotal   OUT NUMBER,
    r_cab_valorTarifaCartao        OUT NUMBER,
    r_cab_valorMargem              OUT NUMBER,
    r_cab_percentualMargem         OUT NUMBER,
    r_cab_imagemMargem             OUT VARCHAR2)    
IS
    v_cab_valorDescontoTotal       NUMBER;
    v_cab_valorOutrasDespesasTotal NUMBER;
    v_cab_valorCustoOperacao       NUMBER;
    v_cab_valorCMV                 NUMBER;
    v_cab_valorDescCustoOpTotal    NUMBER;
    v_cab_valorAcrescCustoOpTotal  NUMBER;
    v_calcularImpostosItem         NUMBER;
    CURSOR c_cab IS
      SELECT a.*,
        modDoc.diminuiDescontoPrUnit,
        modDoc.somaAcrescimosPrUnit,
        modDoc.somaFreteSeguroPrUnit,
        modDoc.habilitaControleEntrega,
        pess.indicadorInscricaoEstadual,
        COALESCE((
          SELECT MIN(munEndEst.uf)
          FROM PAESTABELECIMENTOS est
          JOIN CAENDERECOSPESSOA endEst ON endEst.pessoa = est.pessoaEstabelecimento
          JOIN SIMUNICIPIOS munEndEst on munEndEst.municipio = endEst.municipio
          WHERE est.estabelecimento = a.estabelecimento
          AND endEst.ativo = 1
          AND endEst.principal = 1
          ),'  ') munEndEst_uf
      FROM MODOCUMENTOSFISCAIS a
      JOIN PAMODELOSDOCUMENTO modDoc ON modDoc.modeloDocumento = a.modeloDocumento
      JOIN CAPESSOAS pess ON pess.pessoa = a.pessoa
      WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal;
BEGIN
  FOR cab IN c_cab LOOP
    r_cab_valorProdutos            := cab.valorProdutos;
    r_cab_valorServicos            := cab.valorServicos;
    r_cab_valorBasePagamento       := cab.valorBasePagamento;
    r_cab_valorAVistaMinimo        := cab.valorAVistaMinimo;
    r_cab_valorFreteTotal          := cab.valorFreteTotal;
    r_cab_valorSeguroTotal         := cab.valorSeguroTotal;
    v_cab_valorDescontoTotal       := cab.valorDescontoTotal;
    v_cab_valorOutrasDespesasTotal := cab.valorOutrasDespesasTotal;
    r_cab_valorAdicFreteMarinTotal := cab.valorAdicFreteMarinhaMerTotal;
    r_cab_valorDespesasAduanTotal  := cab.valorDespesasAduaneirasTotal;
    r_cab_valorImpSomaPagamento    := cab.valorImpostosSomaPagamento;
    r_cab_valorImpDiminuiPagamento := cab.valorImpostosDiminuiPagamento;
    r_cab_valorLiquidoItem         := cab.valorLiquidoItem;
    v_cab_valorDescCustoOpTotal    := cab.valorDescontoCustoOpTotal;
    v_cab_valorAcrescCustoOpTotal  := cab.valorAcrescimoCustoOpTotal;
    v_cab_valorCustoOperacao       := cab.valorCustoOperacao;
    v_cab_valorCMV                 := cab.valorCMV;
    r_cab_valorAcrescExtempTotal   := cab.valorAcrescimoExtempTotal;    
    r_cab_valorTarifaCartao        := 0;
    r_cab_valorMargem              := 0;
    r_cab_percentualMargem         := 0;
    r_cab_imagemMargem             := ' ';
    v_calcularImpostosItem         := 0;
    ADD_DOC_FISC_CALC_IMP_RATEIO (
      cab.idDocumentoFiscal,
      cab.modeloDocumento,
      cab.entradaSaida,
      cab.devolucaoAnulacaoRetorno,
      cab.atualizaCustoMedio,
      cab.nfFornecedor,
      p_a_cab_tipoPagamentoFrete,
      cab.tipoPagamentoFrete,
      cab.valorFreteGeral,
      cab.valorSeguroGeral,
      cab.valorDescontoGeral,
      cab.valorOutrasDespesasGeral,
      cab.valorAdicFreteMarinhaMerGeral,
      cab.valorDespesasAduaneirasGeral,
      cab.valorDescontoPagamento,
      cab.valorOutrasDespesasPagamento,
      cab.valorJurosPagamento,
      cab.impostosEditados,
      cab.valorDescontoCustoOpGeral,
      cab.valorAcrescimoCustoOpGeral,
      cab.valorAcrescimoExtempGeral,
      cab.diminuiDescontoPrUnit,
      cab.somaAcrescimosPrUnit,
      cab.somaFreteSeguroPrUnit,
      cab.habilitaControleEntrega,
      /* Retornos */
      r_cab_valorProdutos,
      r_cab_valorServicos,
      r_cab_valorBasePagamento,
      r_cab_valorAVistaMinimo,
      r_cab_valorFreteTotal,
      r_cab_valorSeguroTotal,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespesasTotal,
      r_cab_valorAdicFreteMarinTotal,
      r_cab_valorDespesasAduanTotal,
      r_cab_valorImpSomaPagamento,
      r_cab_valorImpDiminuiPagamento,
      r_cab_valorLiquidoItem,
      v_cab_valorDescCustoOpTotal,
      v_cab_valorAcrescCustoOpTotal,
      v_cab_valorCustoOperacao,
      v_cab_valorCMV,
      r_cab_valorAcrescExtempTotal,
      v_calcularImpostosItem);
    IF v_calcularImpostosItem = 1 THEN
      ADD_DOC_FISC_CALC_IMP_ITENS(
        p_config_64_casasDecSaidas,
        p_config_209_filtrarGrupoEcon,
        p_config_330_redIcmsBasePisCof,
        p_config_362_calcCustoPorGrade,
        cab.idDocumentoFiscal,
        cab.modeloDocumento,
        cab.entradaSaida,
        cab.devolucaoAnulacaoRetorno,
        cab.atualizaCustoMedio,
        cab.estabelecimento,
        cab.nfFornecedor,
        cab.dataEntradaSaida,
        cab.pessoa,
        cab.localDestinoOperacao,
        cab.indicadorConsumidorFinal,
        p_a_cab_tipoPagamentoFrete,
        cab.tipoPagamentoFrete,
        cab.valorProdutosBruto,
        cab.valorDescontoProdutos,
        cab.valorAcrescimoProdutos,
        cab.valorServicosBruto,
        cab.valorDescontoServicos,
        cab.valorAcrescimoServicos,
        cab.valorFreteGeral,
        cab.valorSeguroGeral,
        cab.valorDescontoGeral,
        cab.valorOutrasDespesasGeral,
        cab.valorAdicFreteMarinhaMerGeral,
        cab.valorDespesasAduaneirasGeral,
        cab.valorDescontoPagamento,
        cab.valorOutrasDespesasPagamento,
        cab.valorJurosPagamento,
        cab.impostosEditados,
        cab.valorDescontoCustoOpGeral,
        cab.valorAcrescimoCustoOpGeral,
        cab.valorAcrescimoExtempGeral,
        cab.diminuiDescontoPrUnit,
        cab.somaAcrescimosPrUnit,
        cab.somaFreteSeguroPrUnit,
        cab.indicadorInscricaoEstadual,
        /* Retornos */
        r_cab_valorProdutos,
        r_cab_valorServicos,
        r_cab_valorBasePagamento,
        r_cab_valorAVistaMinimo,
        r_cab_valorFreteTotal,
        r_cab_valorSeguroTotal,
        v_cab_valorDescontoTotal,
        v_cab_valorOutrasDespesasTotal,
        r_cab_valorAdicFreteMarinTotal,
        r_cab_valorDespesasAduanTotal,
        r_cab_valorImpSomaPagamento,
        r_cab_valorImpDiminuiPagamento,
        r_cab_valorLiquidoItem,
        v_cab_valorDescCustoOpTotal,
        v_cab_valorAcrescCustoOpTotal,
        v_cab_valorCustoOperacao,
        v_cab_valorCMV,
        r_cab_valorAcrescExtempTotal);
    END IF;
    IF p_calcularMargemContribuicao = 1 AND (p_regMarg_exibPercMargemCab = 1 OR p_regMarg_exibImagemMargemCab = 1 OR p_regMarg_bloqPercMargemCab = 1 OR p_regMarg_exibPercMargemItem = 1 OR p_regMarg_exibImagemMargemItem = 1 OR p_regMarg_exibDetMargemItem = 1 OR p_regMarg_bloqPercMargemItem = 1) AND cab.tipoDocumento IN (101,102,301,501,503) THEN
      r_cab_valorTarifaCartao := FUNC_ADD_TARIFA_CART_DOC_FISC (cab.idDocumentoFiscal);
    END IF;
    IF p_calcularMargemContribuicao = 1 AND (p_regMarg_exibPercMargemCab = 1 OR p_regMarg_exibImagemMargemCab = 1 OR p_regMarg_exibPercMargemItem = 1 OR p_regMarg_exibImagemMargemItem = 1 OR p_regMarg_exibDetMargemItem = 1) AND cab.tipoDocumento IN (101,102,301,501,503) THEN
      DELETE TEMPMARGEMCONTRIBUICAO
      WHERE uniqueMachineID = p_uniqueMachineID
      AND orcamentoPredocumentoDocumento = 'D'
      AND idCabecalho = cab.idDocumentoFiscal;
      ADD_DOC_FISC_GERA_TEMP_MARGEM(
        p_uniqueMachineID,
        p_config_65_casasDecEntrada,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_regMarg_tipoPreco,
        p_regMarg_tabelaPreco,
        p_regMarg_fatorMultiplicador,
        p_regMarg_tipoPrecoB,
        p_regMarg_tabelaPrecoB,
        p_regMarg_fatorMultiplicadorB,
        p_regMarg_reduzirImpostos,
        p_regMarg_reduzirTarifaCartao,
        p_regMarg_taxaCapitacaoCustoFi,
        p_regMarg_exibImagemMargemCab,
        p_regMarg_regraImagemCab,
        p_regMarg_exibImagemMargemItem,
        p_regMarg_regraImagemItem,
        cab.idDocumentoFiscal,
        cab.estabelecimento,
        cab.dataEmissao,
        cab.prazoMedioPonderado,
        r_cab_valorFreteTotal,
        r_cab_valorSeguroTotal,
        r_cab_valorAdicFreteMarinTotal,
        r_cab_valorDespesasAduanTotal,
        r_cab_valorLiquidoItem,
        r_cab_valorTarifaCartao,
        cab.munEndEst_uf,
        /* Retornos */
        r_cab_valorMargem,
        r_cab_percentualMargem,
        r_cab_imagemMargem
      );
    END IF;
    UPDATE MODOCUMENTOSFISCAIS SET 
      valorProdutos                 = r_cab_valorProdutos,
      valorServicos                 = r_cab_valorServicos,
      valorBasePagamento            = r_cab_valorBasePagamento,
      valorAVistaMinimo             = r_cab_valorAVistaMinimo,
      valorFreteTotal               = r_cab_valorFreteTotal,
      valorSeguroTotal              = r_cab_valorSeguroTotal,
      valorDescontoTotal            = v_cab_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = r_cab_valorAdicFreteMarinTotal,
      valorDespesasAduaneirasTotal  = r_cab_valorDespesasAduanTotal,
      valorImpostosSomaPagamento    = r_cab_valorImpSomaPagamento,
      valorImpostosDiminuiPagamento = r_cab_valorImpDiminuiPagamento,
      valorLiquidoItem              = r_cab_valorLiquidoItem,
      valorDescontoCustoOpTotal     = v_cab_valorDescCustoOpTotal,
      valorAcrescimoCustoOpTotal    = v_cab_valorAcrescCustoOpTotal,
      valorCustoOperacao            = v_cab_valorCustoOperacao,
      valorCMV                      = v_cab_valorCMV,
      valorAcrescimoExtempTotal     = r_cab_valorAcrescExtempTotal
    WHERE idDocumentoFiscal         = cab.idDocumentoFiscal;
  END LOOP;
END ADD_DOC_FISC_CALC_IMP_CAB;

/

create or replace PROCEDURE ADD_PRE_DOC_ROT_EFET_ORCAMENTO(
    p_exclusivo               IN VARCHAR2,
    p_orcamento               IN NUMBER,
    p_usuarioLogado           IN NUMBER,
    p_estabelecimentoAtivo    IN NUMBER,
    p_sessao                  IN NUMBER,
    p_sessaoCaixa             IN NUMBER,
    p_idTerminalSiTef         IN VARCHAR2,
    p_serieFiscal             IN VARCHAR2,
    p_subSerieFiscal          IN NUMBER,
    p_documentoFiscal         IN NUMBER,
    p_dataEmissao             IN DATE,
    p_timezone                IN VARCHAR2,
    p_dataEntradaSaida        IN DATE,
    p_comissionadoB           IN NUMBER,
    p_comissionadoC           IN NUMBER,
    p_novaEtapaOrcamento      IN NUMBER,
    p_versaoAplicativo        IN VARCHAR2,
    r_preDocumento            OUT NUMBER)
IS
  v_tipoDocumento          NUMBER;
  v_fatoContabil           NUMBER;
  v_preDocumento           NUMBER;
  v_estabelecimento        NUMBER;
  v_pessoa                 NUMBER;
  v_colaboradorResponsavel NUMBER;
  CURSOR c_itens
  IS SELECT idItemOrcamento, CASE WHEN cancelado = 0 THEN FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXITENS', 'idItemPreDocumento', 0, p_estabelecimentoAtivo, NULL) ELSE 0 END idItemPreDocumento, sequencia, cancelado, vendedor, gradeProduto, servico, idFormulaTinta, personalizacao, idLoteEstoque, operacaoFiscal, movimentaEstoque, geraFinanceiro, localEstoque, pessoaParticipante, controleQuantidade, unidadeMedidaConversao, conversorQuantidade, loteMinimo, loteMultiplo, altura, largura, comprimento, pecas, quantidade, quantidadeConvertida, quantidadeConferida, pesoLiquido, pesoBruto, tipoPreco, tabelaPreco, precoSugestaoAPrazo, precoSugestaoAVista, precoDesconto, precoMinimo, usarPrecoAVista, precoPautaTabelado, 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, baseISSQN, valorISSQN, aliquotaIRRF, baseIRRF, valorIRRF, aliquotaINSS, baseINSS, valorINSS, retencaoPIS, baseRetPIS, valorRetPIS, retencaoCOFINS, baseRetCOFINS, valorRetCOFINS, retencaoCSLL, baseRetCSLL, valorRetCSLL, aliquotaII, baseII, valorII, aliquotaIOF, baseIOF, valorIOF, codigoEnquadramentoIPI, stIPI, aliquotaIPI, valorAliquotaIPI, baseIPI, valorIPI, stPIS, aliquotaPIS, valorAliquotaPIS, basePIS, valorPIS, aliquotaPISST, valorAliquotaPISST, basePISST, valorPISST, stCOFINS, aliquotaCOFINS, valorAliquotaCOFINS, baseCOFINS, valorCOFINS, aliquotaCOFINSST, valorAliquotaCOFINSST, baseCOFINSST, valorCOFINSST, stSimplesNacional, creditoSimplesNacional, baseCreditoSimplesNacional, valorCreditoSimplesNacional, stICMS, modalidadeBaseCalcICMS, reducaoBaseICMS, aliquotaICMS, diferimentoICMS, motivoDesoneracaoICMS, baseICMS, valorICMSOperacao, valorICMSDiferido, valorICMS, valorICMSDesoneracao, modalidadeBaseCalcICMSST, margemValorAdicionadoST, reducaoBaseST, aliquotaICMSST, aliquotaSTSuportConsFinal, baseICMSST, valorICMSST, baseICMSSTAnteriormente, valorICMSSTAnteriormente, valorICMSProprioSubstituto, reducaoBaseICMSEfetivo, aliquotaICMSEfetivo, baseICMSEfetivo, valorICMSEfetivo, aliquotaICMSUFDestinatario, aliquotaICMSInterestadual, partilhaICMSInterestadual, baseICMSUFDestinatario, valorICMSUFDestinatario, baseICMSUFRemetente, valorICMSUFRemetente, aliquotaFCP, baseFCP, valorFCP, aliquotaFCPST, baseFCPST, valorFCPST, aliquotaFCPSTAnteriormente, baseFCPSTAnteriormente, valorFCPSTAnteriormente, aliquotaFCPUFDestinatario, baseFCPUFDestinatario, valorFCPUFDestinatario, aliquotaEstimadaImpFederais, aliquotaEstimadaImpEstaduais, aliquotaEstimadaImpMunicipais, baseEstimadaImpostos, valorEstimadoImpFederais, valorEstimadoImpEstaduais, valorEstimadoImpMunicipais, valorImpostosSomaPagamento, valorImpostosDiminuiPagamento, valorLiquidoItem, observacoesDigitadas, observacoes
     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_pagtos
  IS SELECT idPagamentoOrcamento, FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXPAGAMENTOS', 'idPagamentoPreDocumento', 0, p_estabelecimentoAtivo, NULL) idPagamentoPreDocumento, 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 MOORCAMENTOXPAGAMENTOS
     WHERE orcamento = p_orcamento
     ORDER BY pagamentoTroco, sequencia;
  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 a.idMotivoBloqueioDocumento, a.idPagamentoOrcamento, FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTIVOSBLOQUEIOS', 'idMotivoBloqueioDocumento', 0, p_estabelecimentoAtivo, NULL) idMotivoBloqueioNovo
    FROM MOMOTBLOQXORCAMENTOPAGAM a
    JOIN MOORCAMENTOXPAGAMENTOS b ON b.idPagamentoOrcamento = a.idPagamentoOrcamento
    WHERE b.orcamento = p_orcamento;
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 WHERE vendedor = orc.colaboradorResponsavel AND 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, 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, 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.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.motorista,
    orc.placa,
    orc.vagao,
    orc.balsa,
    orc.quantidadeVolume,
    orc.especieVolume,
    orc.descricaoMarca,
    orc.numeracaoVolume,
    orc.codigoIntegracao,
    orc.atendimento,
    'E' statusPreDocumento,
    CASE WHEN v_colaboradorResponsavel = 0 THEN orc.ultimoVendedorItem ELSE v_colaboradorResponsavel 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,
    orc.numeroParcelas,
    orc.somaPrazoParcelas,
    orc.valorXPrazoParcelas,
    orc.prazoMedio,
    orc.prazoMedioPonderado,
    orc.valorBasePagamento,
    orc.valorAVistaMinimo,
    orc.valorEntradaMinima,
    orc.valorAVistaEntrada,
    orc.valorPagamentoBruto,
    orc.valorDescontoPagamento,
    orc.valorOutrasDespesasPagamento,
    orc.valorJurosPagamento,
    orc.valorPagamentoLiquido,
    orc.valorTroco,
    orc.valorFreteTotal,
    orc.valorSeguroTotal,
    orc.valorDescontoTotal,
    orc.valorOutrasDespesasTotal,
    orc.valorAdicFreteMarinhaMerTotal,
    orc.valorDespesasAduaneirasTotal,
    orc.impostosEditados,
    orc.valorImpostosSomaPagamento,
    orc.valorImpostosDiminuiPagamento,
    orc.valorLiquidoItem,
    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, vendedor, gradeProduto, servico, idFormulaTinta, personalizacao, idLoteEstoque, operacaoFiscal, movimentaEstoque, geraFinanceiro, localEstoque, pessoaParticipante, controleQuantidade, unidadeMedidaConversao, conversorQuantidade, loteMinimo, loteMultiplo, altura, largura, comprimento, pecas, quantidade, quantidadeConvertida, quantidadeDevolvidaRetornada, quantidadeConferida, percentualDevolucao, pesoLiquido, pesoBruto, tipoPreco, tabelaPreco, precoSugestaoAPrazo, precoSugestaoAVista, precoDesconto, precoMinimo, usarPrecoAVista, precoPautaTabelado, 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, baseISSQN, valorISSQN, aliquotaIRRF, baseIRRF, valorIRRF, aliquotaINSS, baseINSS, valorINSS, retencaoPIS, baseRetPIS, valorRetPIS, retencaoCOFINS, baseRetCOFINS, valorRetCOFINS, retencaoCSLL, baseRetCSLL, valorRetCSLL, 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, baseICMS, valorICMSOperacao, valorICMSDiferido, valorICMS, valorICMSDesoneracao, modalidadeBaseCalcICMSST, margemValorAdicionadoST, reducaoBaseST, aliquotaICMSST, aliquotaSTSuportConsFinal, baseICMSST, valorICMSST, baseICMSSTAnteriormente, valorICMSSTAnteriormente, valorICMSProprioSubstituto, reducaoBaseICMSEfetivo, aliquotaICMSEfetivo, baseICMSEfetivo, valorICMSEfetivo, aliquotaICMSUFDestinatario, aliquotaICMSInterestadual, partilhaICMSInterestadual, baseICMSUFDestinatario, valorICMSUFDestinatario, baseICMSUFRemetente, valorICMSUFRemetente, aliquotaFCP, baseFCP, valorFCP, aliquotaFCPST, baseFCPST, valorFCPST, aliquotaFCPSTAnteriormente, baseFCPSTAnteriormente, valorFCPSTAnteriormente, aliquotaFCPUFDestinatario, baseFCPUFDestinatario, valorFCPUFDestinatario, aliquotaEstimadaImpFederais, aliquotaEstimadaImpEstaduais, aliquotaEstimadaImpMunicipais, baseEstimadaImpostos, valorEstimadoImpFederais, valorEstimadoImpEstaduais, valorEstimadoImpMunicipais, valorImpostosSomaPagamento, valorImpostosDiminuiPagamento, valorLiquidoItem, valorDescontoCustoOpItem, valorDescontoCustoOpGeral, valorDescontoCustoOpTotal, valorAcrescimoCustoOpItem, valorAcrescimoCustoOpGeral, valorAcrescimoCustoOpTotal, precoCustoOperacao, valorCustoOperacao, precoCMV, valorCMV, observacoesDigitadas, observacoes) VALUES (itens.idItemPreDocumento, v_preDocumento, itens.sequencia, itens.cancelado, CASE WHEN v_colaboradorResponsavel = 0 THEN itens.vendedor ELSE v_colaboradorResponsavel END, itens.gradeProduto, itens.servico, itens.idFormulaTinta, itens.personalizacao, itens.idLoteEstoque, itens.operacaoFiscal, itens.movimentaEstoque, itens.geraFinanceiro, 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.quantidadeConferida, 0, itens.pesoLiquido, itens.pesoBruto, itens.tipoPreco, itens.tabelaPreco, itens.precoSugestaoAPrazo, itens.precoSugestaoAVista, itens.precoDesconto, itens.precoMinimo, itens.usarPrecoAVista, itens.precoPautaTabelado, 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.valorFreteGeral, itens.valorSeguroGeral, itens.valorDescontoGeral, itens.valorOutrasDespesasGeral, itens.valorAdicFreteMarinhaMerGeral, itens.valorDespesasAduaneirasGeral, itens.valorBasePagamento, itens.valorDescontoPagamento, itens.valorOutrasDespesasPagamento, itens.valorJurosPagamento, itens.valorFreteTotal, itens.valorSeguroTotal, itens.valorDescontoTotal, itens.valorOutrasDespesasTotal, itens.valorAdicFreteMarinhaMerTotal, itens.valorDespesasAduaneirasTotal, itens.cfop, itens.indicadorISSQN, itens.aliquotaISSQN, itens.baseISSQN, itens.valorISSQN, itens.aliquotaIRRF, itens.baseIRRF, itens.valorIRRF, itens.aliquotaINSS, itens.baseINSS, itens.valorINSS, itens.retencaoPIS, itens.baseRetPIS, itens.valorRetPIS, itens.retencaoCOFINS, itens.baseRetCOFINS, itens.valorRetCOFINS, itens.retencaoCSLL, itens.baseRetCSLL, itens.valorRetCSLL, itens.aliquotaII, itens.baseII, itens.valorII, itens.aliquotaIOF, itens.baseIOF, itens.valorIOF, itens.codigoEnquadramentoIPI, itens.stIPI, itens.aliquotaIPI, itens.valorAliquotaIPI, itens.baseIPI, itens.valorIPI, 0, itens.stPIS, itens.aliquotaPIS, itens.valorAliquotaPIS, itens.basePIS, itens.valorPIS, itens.aliquotaPISST, itens.valorAliquotaPISST, itens.basePISST, itens.valorPISST, itens.stCOFINS, itens.aliquotaCOFINS, itens.valorAliquotaCOFINS, itens.baseCOFINS, itens.valorCOFINS, itens.aliquotaCOFINSST, itens.valorAliquotaCOFINSST, itens.baseCOFINSST, itens.valorCOFINSST, itens.stSimplesNacional, itens.creditoSimplesNacional, itens.baseCreditoSimplesNacional, itens.valorCreditoSimplesNacional, itens.stICMS, itens.modalidadeBaseCalcICMS, itens.reducaoBaseICMS, itens.aliquotaICMS, itens.diferimentoICMS, itens.motivoDesoneracaoICMS, itens.baseICMS, itens.valorICMSOperacao, itens.valorICMSDiferido, itens.valorICMS, itens.valorICMSDesoneracao, itens.modalidadeBaseCalcICMSST, itens.margemValorAdicionadoST, itens.reducaoBaseST, itens.aliquotaICMSST, itens.aliquotaSTSuportConsFinal, itens.baseICMSST, itens.valorICMSST, itens.baseICMSSTAnteriormente, itens.valorICMSSTAnteriormente, itens.valorICMSProprioSubstituto, itens.reducaoBaseICMSEfetivo, itens.aliquotaICMSEfetivo, itens.baseICMSEfetivo, itens.valorICMSEfetivo, itens.aliquotaICMSUFDestinatario, itens.aliquotaICMSInterestadual, itens.partilhaICMSInterestadual, itens.baseICMSUFDestinatario, itens.valorICMSUFDestinatario, itens.baseICMSUFRemetente, itens.valorICMSUFRemetente, itens.aliquotaFCP, itens.baseFCP, itens.valorFCP, itens.aliquotaFCPST, itens.baseFCPST, itens.valorFCPST, itens.aliquotaFCPSTAnteriormente, itens.baseFCPSTAnteriormente, itens.valorFCPSTAnteriormente, itens.aliquotaFCPUFDestinatario, itens.baseFCPUFDestinatario, itens.valorFCPUFDestinatario, itens.aliquotaEstimadaImpFederais, itens.aliquotaEstimadaImpEstaduais, itens.aliquotaEstimadaImpMunicipais, itens.baseEstimadaImpostos, itens.valorEstimadoImpFederais, itens.valorEstimadoImpEstaduais, itens.valorEstimadoImpMunicipais, itens.valorImpostosSomaPagamento, itens.valorImpostosDiminuiPagamento, itens.valorLiquidoItem, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, itens.observacoesDigitadas, itens.observacoes);
      INSERT INTO MOPREDOCUMXPEDIDOCOMPRA (idItemPreDocumento, pedidoCompraFornecedor, sequenciaPedidoCompraFornec) SELECT itens.idItemPreDocumento, x.pedidoCompraFornecedor, x.sequenciaPedidoCompraFornec FROM MOORCAMENTOXPEDIDOCOMPRA x WHERE x.idItemOrcamento = itens.idItemOrcamento;
      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, centroCusto, percentualRateio) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXCENTROSCUSTOS', 'idCentroCustoPreDocumento', 0, p_estabelecimentoAtivo, NULL), itens.idItemPreDocumento, x.centroCusto, x.percentualRateio FROM MOORCAMENTOXCENTROSCUSTOS x WHERE x.idItemOrcamento = itens.idItemOrcamento;
      INSERT INTO MOPREDOCUMXORCAMENTOITEM (id, idItemPreDocumento, idItemOrcamento, quantidade) VALUES (FUNC_ADD_BUSCA_PROXIMO_ID('MOPREDOCUMXORCAMENTOITEM', 'id', 0, p_estabelecimentoAtivo, NULL), itens.idItemPreDocumento,itens.idItemOrcamento,itens.quantidade);
      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;
      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 pagtos IN c_pagtos
  LOOP
    INSERT INTO MOPREDOCUMXPAGAMENTOS (idPagamentoPreDocumento, preDocumento, 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.idPagamentoPreDocumento, v_preDocumento, 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);
    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, pagtos.sequencia, 0, pagtos.idPagamentoPreDocumento, 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.idPagamentoOrcamento = pagtos.idPagamentoOrcamento;
    FOR mot IN c_mot_pag
    LOOP
      IF mot.idPagamentoOrcamento = pagtos.idPagamentoOrcamento 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, 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 MOMOTBLOQXPREDOCUMPAGAM (id, idMotivoBloqueioDocumento, idPagamentoPreDocumento) VALUES (FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXPREDOCUMPAGAM', 'id', 0, p_estabelecimentoAtivo, NULL), mot.idMotivoBloqueioNovo, pagtos.idPagamentoPreDocumento);
        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 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, '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;
  ADD_ORCAMENTO_CAB_RESERVA_GRAV (p_orcamento, p_estabelecimentoAtivo);
  r_preDocumento := v_preDocumento;
END ADD_PRE_DOC_ROT_EFET_ORCAMENTO;

/

create or replace PROCEDURE ADD_DOC_FISC_ROT_EFET_ORCAMENT(
    p_exclusivo               IN VARCHAR2,
    p_1_NFCe_2_ConsFinal_3_NF IN VARCHAR2,
    p_orcamento               IN NUMBER,
    p_usuarioLogado           IN NUMBER,
    p_estabelecimentoAtivo    IN NUMBER,
    p_sessao                  IN NUMBER,
    p_sessaoCaixa             IN NUMBER,
    p_idTerminalSiTef         IN VARCHAR2,
    p_nfFornecedor            IN NUMBER,
    p_idSerieFiscal           IN NUMBER,
    p_serieFiscal             IN VARCHAR2,
    p_subSerieFiscal          IN NUMBER,
    p_modeloDocumentoFiscal   IN VARCHAR2,
    p_documentoFiscal         IN NUMBER,
    p_dataEmissao             IN DATE,
    p_timezone                IN VARCHAR2,
    p_dataEntradaSaida        IN DATE,
    p_comissionadoB           IN NUMBER,
    p_comissionadoC           IN NUMBER,
    p_chaveNfe                IN VARCHAR2,
    p_novaEtapaOrcamento      IN NUMBER,
    p_versaoAplicativo        IN VARCHAR2,
    r_idDocumentoFiscal       OUT NUMBER)
IS
  v_tipoDocumento          NUMBER;
  v_fatoContabil           NUMBER;
  v_idDocumentoFiscal      NUMBER;
  v_estabelecimento        NUMBER;
  v_pessoa                 NUMBER;
  v_colaboradorResponsavel NUMBER;
  v_documentoFiscal        NUMBER;
  CURSOR c_itens IS
    SELECT item.idItemOrcamento,
      CASE
        WHEN cancelado = 0
        THEN FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXITENS', 'idItemDocFiscal', 0, p_estabelecimentoAtivo, NULL)
        ELSE 0
      END idItemDocFiscal,
      item.sequencia,
      item.cancelado,
      item.vendedor,
      item.gradeProduto,
      item.servico,
      item.idFormulaTinta,
      item.personalizacao,
      item.idLoteEstoque,
      item.operacaoFiscal,
      item.movimentaEstoque,
      item.geraFinanceiro,
      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.quantidadeConferida,
      item.pesoLiquido,
      item.pesoBruto,
      item.tipoPreco,
      item.tabelaPreco,
      item.precoSugestaoAPrazo,
      item.precoSugestaoAVista,
      item.precoDesconto,
      item.precoMinimo,
      item.usarPrecoAVista,
      item.precoPautaTabelado,
      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.valorFreteGeral,
      item.valorSeguroGeral,
      item.valorDescontoGeral,
      item.valorOutrasDespesasGeral,
      item.valorAdicFreteMarinhaMerGeral,
      item.valorDespesasAduaneirasGeral,
      item.valorBasePagamento,
      item.valorDescontoPagamento,
      item.valorOutrasDespesasPagamento,
      item.valorJurosPagamento,
      item.valorFreteTotal,
      item.valorSeguroTotal,
      item.valorDescontoTotal,
      item.valorOutrasDespesasTotal,
      item.valorAdicFreteMarinhaMerTotal,
      item.valorDespesasAduaneirasTotal,
      item.cfop,
      item.indicadorISSQN,
      item.aliquotaISSQN,
      item.baseISSQN,
      item.valorISSQN,
      item.aliquotaIRRF,
      item.baseIRRF,
      item.valorIRRF,
      item.aliquotaINSS,
      item.baseINSS,
      item.valorINSS,
      item.retencaoPIS,
      item.baseRetPIS,
      item.valorRetPIS,
      item.retencaoCOFINS,
      item.baseRetCOFINS,
      item.valorRetCOFINS,
      item.retencaoCSLL,
      item.baseRetCSLL,
      item.valorRetCSLL,
      item.aliquotaII,
      item.baseII,
      item.valorII,
      item.aliquotaIOF,
      item.baseIOF,
      item.valorIOF,
      item.codigoEnquadramentoIPI,
      item.stIPI,
      item.aliquotaIPI,
      item.valorAliquotaIPI,
      item.baseIPI,
      item.valorIPI,
      item.stPIS,
      item.aliquotaPIS,
      item.valorAliquotaPIS,
      item.basePIS,
      item.valorPIS,
      item.aliquotaPISST,
      item.valorAliquotaPISST,
      item.basePISST,
      item.valorPISST,
      item.stCOFINS,
      item.aliquotaCOFINS,
      item.valorAliquotaCOFINS,
      item.baseCOFINS,
      item.valorCOFINS,
      item.aliquotaCOFINSST,
      item.valorAliquotaCOFINSST,
      item.baseCOFINSST,
      item.valorCOFINSST,
      item.stSimplesNacional,
      item.creditoSimplesNacional,
      item.baseCreditoSimplesNacional,
      item.valorCreditoSimplesNacional,
      item.stICMS,
      item.modalidadeBaseCalcICMS,
      item.reducaoBaseICMS,
      item.aliquotaICMS,
      item.diferimentoICMS,
      item.motivoDesoneracaoICMS,
      item.baseICMS,
      item.valorICMSOperacao,
      item.valorICMSDiferido,
      item.valorICMS,
      item.valorICMSDesoneracao,
      item.modalidadeBaseCalcICMSST,
      item.margemValorAdicionadoST,
      item.reducaoBaseST,
      item.aliquotaICMSST,
      item.aliquotaSTSuportConsFinal,
      item.baseICMSST,
      item.valorICMSST,
      item.baseICMSSTAnteriormente,
      item.valorICMSSTAnteriormente,
      item.valorICMSProprioSubstituto,
      item.reducaoBaseICMSEfetivo,
      item.aliquotaICMSEfetivo,
      item.baseICMSEfetivo,
      item.valorICMSEfetivo,
      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 <> ' ' 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.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,
      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.aliquotaICMSUFDestinatario,
      item.aliquotaICMSInterestadual,
      item.partilhaICMSInterestadual,
      item.baseICMSUFDestinatario,
      item.valorICMSUFDestinatario,
      item.baseICMSUFRemetente,
      item.valorICMSUFRemetente,
      item.aliquotaFCP,
      item.baseFCP,
      item.valorFCP,
      item.aliquotaFCPST,
      item.baseFCPST,
      item.valorFCPST,
      item.aliquotaFCPSTAnteriormente,
      item.baseFCPSTAnteriormente,
      item.valorFCPSTAnteriormente,
      item.aliquotaFCPUFDestinatario,
      item.baseFCPUFDestinatario,
      item.valorFCPUFDestinatario,
      item.aliquotaEstimadaImpFederais,
      item.aliquotaEstimadaImpEstaduais,
      item.aliquotaEstimadaImpMunicipais,
      item.baseEstimadaImpostos,
      item.valorEstimadoImpFederais,
      item.valorEstimadoImpEstaduais,
      item.valorEstimadoImpMunicipais,
      item.valorImpostosSomaPagamento,
      item.valorImpostosDiminuiPagamento,
      item.valorLiquidoItem,
      item.observacoesDigitadas,
      item.observacoes
    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_pagtos IS
    SELECT idPagamentoOrcamento, 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 MOORCAMENTOXPAGAMENTOS
    WHERE orcamento = p_orcamento
    ORDER BY pagamentoTroco, sequencia;
  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 a.idMotivoBloqueioDocumento, a.idPagamentoOrcamento, FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTIVOSBLOQUEIOS', 'idMotivoBloqueioDocumento', 0, p_estabelecimentoAtivo, NULL) idMotivoBloqueioNovo
    FROM MOMOTBLOQXORCAMENTOPAGAM a
    JOIN MOORCAMENTOXPAGAMENTOS b ON b.idPagamentoOrcamento = a.idPagamentoOrcamento
    WHERE b.orcamento = p_orcamento;
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,
    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,
    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.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.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 v_colaboradorResponsavel = 0 THEN orc.ultimoVendedorItem ELSE v_colaboradorResponsavel 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,
    orc.numeroParcelas,
    orc.somaPrazoParcelas,
    orc.valorXPrazoParcelas,
    orc.prazoMedio,
    orc.prazoMedioPonderado,
    orc.valorBasePagamento,
    orc.valorAVistaMinimo,
    orc.valorEntradaMinima,
    orc.valorAVistaEntrada,
    orc.valorPagamentoBruto,
    orc.valorDescontoPagamento,
    orc.valorOutrasDespesasPagamento,
    orc.valorJurosPagamento,
    orc.valorPagamentoLiquido,
    orc.valorTroco,
    orc.valorFreteTotal,
    orc.valorSeguroTotal,
    orc.valorDescontoTotal,
    orc.valorOutrasDespesasTotal,
    orc.valorAdicFreteMarinhaMerTotal,
    orc.valorDespesasAduaneirasTotal,
    orc.impostosEditados,
    orc.valorImpostosSomaPagamento,
    orc.valorImpostosDiminuiPagamento,
    orc.valorLiquidoItem,
    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, vendedor, gradeProduto, servico, idFormulaTinta, personalizacao, idLoteEstoque, operacaoFiscal, movimentaEstoque, geraFinanceiro, localEstoque, pessoaParticipante, controleQuantidade, unidadeMedidaConversao, conversorQuantidade, loteMinimo, loteMultiplo, altura, largura, comprimento, pecas, quantidade, quantidadeConvertida, quantidadeDevolvidaRetornada, quantidadeConferida, percentualDevolucao, pesoLiquido, pesoBruto, tipoPreco, tabelaPreco, precoSugestaoAPrazo, precoSugestaoAVista, precoDesconto, precoMinimo, usarPrecoAVista, precoPautaTabelado, 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, baseISSQN, valorISSQN, aliquotaIRRF, baseIRRF, valorIRRF, aliquotaINSS, baseINSS, valorINSS, retencaoPIS, baseRetPIS, valorRetPIS, retencaoCOFINS, baseRetCOFINS, valorRetCOFINS, retencaoCSLL, baseRetCSLL, valorRetCSLL, 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, baseICMS, valorICMSOperacao, valorICMSDiferido, valorICMS, valorICMSDesoneracao, modalidadeBaseCalcICMSST, margemValorAdicionadoST, reducaoBaseST, aliquotaICMSST, aliquotaSTSuportConsFinal, baseICMSST, valorICMSST, baseICMSSTAnteriormente, valorICMSSTAnteriormente, valorICMSProprioSubstituto, reducaoBaseICMSEfetivo, aliquotaICMSEfetivo, baseICMSEfetivo, valorICMSEfetivo, stICMSEscrituracao, reducaoBaseICMSEscrituracao, aliquotaICMSEscrituracao, 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, valorImpostosSomaPagamento, valorImpostosDiminuiPagamento, valorLiquidoItem, valorDescontoCustoOpItem, valorDescontoCustoOpGeral, valorDescontoCustoOpTotal, valorAcrescimoCustoOpItem, valorAcrescimoCustoOpGeral, valorAcrescimoCustoOpTotal, precoCustoOperacao, valorCustoOperacao, precoCMV, valorCMV, observacoesDigitadas, observacoes) VALUES (itens.idItemDocFiscal, v_idDocumentoFiscal, itens.sequencia, itens.cancelado, CASE WHEN v_colaboradorResponsavel = 0 THEN itens.vendedor ELSE v_colaboradorResponsavel END, itens.gradeProduto, itens.servico, itens.idFormulaTinta, itens.personalizacao, itens.idLoteEstoque, itens.operacaoFiscal, itens.movimentaEstoque, itens.geraFinanceiro, 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.quantidadeConferida, 0, itens.pesoLiquido, itens.pesoBruto, itens.tipoPreco, itens.tabelaPreco, itens.precoSugestaoAPrazo, itens.precoSugestaoAVista, itens.precoDesconto, itens.precoMinimo, itens.usarPrecoAVista, itens.precoPautaTabelado, 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.valorFreteGeral, itens.valorSeguroGeral, itens.valorDescontoGeral, itens.valorOutrasDespesasGeral, itens.valorAdicFreteMarinhaMerGeral, itens.valorDespesasAduaneirasGeral, itens.valorBasePagamento, itens.valorDescontoPagamento, itens.valorOutrasDespesasPagamento, itens.valorJurosPagamento, itens.valorFreteTotal, itens.valorSeguroTotal, itens.valorDescontoTotal, itens.valorOutrasDespesasTotal, itens.valorAdicFreteMarinhaMerTotal, itens.valorDespesasAduaneirasTotal, itens.cfop, itens.indicadorISSQN, itens.aliquotaISSQN, itens.baseISSQN, itens.valorISSQN, itens.aliquotaIRRF, itens.baseIRRF, itens.valorIRRF, itens.aliquotaINSS, itens.baseINSS, itens.valorINSS, itens.retencaoPIS, itens.baseRetPIS, itens.valorRetPIS, itens.retencaoCOFINS, itens.baseRetCOFINS, itens.valorRetCOFINS, itens.retencaoCSLL, itens.baseRetCSLL, itens.valorRetCSLL, itens.aliquotaII, itens.baseII, itens.valorII, itens.aliquotaIOF, itens.baseIOF, itens.valorIOF, itens.codigoEnquadramentoIPI, itens.stIPI, itens.aliquotaIPI, itens.valorAliquotaIPI, itens.baseIPI, itens.valorIPI, 0, itens.stPIS, itens.aliquotaPIS, itens.valorAliquotaPIS, itens.basePIS, itens.valorPIS, itens.aliquotaPISST, itens.valorAliquotaPISST, itens.basePISST, itens.valorPISST, itens.stCOFINS, itens.aliquotaCOFINS, itens.valorAliquotaCOFINS, itens.baseCOFINS, itens.valorCOFINS, itens.aliquotaCOFINSST, itens.valorAliquotaCOFINSST, itens.baseCOFINSST, itens.valorCOFINSST, itens.stSimplesNacional, itens.creditoSimplesNacional, itens.baseCreditoSimplesNacional, itens.valorCreditoSimplesNacional, itens.stICMS, itens.modalidadeBaseCalcICMS, itens.reducaoBaseICMS, itens.aliquotaICMS, itens.diferimentoICMS, itens.motivoDesoneracaoICMS, itens.baseICMS, itens.valorICMSOperacao, itens.valorICMSDiferido, itens.valorICMS, itens.valorICMSDesoneracao, itens.modalidadeBaseCalcICMSST, itens.margemValorAdicionadoST, itens.reducaoBaseST, itens.aliquotaICMSST, itens.aliquotaSTSuportConsFinal, itens.baseICMSST, itens.valorICMSST, itens.baseICMSSTAnteriormente, itens.valorICMSSTAnteriormente, itens.valorICMSProprioSubstituto, itens.reducaoBaseICMSEfetivo, itens.aliquotaICMSEfetivo, itens.baseICMSEfetivo, itens.valorICMSEfetivo, itens.stICMSEscrituracao, itens.reducaoBaseICMSEscrituracao, itens.aliquotaICMSEscrituracao, itens.baseICMSEscrituracao, itens.valorICMSEscrituracao, itens.valorICMSDesonEscrituracao, itens.margemValorAdicSTEscrituracao, itens.reducaoBaseSTEscrituracao, itens.aliquotaICMSSTEscrituracao, itens.baseICMSSTEscrituracao, itens.valorICMSSTEscrituracao, itens.somarICMSST, itens.aliquotaICMSUFDestinatario, itens.aliquotaICMSInterestadual, itens.partilhaICMSInterestadual, itens.baseICMSUFDestinatario, itens.valorICMSUFDestinatario, itens.baseICMSUFRemetente, itens.valorICMSUFRemetente, itens.aliquotaFCP, itens.baseFCP, itens.valorFCP, itens.aliquotaFCPST, itens.baseFCPST, itens.valorFCPST, itens.aliquotaFCPSTAnteriormente, itens.baseFCPSTAnteriormente, itens.valorFCPSTAnteriormente, itens.aliquotaFCPUFDestinatario, itens.baseFCPUFDestinatario, itens.valorFCPUFDestinatario, itens.aliquotaEstimadaImpFederais, itens.aliquotaEstimadaImpEstaduais, itens.aliquotaEstimadaImpMunicipais, itens.baseEstimadaImpostos, itens.valorEstimadoImpFederais, itens.valorEstimadoImpEstaduais, itens.valorEstimadoImpMunicipais, itens.valorImpostosSomaPagamento, itens.valorImpostosDiminuiPagamento, itens.valorLiquidoItem, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, itens.observacoesDigitadas, itens.observacoes);
      INSERT INTO MODOCFISCALXPEDIDOCOMPRA (idItemDocFiscal, pedidoCompraFornecedor, sequenciaPedidoCompraFornec) SELECT itens.idItemDocFiscal, x.pedidoCompraFornecedor, x.sequenciaPedidoCompraFornec FROM MOORCAMENTOXPEDIDOCOMPRA x WHERE x.idItemOrcamento = itens.idItemOrcamento;
      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, centroCusto, percentualRateio) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXCENTROSCUSTOS', 'idCentroCustoDocFiscal', 0, p_estabelecimentoAtivo, NULL), itens.idItemDocFiscal, x.centroCusto, x.percentualRateio FROM MOORCAMENTOXCENTROSCUSTOS x WHERE x.idItemOrcamento = itens.idItemOrcamento;
      INSERT INTO MODOCFISCALXORCAMENTOITEM (id, idItemDocFiscal, idItemOrcamento, quantidade) VALUES (FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXORCAMENTOITEM', 'id', 0, p_estabelecimentoAtivo, NULL), itens.idItemDocFiscal, itens.idItemOrcamento, itens.quantidade);
      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;
      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 pagtos IN c_pagtos
  LOOP
    INSERT INTO MODOCFISCALXPAGAMENTOS (idPagamentoDocFiscal, idDocumentoFiscal, pagamentoTroco, sequencia, indicadorFormaPagamento, meioPagamento, condicaoPagamento, cobranca, numeroParcelas, somaPrazoParcelas, valorXPrazoParcelas, prazoMedio, prazoMedioPonderado, valorEntradaMinima, valorPagamentoBruto, percDescontoPagamento, valorDescontoPagamento, percOutrasDespesasPagamento, valorOutrasDespesasPagamento, fatorJurosPagamento, valorJurosPagamento, valorPagamentoImpostosSoma, valorPagamentoImpostosDiminui, valorPagamentoLiquido, valorFinanceiro, observacoes) VALUES (pagtos.idPagamentoDocFiscal, v_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);
    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, pagtos.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 MOORCAMENTOXPROMOCOES x WHERE x.idPagamentoOrcamento = pagtos.idPagamentoOrcamento;
    FOR mot IN c_mot_pag
    LOOP
      IF mot.idPagamentoOrcamento = pagtos.idPagamentoOrcamento 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, 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;
      END IF;
    END LOOP;
  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', 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('MOMOTBLOQXDOCFISCALPAGAM', '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;
  ADD_ORCAMENTO_CAB_RESERVA_GRAV (p_orcamento, p_estabelecimentoAtivo);
  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_tipoDocumento     NUMBER;
  v_idDocumentoFiscal 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.vendedor,
       item.gradeProduto,
       item.servico,
       item.idFormulaTinta,
       item.personalizacao,
       item.idLoteEstoque,
       item.operacaoFiscal,
       item.movimentaEstoque,
       item.geraFinanceiro,
       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.quantidadeDevolvidaRetornada,
       item.quantidadeConferida,
       item.percentualDevolucao,
       item.pesoLiquido,
       item.pesoBruto,
       item.tipoPreco,
       item.tabelaPreco,
       item.precoSugestaoAPrazo,
       item.precoSugestaoAVista,
       item.precoDesconto,
       item.precoMinimo,
       item.usarPrecoAVista,
       item.precoPautaTabelado,
       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.valorFreteGeral,
       item.valorSeguroGeral,
       item.valorDescontoGeral,
       item.valorOutrasDespesasGeral,
       item.valorAdicFreteMarinhaMerGeral,
       item.valorDespesasAduaneirasGeral,
       item.valorBasePagamento,
       item.valorDescontoPagamento,
       item.valorOutrasDespesasPagamento,
       item.valorJurosPagamento,
       item.valorFreteTotal,
       item.valorSeguroTotal,
       item.valorDescontoTotal,
       item.valorOutrasDespesasTotal,
       item.valorAdicFreteMarinhaMerTotal,
       item.valorDespesasAduaneirasTotal,
       item.cfop,
       item.indicadorISSQN,
       item.aliquotaISSQN,
       item.baseISSQN,
       item.valorISSQN,
       item.aliquotaIRRF,
       item.baseIRRF,
       item.valorIRRF,
       item.aliquotaINSS,
       item.baseINSS,
       item.valorINSS,
       item.retencaoPIS,
       item.baseRetPIS,
       item.valorRetPIS,
       item.retencaoCOFINS,
       item.baseRetCOFINS,
       item.valorRetCOFINS,
       item.retencaoCSLL,
       item.baseRetCSLL,
       item.valorRetCSLL,
       item.aliquotaII,
       item.baseII,
       item.valorII,
       item.aliquotaIOF,
       item.baseIOF,
       item.valorIOF,
       item.codigoEnquadramentoIPI,
       item.stIPI,
       item.aliquotaIPI,
       item.valorAliquotaIPI,
       item.baseIPI,
       item.valorIPI,
       item.valorIPIDevolucao,
       item.stPIS,
       item.aliquotaPIS,
       item.valorAliquotaPIS,
       item.basePIS,
       item.valorPIS,
       item.aliquotaPISST,
       item.valorAliquotaPISST,
       item.basePISST,
       item.valorPISST,
       item.stCOFINS,
       item.aliquotaCOFINS,
       item.valorAliquotaCOFINS,
       item.baseCOFINS,
       item.valorCOFINS,
       item.aliquotaCOFINSST,
       item.valorAliquotaCOFINSST,
       item.baseCOFINSST,
       item.valorCOFINSST,
       item.stSimplesNacional,
       item.creditoSimplesNacional,
       item.baseCreditoSimplesNacional,
       item.valorCreditoSimplesNacional,
       item.stICMS,
       item.modalidadeBaseCalcICMS,
       item.reducaoBaseICMS,
       item.aliquotaICMS,
       item.diferimentoICMS,
       item.motivoDesoneracaoICMS,
       item.baseICMS,
       item.valorICMSOperacao,
       item.valorICMSDiferido,
       item.valorICMS,
       item.valorICMSDesoneracao,
       item.modalidadeBaseCalcICMSST,
       item.margemValorAdicionadoST,
       item.reducaoBaseST,
       item.aliquotaICMSST,
       item.aliquotaSTSuportConsFinal,
       item.baseICMSST,
       item.valorICMSST,
       item.baseICMSSTAnteriormente,
       item.valorICMSSTAnteriormente,
       item.valorICMSProprioSubstituto,
       item.reducaoBaseICMSEfetivo,
       item.aliquotaICMSEfetivo,
       item.baseICMSEfetivo,
       item.valorICMSEfetivo,
       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 <> ' ' 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.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,
       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.aliquotaICMSUFDestinatario,
       item.aliquotaICMSInterestadual,
       item.partilhaICMSInterestadual,
       item.baseICMSUFDestinatario,
       item.valorICMSUFDestinatario,
       item.baseICMSUFRemetente,
       item.valorICMSUFRemetente,
       item.aliquotaFCP,
       item.baseFCP,
       item.valorFCP,
       item.aliquotaFCPST,
       item.baseFCPST,
       item.valorFCPST,
       item.aliquotaFCPSTAnteriormente,
       item.baseFCPSTAnteriormente,
       item.valorFCPSTAnteriormente,
       item.aliquotaFCPUFDestinatario,
       item.baseFCPUFDestinatario,
       item.valorFCPUFDestinatario,
       item.aliquotaEstimadaImpFederais,
       item.aliquotaEstimadaImpEstaduais,
       item.aliquotaEstimadaImpMunicipais,
       item.baseEstimadaImpostos,
       item.valorEstimadoImpFederais,
       item.valorEstimadoImpEstaduais,
       item.valorEstimadoImpMunicipais,
       item.valorImpostosSomaPagamento,
       item.valorImpostosDiminuiPagamento,
       item.valorLiquidoItem,
       item.valorDescontoCustoOpItem,
       item.valorDescontoCustoOpGeral,
       item.valorDescontoCustoOpTotal,
       item.valorAcrescimoCustoOpItem,
       item.valorAcrescimoCustoOpGeral,
       item.valorAcrescimoCustoOpTotal,
       item.precoCustoOperacao,
       item.valorCustoOperacao,
       item.precoCMV,
       item.valorCMV,
       item.quantidadeExtemporanea,
       item.acrescimoUnitarioExtemporaneo,
       item.valorAcrescimoExtempSubtotal,
       item.valorAcrescimoExtempItem,
       item.valorAcrescimoExtempGeral,
       item.valorAcrescimoExtempTotal,
       item.observacoesDigitadas,
       item.observacoes
     FROM MOPREDOCUMXITENS item
     JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = item.gradeProduto
     JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
     WHERE item.preDocumento = p_preDocumento
     ORDER BY item.sequencia;
  CURSOR c_endEst
  IS SELECT a.idEnderecoEstoquePreDocumento, a.idItemPreDocumento, FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXENDERECOESTOQ', 'idEnderecoEstoqueDocFiscal', 0, p_estabelecimentoAtivo, NULL) idEnderecoEstoqueDocFiscal, a.idEnderecoEstoque, a.posicaoCaixaEstoque, a.quantidade, a.quantidadeDevolvidaRetornada, a.quantidadeConferida, a.observacoes
     FROM MOPREDOCUMXENDERECOESTOQ a
     JOIN MOPREDOCUMXITENS b ON b.idItemPreDocumento = a.idItemPreDocumento
     WHERE b.preDocumento = p_preDocumento
     AND b.cancelado = 0;
  CURSOR c_pagtos
  IS SELECT idPagamentoPreDocumento, FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXPAGAMENTOS', 'idPagamentoDocFiscal', 0, p_estabelecimentoAtivo, NULL) idPagamentoDocFiscal, pagamentoTroco, sequencia, indicadorFormaPagamento, meioPagamento, condicaoPagamento, cobranca, numeroParcelas, somaPrazoParcelas, valorXPrazoParcelas, prazoMedio, prazoMedioPonderado, valorEntradaMinima, valorPagamentoBruto, percDescontoPagamento, valorDescontoPagamento, percOutrasDespesasPagamento, valorOutrasDespesasPagamento, fatorJurosPagamento, valorJurosPagamento, valorPagamentoImpostosSoma, valorPagamentoImpostosDiminui, valorPagamentoLiquido, valorFinanceiro, observacoes
     FROM MOPREDOCUMXPAGAMENTOS
     WHERE preDocumento = p_preDocumento
     ORDER BY pagamentoTroco, sequencia;
  CURSOR c_mot_cab IS
    SELECT idMotivoBloqueioDocumento, FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTIVOSBLOQUEIOS', 'idMotivoBloqueioDocumento', 0, p_estabelecimentoAtivo, NULL) idMotivoBloqueioNovo
    FROM MOMOTBLOQXPREDOCUMENTOS
    WHERE preDocumento = p_preDocumento;
  CURSOR c_mot_item IS
    SELECT a.idMotivoBloqueioDocumento, a.idItemPreDocumento, FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTIVOSBLOQUEIOS', 'idMotivoBloqueioDocumento', 0, p_estabelecimentoAtivo, NULL) idMotivoBloqueioNovo
    FROM MOMOTBLOQXPREDOCUMITENS a
    JOIN MOPREDOCUMXITENS b ON b.idItemPreDocumento = a.idItemPreDocumento
    WHERE b.preDocumento = p_preDocumento
    AND b.cancelado = 0;
  CURSOR c_mot_pag IS
    SELECT a.idMotivoBloqueioDocumento, a.idPagamentoPreDocumento, FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTIVOSBLOQUEIOS', 'idMotivoBloqueioDocumento', 0, p_estabelecimentoAtivo, NULL) idMotivoBloqueioNovo
    FROM MOMOTBLOQXPREDOCUMPAGAM a
    JOIN MOPREDOCUMXPAGAMENTOS b ON b.idPagamentoPreDocumento = a.idPagamentoPreDocumento
    WHERE b.preDocumento = p_preDocumento;
BEGIN
  v_idDocumentoFiscal := FUNC_ADD_BUSCA_PROXIMO_ID('MODOCUMENTOSFISCAIS', 'idDocumentoFiscal', 0, p_estabelecimentoAtivo, NULL);
  SELECT 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.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_tipoDocumento, v_estabelecimento, v_pessoa, v_documentoFiscal FROM MOPREDOCUMENTOS preDoc WHERE preDoc.preDocumento = p_preDocumento;
  INSERT INTO MODOCUMENTOSFISCAIS (
    idDocumentoFiscal,
    origemDocumento,
    tipoDocumento,
    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,
    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 v_idDocumentoFiscal,
    preDoc.origemDocumento,
    v_tipoDocumento,
    preDoc.modeloDocumento,
    preDoc.entradaSaida,
    preDoc.devolucaoAnulacaoRetorno,
    preDoc.finalidadeNota,
    preDoc.atualizaCustoMedio,
    preDoc.atualizaUltimaCompra,
    preDoc.validoFaturamento,
    preDoc.usarPrecoAVista,
    preDoc.sessao,
    preDoc.sessaoCaixa,
    preDoc.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.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,
    preDoc.valorOutrasDespesasGeral,
    preDoc.valorAdicFreteMarinhaMerGeral,
    preDoc.valorDespesasAduaneirasGeral,
    preDoc.condicaoPagamento,
    preDoc.contaFinanceira,
    preDoc.numeroParcelas,
    preDoc.somaPrazoParcelas,
    preDoc.valorXPrazoParcelas,
    preDoc.prazoMedio,
    preDoc.prazoMedioPonderado,
    preDoc.valorBasePagamento,
    preDoc.valorAVistaMinimo,
    preDoc.valorEntradaMinima,
    preDoc.valorAVistaEntrada,
    preDoc.valorPagamentoBruto,
    preDoc.valorDescontoPagamento,
    preDoc.valorOutrasDespesasPagamento,
    preDoc.valorJurosPagamento,
    preDoc.valorPagamentoLiquido,
    preDoc.valorTroco,
    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;
  SELECT preDoc.fatocontabil INTO v_fatocontabil FROM MOPREDOCUMENTOS preDoc WHERE preDoc.preDocumento = p_preDocumento;
  IF v_fatocontabil > 0 THEN
    UPDATE MOFATOSCONTABEIS a SET a.situacaoContabilizacao = 'A' WHERE a.fatocontabil = v_fatocontabil AND a.situacaoContabilizacao = 'N';
  END IF;
  INSERT INTO MOBAIXAFINANCXDOCFISCAL (id, idBaixaFinanceiro, idDocumentoFiscal) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOBAIXAFINANCXDOCFISCAL', 'id', 0, p_estabelecimentoAtivo, NULL), x.idBaixaFinanceiro, v_idDocumentoFiscal FROM MOBAIXAFINANCXPREDOCUM x WHERE x.preDocumento = p_preDocumento;
  DELETE MOBAIXAFINANCXPREDOCUM WHERE preDocumento = p_preDocumento;
  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 MOPREDOCUMXPERSPROJETO x WHERE x.preDocumento = p_preDocumento;
  DELETE 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), v_idDocumentoFiscal, x.sequencia, x.geradoPeloSistema, x.imprimir, x.destaque, x.informacaoComplementar, x.descInformacaoComplementar FROM MOPREDOCUMXINFOCOMPLENT x WHERE x.preDocumento = p_preDocumento;
  DELETE 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), 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 MOPREDOCUMXPROMOCOES x WHERE x.preDocumento = p_preDocumento AND x.idItemPreDocumento = 0 AND x.idPagamentoPreDocumento = 0;
  DELETE MOPREDOCUMXPROMOCOES x WHERE x.preDocumento = p_preDocumento AND x.idItemPreDocumento = 0 AND x.idPagamentoPreDocumento = 0;
  INSERT INTO MOVALEDESCXDOCFISCAL (id, idValeDesconto, idDocumentoFiscal, valor) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOVALEDESCXDOCFISCAL', 'id', 0, p_estabelecimentoAtivo, NULL), x.idValeDesconto, v_idDocumentoFiscal, x.valor FROM MOVALEDESCXPREDOCUM x WHERE x.preDocumento = p_preDocumento;
  DELETE 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), v_idDocumentoFiscal, x.sequencia, x.dataBloqueio, x.estabelecimento, x.localEstoque, x.pessoaParticipante, x.idEnderecoEstoque, x.gradeProduto, x.personalizacao, x.idLoteEstoque, x.idNumeroSerie, x.quantidade, x.quantidadeEstoque, x.quantidadeReservas, x.situacaoLiberacao, x.usuarioLiberacao, x.dataLiberacao, x.observacoes FROM MOPREDOCUMXBLOQUEIOSEST x WHERE x.preDocumento = p_preDocumento;
  DELETE MOPREDOCUMXBLOQUEIOSEST x WHERE x.preDocumento = p_preDocumento;
  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, vendedor, gradeProduto, servico, idFormulaTinta, personalizacao, idLoteEstoque, operacaoFiscal, movimentaEstoque, geraFinanceiro, localEstoque, pessoaParticipante, controleQuantidade, unidadeMedidaConversao, conversorQuantidade, loteMinimo, loteMultiplo, altura, largura, comprimento, pecas, quantidade, quantidadeConvertida, quantidadeDevolvidaRetornada, quantidadeConferida, percentualDevolucao, pesoLiquido, pesoBruto, tipoPreco, tabelaPreco, precoSugestaoAPrazo, precoSugestaoAVista, precoDesconto, precoMinimo, usarPrecoAVista, precoPautaTabelado, 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, baseISSQN, valorISSQN, aliquotaIRRF, baseIRRF, valorIRRF, aliquotaINSS, baseINSS, valorINSS, retencaoPIS, baseRetPIS, valorRetPIS, retencaoCOFINS, baseRetCOFINS, valorRetCOFINS, retencaoCSLL, baseRetCSLL, valorRetCSLL, 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, baseICMS, valorICMSOperacao, valorICMSDiferido, valorICMS, valorICMSDesoneracao, modalidadeBaseCalcICMSST, margemValorAdicionadoST, reducaoBaseST, aliquotaICMSST, aliquotaSTSuportConsFinal, baseICMSST, valorICMSST, baseICMSSTAnteriormente, valorICMSSTAnteriormente, valorICMSProprioSubstituto, reducaoBaseICMSEfetivo, aliquotaICMSEfetivo, baseICMSEfetivo, valorICMSEfetivo, stICMSEscrituracao, reducaoBaseICMSEscrituracao, aliquotaICMSEscrituracao, 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, valorImpostosSomaPagamento, valorImpostosDiminuiPagamento, valorLiquidoItem, valorDescontoCustoOpItem, valorDescontoCustoOpGeral, valorDescontoCustoOpTotal, valorAcrescimoCustoOpItem, valorAcrescimoCustoOpGeral, valorAcrescimoCustoOpTotal, precoCustoOperacao, valorCustoOperacao, precoCMV, valorCMV, quantidadeExtemporanea, acrescimoUnitarioExtemporaneo, valorAcrescimoExtempSubtotal, valorAcrescimoExtempItem, valorAcrescimoExtempGeral, valorAcrescimoExtempTotal, observacoesDigitadas, observacoes) VALUES (itens.idItemDocFiscal, v_idDocumentoFiscal, v_sequenciaItem, itens.cancelado, itens.vendedor, itens.gradeProduto, itens.servico, itens.idFormulaTinta, itens.personalizacao, itens.idLoteEstoque, itens.operacaoFiscal, itens.movimentaEstoque, itens.geraFinanceiro, 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, itens.quantidadeDevolvidaRetornada, itens.quantidadeConferida, itens.percentualDevolucao, itens.pesoLiquido, itens.pesoBruto, itens.tipoPreco, itens.tabelaPreco, itens.precoSugestaoAPrazo, itens.precoSugestaoAVista, itens.precoDesconto, itens.precoMinimo, itens.usarPrecoAVista, itens.precoPautaTabelado, 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.valorFreteGeral, itens.valorSeguroGeral, itens.valorDescontoGeral, itens.valorOutrasDespesasGeral, itens.valorAdicFreteMarinhaMerGeral, itens.valorDespesasAduaneirasGeral, itens.valorBasePagamento, itens.valorDescontoPagamento, itens.valorOutrasDespesasPagamento, itens.valorJurosPagamento, itens.valorFreteTotal, itens.valorSeguroTotal, itens.valorDescontoTotal, itens.valorOutrasDespesasTotal, itens.valorAdicFreteMarinhaMerTotal, itens.valorDespesasAduaneirasTotal, itens.cfop, itens.indicadorISSQN, itens.aliquotaISSQN, itens.baseISSQN, itens.valorISSQN, itens.aliquotaIRRF, itens.baseIRRF, itens.valorIRRF, itens.aliquotaINSS, itens.baseINSS, itens.valorINSS, itens.retencaoPIS, itens.baseRetPIS, itens.valorRetPIS, itens.retencaoCOFINS, itens.baseRetCOFINS, itens.valorRetCOFINS, itens.retencaoCSLL, itens.baseRetCSLL, itens.valorRetCSLL, itens.aliquotaII, itens.baseII, itens.valorII, itens.aliquotaIOF, itens.baseIOF, itens.valorIOF, itens.codigoEnquadramentoIPI, itens.stIPI, itens.aliquotaIPI, itens.valorAliquotaIPI, itens.baseIPI, itens.valorIPI, itens.valorIPIDevolucao, itens.stPIS, itens.aliquotaPIS, itens.valorAliquotaPIS, itens.basePIS, itens.valorPIS, itens.aliquotaPISST, itens.valorAliquotaPISST, itens.basePISST, itens.valorPISST, itens.stCOFINS, itens.aliquotaCOFINS, itens.valorAliquotaCOFINS, itens.baseCOFINS, itens.valorCOFINS, itens.aliquotaCOFINSST, itens.valorAliquotaCOFINSST, itens.baseCOFINSST, itens.valorCOFINSST, itens.stSimplesNacional, itens.creditoSimplesNacional, itens.baseCreditoSimplesNacional, itens.valorCreditoSimplesNacional, itens.stICMS, itens.modalidadeBaseCalcICMS, itens.reducaoBaseICMS, itens.aliquotaICMS, itens.diferimentoICMS, itens.motivoDesoneracaoICMS, itens.baseICMS, itens.valorICMSOperacao, itens.valorICMSDiferido, itens.valorICMS, itens.valorICMSDesoneracao, itens.modalidadeBaseCalcICMSST, itens.margemValorAdicionadoST, itens.reducaoBaseST, itens.aliquotaICMSST, itens.aliquotaSTSuportConsFinal, itens.baseICMSST, itens.valorICMSST, itens.baseICMSSTAnteriormente, itens.valorICMSSTAnteriormente, itens.valorICMSProprioSubstituto, itens.reducaoBaseICMSEfetivo, itens.aliquotaICMSEfetivo, itens.baseICMSEfetivo, itens.valorICMSEfetivo, itens.stICMSEscrituracao, itens.reducaoBaseICMSEscrituracao, itens.aliquotaICMSEscrituracao, itens.baseICMSEscrituracao, itens.valorICMSEscrituracao, itens.valorICMSDesonEscrituracao, itens.margemValorAdicSTEscrituracao, itens.reducaoBaseSTEscrituracao, itens.aliquotaICMSSTEscrituracao, itens.baseICMSSTEscrituracao, itens.valorICMSSTEscrituracao, itens.somarICMSST, itens.aliquotaICMSUFDestinatario, itens.aliquotaICMSInterestadual, itens.partilhaICMSInterestadual, itens.baseICMSUFDestinatario, itens.valorICMSUFDestinatario, itens.baseICMSUFRemetente, itens.valorICMSUFRemetente, itens.aliquotaFCP, itens.baseFCP, itens.valorFCP, itens.aliquotaFCPST, itens.baseFCPST, itens.valorFCPST, itens.aliquotaFCPSTAnteriormente, itens.baseFCPSTAnteriormente, itens.valorFCPSTAnteriormente, itens.aliquotaFCPUFDestinatario, itens.baseFCPUFDestinatario, itens.valorFCPUFDestinatario, itens.aliquotaEstimadaImpFederais, itens.aliquotaEstimadaImpEstaduais, itens.aliquotaEstimadaImpMunicipais, itens.baseEstimadaImpostos, itens.valorEstimadoImpFederais, itens.valorEstimadoImpEstaduais, itens.valorEstimadoImpMunicipais, itens.valorImpostosSomaPagamento, itens.valorImpostosDiminuiPagamento, itens.valorLiquidoItem, itens.valorDescontoCustoOpItem, itens.valorDescontoCustoOpGeral, itens.valorDescontoCustoOpTotal, itens.valorAcrescimoCustoOpItem, itens.valorAcrescimoCustoOpGeral, itens.valorAcrescimoCustoOpTotal, itens.precoCustoOperacao, itens.valorCustoOperacao, itens.precoCMV, itens.valorCMV, itens.quantidadeExtemporanea, itens.acrescimoUnitarioExtemporaneo, itens.valorAcrescimoExtempSubtotal, itens.valorAcrescimoExtempItem, itens.valorAcrescimoExtempGeral, itens.valorAcrescimoExtempTotal, itens.observacoesDigitadas, itens.observacoes);
      INSERT INTO MODOCFISCALXPEDIDOCOMPRA (idItemDocFiscal, pedidoCompraFornecedor, sequenciaPedidoCompraFornec) SELECT itens.idItemDocFiscal, x.pedidoCompraFornecedor, x.sequenciaPedidoCompraFornec FROM MOPREDOCUMXPEDIDOCOMPRA x WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      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, centroCusto, percentualRateio) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXCENTROSCUSTOS', 'idCentroCustoDocFiscal', 0, p_estabelecimentoAtivo, NULL), itens.idItemDocFiscal, x.centroCusto, x.percentualRateio FROM MOPREDOCUMXCENTROSCUSTOS x WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      INSERT INTO MODOCFISCALXORCAMENTOITEM (id, idItemDocFiscal, idItemOrcamento, quantidade) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXORCAMENTOITEM', 'id', 0, p_estabelecimentoAtivo, NULL), itens.idItemDocFiscal, x.idItemOrcamento, x.quantidade 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('MODOCTRANSFXPREDOCUM', '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 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), 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 MOPREDOCUMXPROMOCOES 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;
      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', 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;
        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 LOOP;
    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 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 MOPREDOCUMXPEDIDOCOMPRA x WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
    DELETE MOVALEDESCXITEMPREDOCUM x WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
  END LOOP;
  FOR pagtos IN c_pagtos
  LOOP
    INSERT INTO MODOCFISCALXPAGAMENTOS (idPagamentoDocFiscal, idDocumentoFiscal, pagamentoTroco, sequencia, indicadorFormaPagamento, meioPagamento, condicaoPagamento, cobranca, numeroParcelas, somaPrazoParcelas, valorXPrazoParcelas, prazoMedio, prazoMedioPonderado, valorEntradaMinima, valorPagamentoBruto, percDescontoPagamento, valorDescontoPagamento, percOutrasDespesasPagamento, valorOutrasDespesasPagamento, fatorJurosPagamento, valorJurosPagamento, valorPagamentoImpostosSoma, valorPagamentoImpostosDiminui, valorPagamentoLiquido, valorFinanceiro, observacoes) VALUES (pagtos.idPagamentoDocFiscal, v_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 = v_idDocumentoFiscal WHERE EXISTS (SELECT 1 FROM MOFINANCEIROS y WHERE y.idFinanceiro = x.idFinanceiro AND y.idPagamentoPreDocumento = pagtos.idPagamentoPreDocumento);
    UPDATE MOFINANCEIROS x SET 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), v_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', v_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;
  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('MOMOTBLOQXDOCFISCALPAGAM', '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;
    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 LOOP;
  UPDATE MOPREVFINANCXFINANCEIRO x SET x.preDocumento = 0, x.idDocumentoFiscal = v_idDocumentoFiscal WHERE x.preDocumento = p_preDocumento;
  UPDATE MOEVENTOS x SET x.preDocumento = 0, x.idDocumentoFiscal = v_idDocumentoFiscal WHERE x.preDocumento = p_preDocumento;
  DELETE MOPREDOCUMXPAGAMENTOS WHERE preDocumento = p_preDocumento;
  DELETE MOPREDOCUMXITENS WHERE preDocumento = p_preDocumento;
  DELETE MOPREDOCUMXSTATUS WHERE preDocumento = p_preDocumento;
  DELETE MOPREDOCUMENTOS WHERE preDocumento = p_preDocumento;
  r_idDocumentoFiscal := v_idDocumentoFiscal;
END ADD_DOC_FISC_ROT_EFET_PRE_DOC;

/

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

/

-- FIM VERSÃO BETA

-- MODOCFISCALXDECLARACAOIMP
CREATE TABLE MODOCFISCALXDECLARACAOIMP
  (
    idDocumentoFiscal         NUMERIC (14,0) DEFAULT 0 NOT NULL,
    numeroDi                  VARCHAR (12) DEFAULT ' ' NOT NULL,
    dataRegistroDi            DATE,
    localEmbarqueTransposicao VARCHAR (60) DEFAULT ' ' NOT NULL,
    ufEmbarqueTransposicao    CHAR (2) DEFAULT '  ' NOT NULL,
    localDespacho             VARCHAR (60) DEFAULT ' ' NOT NULL,
    localDesembaracoAduaneiro VARCHAR (60) DEFAULT ' ' NOT NULL,
    ufDesembaracoAduaneiro    CHAR (2) DEFAULT '  ' NOT NULL,
    dataDesembaracoAduaneiro  DATE,
    tipoViaTransporte         CHAR (2) DEFAULT '  ' NOT NULL,
    tipoIntermedio            CHAR (1) DEFAULT ' ' NOT NULL,
    codigoExportador          VARCHAR (60) DEFAULT ' ' NOT NULL,
    codigoFabricante          VARCHAR (60) DEFAULT ' ' NOT NULL
  );
ALTER TABLE MODOCFISCALXDECLARACAOIMP ADD CONSTRAINT MODOCFISCALXDECLARACAOIMP_PK1 PRIMARY KEY (idDocumentoFiscal);
ALTER TABLE MODOCFISCALXDECLARACAOIMP ADD CONSTRAINT MODOCFISCALXDECLARACAOIMP_FK1 FOREIGN KEY (idDocumentoFiscal) REFERENCES MODOCUMENTOSFISCAIS (idDocumentoFiscal);
ALTER TABLE MODOCFISCALXDECLARACAOIMP ADD CONSTRAINT MODOCFISCALXDECLARACAOIMP_FK2 FOREIGN KEY (ufEmbarqueTransposicao) REFERENCES SIUFS (uf);
ALTER TABLE MODOCFISCALXDECLARACAOIMP ADD CONSTRAINT MODOCFISCALXDECLARACAOIMP_FK3 FOREIGN KEY (ufDesembaracoAduaneiro) REFERENCES SIUFS (uf);

INSERT INTO MODOCFISCALXDECLARACAOIMP (idDocumentoFiscal, numeroDi, dataRegistroDi, localEmbarqueTransposicao, ufEmbarqueTransposicao, localDespacho, localDesembaracoAduaneiro, ufDesembaracoAduaneiro, dataDesembaracoAduaneiro, tipoViaTransporte, tipoIntermedio, codigoExportador, codigoFabricante) VALUES (0, ' ', NULL, ' ', '  ', ' ', ' ', '  ', NULL, '  ', ' ', ' ', ' ');

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('MODOCFISCALXDECLARACAOIMP', 'Documento Fiscal X Declaração Importação', 1, 50351, 'MO', 'idDocumentoFiscal', 'N', 14, ' ', 1, ' ', 0, 100001, ' ', ' ', 1, 1, ' '); 

COMMIT;

INSERT INTO SICONFIGURACOES (configuracao, descricao, ativo, subcategoriaConfiguracao, tipoCampo, mascara, exibirCampo, tipoArquivo, conteudoSugestao, tabelaSistema, observacoes) values (375, 'Dias para registro no SPC', 1, 40002, 'N', '6', 'E', 0, '30', ' ', ' ');

COMMIT;

INSERT INTO SIPERSONALIZACOESCAMPOS (personalizacaoCampo, ordenacao, descricao, ativo, subcategoriaPersonalCampo, tipoCampo, mascara, exibirCampo, tipoArquivo, alteraTipoCampo, alteraExibirCampo, visivelSugestao, modificavelSugestao, obrigatorioSugestao, nomeCampoSugestao, conteudoSugestao, tabelaSistema, observacoes) VALUES (221, 50001006, 'Opção "Manutenção (Inclusão indevida)" na rotina "Manutenção SPC"', 1, 50001, 'A', '120', 'E', 0, 0, 1, 0, 0, 0, 'Manutenção (Inclusão indevida)', ' ', ' ', ' ');

COMMIT;

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_tipoDocumento     NUMBER;
  v_idDocumentoFiscal 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.vendedor,
       item.gradeProduto,
       item.servico,
       item.idFormulaTinta,
       item.personalizacao,
       item.idLoteEstoque,
       item.operacaoFiscal,
       item.movimentaEstoque,
       item.geraFinanceiro,
       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.quantidadeDevolvidaRetornada,
       item.quantidadeConferida,
       item.percentualDevolucao,
       item.pesoLiquido,
       item.pesoBruto,
       item.tipoPreco,
       item.tabelaPreco,
       item.precoSugestaoAPrazo,
       item.precoSugestaoAVista,
       item.precoDesconto,
       item.precoMinimo,
       item.usarPrecoAVista,
       item.precoPautaTabelado,
       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.valorFreteGeral,
       item.valorSeguroGeral,
       item.valorDescontoGeral,
       item.valorOutrasDespesasGeral,
       item.valorAdicFreteMarinhaMerGeral,
       item.valorDespesasAduaneirasGeral,
       item.valorBasePagamento,
       item.valorDescontoPagamento,
       item.valorOutrasDespesasPagamento,
       item.valorJurosPagamento,
       item.valorFreteTotal,
       item.valorSeguroTotal,
       item.valorDescontoTotal,
       item.valorOutrasDespesasTotal,
       item.valorAdicFreteMarinhaMerTotal,
       item.valorDespesasAduaneirasTotal,
       item.cfop,
       item.indicadorISSQN,
       item.aliquotaISSQN,
       item.baseISSQN,
       item.valorISSQN,
       item.aliquotaIRRF,
       item.baseIRRF,
       item.valorIRRF,
       item.aliquotaINSS,
       item.baseINSS,
       item.valorINSS,
       item.retencaoPIS,
       item.baseRetPIS,
       item.valorRetPIS,
       item.retencaoCOFINS,
       item.baseRetCOFINS,
       item.valorRetCOFINS,
       item.retencaoCSLL,
       item.baseRetCSLL,
       item.valorRetCSLL,
       item.aliquotaII,
       item.baseII,
       item.valorII,
       item.aliquotaIOF,
       item.baseIOF,
       item.valorIOF,
       item.codigoEnquadramentoIPI,
       item.stIPI,
       item.aliquotaIPI,
       item.valorAliquotaIPI,
       item.baseIPI,
       item.valorIPI,
       item.valorIPIDevolucao,
       item.stPIS,
       item.aliquotaPIS,
       item.valorAliquotaPIS,
       item.basePIS,
       item.valorPIS,
       item.aliquotaPISST,
       item.valorAliquotaPISST,
       item.basePISST,
       item.valorPISST,
       item.stCOFINS,
       item.aliquotaCOFINS,
       item.valorAliquotaCOFINS,
       item.baseCOFINS,
       item.valorCOFINS,
       item.aliquotaCOFINSST,
       item.valorAliquotaCOFINSST,
       item.baseCOFINSST,
       item.valorCOFINSST,
       item.stSimplesNacional,
       item.creditoSimplesNacional,
       item.baseCreditoSimplesNacional,
       item.valorCreditoSimplesNacional,
       item.stICMS,
       item.modalidadeBaseCalcICMS,
       item.reducaoBaseICMS,
       item.aliquotaICMS,
       item.diferimentoICMS,
       item.motivoDesoneracaoICMS,
       item.baseICMS,
       item.valorICMSOperacao,
       item.valorICMSDiferido,
       item.valorICMS,
       item.valorICMSDesoneracao,
       item.modalidadeBaseCalcICMSST,
       item.margemValorAdicionadoST,
       item.reducaoBaseST,
       item.aliquotaICMSST,
       item.aliquotaSTSuportConsFinal,
       item.baseICMSST,
       item.valorICMSST,
       item.baseICMSSTAnteriormente,
       item.valorICMSSTAnteriormente,
       item.valorICMSProprioSubstituto,
       item.reducaoBaseICMSEfetivo,
       item.aliquotaICMSEfetivo,
       item.baseICMSEfetivo,
       item.valorICMSEfetivo,
       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 <> ' ' 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.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,
       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.aliquotaICMSUFDestinatario,
       item.aliquotaICMSInterestadual,
       item.partilhaICMSInterestadual,
       item.baseICMSUFDestinatario,
       item.valorICMSUFDestinatario,
       item.baseICMSUFRemetente,
       item.valorICMSUFRemetente,
       item.aliquotaFCP,
       item.baseFCP,
       item.valorFCP,
       item.aliquotaFCPST,
       item.baseFCPST,
       item.valorFCPST,
       item.aliquotaFCPSTAnteriormente,
       item.baseFCPSTAnteriormente,
       item.valorFCPSTAnteriormente,
       item.aliquotaFCPUFDestinatario,
       item.baseFCPUFDestinatario,
       item.valorFCPUFDestinatario,
       item.aliquotaEstimadaImpFederais,
       item.aliquotaEstimadaImpEstaduais,
       item.aliquotaEstimadaImpMunicipais,
       item.baseEstimadaImpostos,
       item.valorEstimadoImpFederais,
       item.valorEstimadoImpEstaduais,
       item.valorEstimadoImpMunicipais,
       item.valorImpostosSomaPagamento,
       item.valorImpostosDiminuiPagamento,
       item.valorLiquidoItem,
       item.valorDescontoCustoOpItem,
       item.valorDescontoCustoOpGeral,
       item.valorDescontoCustoOpTotal,
       item.valorAcrescimoCustoOpItem,
       item.valorAcrescimoCustoOpGeral,
       item.valorAcrescimoCustoOpTotal,
       item.precoCustoOperacao,
       item.valorCustoOperacao,
       item.precoCMV,
       item.valorCMV,
       item.quantidadeExtemporanea,
       item.acrescimoUnitarioExtemporaneo,
       item.valorAcrescimoExtempSubtotal,
       item.valorAcrescimoExtempItem,
       item.valorAcrescimoExtempGeral,
       item.valorAcrescimoExtempTotal,
       item.observacoesDigitadas,
       item.observacoes
     FROM MOPREDOCUMXITENS item
     JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = item.gradeProduto
     JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
     WHERE item.preDocumento = p_preDocumento
     ORDER BY item.sequencia;
  CURSOR c_endEst
  IS SELECT a.idEnderecoEstoquePreDocumento, a.idItemPreDocumento, FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXENDERECOESTOQ', 'idEnderecoEstoqueDocFiscal', 0, p_estabelecimentoAtivo, NULL) idEnderecoEstoqueDocFiscal, a.idEnderecoEstoque, a.posicaoCaixaEstoque, a.quantidade, a.quantidadeDevolvidaRetornada, a.quantidadeConferida, a.observacoes
     FROM MOPREDOCUMXENDERECOESTOQ a
     JOIN MOPREDOCUMXITENS b ON b.idItemPreDocumento = a.idItemPreDocumento
     WHERE b.preDocumento = p_preDocumento
     AND b.cancelado = 0;
  CURSOR c_pagtos
  IS SELECT idPagamentoPreDocumento, FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXPAGAMENTOS', 'idPagamentoDocFiscal', 0, p_estabelecimentoAtivo, NULL) idPagamentoDocFiscal, pagamentoTroco, sequencia, indicadorFormaPagamento, meioPagamento, condicaoPagamento, cobranca, numeroParcelas, somaPrazoParcelas, valorXPrazoParcelas, prazoMedio, prazoMedioPonderado, valorEntradaMinima, valorPagamentoBruto, percDescontoPagamento, valorDescontoPagamento, percOutrasDespesasPagamento, valorOutrasDespesasPagamento, fatorJurosPagamento, valorJurosPagamento, valorPagamentoImpostosSoma, valorPagamentoImpostosDiminui, valorPagamentoLiquido, valorFinanceiro, observacoes
     FROM MOPREDOCUMXPAGAMENTOS
     WHERE preDocumento = p_preDocumento
     ORDER BY pagamentoTroco, sequencia;
  CURSOR c_mot_cab IS
    SELECT idMotivoBloqueioDocumento, FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTIVOSBLOQUEIOS', 'idMotivoBloqueioDocumento', 0, p_estabelecimentoAtivo, NULL) idMotivoBloqueioNovo
    FROM MOMOTBLOQXPREDOCUMENTOS
    WHERE preDocumento = p_preDocumento;
  CURSOR c_mot_item IS
    SELECT a.idMotivoBloqueioDocumento, a.idItemPreDocumento, FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTIVOSBLOQUEIOS', 'idMotivoBloqueioDocumento', 0, p_estabelecimentoAtivo, NULL) idMotivoBloqueioNovo
    FROM MOMOTBLOQXPREDOCUMITENS a
    JOIN MOPREDOCUMXITENS b ON b.idItemPreDocumento = a.idItemPreDocumento
    WHERE b.preDocumento = p_preDocumento
    AND b.cancelado = 0;
  CURSOR c_mot_pag IS
    SELECT a.idMotivoBloqueioDocumento, a.idPagamentoPreDocumento, FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTIVOSBLOQUEIOS', 'idMotivoBloqueioDocumento', 0, p_estabelecimentoAtivo, NULL) idMotivoBloqueioNovo
    FROM MOMOTBLOQXPREDOCUMPAGAM a
    JOIN MOPREDOCUMXPAGAMENTOS b ON b.idPagamentoPreDocumento = a.idPagamentoPreDocumento
    WHERE b.preDocumento = p_preDocumento;
BEGIN
  v_idDocumentoFiscal := FUNC_ADD_BUSCA_PROXIMO_ID('MODOCUMENTOSFISCAIS', 'idDocumentoFiscal', 0, p_estabelecimentoAtivo, NULL);
  SELECT 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.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_tipoDocumento, v_estabelecimento, v_pessoa, v_documentoFiscal FROM MOPREDOCUMENTOS preDoc WHERE preDoc.preDocumento = p_preDocumento;
  INSERT INTO MODOCUMENTOSFISCAIS (
    idDocumentoFiscal,
    origemDocumento,
    tipoDocumento,
    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,
    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 v_idDocumentoFiscal,
    preDoc.origemDocumento,
    v_tipoDocumento,
    preDoc.modeloDocumento,
    preDoc.entradaSaida,
    preDoc.devolucaoAnulacaoRetorno,
    preDoc.finalidadeNota,
    preDoc.atualizaCustoMedio,
    preDoc.atualizaUltimaCompra,
    preDoc.validoFaturamento,
    preDoc.usarPrecoAVista,
    preDoc.sessao,
    preDoc.sessaoCaixa,
    preDoc.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.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,
    preDoc.valorOutrasDespesasGeral,
    preDoc.valorAdicFreteMarinhaMerGeral,
    preDoc.valorDespesasAduaneirasGeral,
    preDoc.condicaoPagamento,
    preDoc.contaFinanceira,
    preDoc.numeroParcelas,
    preDoc.somaPrazoParcelas,
    preDoc.valorXPrazoParcelas,
    preDoc.prazoMedio,
    preDoc.prazoMedioPonderado,
    preDoc.valorBasePagamento,
    preDoc.valorAVistaMinimo,
    preDoc.valorEntradaMinima,
    preDoc.valorAVistaEntrada,
    preDoc.valorPagamentoBruto,
    preDoc.valorDescontoPagamento,
    preDoc.valorOutrasDespesasPagamento,
    preDoc.valorJurosPagamento,
    preDoc.valorPagamentoLiquido,
    preDoc.valorTroco,
    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;
  SELECT preDoc.fatocontabil INTO v_fatocontabil FROM MOPREDOCUMENTOS preDoc WHERE preDoc.preDocumento = p_preDocumento;
  IF v_fatocontabil > 0 THEN
    UPDATE MOFATOSCONTABEIS a SET a.situacaoContabilizacao = 'A' WHERE a.fatocontabil = v_fatocontabil AND a.situacaoContabilizacao = 'N';
  END IF;
  INSERT INTO MOBAIXAFINANCXDOCFISCAL (id, idBaixaFinanceiro, idDocumentoFiscal) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOBAIXAFINANCXDOCFISCAL', 'id', 0, p_estabelecimentoAtivo, NULL), x.idBaixaFinanceiro, v_idDocumentoFiscal FROM MOBAIXAFINANCXPREDOCUM x WHERE x.preDocumento = p_preDocumento;
  DELETE MOBAIXAFINANCXPREDOCUM  WHERE preDocumento = p_preDocumento;
  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 MOPREDOCUMXPERSPROJETO x WHERE x.preDocumento = p_preDocumento;
  DELETE 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), v_idDocumentoFiscal, x.sequencia, x.geradoPeloSistema, x.imprimir, x.destaque, x.informacaoComplementar, x.descInformacaoComplementar FROM MOPREDOCUMXINFOCOMPLENT x WHERE x.preDocumento = p_preDocumento;
  DELETE 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), 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 MOPREDOCUMXPROMOCOES x WHERE x.preDocumento = p_preDocumento AND x.idItemPreDocumento = 0 AND x.idPagamentoPreDocumento = 0;
  DELETE MOPREDOCUMXPROMOCOES    x WHERE x.preDocumento = p_preDocumento AND x.idItemPreDocumento = 0 AND x.idPagamentoPreDocumento = 0;
  INSERT INTO MOVALEDESCXDOCFISCAL (id, idValeDesconto, idDocumentoFiscal, valor) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOVALEDESCXDOCFISCAL', 'id', 0, p_estabelecimentoAtivo, NULL), x.idValeDesconto, v_idDocumentoFiscal, x.valor FROM MOVALEDESCXPREDOCUM x WHERE x.preDocumento = p_preDocumento;
  DELETE 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), v_idDocumentoFiscal, x.sequencia, x.dataBloqueio, x.estabelecimento, x.localEstoque, x.pessoaParticipante, x.idEnderecoEstoque, x.gradeProduto, x.personalizacao, x.idLoteEstoque, x.idNumeroSerie, x.quantidade, x.quantidadeEstoque, x.quantidadeReservas, x.situacaoLiberacao, x.usuarioLiberacao, x.dataLiberacao, x.observacoes FROM MOPREDOCUMXBLOQUEIOSEST x WHERE x.preDocumento = p_preDocumento;
  DELETE MOPREDOCUMXBLOQUEIOSEST x WHERE x.preDocumento = p_preDocumento;
  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, vendedor, gradeProduto, servico, idFormulaTinta, personalizacao, idLoteEstoque, operacaoFiscal, movimentaEstoque, geraFinanceiro, localEstoque, pessoaParticipante, controleQuantidade, unidadeMedidaConversao, conversorQuantidade, loteMinimo, loteMultiplo, altura, largura, comprimento, pecas, quantidade, quantidadeConvertida, quantidadeDevolvidaRetornada, quantidadeConferida, percentualDevolucao, pesoLiquido, pesoBruto, tipoPreco, tabelaPreco, precoSugestaoAPrazo, precoSugestaoAVista, precoDesconto, precoMinimo, usarPrecoAVista, precoPautaTabelado, 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, baseISSQN, valorISSQN, aliquotaIRRF, baseIRRF, valorIRRF, aliquotaINSS, baseINSS, valorINSS, retencaoPIS, baseRetPIS, valorRetPIS, retencaoCOFINS, baseRetCOFINS, valorRetCOFINS, retencaoCSLL, baseRetCSLL, valorRetCSLL, 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, baseICMS, valorICMSOperacao, valorICMSDiferido, valorICMS, valorICMSDesoneracao, modalidadeBaseCalcICMSST, margemValorAdicionadoST, reducaoBaseST, aliquotaICMSST, aliquotaSTSuportConsFinal, baseICMSST, valorICMSST, baseICMSSTAnteriormente, valorICMSSTAnteriormente, valorICMSProprioSubstituto, reducaoBaseICMSEfetivo, aliquotaICMSEfetivo, baseICMSEfetivo, valorICMSEfetivo, stICMSEscrituracao, reducaoBaseICMSEscrituracao, aliquotaICMSEscrituracao, 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, valorImpostosSomaPagamento, valorImpostosDiminuiPagamento, valorLiquidoItem, valorDescontoCustoOpItem, valorDescontoCustoOpGeral, valorDescontoCustoOpTotal, valorAcrescimoCustoOpItem, valorAcrescimoCustoOpGeral, valorAcrescimoCustoOpTotal, precoCustoOperacao, valorCustoOperacao, precoCMV, valorCMV, quantidadeExtemporanea, acrescimoUnitarioExtemporaneo, valorAcrescimoExtempSubtotal, valorAcrescimoExtempItem, valorAcrescimoExtempGeral, valorAcrescimoExtempTotal, observacoesDigitadas, observacoes) VALUES (itens.idItemDocFiscal, v_idDocumentoFiscal, v_sequenciaItem, itens.cancelado, itens.vendedor, itens.gradeProduto, itens.servico, itens.idFormulaTinta, itens.personalizacao, itens.idLoteEstoque, itens.operacaoFiscal, itens.movimentaEstoque, itens.geraFinanceiro, 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, itens.quantidadeDevolvidaRetornada, itens.quantidadeConferida, itens.percentualDevolucao, itens.pesoLiquido, itens.pesoBruto, itens.tipoPreco, itens.tabelaPreco, itens.precoSugestaoAPrazo, itens.precoSugestaoAVista, itens.precoDesconto, itens.precoMinimo, itens.usarPrecoAVista, itens.precoPautaTabelado, 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.valorFreteGeral, itens.valorSeguroGeral, itens.valorDescontoGeral, itens.valorOutrasDespesasGeral, itens.valorAdicFreteMarinhaMerGeral, itens.valorDespesasAduaneirasGeral, itens.valorBasePagamento, itens.valorDescontoPagamento, itens.valorOutrasDespesasPagamento, itens.valorJurosPagamento, itens.valorFreteTotal, itens.valorSeguroTotal, itens.valorDescontoTotal, itens.valorOutrasDespesasTotal, itens.valorAdicFreteMarinhaMerTotal, itens.valorDespesasAduaneirasTotal, itens.cfop, itens.indicadorISSQN, itens.aliquotaISSQN, itens.baseISSQN, itens.valorISSQN, itens.aliquotaIRRF, itens.baseIRRF, itens.valorIRRF, itens.aliquotaINSS, itens.baseINSS, itens.valorINSS, itens.retencaoPIS, itens.baseRetPIS, itens.valorRetPIS, itens.retencaoCOFINS, itens.baseRetCOFINS, itens.valorRetCOFINS, itens.retencaoCSLL, itens.baseRetCSLL, itens.valorRetCSLL, itens.aliquotaII, itens.baseII, itens.valorII, itens.aliquotaIOF, itens.baseIOF, itens.valorIOF, itens.codigoEnquadramentoIPI, itens.stIPI, itens.aliquotaIPI, itens.valorAliquotaIPI, itens.baseIPI, itens.valorIPI, itens.valorIPIDevolucao, itens.stPIS, itens.aliquotaPIS, itens.valorAliquotaPIS, itens.basePIS, itens.valorPIS, itens.aliquotaPISST, itens.valorAliquotaPISST, itens.basePISST, itens.valorPISST, itens.stCOFINS, itens.aliquotaCOFINS, itens.valorAliquotaCOFINS, itens.baseCOFINS, itens.valorCOFINS, itens.aliquotaCOFINSST, itens.valorAliquotaCOFINSST, itens.baseCOFINSST, itens.valorCOFINSST, itens.stSimplesNacional, itens.creditoSimplesNacional, itens.baseCreditoSimplesNacional, itens.valorCreditoSimplesNacional, itens.stICMS, itens.modalidadeBaseCalcICMS, itens.reducaoBaseICMS, itens.aliquotaICMS, itens.diferimentoICMS, itens.motivoDesoneracaoICMS, itens.baseICMS, itens.valorICMSOperacao, itens.valorICMSDiferido, itens.valorICMS, itens.valorICMSDesoneracao, itens.modalidadeBaseCalcICMSST, itens.margemValorAdicionadoST, itens.reducaoBaseST, itens.aliquotaICMSST, itens.aliquotaSTSuportConsFinal, itens.baseICMSST, itens.valorICMSST, itens.baseICMSSTAnteriormente, itens.valorICMSSTAnteriormente, itens.valorICMSProprioSubstituto, itens.reducaoBaseICMSEfetivo, itens.aliquotaICMSEfetivo, itens.baseICMSEfetivo, itens.valorICMSEfetivo, itens.stICMSEscrituracao, itens.reducaoBaseICMSEscrituracao, itens.aliquotaICMSEscrituracao, itens.baseICMSEscrituracao, itens.valorICMSEscrituracao, itens.valorICMSDesonEscrituracao, itens.margemValorAdicSTEscrituracao, itens.reducaoBaseSTEscrituracao, itens.aliquotaICMSSTEscrituracao, itens.baseICMSSTEscrituracao, itens.valorICMSSTEscrituracao, itens.somarICMSST, itens.aliquotaICMSUFDestinatario, itens.aliquotaICMSInterestadual, itens.partilhaICMSInterestadual, itens.baseICMSUFDestinatario, itens.valorICMSUFDestinatario, itens.baseICMSUFRemetente, itens.valorICMSUFRemetente, itens.aliquotaFCP, itens.baseFCP, itens.valorFCP, itens.aliquotaFCPST, itens.baseFCPST, itens.valorFCPST, itens.aliquotaFCPSTAnteriormente, itens.baseFCPSTAnteriormente, itens.valorFCPSTAnteriormente, itens.aliquotaFCPUFDestinatario, itens.baseFCPUFDestinatario, itens.valorFCPUFDestinatario, itens.aliquotaEstimadaImpFederais, itens.aliquotaEstimadaImpEstaduais, itens.aliquotaEstimadaImpMunicipais, itens.baseEstimadaImpostos, itens.valorEstimadoImpFederais, itens.valorEstimadoImpEstaduais, itens.valorEstimadoImpMunicipais, itens.valorImpostosSomaPagamento, itens.valorImpostosDiminuiPagamento, itens.valorLiquidoItem, itens.valorDescontoCustoOpItem, itens.valorDescontoCustoOpGeral, itens.valorDescontoCustoOpTotal, itens.valorAcrescimoCustoOpItem, itens.valorAcrescimoCustoOpGeral, itens.valorAcrescimoCustoOpTotal, itens.precoCustoOperacao, itens.valorCustoOperacao, itens.precoCMV, itens.valorCMV, itens.quantidadeExtemporanea, itens.acrescimoUnitarioExtemporaneo, itens.valorAcrescimoExtempSubtotal, itens.valorAcrescimoExtempItem, itens.valorAcrescimoExtempGeral, itens.valorAcrescimoExtempTotal, itens.observacoesDigitadas, itens.observacoes);
      INSERT INTO MODOCFISCALXPEDIDOCOMPRA (idItemDocFiscal, pedidoCompraFornecedor, sequenciaPedidoCompraFornec) SELECT itens.idItemDocFiscal, x.pedidoCompraFornecedor, x.sequenciaPedidoCompraFornec FROM MOPREDOCUMXPEDIDOCOMPRA x WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      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, centroCusto, percentualRateio) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXCENTROSCUSTOS', 'idCentroCustoDocFiscal', 0, p_estabelecimentoAtivo, NULL), itens.idItemDocFiscal, x.centroCusto, x.percentualRateio FROM MOPREDOCUMXCENTROSCUSTOS x WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
      INSERT INTO MODOCFISCALXORCAMENTOITEM (id, idItemDocFiscal, idItemOrcamento, quantidade) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MODOCFISCALXORCAMENTOITEM', 'id', 0, p_estabelecimentoAtivo, NULL), itens.idItemDocFiscal, x.idItemOrcamento, x.quantidade 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('MODOCTRANSFXPREDOCUM', '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 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), 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 MOPREDOCUMXPROMOCOES 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;
      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', 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;
        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 LOOP;
    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 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 MOPREDOCUMXPEDIDOCOMPRA  x WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
    DELETE MOVALEDESCXITEMPREDOCUM  x WHERE x.idItemPreDocumento = itens.idItemPreDocumento;
  END LOOP;
  FOR pagtos IN c_pagtos
  LOOP
    INSERT INTO MODOCFISCALXPAGAMENTOS (idPagamentoDocFiscal, idDocumentoFiscal, pagamentoTroco, sequencia, indicadorFormaPagamento, meioPagamento, condicaoPagamento, cobranca, numeroParcelas, somaPrazoParcelas, valorXPrazoParcelas, prazoMedio, prazoMedioPonderado, valorEntradaMinima, valorPagamentoBruto, percDescontoPagamento, valorDescontoPagamento, percOutrasDespesasPagamento, valorOutrasDespesasPagamento, fatorJurosPagamento, valorJurosPagamento, valorPagamentoImpostosSoma, valorPagamentoImpostosDiminui, valorPagamentoLiquido, valorFinanceiro, observacoes) VALUES (pagtos.idPagamentoDocFiscal, v_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 = v_idDocumentoFiscal WHERE EXISTS (SELECT 1 FROM MOFINANCEIROS y WHERE y.idFinanceiro = x.idFinanceiro AND y.idPagamentoPreDocumento = pagtos.idPagamentoPreDocumento);
    UPDATE MOFINANCEIROS           x SET 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), v_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', v_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;
  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('MOMOTBLOQXDOCFISCALPAGAM', '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;
    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 LOOP;
  UPDATE MOPREVFINANCXFINANCEIRO x SET x.preDocumento = 0, x.idDocumentoFiscal = v_idDocumentoFiscal WHERE x.preDocumento = p_preDocumento;
  UPDATE MOFINANCEIROXCOMISSOES  x SET x.preDocumento = 0, x.idDocumentoFiscal = v_idDocumentoFiscal WHERE x.preDocumento = p_preDocumento;
  UPDATE MOEVENTOS               x SET x.preDocumento = 0, x.idDocumentoFiscal = v_idDocumentoFiscal WHERE x.preDocumento = p_preDocumento;
  DELETE MOPREDOCUMXPAGAMENTOS WHERE preDocumento = p_preDocumento;
  DELETE MOPREDOCUMXITENS      WHERE preDocumento = p_preDocumento;
  DELETE MOPREDOCUMXSTATUS     WHERE preDocumento = p_preDocumento;
  DELETE MOPREDOCUMENTOS       WHERE preDocumento = p_preDocumento;
  r_idDocumentoFiscal := v_idDocumentoFiscal;
END ADD_DOC_FISC_ROT_EFET_PRE_DOC;

/

UPDATE SICONFIGURACOES SET descricao = 'Efetivar transferência', tipoCampo = 'A', mascara = '256', exibirCampo = 'P', conteudoSugestao = 'A' WHERE configuracao = 309;

COMMIT;

INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (130, 'A', 'Aprovadas', 309, 1, 1, ' ');
INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (131, 'E', 'Em digitação e Aprovadas', 309, 1, 2, ' ');
INSERT INTO SIOPCOESCOMBOCONFIGURACAO (id, conteudo, descricao, configuracao, ativo, ordenacao, observacoes) VALUES (132, 'N', 'Não Efetiva', 309, 1, 3, ' ');

COMMIT;

UPDATE PACONFIGURACAOXCONTEUDOS SET conteudo = CASE WHEN conteudo = 'N' THEN 'A' ELSE 'E' END WHERE configuracao = 309;

COMMIT;

DROP TABLE TEMPPESQUISAPRODUTOS;

-- TEMPPESQUISAPRODUTOS
CREATE GLOBAL TEMPORARY TABLE TEMPPESQUISAPRODUTOS
  (
    uniqueMachineID              VARCHAR (18) DEFAULT ' ' NOT NULL,
    contadorSessao               NUMERIC (14,0) DEFAULT 0 NOT NULL,
    gradeProduto                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    produto                      NUMERIC (7,0) DEFAULT 0 NOT NULL,
    visivel                      NUMERIC (1,0) DEFAULT 0 NOT NULL,
    ordenacao                    NUMERIC (11,0) DEFAULT 0 NOT NULL,
    selecionado                  NUMERIC (1,0) DEFAULT 0 NOT NULL,
    quantidadeCarrinhoCompras    NUMERIC (15,6) DEFAULT 0 NOT NULL,
    legenda                      NUMERIC (3,0) DEFAULT 0 NOT NULL,
    imagem                       VARCHAR (256) DEFAULT ' ' NOT NULL,
    produtoImpresso              VARCHAR (60) DEFAULT ' ' NOT NULL,
    descricao                    VARCHAR (120) DEFAULT ' ' NOT NULL,
    ativo                        NUMERIC (1,0) DEFAULT 0 NOT NULL,
    descricaoCategoriaProduto    VARCHAR (120) DEFAULT ' ' NOT NULL,
    descricaoSubcategoriaProduto VARCHAR (120) DEFAULT ' ' NOT NULL,
    descricaoMarca               VARCHAR (60) DEFAULT ' ' NOT NULL,
    referencia                   VARCHAR (60) DEFAULT ' ' NOT NULL,
    descricaoCaracteristicaA     VARCHAR (120) DEFAULT ' ' NOT NULL,
    descricaoCaracteristicaB     VARCHAR (120) DEFAULT ' ' NOT NULL,
    descricaoCaracteristicaC     VARCHAR (120) DEFAULT ' ' NOT NULL,
    descricaoCaracteristicaD     VARCHAR (120) DEFAULT ' ' NOT NULL,
    descricaoCaracteristicaE     VARCHAR (120) DEFAULT ' ' NOT NULL,
    descricaoExclusivoA          VARCHAR (256) DEFAULT ' ' NOT NULL,
    descricaoExclusivoB          VARCHAR (256) DEFAULT ' ' NOT NULL,
    descricaoExclusivoC          VARCHAR (256) DEFAULT ' ' NOT NULL,
    descricaoExclusivoD          VARCHAR (256) DEFAULT ' ' NOT NULL,
    descricaoExclusivoE          VARCHAR (256) DEFAULT ' ' NOT NULL,
    eanGtin                      VARCHAR (14) DEFAULT ' ' NOT NULL,
    gradeCor                     NUMERIC (4,0) DEFAULT 0 NOT NULL,
    gradeTamanho                 NUMERIC (4,0) DEFAULT 0 NOT NULL,
    unidadeMedida                VARCHAR (6) DEFAULT ' ' NOT NULL,
    casasDecimaisUnidadeMedida   NUMERIC (1,0) DEFAULT 0 NOT NULL,
    quantidadeEstoque            NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeReserva            NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeDisponivel         NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeEstoqueB           NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeEstoqueTotal       NUMERIC (15,6) DEFAULT 0 NOT NULL,
    quantidadeDisponivelTotal    NUMERIC (15,6) DEFAULT 0 NOT NULL,
    situacaoTributaria           CHAR (1) DEFAULT ' ' NOT NULL,
    precoPromocao                NUMERIC (1,0) DEFAULT 0 NOT NULL,
    precoPrazo                   NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoVista                   NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoDesconto                NUMERIC (15,7) DEFAULT 0 NOT NULL,
    precoMinimo                  NUMERIC (15,7) DEFAULT 0 NOT NULL,
    descricaoDesconto            VARCHAR (30) DEFAULT ' ' NOT NULL,
    enderecoEstoque              VARCHAR (60) DEFAULT ' ' NOT NULL,
    iat                          CHAR (1) DEFAULT ' ' NOT NULL,
    ippt                         CHAR (1) DEFAULT ' ' NOT NULL,
    aplicacao                    VARCHAR (256) DEFAULT ' ' NOT NULL,
    detalhamento                 VARCHAR (4000) DEFAULT ' ' NOT NULL,
    observacoes                  VARCHAR (4000) DEFAULT ' ' NOT NULL
  ) ON COMMIT PRESERVE ROWS;
ALTER TABLE TEMPPESQUISAPRODUTOS ADD CONSTRAINT TEMPPESQUISAPRODUTOS_PK1 PRIMARY KEY (uniqueMachineID, contadorSessao, gradeProduto, produto, visivel, ordenacao);
CREATE INDEX TEMPPESQUISAPRODUTOS_K2 ON TEMPPESQUISAPRODUTOS (uniqueMachineID, contadorSessao, visivel, ordenacao);
CREATE INDEX TEMPPESQUISAPRODUTOS_K3 ON TEMPPESQUISAPRODUTOS (uniqueMachineID);
CREATE INDEX TEMPPESQUISAPRODUTOS_K4 ON TEMPPESQUISAPRODUTOS (uniqueMachineID, contadorSessao);

INSERT INTO SIVERSOESSISTEMA (idVersaoSistema, versaoAplicativo, dataLiberacaoVersao, possuiConversaoTabelas, atualizada, dataAtualizacaoVersao, observacoes) VALUES (2022002001, '2022.2.1', sysdate, 1, 1, sysdate, ' ');

COMMIT;

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

/*
DROP TABLE MOORCAMENTOS_2202;
DROP TABLE MOPREDOCUMENTOS_2202;
DROP TABLE MODOCUMENTOSFISCAIS_2202;
DROP TABLE MODOCFISCALXNFREF_2202;
DROP TABLE CAPLACAS_2202;
*/