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

/

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,
    /* Retornos */
    r_cab_valorTarifaCartao        OUT NUMBER,
    r_cab_valorMargem              OUT NUMBER,
    r_cab_percentualMargem         OUT NUMBER,
    r_cab_imagemMargem             OUT VARCHAR2)
IS
    v_cab_estabelecimento          NUMBER;
    v_cab_dataEmissao              DATE;
    v_cab_prazoMedioPonderado      NUMBER;
    v_cab_valorFreteTotal          NUMBER;
    v_cab_valorSeguroTotal         NUMBER;
    v_cab_valorAdicFreteMarinTotal NUMBER;
    v_cab_valorDespesasAduanTotal  NUMBER;
    v_cab_valorLiquidoItem         NUMBER;
    v_munEndEst_uf                 CHAR(2);
    v_item_valorLiquidoSemFreteSeg NUMBER;
    v_item_valorCaptacao           NUMBER;
    v_item_valorTarifaCartao       NUMBER;
    v_item_valorImpostos           NUMBER;
    v_item_precoCusto              NUMBER;
    v_item_valorCusto              NUMBER;
    v_item_valorMargem             NUMBER;
    v_item_percentualMargem        NUMBER;
    v_item_imagemMargem            VARCHAR2(256);
    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_valorTarifaCartao := FUNC_ADD_TARIFA_CART_ORCAMENTO (p_cab_orcamento);
  r_cab_valorMargem       := 0;
  r_cab_valorMargem       := 0;
  r_cab_percentualMargem  := 0;
  r_cab_imagemMargem      := ' ';
  DELETE TEMPMARGEMCONTRIBUICAO
  WHERE uniqueMachineID = p_uniqueMachineID
  AND orcamentoPredocumentoDocumento = 'O'
  AND idCabecalho = p_cab_orcamento;
  SELECT
    cab.estabelecimento,
    cab.dataEmissao,
    cab.prazoMedioPonderado,
    cab.valorFreteTotal,
    cab.valorSeguroTotal,
    cab.valorAdicFreteMarinhaMerTotal,
    cab.valorDespesasAduaneirasTotal,
    cab.valorLiquidoItem,
    COALESCE((
      SELECT MAX(munEndEst.uf)
      FROM CAENDERECOSPESSOA endEst
      JOIN SIMUNICIPIOS munEndEst
      ON munEndEst.municipio = endEst.municipio
      WHERE endEst.pessoa = est.pessoaEstabelecimento
      AND endEst.ativo = 1
      AND endEst.principal = 1),'  ')
  INTO
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_prazoMedioPonderado,
    v_cab_valorFreteTotal,
    v_cab_valorSeguroTotal,
    v_cab_valorAdicFreteMarinTotal,
    v_cab_valorDespesasAduanTotal,
    v_cab_valorLiquidoItem,
    v_munEndEst_uf
  FROM MOORCAMENTOS cab
  JOIN PAESTABELECIMENTOS est
  ON est.estabelecimento = cab.estabelecimento
  WHERE cab.orcamento = p_cab_orcamento;
  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,
      v_cab_estabelecimento,
      v_cab_dataEmissao,
      v_cab_prazoMedioPonderado,
      v_cab_valorLiquidoItem,
      r_cab_valorTarifaCartao,
      v_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_item_valorLiquidoSemFreteSeg,
      v_item_valorCaptacao,
      v_item_valorTarifaCartao,
      v_item_valorImpostos,
      v_item_precoCusto,
      v_item_valorCusto,
      v_item_valorMargem,
      v_item_percentualMargem);
    IF p_regMarg_exibImagemMargemItem = 1 AND p_regMarg_regraImagemItem <> 0 THEN
      v_item_imagemMargem := FUNC_ADD_BUSCA_IMAGEM_FAIXA (p_regMarg_regraImagemItem, v_item_percentualMargem);
    ELSE
      v_item_imagemMargem := ' ';
    END IF;
    IF item.cancelado = 0 THEN
      r_cab_valorMargem := r_cab_valorMargem + v_item_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_item_valorLiquidoSemFreteSeg,
      v_item_valorCaptacao,
      v_item_valorTarifaCartao,
      v_item_valorImpostos,
      v_item_precoCusto,
      v_item_valorCusto,
      v_item_valorMargem,
      v_item_percentualMargem,
      v_item_imagemMargem);
  END LOOP;
  r_cab_percentualMargem := CASE WHEN v_cab_valorLiquidoItem - v_cab_valorFreteTotal - v_cab_valorSeguroTotal - v_cab_valorAdicFreteMarinTotal - v_cab_valorDespesasAduanTotal = 0 THEN 0 ELSE ROUND ((100 * r_cab_valorMargem / (v_cab_valorLiquidoItem - v_cab_valorFreteTotal - v_cab_valorSeguroTotal - v_cab_valorAdicFreteMarinTotal - v_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_itens IS 
    SELECT idItemOrcamento
    FROM MOORCAMENTOXITENS
    WHERE orcamento = p_orcamento
    ORDER BY sequencia;
BEGIN
  v_bufferIdReservaEstoque := '';
  FOR a IN c_itens
  LOOP
    ADD_ORCAMENTO_ITEM_RES_ITEM(
      a.idItemOrcamento,
      p_estabelecimentoAtivo, 
      v_bufferIdReservaEstoque, 
      v_bufferIdReservaEstoque);
  END LOOP;
END ADD_ORCAMENTO_CAB_RESERVA_GRAV;

/

create or replace PROCEDURE ADD_ORCAMENTO_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_entradaSaida             IN CHAR,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEntradaSaida         IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_cab_localDestinoOperacao     IN CHAR,
    p_cab_indicadorConsumidorFinal IN CHAR,
    p_cab_tipoPagamentoFrete       IN CHAR,
    p_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_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_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(
      p_cab_tipoPagamentoFrete,
      p_modDoc_diminuiDescontoPrUnit,
      p_modDoc_somaAcrescimosPrUnit,
      p_modDoc_somaFreteSeguroPrUnit,
      item.quantidade,
      item.quantidadeConvertida,
      item.precoUnitarioBruto,
      item.acrescimoUnitarioComposicao,
      item.precoUnitario,
      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,
      0,
      0,
      0,
      0,
      /* Retornos */
      v_precoUnitario,
      v_precoUnitarioConvertido,
      v_valorProdutoServico,
      v_auxNumber,
      v_auxNumber,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal,
      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
      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_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_troca_tipoPagamentoFrete     IN NUMBER,
    p_a_cab_tipoPagamentoFrete     IN CHAR)
IS
    v_cab_valorProdutos            NUMBER;
    v_cab_valorServicos            NUMBER;
    v_cab_valorBasePagamento       NUMBER;
    v_cab_valorAVistaMinimo        NUMBER;
    v_cab_valorFreteTotal          NUMBER;
    v_cab_valorSeguroTotal         NUMBER;
    v_cab_valorDescontoTotal       NUMBER;
    v_cab_valorOutrasDespesasTotal NUMBER;
    v_cab_valorAdicFreteMarinTotal NUMBER;
    v_cab_valorDespesasAduanTotal  NUMBER;
    v_cab_valorImpSomaPagamento    NUMBER;
    v_cab_valorImpDiminuiPagamento NUMBER;
    v_cab_valorLiquidoItem         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
    v_cab_valorProdutos            := cab.valorProdutos;
    v_cab_valorServicos            := cab.valorServicos;
    v_cab_valorBasePagamento       := cab.valorBasePagamento;
    v_cab_valorAVistaMinimo        := cab.valorAVistaMinimo;
    v_cab_valorFreteTotal          := cab.valorFreteTotal;
    v_cab_valorSeguroTotal         := cab.valorSeguroTotal;
    v_cab_valorDescontoTotal       := cab.valorDescontoTotal;
    v_cab_valorOutrasDespesasTotal := cab.valorOutrasDespesasTotal;
    v_cab_valorAdicFreteMarinTotal := cab.valorAdicFreteMarinhaMerTotal;
    v_cab_valorDespesasAduanTotal  := cab.valorDespesasAduaneirasTotal;
    v_cab_valorImpSomaPagamento    := cab.valorImpostosSomaPagamento;
    v_cab_valorImpDiminuiPagamento := cab.valorImpostosDiminuiPagamento;
    v_cab_valorLiquidoItem         := cab.valorLiquidoItem;
    ADD_ORCAMENTO_CALC_IMP_RATEIO (
      cab.orcamento,
      p_troca_tipoPagamentoFrete,
      p_a_cab_tipoPagamentoFrete,
      cab.modeloDocumento,
      cab.entradaSaida,
      cab.atualizaCustoMedio,
      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 */
      v_cab_valorProdutos,
      v_cab_valorServicos,
      v_cab_valorBasePagamento,
      v_cab_valorAVistaMinimo,
      v_cab_valorFreteTotal,
      v_cab_valorSeguroTotal,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespesasTotal,
      v_cab_valorAdicFreteMarinTotal,
      v_cab_valorDespesasAduanTotal,
      v_cab_valorImpSomaPagamento,
      v_cab_valorImpDiminuiPagamento,
      v_cab_valorLiquidoItem,
      v_calcularImpostosItem);
    IF v_calcularImpostosItem = 1 THEN
      ADD_ORCAMENTO_CALC_IMP_ITENS(
        p_config_64_casasDecSaidas,
        p_config_209_filtrarGrupoEcon,
        p_config_330_redIcmsBasePisCof,
        p_config_362_calcCustoPorGrade,
        cab.orcamento,
        cab.entradaSaida,
        cab.estabelecimento,
        cab.dataEmissao,
        cab.pessoa,
        cab.localDestinoOperacao,
        cab.indicadorConsumidorFinal,
        cab.tipoPagamentoFrete,
        cab.diminuiDescontoPrUnit,
        cab.somaAcrescimosPrUnit,
        cab.somaFreteSeguroPrUnit,
        cab.indicadorInscricaoEstadual,
        /* Retornos */
        v_cab_valorProdutos,
        v_cab_valorServicos,
        v_cab_valorBasePagamento,
        v_cab_valorAVistaMinimo,
        v_cab_valorFreteTotal,
        v_cab_valorSeguroTotal,
        v_cab_valorDescontoTotal,
        v_cab_valorOutrasDespesasTotal,
        v_cab_valorAdicFreteMarinTotal,
        v_cab_valorDespesasAduanTotal,
        v_cab_valorImpSomaPagamento,
        v_cab_valorImpDiminuiPagamento,
        v_cab_valorLiquidoItem);
    END IF;
    UPDATE MOORCAMENTOS SET 
      valorProdutos                 = v_cab_valorProdutos,
      valorServicos                 = v_cab_valorServicos,
      valorBasePagamento            = v_cab_valorBasePagamento,
      valorAVistaMinimo             = v_cab_valorAVistaMinimo,
      valorFreteTotal               = v_cab_valorFreteTotal,
      valorSeguroTotal              = v_cab_valorSeguroTotal,
      valorDescontoTotal            = v_cab_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarinTotal,
      valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
      valorImpostosSomaPagamento    = v_cab_valorImpSomaPagamento,
      valorImpostosDiminuiPagamento = v_cab_valorImpDiminuiPagamento,
      valorLiquidoItem              = v_cab_valorLiquidoItem
    WHERE orcamento                 = cab.orcamento;
  END LOOP;
END ADD_ORCAMENTO_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,
            item.stICMS,
            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_KIT(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_bufferIdEstoque              IN VARCHAR2,
    p_estabelecimentoAtivo         IN NUMBER,
    p_cab_modeloDocumento          IN NUMBER,
    p_cab_atualizaCustoMedio       IN NUMBER,
    p_cab_atualizaUltimaCompra     IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEmissao              IN DATE,
    p_cab_dataEntradaSaida         IN DATE,
    p_modDoc_geraTransferencia     IN NUMBER,
    p_modDoc_geraOperacaoEmTransit IN NUMBER,
    p_modDoc_transitoLocalEstoque  IN NUMBER,
    p_locEstTransito_indicProprPos IN CHAR,
    p_item_idItemDocFiscal         IN NUMBER,
    p_item_gradeProduto            IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_item_valorCustoOperacao      IN NUMBER,
    p_item_observacoes             IN VARCHAR2,
    p_endEst_idEnderecoEstoqueDocF IN NUMBER,
    p_idEnderecoEstoque            IN NUMBER,
    p_locEst_indicProprPosseItem   IN CHAR,
    p_docTransf_estabelecEntrada   IN NUMBER,
    p_docTransf_estabelecSaida     IN NUMBER,
    r_bufferIdEstoque              OUT VARCHAR2)
IS  
  v_quantidadeNumerosSerie NUMBER;
  v_quantidadeRateioTotal  NUMBER;
  v_quantSaldoRateioTotal  NUMBER;
  v_valorSaldoRateioTotal  NUMBER;
  v_valorCustoManter       NUMBER;
  v_precoCustoKit          NUMBER;
  v_valorCustoKit          NUMBER;
  CURSOR c_kit IS 
    SELECT 
      kit.gradeProdutoFilho,
      kit.manterUltimoCusto,
      gradProdFilho.produto,
      prodFilho.controleEstoque,
      prodFilho.controlaNumeroSerie,
      ROUND(p_item_quantidade * kit.quantidade, uniFilho.casasDecimaisUnidadeMedida) quantidade
    FROM CAGRADEPRODUTOXKITSCOMBOS kit 
    JOIN CAGRADESPRODUTO gradProdFilho ON gradProdFilho.gradeProduto = kit.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE kit.gradeProduto = p_item_gradeProduto
    AND kit.ativo = 1
    AND kit.gradeProduto <> kit.gradeProdutoFilho
    AND ROUND(p_item_quantidade * kit.quantidade, uniFilho.casasDecimaisUnidadeMedida) > 0;
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  IF p_cab_atualizaCustoMedio = 1 THEN
    SELECT COALESCE(SUM(ROUND(p_item_quantidade * kit.quantidade, uniFilho.casasDecimaisUnidadeMedida)),0)
    INTO v_quantidadeRateioTotal
    FROM CAGRADEPRODUTOXKITSCOMBOS kit 
    JOIN CAGRADESPRODUTO gradProdFilho ON gradProdFilho.gradeProduto = kit.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE kit.gradeProduto = p_item_gradeProduto
    AND kit.ativo = 1
    AND kit.manterUltimoCusto = 0
    AND kit.gradeProduto <> kit.gradeProdutoFilho;
    SELECT ROUND((COALESCE(SUM(ROUND(p_item_quantidade * kit.quantidade, uniFilho.casasDecimaisUnidadeMedida)
      * FUNC_ADD_BUSCA_PRECO_ULT_CUSTO(
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          TO_DATE ('01/01/1900','DD/MM/YYYY'),
          CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END - 1,
          0,
          gradProdFilho.produto,
          0,
          ' ',
          p_locEst_indicProprPosseItem,
          p_item_pessoaParticipante)),0)),2)
    INTO v_valorCustoManter
    FROM CAGRADEPRODUTOXKITSCOMBOS kit 
    JOIN CAGRADESPRODUTO gradProdFilho ON gradProdFilho.gradeProduto = kit.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE kit.gradeProduto = p_item_gradeProduto
    AND kit.ativo = 1
    AND kit.manterUltimoCusto = 1
    AND kit.gradeProduto <> kit.gradeProdutoFilho;
  ELSE
    v_quantidadeRateioTotal := 0;
    v_valorCustoManter      := 0;
  END IF;
  v_quantSaldoRateioTotal := v_quantidadeRateioTotal;
  v_valorSaldoRateioTotal := p_item_valorCustoOperacao - v_valorCustoManter;
  FOR kit IN c_kit
  LOOP  
    IF p_cab_atualizaCustoMedio = 1 AND kit.manterUltimoCusto = 1 THEN
      v_precoCustoKit := FUNC_ADD_BUSCA_PRECO_ULT_CUSTO(
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          TO_DATE ('01/01/1900','DD/MM/YYYY'),
          CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END - 1,
          0,
          kit.produto,
          0,
          ' ',
          p_locEst_indicProprPosseItem,
          p_item_pessoaParticipante);
      v_valorCustoKit := ROUND (kit.quantidade * v_precoCustoKit,2);
    ELSIF p_cab_atualizaCustoMedio = 1 AND p_item_valorCustoOperacao > v_valorCustoManter AND v_quantSaldoRateioTotal > kit.quantidade THEN
      v_valorCustoKit := ROUND((p_item_valorCustoOperacao - v_valorCustoManter) * kit.quantidade / v_quantidadeRateioTotal,2);
      v_precoCustoKit := ROUND(v_valorCustoKit / kit.quantidade,7);
      v_quantSaldoRateioTotal := v_quantSaldoRateioTotal - kit.quantidade;
      v_valorSaldoRateioTotal := v_valorSaldoRateioTotal - v_valorCustoKit;
    ELSIF p_cab_atualizaCustoMedio = 1 AND v_valorSaldoRateioTotal > 0 THEN
      v_valorCustoKit := v_valorSaldoRateioTotal;
      v_precoCustoKit := ROUND(v_valorCustoKit / kit.quantidade,7);
      v_quantSaldoRateioTotal := 0;
      v_valorSaldoRateioTotal := 0;
    ELSE
      v_precoCustoKit := 0;
      v_valorCustoKit := 0;
    END IF;
    IF kit.controleEstoque IN (3,4) THEN
      ADD_DOC_FISC_ITEM_EST_KIT(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo,
        p_cab_modeloDocumento,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_idItemDocFiscal,
        kit.gradeProdutoFilho,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        kit.quantidade,
        v_valorCustoKit,
        p_item_observacoes,
        p_endEst_idEnderecoEstoqueDocF,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        r_bufferIdEstoque);
    ELSIF kit.controleEstoque IN(1,5,11,12) THEN
      v_quantidadeNumerosSerie := 0;
      IF kit.controlaNumeroSerie > 0 THEN
        ADD_DOC_FISC_ITEM_EST_N_SERIE(
          r_bufferIdEstoque,
          p_estabelecimentoAtivo,
          p_cab_modeloDocumento,
          p_cab_atualizaCustoMedio,
          p_cab_atualizaUltimaCompra,
          p_cab_entradaSaida,
          p_cab_estabelecimento,
          p_cab_dataEmissao,
          p_cab_dataEntradaSaida,
          p_modDoc_geraTransferencia,
          p_modDoc_geraOperacaoEmTransit,
          p_modDoc_transitoLocalEstoque,
          p_locEstTransito_indicProprPos,
          p_item_idItemDocFiscal,
          kit.gradeProdutoFilho,
          0, -- p_item_idFormulaTinta
          0, -- p_item_personalizacao
          0, -- p_item_idLoteEstoque
          p_item_localEstoque,
          p_item_pessoaParticipante,
          v_precoCustoKit, -- p_item_precoCustoOperacao,
          0, -- p_item_precoCMV,
          p_item_observacoes,
          p_endEst_idEnderecoEstoqueDocF,
          p_idEnderecoEstoque,
          p_locEst_indicProprPosseItem,
          p_docTransf_estabelecEntrada,
          p_docTransf_estabelecSaida,
          r_bufferIdEstoque,
          v_quantidadeNumerosSerie);
      END IF;    
      IF kit.quantidade > v_quantidadeNumerosSerie THEN
        ADD_ESTOQUE_INSERE(
          r_bufferIdEstoque,
          p_estabelecimentoAtivo,
          p_cab_estabelecimento,
          CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, --p_data
          kit.gradeProdutoFilho,
          p_cab_modeloDocumento,
          100, --p_cab_operacaoInternaEstoque
          p_cab_atualizaCustoMedio,
          p_cab_atualizaUltimaCompra,
          p_cab_entradaSaida,
          p_locEst_indicProprPosseItem,
          p_item_pessoaParticipante,
          p_item_localEstoque,
          0, -- p_personalizacao
          0, -- p_idLoteEstoque
          p_idEnderecoEstoque,
          0, -- p_idNumeroSerie
          kit.quantidade - v_quantidadeNumerosSerie,
          v_precoCustoKit, -- p_precoCustoOperacao
          CASE WHEN v_quantidadeNumerosSerie = 0 THEN v_valorCustoKit WHEN kit.quantidade = 0 THEN 0 ELSE ROUND ((v_valorCustoKit * (kit.quantidade - v_quantidadeNumerosSerie) / kit.quantidade), 2) END, -- p_totalCustoOperacao
          0, -- p_precoCMV
          0, -- p_valorCMV
          p_item_observacoes,
          0, -- p_idItemPreDocumento,
          p_item_idItemDocFiscal,
          0, -- p_idItemSeparacao,
          0, -- p_divergenciaBalanco,
          0, -- p_idItemDocTransferencia,
          r_bufferIdEstoque);
        IF p_modDoc_geraTransferencia = 1 AND p_modDoc_geraOperacaoEmTransit = 1 AND p_modDoc_transitoLocalEstoque > 0 AND p_docTransf_estabelecEntrada > 0 AND p_docTransf_estabelecSaida > 0 THEN
          ADD_ESTOQUE_INSERE(
            r_bufferIdEstoque, 
            p_estabelecimentoAtivo, 
            p_docTransf_estabelecSaida,
            CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, --p_data
            kit.gradeProdutoFilho,
            p_cab_modeloDocumento,
            900,
            0,
            0,
            CASE WHEN p_cab_entradaSaida='S' THEN 'E' ELSE 'S' END,
            p_locEstTransito_indicProprPos,
            p_item_pessoaParticipante,
            p_modDoc_transitoLocalEstoque,
            0, -- p_personalizacao
            0, -- p_idLoteEstoque
            p_idEnderecoEstoque,
            0, -- p_idNumeroSerie
            kit.quantidade - v_quantidadeNumerosSerie,
            v_precoCustoKit, -- p_precoCustoOperacao
            CASE WHEN v_quantidadeNumerosSerie = 0 THEN v_valorCustoKit WHEN kit.quantidade = 0 THEN 0 ELSE ROUND ((v_valorCustoKit * (kit.quantidade - v_quantidadeNumerosSerie) / kit.quantidade), 2) END, -- p_totalCustoOperacao
            0, -- p_precoCMV
            0, -- p_valorCMV
            p_item_observacoes,
            0, -- p_idItemPreDocumento,
            p_item_idItemDocFiscal,
            0, -- p_idItemSeparacao,
            0, -- p_divergenciaBalanco,
            0, -- p_idItemDocTransferencia,
            r_bufferIdEstoque);
        END IF;    
      END IF;    
    END IF;
  END LOOP;
END ADD_DOC_FISC_ITEM_EST_KIT;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_EST_ENDERECO(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_bufferIdEstoque              IN VARCHAR2,
    p_estabelecimentoAtivo         IN NUMBER,
    p_cab_modeloDocumento          IN NUMBER,
    p_cab_atualizaCustoMedio       IN NUMBER,
    p_cab_atualizaUltimaCompra     IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEmissao              IN DATE,
    p_cab_dataEntradaSaida         IN DATE,
    p_modDoc_geraTransferencia     IN NUMBER,
    p_modDoc_geraOperacaoEmTransit IN NUMBER,
    p_modDoc_transitoLocalEstoque  IN NUMBER,
    p_locEstTransito_indicProprPos IN CHAR,
    p_item_idItemDocFiscal         IN NUMBER,
    p_item_gradeProduto            IN NUMBER,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_idLoteEstoque           IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_item_precoCustoOperacao      IN NUMBER,
    p_item_valorCustoOperacao      IN NUMBER,
    p_item_precoCMV                IN NUMBER,
    p_item_valorCMV                IN NUMBER,
    p_item_quantidadeExtemporanea  IN NUMBER,
    p_item_observacoes             IN VARCHAR2,
    p_prod_controlaNumeroSerie     IN NUMBER,
    p_prod_controleEstoque         IN NUMBER,
    p_locEst_indicProprPosseItem   IN CHAR,
    p_docTransf_estabelecEntrada   IN NUMBER,
    p_docTransf_estabelecSaida     IN NUMBER,
    r_bufferIdEstoque              OUT VARCHAR2,
    r_quantidadeEnderecoEstoque    OUT NUMBER)
IS
  v_quantidadeNumerosSerie NUMBER (14,0);
  CURSOR c_endEst
  IS 
    SELECT idEnderecoEstoque,
      idEnderecoEstoqueDocFiscal,
      quantidade 
    FROM MODOCFISCALXENDERECOESTOQ
    WHERE idItemDocFiscal = p_item_idItemDocFiscal
    AND quantidade        > 0;
BEGIN
  r_bufferIdEstoque           := p_bufferIdEstoque;
  r_quantidadeEnderecoEstoque := 0;
  FOR endEst IN c_endEst
  LOOP
    r_quantidadeEnderecoEstoque := r_quantidadeEnderecoEstoque + endEst.quantidade;
    IF p_prod_controleEstoque = 12 AND p_item_idFormulaTinta > 0 THEN
      ADD_ESTOQUE_FORMULA_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_modeloDocumento,
        100,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_idFormulaTinta,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        endEst.quantidade,
        p_item_observacoes,
        endEst.idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        0, -- p_idItemPreDocumento,
        p_item_idItemDocFiscal,
        0, -- p_idItemSeparacao,
        0, -- p_divergenciaBalanco,
        0, -- p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        r_bufferIdEstoque);
    ELSIF p_prod_controleEstoque IN (3,4) THEN
      ADD_DOC_FISC_ITEM_EST_KIT(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_modeloDocumento,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_idItemDocFiscal,
        p_item_gradeProduto,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        endEst.quantidade,
        CASE WHEN p_item_quantidade + p_item_quantidadeExtemporanea = 0 THEN 0 ELSE ROUND ((p_item_valorCustoOperacao * (endEst.quantidade - v_quantidadeNumerosSerie) / (p_item_quantidade + p_item_quantidadeExtemporanea)), 2) END,
        p_item_observacoes,
        endEst.idEnderecoEstoqueDocFiscal,
        endEst.idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        r_bufferIdEstoque);
    ELSIF p_prod_controleEstoque IN (1,5,11,12) THEN
      v_quantidadeNumerosSerie := 0;
      IF p_prod_controlaNumeroSerie > 0 THEN
        ADD_DOC_FISC_ITEM_EST_N_SERIE(
          r_bufferIdEstoque,
          p_estabelecimentoAtivo,
          p_cab_modeloDocumento,
          p_cab_atualizaCustoMedio,
          p_cab_atualizaUltimaCompra,
          p_cab_entradaSaida,
          p_cab_estabelecimento,
          p_cab_dataEmissao,
          p_cab_dataEntradaSaida,
          p_modDoc_geraTransferencia,
          p_modDoc_geraOperacaoEmTransit,
          p_modDoc_transitoLocalEstoque,
          p_locEstTransito_indicProprPos,
          p_item_idItemDocFiscal,
          p_item_gradeProduto,
          p_item_idFormulaTinta,
          p_item_personalizacao,
          p_item_idLoteEstoque,
          p_item_localEstoque,
          p_item_pessoaParticipante,
          p_item_precoCustoOperacao,
          p_item_precoCMV,
          p_item_observacoes,
          endEst.idEnderecoEstoqueDocFiscal,
          endEst.idEnderecoEstoque,
          p_locEst_indicProprPosseItem,
          p_docTransf_estabelecEntrada,
          p_docTransf_estabelecSaida,
          r_bufferIdEstoque,
          v_quantidadeNumerosSerie);
      END IF;
      IF endEst.quantidade > v_quantidadeNumerosSerie THEN
        ADD_ESTOQUE_INSERE(
          r_bufferIdEstoque, 
          p_estabelecimentoAtivo, 
          p_cab_estabelecimento,
          CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, -- p_data
          p_item_gradeProduto,
          p_cab_modeloDocumento,
          100,
          p_cab_atualizaCustoMedio,
          p_cab_atualizaUltimaCompra,
          p_cab_entradaSaida,
          p_locEst_indicProprPosseItem,
          p_item_pessoaParticipante,
          p_item_localEstoque,
          p_item_personalizacao,
          p_item_idLoteEstoque,
          endEst.idEnderecoEstoque,
          0, -- p_idNumeroSerie
          endEst.quantidade - v_quantidadeNumerosSerie,
          p_item_precoCustoOperacao,
          CASE WHEN p_item_quantidade + p_item_quantidadeExtemporanea = 0 THEN 0 ELSE ROUND ((p_item_valorCustoOperacao * (endEst.quantidade - v_quantidadeNumerosSerie) / (p_item_quantidade + p_item_quantidadeExtemporanea)), 2) END,
          p_item_precoCMV,
          CASE WHEN p_item_quantidade + p_item_quantidadeExtemporanea = 0 THEN 0 ELSE ROUND ((p_item_valorCMV * (endEst.quantidade - v_quantidadeNumerosSerie) / (p_item_quantidade + p_item_quantidadeExtemporanea)), 2) END,
          p_item_observacoes,
          0, -- p_idItemPreDocumento,
          p_item_idItemDocFiscal,
          0, -- p_idItemSeparacao,
          0, -- p_divergenciaBalanco,
          0, -- p_idItemDocTransferencia,
          r_bufferIdEstoque);
        IF p_modDoc_geraTransferencia = 1 AND p_modDoc_geraOperacaoEmTransit = 1 AND p_modDoc_transitoLocalEstoque > 0 AND p_docTransf_estabelecEntrada > 0 AND p_docTransf_estabelecSaida > 0 THEN
          ADD_ESTOQUE_INSERE(
            r_bufferIdEstoque, 
            p_estabelecimentoAtivo, 
            p_docTransf_estabelecSaida,
            CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, -- p_data
            p_item_gradeProduto,
            p_cab_modeloDocumento,
            900,
            0,
            0,
            CASE WHEN p_cab_entradaSaida='S' THEN 'E' ELSE 'S' END,
            p_locEstTransito_indicProprPos,
            p_item_pessoaParticipante,
            p_modDoc_transitoLocalEstoque,
            p_item_personalizacao,
            p_item_idLoteEstoque,
            endEst.idEnderecoEstoque,
            0, -- p_idNumeroSerie
            endEst.quantidade - v_quantidadeNumerosSerie,
            p_item_precoCustoOperacao,
            CASE WHEN p_item_quantidade + p_item_quantidadeExtemporanea = 0 THEN 0 ELSE ROUND ((p_item_valorCustoOperacao * (endEst.quantidade - v_quantidadeNumerosSerie) / (p_item_quantidade + p_item_quantidadeExtemporanea)), 2) END,
            p_item_precoCMV,
            CASE WHEN p_item_quantidade + p_item_quantidadeExtemporanea = 0 THEN 0 ELSE ROUND ((p_item_valorCMV * (endEst.quantidade - v_quantidadeNumerosSerie) / (p_item_quantidade + p_item_quantidadeExtemporanea)), 2) END,
            p_item_observacoes,
            0, -- p_idItemPreDocumento,
            p_item_idItemDocFiscal,
            0, -- p_idItemSeparacao,
            0, -- p_divergenciaBalanco,
            0, -- p_idItemDocTransferencia,
            r_bufferIdEstoque);
        END IF;
      END IF;
    END IF;
  END LOOP;
END ADD_DOC_FISC_ITEM_EST_ENDERECO;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_EST_GRAVA(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_bufferIdEstoque              IN VARCHAR2,
    p_estabelecimentoAtivo         IN NUMBER,
    p_cab_modeloDocumento          IN NUMBER,
    p_cab_atualizaCustoMedio       IN NUMBER,
    p_cab_atualizaUltimaCompra     IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEmissao              IN DATE,
    p_cab_dataEntradaSaida         IN DATE,
    p_modDoc_geraTransferencia     IN NUMBER,
    p_modDoc_geraOperacaoEmTransit IN NUMBER,
    p_modDoc_transitoLocalEstoque  IN NUMBER,
    p_locEstTransito_indicProprPos IN CHAR,
    p_item_idItemDocFiscal         IN NUMBER,
    p_item_gradeProduto            IN NUMBER,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_idLoteEstoque           IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_item_precoCustoOperacao      IN NUMBER,
    p_item_valorCustoOperacao      IN NUMBER,
    p_item_precoCMV                IN NUMBER,
    p_item_valorCMV                IN NUMBER,
    p_item_quantidadeExtemporanea  IN NUMBER,
    p_item_observacoes             IN VARCHAR2,
    p_prod_controlaNumeroSerie     IN NUMBER,
    p_prod_controleEstoque         IN NUMBER,
    p_locEst_indicProprPosseItem   IN CHAR,
    p_estXLoc_solicitaEnderecoEst  IN NUMBER,
    p_docTransf_estabelecEntrada   IN NUMBER,
    p_docTransf_estabelecSaida     IN NUMBER,
    r_bufferIdEstoque              OUT VARCHAR2)
IS
  v_quantidadeEnderecoEstoque NUMBER (14,0);
  v_quantidadeNumerosSerie    NUMBER (14,0);
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  v_quantidadeEnderecoEstoque := 0;
  v_quantidadeNumerosSerie    := 0;
  IF p_estXLoc_solicitaEnderecoEst = 1 AND p_prod_controleEstoque IN (1,3,4,5,11,12) THEN
    ADD_DOC_FISC_ITEM_EST_ENDERECO(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      r_bufferIdEstoque,
      p_estabelecimentoAtivo,
      p_cab_modeloDocumento,
      p_cab_atualizaCustoMedio,
      p_cab_atualizaUltimaCompra,
      p_cab_entradaSaida,
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_cab_dataEntradaSaida,
      p_modDoc_geraTransferencia,
      p_modDoc_geraOperacaoEmTransit,
      p_modDoc_transitoLocalEstoque,
      p_locEstTransito_indicProprPos,
      p_item_idItemDocFiscal,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_localEstoque,
      p_item_pessoaParticipante,
      p_item_quantidade,
      p_item_precoCustoOperacao,
      p_item_valorCustoOperacao,
      p_item_precoCMV,
      p_item_valorCMV,
      p_item_quantidadeExtemporanea,
      p_item_observacoes,
      p_prod_controlaNumeroSerie,
      p_prod_controleEstoque,
      p_locEst_indicProprPosseItem,
      p_docTransf_estabelecEntrada,
      p_docTransf_estabelecSaida,
      r_bufferIdEstoque,
      v_quantidadeEnderecoEstoque);
  END IF;
  IF p_item_quantidade > v_quantidadeEnderecoEstoque THEN
    IF p_prod_controleEstoque = 12 AND p_item_idFormulaTinta > 0 THEN
      ADD_ESTOQUE_FORMULA_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_modeloDocumento,
        100,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_idFormulaTinta,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade - v_quantidadeEnderecoEstoque,
        p_item_observacoes,
        0, -- p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        0, -- p_idItemPreDocumento,
        p_item_idItemDocFiscal,
        0, -- p_idItemSeparacao,
        0, -- p_divergenciaBalanco,
        0, -- p_idItemDocTransferencia,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        r_bufferIdEstoque);
    ELSIF p_prod_controleEstoque IN (3,4) THEN
      ADD_DOC_FISC_ITEM_EST_KIT(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque,
        p_estabelecimentoAtivo, 
        p_cab_modeloDocumento,
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_idItemDocFiscal,
        p_item_gradeProduto,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade - v_quantidadeEnderecoEstoque,
        CASE WHEN v_quantidadeEnderecoEstoque = 0 THEN p_item_valorCustoOperacao WHEN p_item_quantidade + p_item_quantidadeExtemporanea = 0 THEN 0 ELSE ROUND ((p_item_valorCustoOperacao * (p_item_quantidade + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque) / (p_item_quantidade + p_item_quantidadeExtemporanea)), 2) END,
        p_item_observacoes,
        0, -- p_idEnderecoEstoqueDocFiscal,
        0, -- p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        r_bufferIdEstoque);
    ELSIF p_prod_controleEstoque IN (1,5,11,12) THEN
      v_quantidadeNumerosSerie := 0;
      IF p_prod_controlaNumeroSerie > 0 THEN
        ADD_DOC_FISC_ITEM_EST_N_SERIE(
          r_bufferIdEstoque,
          p_estabelecimentoAtivo,
          p_cab_modeloDocumento,
          p_cab_atualizaCustoMedio,
          p_cab_atualizaUltimaCompra,
          p_cab_entradaSaida,
          p_cab_estabelecimento,
          p_cab_dataEmissao,
          p_cab_dataEntradaSaida,
          p_modDoc_geraTransferencia,
          p_modDoc_geraOperacaoEmTransit,
          p_modDoc_transitoLocalEstoque,
          p_locEstTransito_indicProprPos,
          p_item_idItemDocFiscal,
          p_item_gradeProduto,
          p_item_idFormulaTinta,
          p_item_personalizacao,
          p_item_idLoteEstoque,
          p_item_localEstoque,
          p_item_pessoaParticipante,
          p_item_precoCustoOperacao,
          p_item_precoCMV,
          p_item_observacoes,
          0, -- p_idEnderecoEstoqueDocFiscal,
          0, -- p_idEnderecoEstoque,
          p_locEst_indicProprPosseItem,
          p_docTransf_estabelecEntrada,
          p_docTransf_estabelecSaida,
          r_bufferIdEstoque,
          v_quantidadeNumerosSerie);
      END IF;
      IF p_item_quantidade - v_quantidadeEnderecoEstoque > v_quantidadeNumerosSerie THEN
        ADD_ESTOQUE_INSERE(
          r_bufferIdEstoque, 
          p_estabelecimentoAtivo, 
          p_cab_estabelecimento,
          CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, -- p_data
          p_item_gradeProduto,
          p_cab_modeloDocumento,
          100,
          p_cab_atualizaCustoMedio,
          p_cab_atualizaUltimaCompra,
          p_cab_entradaSaida,
          p_locEst_indicProprPosseItem,
          p_item_pessoaParticipante,
          p_item_localEstoque,
          p_item_personalizacao,
          p_item_idLoteEstoque,
          0, -- p_idEnderecoEstoque,
          0, -- p_idNumeroSerie
          p_item_quantidade - v_quantidadeEnderecoEstoque - v_quantidadeNumerosSerie,
          p_item_precoCustoOperacao,
          CASE WHEN p_item_quantidade + p_item_quantidadeExtemporanea = 0 THEN 0 ELSE ROUND ((p_item_valorCustoOperacao * (p_item_quantidade - v_quantidadeEnderecoEstoque - v_quantidadeNumerosSerie) / (p_item_quantidade + p_item_quantidadeExtemporanea)), 2) END,
          p_item_precoCMV,
          CASE WHEN p_item_quantidade + p_item_quantidadeExtemporanea = 0 THEN 0 ELSE ROUND ((p_item_valorCMV * (p_item_quantidade - v_quantidadeEnderecoEstoque - v_quantidadeNumerosSerie) / (p_item_quantidade + p_item_quantidadeExtemporanea)), 2) END,
          p_item_observacoes,
          0, -- p_idItemPreDocumento,
          p_item_idItemDocFiscal,
          0, -- p_idItemSeparacao,
          0, -- p_divergenciaBalanco,
          0, -- p_idItemDocTransferencia,
          r_bufferIdEstoque);
        IF p_modDoc_geraTransferencia = 1 AND p_modDoc_geraOperacaoEmTransit = 1 AND p_modDoc_transitoLocalEstoque > 0 AND p_docTransf_estabelecEntrada > 0 AND p_docTransf_estabelecSaida > 0 THEN
          ADD_ESTOQUE_INSERE(
            r_bufferIdEstoque, 
            p_estabelecimentoAtivo, 
            p_docTransf_estabelecSaida,
            CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, -- p_data
            p_item_gradeProduto,
            p_cab_modeloDocumento,
            900,
            0,
            0,
            CASE WHEN p_cab_entradaSaida='S' THEN 'E' ELSE 'S' END,
            p_locEstTransito_indicProprPos,
            p_item_pessoaParticipante,
            p_modDoc_transitoLocalEstoque,
            p_item_personalizacao,
            p_item_idLoteEstoque,
            0, -- p_idEnderecoEstoque,
            0, -- p_idNumeroSerie
            p_item_quantidade - v_quantidadeEnderecoEstoque - v_quantidadeNumerosSerie,
            p_item_precoCustoOperacao,
            CASE WHEN p_item_quantidade + p_item_quantidadeExtemporanea = 0 THEN 0 ELSE ROUND ((p_item_valorCustoOperacao * (p_item_quantidade - v_quantidadeEnderecoEstoque - v_quantidadeNumerosSerie) / (p_item_quantidade + p_item_quantidadeExtemporanea)), 2) END,
            p_item_precoCMV,
            CASE WHEN p_item_quantidade + p_item_quantidadeExtemporanea = 0 THEN 0 ELSE ROUND ((p_item_valorCMV * (p_item_quantidade - v_quantidadeEnderecoEstoque - v_quantidadeNumerosSerie) / (p_item_quantidade + p_item_quantidadeExtemporanea)), 2) END,
            p_item_observacoes,
            0, -- p_idItemPreDocumento,
            p_item_idItemDocFiscal,
            0, -- p_idItemSeparacao,
            0, -- p_divergenciaBalanco,
            0, -- p_idItemDocTransferencia,
            r_bufferIdEstoque);
        END IF;
      END IF;
    END IF;
  END IF;
END ADD_DOC_FISC_ITEM_EST_GRAVA;

/

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'));
    ADD_MOESTOQUES_EXCLUI (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_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,
    /* Retornos */
    r_cab_valorTarifaCartao        OUT NUMBER,
    r_cab_valorMargem              OUT NUMBER,
    r_cab_percentualMargem         OUT NUMBER,
    r_cab_imagemMargem             OUT VARCHAR2)
IS
    v_cab_estabelecimento          NUMBER;
    v_cab_dataEmissao              DATE;
    v_cab_prazoMedioPonderado      NUMBER;
    v_cab_valorFreteTotal          NUMBER;
    v_cab_valorSeguroTotal         NUMBER;
    v_cab_valorAdicFreteMarinTotal NUMBER;
    v_cab_valorDespesasAduanTotal  NUMBER;
    v_cab_valorLiquidoItem         NUMBER;
    v_munEndEst_uf                 CHAR(2);
    v_item_valorLiquidoSemFreteSeg NUMBER;
    v_item_valorCaptacao           NUMBER;
    v_item_valorTarifaCartao       NUMBER;
    v_item_valorImpostos           NUMBER;
    v_item_precoCusto              NUMBER;
    v_item_valorCusto              NUMBER;
    v_item_valorMargem             NUMBER;
    v_item_percentualMargem        NUMBER;
    v_item_imagemMargem            VARCHAR2(256);
    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_valorTarifaCartao := FUNC_ADD_TARIFA_CART_DOC_FISC (p_cab_idDocumentoFiscal);
  r_cab_valorMargem       := 0;
  r_cab_valorMargem       := 0;
  r_cab_percentualMargem  := 0;
  r_cab_imagemMargem      := ' ';
  DELETE TEMPMARGEMCONTRIBUICAO
  WHERE uniqueMachineID = p_uniqueMachineID
  AND orcamentoPredocumentoDocumento = 'D'
  AND idCabecalho = p_cab_idDocumentoFiscal;
  SELECT
    cab.estabelecimento,
    cab.dataEmissao,
    cab.prazoMedioPonderado,
    cab.valorFreteTotal,
    cab.valorSeguroTotal,
    cab.valorAdicFreteMarinhaMerTotal,
    cab.valorDespesasAduaneirasTotal,
    cab.valorLiquidoItem,
    COALESCE((
      SELECT MAX(munEndEst.uf)
      FROM CAENDERECOSPESSOA endEst
      JOIN SIMUNICIPIOS munEndEst
      ON munEndEst.municipio = endEst.municipio
      WHERE endEst.pessoa = est.pessoaEstabelecimento
      AND endEst.ativo = 1
      AND endEst.principal = 1),'  ')
  INTO
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_prazoMedioPonderado,
    v_cab_valorFreteTotal,
    v_cab_valorSeguroTotal,
    v_cab_valorAdicFreteMarinTotal,
    v_cab_valorDespesasAduanTotal,
    v_cab_valorLiquidoItem,
    v_munEndEst_uf
  FROM MODOCUMENTOSFISCAIS cab
  JOIN PAESTABELECIMENTOS est
  ON est.estabelecimento = cab.estabelecimento
  WHERE cab.idDocumentoFiscal = p_cab_idDocumentoFiscal;
  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,
      v_cab_estabelecimento,
      v_cab_dataEmissao,
      v_cab_prazoMedioPonderado,
      v_cab_valorLiquidoItem,
      r_cab_valorTarifaCartao,
      v_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_item_valorLiquidoSemFreteSeg,
      v_item_valorCaptacao,
      v_item_valorTarifaCartao,
      v_item_valorImpostos,
      v_item_precoCusto,
      v_item_valorCusto,
      v_item_valorMargem,
      v_item_percentualMargem);
    IF p_regMarg_exibImagemMargemItem = 1 AND p_regMarg_regraImagemItem <> 0 THEN
      v_item_imagemMargem := FUNC_ADD_BUSCA_IMAGEM_FAIXA (p_regMarg_regraImagemItem, v_item_percentualMargem);
    ELSE
      v_item_imagemMargem := ' ';
    END IF;
    IF item.cancelado = 0 THEN
      r_cab_valorMargem := r_cab_valorMargem + v_item_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_item_valorLiquidoSemFreteSeg,
      v_item_valorCaptacao,
      v_item_valorTarifaCartao,
      v_item_valorImpostos,
      v_item_precoCusto,
      v_item_valorCusto,
      v_item_valorMargem,
      v_item_percentualMargem,
      v_item_imagemMargem);
  END LOOP;
  r_cab_percentualMargem := CASE WHEN v_cab_valorLiquidoItem - v_cab_valorFreteTotal - v_cab_valorSeguroTotal - v_cab_valorAdicFreteMarinTotal - v_cab_valorDespesasAduanTotal = 0 THEN 0 ELSE ROUND ((100 * r_cab_valorMargem / (v_cab_valorLiquidoItem - v_cab_valorFreteTotal - v_cab_valorSeguroTotal - v_cab_valorAdicFreteMarinTotal - v_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_cab_tipoPagamentoFrete       IN CHAR,
    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_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_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(
      p_cab_tipoPagamentoFrete,
      p_modDoc_diminuiDescontoPrUnit,
      p_modDoc_somaAcrescimosPrUnit,
      p_modDoc_somaFreteSeguroPrUnit,
      item.quantidade,
      item.quantidadeConvertida,
      item.precoUnitarioBruto,
      item.acrescimoUnitarioComposicao,
      item.precoUnitario,
      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,
      item.quantidadeExtemporanea,
      item.acrescimoUnitarioExtemporaneo,
      item.valorAcrescimoExtempItem,
      item.valorAcrescimoExtempGeral,
      /* Retornos */
      v_precoUnitario,
      v_precoUnitarioConvertido,
      v_valorProdutoServico,
      v_auxNumber,
      v_auxNumber,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal,
      v_valorAcrescimoExtempSubtotal,
      v_valorAcrescimoExtempTotal);
    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
      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_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_troca_tipoPagamentoFrete     IN NUMBER,
    p_a_cab_tipoPagamentoFrete     IN CHAR)
IS
    v_cab_valorProdutos            NUMBER;
    v_cab_valorServicos            NUMBER;
    v_cab_valorBasePagamento       NUMBER;
    v_cab_valorAVistaMinimo        NUMBER;
    v_cab_valorFreteTotal          NUMBER;
    v_cab_valorSeguroTotal         NUMBER;
    v_cab_valorDescontoTotal       NUMBER;
    v_cab_valorOutrasDespesasTotal NUMBER;
    v_cab_valorAdicFreteMarinTotal NUMBER;
    v_cab_valorDespesasAduanTotal  NUMBER;
    v_cab_valorImpSomaPagamento    NUMBER;
    v_cab_valorImpDiminuiPagamento NUMBER;
    v_cab_valorLiquidoItem         NUMBER;
    v_cab_valorCustoOperacao       NUMBER;
    v_cab_valorCMV                 NUMBER;
    v_cab_valorDescCustoOpTotal    NUMBER;
    v_cab_valorAcrescCustoOpTotal  NUMBER;
    v_cab_valorAcrescExtempTotal   NUMBER;
    v_calcularImpostosItem         NUMBER;
    v_modDoc_habilitaControleEntr  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
    v_cab_valorProdutos            := cab.valorProdutos;
    v_cab_valorServicos            := cab.valorServicos;
    v_cab_valorBasePagamento       := cab.valorBasePagamento;
    v_cab_valorAVistaMinimo        := cab.valorAVistaMinimo;
    v_cab_valorFreteTotal          := cab.valorFreteTotal;
    v_cab_valorSeguroTotal         := cab.valorSeguroTotal;
    v_cab_valorDescontoTotal       := cab.valorDescontoTotal;
    v_cab_valorOutrasDespesasTotal := cab.valorOutrasDespesasTotal;
    v_cab_valorAdicFreteMarinTotal := cab.valorAdicFreteMarinhaMerTotal;
    v_cab_valorDespesasAduanTotal  := cab.valorDespesasAduaneirasTotal;
    v_cab_valorImpSomaPagamento    := cab.valorImpostosSomaPagamento;
    v_cab_valorImpDiminuiPagamento := cab.valorImpostosDiminuiPagamento;
    v_cab_valorLiquidoItem         := cab.valorLiquidoItem;
    v_cab_valorDescCustoOpTotal    := cab.valorDescontoCustoOpTotal;
    v_cab_valorAcrescCustoOpTotal  := cab.valorAcrescimoCustoOpTotal;
    v_cab_valorCustoOperacao       := cab.valorCustoOperacao;
    v_cab_valorCMV                 := cab.valorCMV;
    v_cab_valorAcrescExtempTotal   := cab.valorAcrescimoExtempTotal;
    v_modDoc_habilitaControleEntr  := cab.habilitaControleEntrega;
    IF v_modDoc_habilitaControleEntr = 0 THEN
      SELECT CASE WHEN EXISTS (
        SELECT 1
        FROM MODOCFISCALXITENS a
        JOIN MODOCFISCALXORCAMENTOITEM docXorc
        ON docXorc.idItemDocFiscal = a.idItemDocFiscal
        JOIN MOORCAMENTOXITENS itemOrc
        ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento
        JOIN PACONTROLESENTREGA contr
        ON contr.controleEntrega = itemOrc.controleEntrega
        WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
        AND itemOrc.controleEntrega <> 0
        AND contr.habilitaFrete = 1) THEN 1 ELSE 0 END
      INTO v_modDoc_habilitaControleEntr
      FROM DUAL;
    END IF;
    ADD_DOC_FISC_CALC_IMP_RATEIO (
      cab.idDocumentoFiscal,
      p_troca_tipoPagamentoFrete,
      p_a_cab_tipoPagamentoFrete,
      cab.modeloDocumento,
      cab.entradaSaida,
      cab.devolucaoAnulacaoRetorno,
      cab.atualizaCustoMedio,
      cab.nfFornecedor,
      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,
      v_modDoc_habilitaControleEntr,
      /* Retornos */
      v_cab_valorProdutos,
      v_cab_valorServicos,
      v_cab_valorBasePagamento,
      v_cab_valorAVistaMinimo,
      v_cab_valorFreteTotal,
      v_cab_valorSeguroTotal,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespesasTotal,
      v_cab_valorAdicFreteMarinTotal,
      v_cab_valorDespesasAduanTotal,
      v_cab_valorImpSomaPagamento,
      v_cab_valorImpDiminuiPagamento,
      v_cab_valorLiquidoItem,
      v_cab_valorDescCustoOpTotal,
      v_cab_valorAcrescCustoOpTotal,
      v_cab_valorCustoOperacao,
      v_cab_valorCMV,
      v_cab_valorAcrescExtempTotal,
      v_calcularImpostosItem);
    IF v_calcularImpostosItem = 1 THEN
      ADD_DOC_FISC_CALC_IMP_ITENS(
        p_config_64_casasDecSaidas,
        p_config_209_filtrarGrupoEcon,
        p_config_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,
        cab.tipoPagamentoFrete,
        cab.diminuiDescontoPrUnit,
        cab.somaAcrescimosPrUnit,
        cab.somaFreteSeguroPrUnit,
        cab.indicadorInscricaoEstadual,
        /* Retornos */
        v_cab_valorProdutos,
        v_cab_valorServicos,
        v_cab_valorBasePagamento,
        v_cab_valorAVistaMinimo,
        v_cab_valorFreteTotal,
        v_cab_valorSeguroTotal,
        v_cab_valorDescontoTotal,
        v_cab_valorOutrasDespesasTotal,
        v_cab_valorAdicFreteMarinTotal,
        v_cab_valorDespesasAduanTotal,
        v_cab_valorImpSomaPagamento,
        v_cab_valorImpDiminuiPagamento,
        v_cab_valorLiquidoItem,
        v_cab_valorDescCustoOpTotal,
        v_cab_valorAcrescCustoOpTotal,
        v_cab_valorCustoOperacao,
        v_cab_valorCMV,
        v_cab_valorAcrescExtempTotal);
    END IF;
    UPDATE MODOCUMENTOSFISCAIS SET 
      valorProdutos                 = v_cab_valorProdutos,
      valorServicos                 = v_cab_valorServicos,
      valorBasePagamento            = v_cab_valorBasePagamento,
      valorAVistaMinimo             = v_cab_valorAVistaMinimo,
      valorFreteTotal               = v_cab_valorFreteTotal,
      valorSeguroTotal              = v_cab_valorSeguroTotal,
      valorDescontoTotal            = v_cab_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarinTotal,
      valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
      valorImpostosSomaPagamento    = v_cab_valorImpSomaPagamento,
      valorImpostosDiminuiPagamento = v_cab_valorImpDiminuiPagamento,
      valorLiquidoItem              = v_cab_valorLiquidoItem,
      valorDescontoCustoOpTotal     = v_cab_valorDescCustoOpTotal,
      valorAcrescimoCustoOpTotal    = v_cab_valorAcrescCustoOpTotal,
      valorCustoOperacao            = v_cab_valorCustoOperacao,
      valorCMV                      = v_cab_valorCMV,
      valorAcrescimoExtempTotal     = v_cab_valorAcrescExtempTotal
    WHERE idDocumentoFiscal         = cab.idDocumentoFiscal;
  END LOOP;
END ADD_DOC_FISC_CALC_IMP_CAB;

/

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'));
    ADD_MOESTOQUES_EXCLUI (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_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('MOMOTBLOQXDOCUMENTOSFISC', 'id', 0, p_estabelecimentoAtivo, NULL), mot.idMotivoBloqueioNovo, v_idDocumentoFiscal);
    INSERT INTO MOMOTBLOQXLIBERACOES (id, idMotivoBloqueioDocumento, usuario, dataLiberacao, valorLiberado, percentualLiberado, percentualAlcada, situacaoLiberacao, observacoes) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXLIBERACOES', 'id', 0, p_estabelecimentoAtivo, NULL), mot.idMotivoBloqueioNovo, a.usuario, a.dataLiberacao, a.valorLiberado, a.percentualLiberado, a.percentualAlcada, a.situacaoLiberacao, a.observacoes FROM MOMOTBLOQXLIBERACOES a WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
  END LOOP;
  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('MOMOTBLOQXDOCUMENTOSFISC', 'id', 0, p_estabelecimentoAtivo, NULL), mot.idMotivoBloqueioNovo, v_idDocumentoFiscal);
    INSERT INTO MOMOTBLOQXLIBERACOES (id, idMotivoBloqueioDocumento, usuario, dataLiberacao, valorLiberado, percentualLiberado, percentualAlcada, situacaoLiberacao, observacoes) SELECT FUNC_ADD_BUSCA_PROXIMO_ID('MOMOTBLOQXLIBERACOES', 'id', 0, p_estabelecimentoAtivo, NULL), mot.idMotivoBloqueioNovo, a.usuario, a.dataLiberacao, a.valorLiberado, a.percentualLiberado, a.percentualAlcada, a.situacaoLiberacao, a.observacoes FROM MOMOTBLOQXLIBERACOES a WHERE a.idMotivoBloqueioDocumento = mot.idMotivoBloqueioDocumento;
    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;

/

create or replace PROCEDURE ADD_ORCAMENTO_INFO_PAG_PRE_DOC (
  p_perfilUsuarioLogado          IN NUMBER,
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_deOrcamento                  IN NUMBER,
  p_paraPreDocumento             IN NUMBER,
  p_somenteNaEntrega             IN NUMBER)
IS
  CURSOR c_pag IS
    SELECT 
      pag.*,
      condPag.descricao condPag_descricao,
      ( SELECT COALESCE (SUM (financ.valor - financ.saldo), 0)
        FROM MOFINANCEIROS financ
        JOIN MOPREVFINANCXFINANCEIRO baixa ON baixa.idFinanceiro = financ.idFinanceiro
        JOIN MOPREVISOESFINANCEIRAS prev ON prev.idPrevisaoFinanceira = baixa.idPrevisaoFinanceira
        WHERE prev.idPagamentoOrcamento = pag.idPagamentoOrcamento
      ) valorBaixas
    FROM MOORCAMENTOXPAGAMENTOS pag
    JOIN PACONDICOESPAGAMENTO condPag on condPag.condicaoPagamento = pag.condicaoPagamento
    WHERE pag.orcamento = p_deOrcamento
    AND (p_somenteNaEntrega = 0 
      OR FUNC_ADD_BUSCA_CONFIG (110, p_perfilUsuarioLogado, p_usuarioLogado, p_estabelecimentoAtivo) = 'S'
      OR pag.meioPagamento = 58)
    AND pag.valorPagamentoLiquido > 0
    ORDER BY pag.pagamentoTroco,
      pag.sequencia;
BEGIN
  FOR pag IN c_pag LOOP
    IF pag.valorPagamentoLiquido - pag.valorBaixas > 0 THEN
      ADD_PRE_DOC_INFO_GRAVA_DESCR (
        p_estabelecimentoAtivo,
        p_paraPreDocumento,
        1,
        1,
        (CASE WHEN p_somenteNaEntrega = 1 AND pag.meioPagamento = 58 THEN 1 ELSE 0 END),
        0,          
        pag.pagamentoTroco || TO_CHAR(pag.sequencia) || ' ' || TRIM (pag.condPag_descricao) || ' R$ ' || RTRIM (TO_CHAR (pag.valorPagamentoLiquido, 'FM999G999G999G999G999G990D00'))
      );
    END IF;
  END LOOP;
END ADD_ORCAMENTO_INFO_PAG_PRE_DOC;

/

create or replace PROCEDURE ADD_ORCAMENTO_INFO_PAG_DOC_FIS (
  p_perfilUsuarioLogado          IN NUMBER,
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_deOrcamento                  IN NUMBER,
  p_paraIdDocumentoFiscal        IN NUMBER,
  p_somenteNaEntrega             IN NUMBER)
IS
  CURSOR c_pag IS
    SELECT 
      pag.*,
      condPag.descricao condPag_descricao,
      ( SELECT COALESCE (SUM (financ.valor - financ.saldo), 0)
        FROM MOFINANCEIROS financ
        JOIN MOPREVFINANCXFINANCEIRO baixa ON baixa.idFinanceiro = financ.idFinanceiro
        JOIN MOPREVISOESFINANCEIRAS prev ON prev.idPrevisaoFinanceira = baixa.idPrevisaoFinanceira
        WHERE prev.idPagamentoOrcamento = pag.idPagamentoOrcamento
      ) valorBaixas
    FROM MOORCAMENTOXPAGAMENTOS pag
    JOIN PACONDICOESPAGAMENTO condPag on condPag.condicaoPagamento = pag.condicaoPagamento
    WHERE pag.orcamento = p_deOrcamento
    AND (p_somenteNaEntrega = 0 
      OR FUNC_ADD_BUSCA_CONFIG (110, p_perfilUsuarioLogado, p_usuarioLogado, p_estabelecimentoAtivo) = 'S'
      OR pag.meioPagamento = 58)
    AND pag.valorPagamentoLiquido > 0
    ORDER BY pag.pagamentoTroco,
      pag.sequencia;
BEGIN
  FOR pag IN c_pag LOOP
    IF pag.valorPagamentoLiquido - pag.valorBaixas > 0 THEN
      ADD_DOC_FISC_INFO_GRAVA_DESCR (
        p_estabelecimentoAtivo,
        p_paraIdDocumentoFiscal,
        1,
        1,
        (CASE WHEN p_somenteNaEntrega = 1 AND pag.meioPagamento = 58 THEN 1 ELSE 0 END),
        0,          
        pag.pagamentoTroco || TO_CHAR(pag.sequencia) || ' ' || TRIM (pag.condPag_descricao) || ' R$ ' || RTRIM (TO_CHAR (pag.valorPagamentoLiquido, 'FM999G999G999G999G999G990D00'))
      );
    END IF;
  END LOOP;
END ADD_ORCAMENTO_INFO_PAG_DOC_FIS;

/

create or replace PROCEDURE ADD_PREVFIN_GRAVA (
    p_estabelecimentoAtivo          IN NUMBER,
    p_idPrevisaoFinanceira          IN NUMBER,
    p_estabelecimento               IN NUMBER,
    p_dataEmissao                   IN DATE,
    p_prazoPadrao                   IN NUMBER,
    p_prazo                         IN NUMBER,
    p_vencimento                    IN DATE,
    p_contaFinanceira               IN VARCHAR2,
    p_pagamentoRecebimento          IN CHAR,
    p_operacaoFinanceira            IN NUMBER,
    p_complemento                   IN VARCHAR2,
    p_idPagamentoOrcamento          IN NUMBER,
    p_documento                     IN VARCHAR2,
    p_fatura                        IN VARCHAR2,
    p_parcelaAtual                  IN NUMBER,
    p_parcelasTotais                IN NUMBER,
    p_pessoa                        IN NUMBER,
    p_autorizadoPessoa              IN NUMBER,
    p_cobranca                      IN NUMBER,
    p_meioPagamento                 IN NUMBER,
    p_carteiraFinanceira            IN NUMBER,
    p_valor                         IN NUMBER,
    p_saldo                         IN NUMBER,
    p_indexador                     IN VARCHAR2,
    p_cotacao                       IN NUMBER,
    p_valorIndexado                 IN NUMBER,
    p_saldoIndexado                 IN NUMBER,
    p_efetivado                     IN NUMBER,
    p_tarifaDescontoAteVencimento   IN NUMBER,
    p_tipoPagamentoAntecipado       IN CHAR,
    p_tarifaMensalDescAntecipado    IN NUMBER,
    p_tipoJuroDeMora                IN CHAR,
    p_tarifaMensalJuroDeMora        IN NUMBER,
    p_tarifaMulta                   IN NUMBER,
    p_valorFixoMulta                IN NUMBER,
    p_tarifaCartao                  IN NUMBER,
    p_valorTarifaCartao             IN NUMBER,
    /* Retornos */
    r_idPrevisaoFinanceira          OUT NUMBER)
IS
BEGIN
  r_idPrevisaoFinanceira := p_idPrevisaoFinanceira;
  IF (r_idPrevisaoFinanceira = 0) THEN
    r_idPrevisaoFinanceira := FUNC_BUSCA_PROXIMO_ID ('MOPREVISOESFINANCEIRAS', p_estabelecimentoAtivo, NULL);
  END IF;
  MERGE INTO MOPREVISOESFINANCEIRAS a
  USING (
    SELECT
      r_idPrevisaoFinanceira          idPrevisaoFinanceira,
      p_estabelecimento               estabelecimento,
      p_dataEmissao                   dataEmissao,
      p_prazoPadrao                   prazoPadrao,
      p_prazo                         prazo,
      p_vencimento                    vencimento,
      p_contaFinanceira               contaFinanceira,
      p_pagamentoRecebimento          pagamentoRecebimento,
      p_operacaoFinanceira            operacaoFinanceira,
      p_complemento                   complemento,
      p_idPagamentoOrcamento          idPagamentoOrcamento,
      p_documento                     documento,
      p_fatura                        fatura,
      p_parcelaAtual                  parcelaAtual,
      p_parcelasTotais                parcelasTotais,
      p_pessoa                        pessoa,
      p_autorizadoPessoa              autorizadoPessoa,
      p_cobranca                      cobranca,
      p_meioPagamento                 meioPagamento,
      p_carteiraFinanceira            carteiraFinanceira,
      p_valor                         valor,
      p_saldo                         saldo,
      p_indexador                     indexador,
      p_cotacao                       cotacao,
      p_valorIndexado                 valorIndexado,
      p_saldoIndexado                 saldoIndexado,
      p_efetivado                     efetivado,
      p_tarifaDescontoAteVencimento   tarifaDescontoAteVencimento,
      p_tipoPagamentoAntecipado       tipoPagamentoAntecipado,
      p_tarifaMensalDescAntecipado    tarifaMensalDescontoAntecipado,
      p_tipoJuroDeMora                tipoJuroDeMora,
      p_tarifaMensalJuroDeMora        tarifaMensalJuroDeMora,
      p_tarifaMulta                   tarifaMulta,
      p_valorFixoMulta                valorFixoMulta,
      p_tarifaCartao                  tarifaCartao,
      p_valorTarifaCartao             valorTarifaCartao
    FROM DUAL
  ) b ON (a.idPrevisaoFinanceira = b.idPrevisaoFinanceira)
  WHEN MATCHED THEN UPDATE SET 
    a.estabelecimento                = b.estabelecimento,
    a.dataEmissao                    = b.dataEmissao,
    a.prazoPadrao                    = b.prazoPadrao,
    a.prazo                          = b.prazo,
    a.vencimento                     = b.vencimento,
    a.contaFinanceira                = b.contaFinanceira,
    a.pagamentoRecebimento           = b.pagamentoRecebimento,
    a.operacaoFinanceira             = b.operacaoFinanceira,
    a.complemento                    = b.complemento,
    a.idPagamentoOrcamento           = b.idPagamentoOrcamento,
    a.documento                      = b.documento,
    a.fatura                         = b.fatura,
    a.parcelaAtual                   = b.parcelaAtual,
    a.parcelasTotais                 = b.parcelasTotais,
    a.pessoa                         = b.pessoa,
    a.autorizadoPessoa               = b.autorizadoPessoa,
    a.cobranca                       = b.cobranca,
    a.meioPagamento                  = b.meioPagamento,
    a.carteiraFinanceira             = b.carteiraFinanceira,
    a.valor                          = b.valor,
    a.saldo                          = b.saldo,
    a.indexador                      = b.indexador,
    a.cotacao                        = b.cotacao,
    a.valorIndexado                  = b.valorIndexado,
    a.saldoIndexado                  = b.saldoIndexado,
    a.efetivado                      = b.efetivado,
    a.tarifaDescontoAteVencimento    = b.tarifaDescontoAteVencimento,
    a.tipoPagamentoAntecipado        = b.tipoPagamentoAntecipado,
    a.tarifaMensalDescontoAntecipado = b.tarifaMensalDescontoAntecipado,
    a.tipoJuroDeMora                 = b.tipoJuroDeMora,
    a.tarifaMensalJuroDeMora         = b.tarifaMensalJuroDeMora,
    a.tarifaMulta                    = b.tarifaMulta,
    a.valorFixoMulta                 = b.valorFixoMulta,
    a.tarifaCartao                   = b.tarifaCartao,
    a.valorTarifaCartao              = b.valorTarifaCartao
  WHEN NOT MATCHED THEN INSERT (
    idPrevisaoFinanceira,
    estabelecimento,
    dataEmissao,
    prazoPadrao,
    prazo,
    vencimento,
    contaFinanceira,
    pagamentoRecebimento,
    operacaoFinanceira,
    complemento,
    idPagamentoOrcamento,
    documento,
    fatura,
    parcelaAtual,
    parcelasTotais,
    pessoa,
    autorizadoPessoa,
    cobranca,
    meioPagamento,
    carteiraFinanceira,
    valor,
    saldo,
    indexador,
    cotacao,
    valorIndexado,
    saldoIndexado,
    efetivado,
    tarifaDescontoAteVencimento,
    tipoPagamentoAntecipado,
    tarifaMensalDescontoAntecipado,
    tipoJuroDeMora,
    tarifaMensalJuroDeMora,
    tarifaMulta,
    valorFixoMulta,
    tarifaCartao,
    valorTarifaCartao
  ) VALUES (
    b.idPrevisaoFinanceira,
    b.estabelecimento,
    b.dataEmissao,
    b.prazoPadrao,
    b.prazo,
    b.vencimento,
    b.contaFinanceira,
    b.pagamentoRecebimento,
    b.operacaoFinanceira,
    b.complemento,
    b.idPagamentoOrcamento,
    b.documento,
    b.fatura,
    b.parcelaAtual,
    b.parcelasTotais,
    b.pessoa,
    b.autorizadoPessoa,
    b.cobranca,
    b.meioPagamento,
    b.carteiraFinanceira,
    b.valor,
    b.saldo,
    b.indexador,
    b.cotacao,
    b.valorIndexado,
    b.saldoIndexado,
    b.efetivado,
    b.tarifaDescontoAteVencimento,
    b.tipoPagamentoAntecipado,
    b.tarifaMensalDescontoAntecipado,
    b.tipoJuroDeMora,
    b.tarifaMensalJuroDeMora,
    b.tarifaMulta,
    b.valorFixoMulta,
    b.tarifaCartao,
    b.valorTarifaCartao); 
END ADD_PREVFIN_GRAVA;

/

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

/

create or replace PROCEDURE ADD_PRE_DOC_INFO_PAG_PRE_DOC (
  p_perfilUsuarioLogado          IN NUMBER,
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_dePreDocumento               IN NUMBER,
  p_paraPreDocumento             IN NUMBER,
  p_somenteNaEntrega             IN NUMBER)
IS
  CURSOR c_pag IS
    SELECT
      pag.*,
      condPag.descricao condPag_descricao
    FROM MOPREDOCUMXPAGAMENTOS pag
    JOIN PACONDICOESPAGAMENTO condPag on condPag.condicaoPagamento = pag.condicaoPagamento
    WHERE pag.preDocumento = p_dePreDocumento
    AND (p_somenteNaEntrega = 0 
      OR FUNC_ADD_BUSCA_CONFIG (110, p_perfilUsuarioLogado, p_usuarioLogado, p_estabelecimentoAtivo) = 'S'
      OR pag.meioPagamento = 58)
    AND pag.valorPagamentoLiquido > 0
    ORDER BY pag.pagamentoTroco,
      pag.sequencia;
BEGIN
  FOR pag IN c_pag LOOP
    ADD_PRE_DOC_INFO_GRAVA_DESCR (
      p_estabelecimentoAtivo,
      p_paraPreDocumento,
      1,
      1,
      (CASE WHEN p_somenteNaEntrega = 1 AND pag.meioPagamento = 58 THEN 1 ELSE 0 END),
      0,          
      pag.pagamentoTroco || TO_CHAR(pag.sequencia) || ' ' || TRIM (pag.condPag_descricao) || ' R$ ' || RTRIM (TO_CHAR (pag.valorPagamentoLiquido, 'FM999G999G999G999G999G990D00'))
    );
  END LOOP;
END ADD_PRE_DOC_INFO_PAG_PRE_DOC;

/

create or replace PROCEDURE ADD_PRE_DOC_INFO_PAG_DOC_FISC (
  p_perfilUsuarioLogado          IN NUMBER,
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_dePreDocumento               IN NUMBER,
  p_paraIdDocumentoFiscal        IN NUMBER,
  p_somenteNaEntrega             IN NUMBER)
IS
  CURSOR c_pag IS
    SELECT
      pag.*,
      condPag.descricao condPag_descricao
    FROM MOPREDOCUMXPAGAMENTOS pag
    JOIN PACONDICOESPAGAMENTO condPag on condPag.condicaoPagamento = pag.condicaoPagamento
    WHERE pag.preDocumento = p_dePreDocumento
    AND (p_somenteNaEntrega = 0 
      OR FUNC_ADD_BUSCA_CONFIG (110, p_perfilUsuarioLogado, p_usuarioLogado, p_estabelecimentoAtivo) = 'S'
      OR pag.meioPagamento = 58)
    AND pag.valorPagamentoLiquido > 0
    ORDER BY pag.pagamentoTroco,
      pag.sequencia;
BEGIN
  FOR pag IN c_pag LOOP
    ADD_DOC_FISC_INFO_GRAVA_DESCR (
      p_estabelecimentoAtivo,
      p_paraIdDocumentoFiscal,
      1,
      1,
      (CASE WHEN p_somenteNaEntrega = 1 AND pag.meioPagamento = 58 THEN 1 ELSE 0 END),
      0,          
      pag.pagamentoTroco || TO_CHAR(pag.sequencia) || ' ' || TRIM (pag.condPag_descricao) || ' R$ ' || RTRIM (TO_CHAR (pag.valorPagamentoLiquido, 'FM999G999G999G999G999G990D00'))
    );
  END LOOP;
END ADD_PRE_DOC_INFO_PAG_DOC_FISC;

/

create or replace PROCEDURE ADD_DOC_FISC_INFO_PAG_PRE_DOC (
  p_perfilUsuarioLogado          IN NUMBER,
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_deIdDocumentoFiscal          IN NUMBER,
  p_paraPreDocumento             IN NUMBER,
  p_somenteNaEntrega             IN NUMBER)
IS
  CURSOR c_pag IS
    SELECT
      pag.*,
      condPag.descricao condPag_descricao
    FROM MODOCFISCALXPAGAMENTOS pag
    JOIN PACONDICOESPAGAMENTO condPag on condPag.condicaoPagamento = pag.condicaoPagamento
    WHERE pag.idDocumentoFiscal = p_deIdDocumentoFiscal
    AND (p_somenteNaEntrega = 0 
      OR FUNC_ADD_BUSCA_CONFIG (110, p_perfilUsuarioLogado, p_usuarioLogado, p_estabelecimentoAtivo) = 'S'
      OR pag.meioPagamento = 58)
    AND pag.valorPagamentoLiquido > 0
    ORDER BY pag.pagamentoTroco,
      pag.sequencia;
BEGIN
  FOR pag IN c_pag LOOP
    ADD_PRE_DOC_INFO_GRAVA_DESCR (
      p_estabelecimentoAtivo,
      p_paraPreDocumento,
      1,
      1,
      (CASE WHEN p_somenteNaEntrega = 1 AND pag.meioPagamento = 58 THEN 1 ELSE 0 END),
      0,          
      pag.pagamentoTroco || TO_CHAR(pag.sequencia) || ' ' || TRIM (pag.condPag_descricao) || ' R$ ' || RTRIM (TO_CHAR (pag.valorPagamentoLiquido, 'FM999G999G999G999G999G990D00'))
    );
  END LOOP;
END ADD_DOC_FISC_INFO_PAG_PRE_DOC;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_ULT_COMPR(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_estabelecimento              IN NUMBER,
    p_dataInicial                  IN DATE,
    p_dataFinal                    IN DATE,
    p_item_personalizacao          IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_retornarPrecoBruto           IN NUMBER)
  RETURN NUMBER
IS 
  v_dataInventario  DATE;
  v_precoInventario NUMBER;
  v_preco           NUMBER;
BEGIN
  SELECT
    TO_DATE(SUBSTR(a.ordenacao,1,8),'YYYYMMDD'),
    COALESCE ((TO_NUMBER(SUBSTR(a.ordenacao,9,15)) / 10000000),0)
  INTO
    v_dataInventario,
    v_precoInventario
  FROM (
    SELECT MAX((COALESCE(TO_CHAR(invEst.data,'YYYYMMDD'),'19000101')
      || LPAD((itemEst.precoUnitarioUltimaCompra * 10000000),15,'0'))) ordenacao
    FROM MOINVENTARIOESTOQUEXITENS itemEst
    JOIN MOINVENTARIOSESTOQUE invEst ON invEst.inventarioEstoque = itemEst.inventarioEstoque
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = itemEst.gradeProduto
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
    WHERE itemEst.precoUnitarioUltimaCompra <> 0
    AND gradProd.produto = p_gradProd_produto
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_cor = 0
      OR gradProd.cor = p_gradProd_cor)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_tamanho = ''
      OR p_gradProd_tamanho = ' '
      OR gradProd.tamanho = p_gradProd_tamanho)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_item_personalizacao = 0
      OR itemEst.personalizacao = p_item_personalizacao)
    AND invEst.data >= CASE
        WHEN NOT(p_dataInicial IS NULL)
        THEN TRUNC(p_dataInicial)
        ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
      END
    AND invEst.data < TRUNC(p_dataFinal) + CASE WHEN invEst.motivoInventarioEstoque = '01' THEN 1 ELSE 0 END) a;
  SELECT COALESCE ((
    SELECT TO_NUMBER(SUBSTR(MAX (a.dataPreco),9,15)) / 10000000
    FROM (
      SELECT COALESCE(TO_CHAR(doc.dataEntradaSaida,'YYYYMMDD'),'00000000')
        || LPAD(((CASE WHEN COUNT (1) = 1 OR SUM(item.quantidade) = 0 THEN MAX(item.precoUnitario) ELSE ROUND((SUM(item.valorProdutoServico) / SUM(item.quantidade)),7) END
        - CASE WHEN p_retornarPrecoBruto = 1 OR SUM(item.quantidade) = 0 THEN 0 ELSE ROUND(SUM(item.valorDescontoTotal) / SUM(item.quantidade),7) END
        ) * 10000000),15,'0') dataPreco,
        CASE WHEN COUNT (1) = 1 OR SUM(item.quantidade) = 0 THEN MAX(item.precoUnitario) ELSE ROUND((SUM(item.valorProdutoServico) / SUM(item.quantidade)),7) END
        - CASE WHEN p_retornarPrecoBruto = 1 OR SUM(item.quantidade) = 0 THEN 0 ELSE ROUND(SUM(item.valorDescontoTotal) / SUM(item.quantidade),7) END preco
      FROM MODOCFISCALXITENS item
      JOIN CAGRADESPRODUTO grad ON grad.gradeProduto = item.gradeProduto
      JOIN MODOCUMENTOSFISCAIS doc ON doc.idDocumentoFiscal = item.idDocumentoFiscal
      WHERE item.cancelado = 0
      AND grad.produto = p_gradProd_produto
      AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_cor = 0 OR grad.cor = p_gradProd_cor)
      AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_tamanho = '' OR p_gradProd_tamanho = ' ' OR grad.tamanho = p_gradProd_tamanho)
      AND (p_config_362_calcCustoPorGrade = 0 OR p_item_personalizacao = 0 OR item.personalizacao = p_item_personalizacao)
      AND doc.entradaSaida = 'E'
      AND doc.devolucaoAnulacaoRetorno = 0
      AND doc.situacaoDocumentoFiscal IN (21,22,23)
      AND doc.atualizaUltimaCompra = 1
      AND doc.dataEntradaSaida >= CASE
          WHEN NOT(v_dataInventario IS NULL)
          THEN v_dataInventario + 1
          WHEN NOT(p_dataInicial IS NULL)
          THEN TRUNC(p_dataInicial)
          ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
        END
      AND doc.dataEntradaSaida < TRUNC(p_dataFinal)+1
      AND (p_estabelecimento = 0
        OR p_estabelecimento <> 0
        AND p_config_209_filtrarGrupoEcon = 0
        AND EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
          WHERE est.estabelecimento = doc.estabelecimento
          AND (est.estabelecimento = p_estabelecimento
            OR est2.estabelecimento = p_estabelecimento))
        OR p_estabelecimento <> 0
        AND p_config_209_filtrarGrupoEcon = 1
        AND EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN CAPESSOAS pessEst ON pessEst.pessoa = est.pessoaEstabelecimento
          JOIN CAPESSOAS pessEst2 ON pessEst2.grupoEconomico = pessEst.grupoEconomico
          JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = pessEst2.pessoa
          WHERE est.estabelecimento = doc.estabelecimento
          AND (est.estabelecimento = p_estabelecimento
            OR est2.estabelecimento = p_estabelecimento)))
      GROUP BY COALESCE(TO_CHAR(doc.dataEntradaSaida,'YYYYMMDD'),'00000000'), item.idDocumentoFiscal
      UNION ALL
      SELECT COALESCE(TO_CHAR(doc.dataEntradaSaida,'YYYYMMDD'),'00000000')
        || LPAD(((CASE WHEN COUNT (1) = 1 OR SUM(item.quantidade) = 0 THEN MAX(item.precoUnitario) ELSE ROUND((SUM(item.valorProdutoServico) / SUM(item.quantidade)),7) END
        - CASE WHEN p_retornarPrecoBruto = 1 OR SUM(item.quantidade) = 0 THEN 0 ELSE ROUND(SUM(item.valorDescontoTotal) / SUM(item.quantidade),7) END
        ) * 10000000),15,'0') dataPreco,
        CASE WHEN COUNT (1) = 1 OR SUM(item.quantidade) = 0 THEN MAX(item.precoUnitario) ELSE ROUND((SUM(item.valorProdutoServico) / SUM(item.quantidade)),7) END
        - CASE WHEN p_retornarPrecoBruto = 1 OR SUM(item.quantidade) = 0 THEN 0 ELSE ROUND(SUM(item.valorDescontoTotal) / SUM(item.quantidade),7) END preco
      FROM MOPREDOCUMXITENS item
      JOIN CAGRADESPRODUTO grad ON grad.gradeProduto = item.gradeProduto
      JOIN MOPREDOCUMENTOS doc ON doc.preDocumento = item.preDocumento
      WHERE item.cancelado = 0
      AND grad.produto = p_gradProd_produto
      AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_cor = 0 OR grad.cor = p_gradProd_cor)
      AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_tamanho = '' OR p_gradProd_tamanho = ' ' OR grad.tamanho = p_gradProd_tamanho)
      AND (p_config_362_calcCustoPorGrade = 0 OR p_item_personalizacao = 0 OR item.personalizacao = p_item_personalizacao)
      AND doc.entradaSaida = 'E'
      AND doc.devolucaoAnulacaoRetorno = 0
      AND doc.statusPreDocumento = 'A'
      AND doc.atualizaUltimaCompra = 1
      AND doc.dataEntradaSaida >= CASE
          WHEN NOT(v_dataInventario IS NULL)
          THEN v_dataInventario + 1
          WHEN NOT(p_dataInicial IS NULL)
          THEN TRUNC(p_dataInicial)
          ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
        END
      AND doc.dataEntradaSaida < TRUNC(p_dataFinal) + 1
      AND (p_estabelecimento = 0
        OR p_estabelecimento <> 0
        AND p_config_209_filtrarGrupoEcon = 0
        AND EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
          WHERE est.estabelecimento = doc.estabelecimento
          AND (est.estabelecimento = p_estabelecimento
            OR est2.estabelecimento = p_estabelecimento))
        OR p_estabelecimento <> 0
        AND p_config_209_filtrarGrupoEcon = 1
        AND EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN CAPESSOAS pessEst ON pessEst.pessoa = est.pessoaEstabelecimento
          JOIN CAPESSOAS pessEst2 ON pessEst2.grupoEconomico = pessEst.grupoEconomico
          JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = pessEst2.pessoa
          WHERE est.estabelecimento = doc.estabelecimento
          AND (est.estabelecimento = p_estabelecimento
            OR est2.estabelecimento = p_estabelecimento)))
      GROUP BY COALESCE(TO_CHAR(doc.dataEntradaSaida,'YYYYMMDD'),'00000000'), item.preDocumento
    ) a
    WHERE a.preco > 0
  ),0)
  INTO v_preco
  FROM DUAL;
  IF v_preco = 0 THEN
    v_preco := v_precoInventario;
  END IF;
  IF v_preco = 0 AND (p_dataInicial IS NULL OR p_dataInicial = TO_DATE ('01/01/1900','DD/MM/YYYY')) THEN
    SELECT COALESCE(MAX(preco.precoUltimaCompraInicial),0)
    INTO v_preco      
    FROM CAPRODUTOXESTABELECIMENTO preco
    WHERE preco.produto = p_gradProd_produto
    AND preco.estabelecimento = p_estabelecimento
    AND preco.ativo = 1;
    IF p_estabelecimento <> 0 AND v_preco = 0 THEN
      SELECT COALESCE(MAX(preco.precoUltimaCompraInicial),0)
      INTO v_preco      
      FROM CAPRODUTOXESTABELECIMENTO preco
      WHERE preco.produto = p_gradProd_produto
      AND preco.ativo = 1
      AND (p_estabelecimento = 0
        OR p_estabelecimento <> 0
        AND p_config_209_filtrarGrupoEcon = 0
        AND EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
          WHERE est.estabelecimento = preco.estabelecimento
          AND (est.estabelecimento = p_estabelecimento
            OR est2.estabelecimento = p_estabelecimento))
        OR p_estabelecimento <> 0
        AND p_config_209_filtrarGrupoEcon = 1
        AND EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN CAPESSOAS pessEst ON pessEst.pessoa = est.pessoaEstabelecimento
          JOIN CAPESSOAS pessEst2 ON pessEst2.grupoEconomico = pessEst.grupoEconomico
          JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = pessEst2.pessoa
          WHERE est.estabelecimento = preco.estabelecimento
          AND (est.estabelecimento = p_estabelecimento
            OR est2.estabelecimento = p_estabelecimento)));
    END IF;
    IF p_estabelecimento <> 0 AND v_preco = 0 THEN
      SELECT COALESCE(MAX(preco.precoUltimaCompraInicial),0)
      INTO v_preco      
      FROM CAPRODUTOXESTABELECIMENTO preco
      WHERE preco.produto = p_gradProd_produto
      AND preco.estabelecimento = 0
      AND preco.ativo = 1;
    END IF;
  END IF;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_ULT_CUSTO(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_estabelecimento              IN NUMBER,
    p_dataInicial                  IN DATE,
    p_dataFinal                    IN DATE,
    p_item_personalizacao          IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_indicadorPropriedadePosseIt  IN CHAR,
    p_pessoaParticipante           IN NUMBER)
  RETURN NUMBER
IS 
  v_dataInventario  DATE;
  v_precoInventario NUMBER;
  v_preco           NUMBER;
BEGIN
  SELECT
    TO_DATE(SUBSTR(a.ordenacao,1,8),'YYYYMMDD'),
    COALESCE ((TO_NUMBER(SUBSTR(a.ordenacao,9,15)) / 10000000),0)
  INTO
    v_dataInventario,
    v_precoInventario
  FROM (
    SELECT MAX((COALESCE(TO_CHAR(invEst.data,'YYYYMMDD'),'19000101')
      || LPAD((itemEst.precoCustoUltimaCompra * 10000000),15,'0'))) ordenacao
    FROM MOINVENTARIOESTOQUEXITENS itemEst
    JOIN MOINVENTARIOSESTOQUE invEst ON invEst.inventarioEstoque = itemEst.inventarioEstoque
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = itemEst.gradeProduto
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
    WHERE itemEst.precoCustoUltimaCompra <> 0
    AND gradProd.produto = p_gradProd_produto
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_cor = 0
      OR gradProd.cor = p_gradProd_cor)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_tamanho = ''
      OR p_gradProd_tamanho = ' '
      OR gradProd.tamanho = p_gradProd_tamanho)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_item_personalizacao = 0
      OR itemEst.personalizacao = p_item_personalizacao)
    AND invEst.data >= CASE
        WHEN NOT(p_dataInicial IS NULL)
        THEN TRUNC(p_dataInicial)
        ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
      END
    AND invEst.data < TRUNC(p_dataFinal) + CASE WHEN invEst.motivoInventarioEstoque = '01' THEN 1 ELSE 0 END) a;
  SELECT COALESCE ((
    SELECT TO_NUMBER(SUBSTR(MAX((COALESCE(TO_CHAR(itemEst.data,'YYYYMMDD'),'00000000')
      || LPAD((CASE WHEN COUNT (1) = 1 OR SUM(itemEst.quantidade) = 0 THEN MAX(itemEst.precoCustoOperacao) ELSE ROUND((SUM (itemEst.totalCustoOperacao)/SUM(itemEst.quantidade)),7) END * 10000000),15,'0'))),9,15)) / 10000000
    FROM MOESTOQUES itemEst
    LEFT JOIN MOPREDOCUMXESTOQUE preXEst ON preXEst.idEstoque = itemEst.idEstoque
    LEFT JOIN MOPREDOCUMXITENS itemPre ON itemPre.idItemPreDocumento = preXEst.idItemPreDocumento
    LEFT JOIN MODOCFISCALXESTOQUE docXEst ON docXEst.idEstoque = itemEst.idEstoque
    LEFT JOIN MODOCFISCALXITENS itemDoc ON itemDoc.idItemDocFiscal = docXEst.idItemDocFiscal
    JOIN CAGRADESPRODUTO grad ON grad.gradeProduto = itemEst.gradeProduto AND grad.produto = p_gradProd_produto
    WHERE itemEst.entradaSaida = 'E'
    AND itemEst.atualizaUltimaCompra = 1
    AND itemEst.precoCustoOperacao > 0
    AND itemEst.indicadorPropriedadePosseItem = '' || CASE WHEN p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = '' OR p_indicadorPropriedadePosseIt = ' ' THEN '0' ELSE p_indicadorPropriedadePosseIt END || ''
    AND itemEst.pessoaParticipante = p_pessoaParticipante
    AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_cor = 0 OR grad.cor = p_gradProd_cor)
    AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_tamanho = '' OR p_gradProd_tamanho = ' ' OR grad.tamanho = p_gradProd_tamanho)
    AND (p_config_362_calcCustoPorGrade = 0 OR p_item_personalizacao = 0 OR itemEst.personalizacao = p_item_personalizacao)
    AND itemEst.data >= CASE
        WHEN NOT(v_dataInventario IS NULL)
        THEN v_dataInventario + 1
        WHEN NOT(p_dataInicial IS NULL)
        THEN TRUNC(p_dataInicial)
        ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
      END
    AND itemEst.data < TRUNC(p_dataFinal) + 1
    AND (p_estabelecimento = 0
      OR p_estabelecimento <> 0
      AND p_config_209_filtrarGrupoEcon = 0
      AND EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
        WHERE est.estabelecimento = itemEst.estabelecimento
        AND (est.estabelecimento = p_estabelecimento
          OR est2.estabelecimento = p_estabelecimento))
      OR p_estabelecimento <> 0
      AND p_config_209_filtrarGrupoEcon = 1
      AND EXISTS (
        SELECT 1
        FROM PAESTABELECIMENTOS est
        JOIN CAPESSOAS pessEst ON pessEst.pessoa = est.pessoaEstabelecimento
        JOIN CAPESSOAS pessEst2 ON pessEst2.grupoEconomico = pessEst.grupoEconomico
        JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = pessEst2.pessoa
        WHERE est.estabelecimento = itemEst.estabelecimento
        AND (est.estabelecimento = p_estabelecimento
          OR est2.estabelecimento = p_estabelecimento)))    
    GROUP BY COALESCE(TO_CHAR(itemEst.data,'YYYYMMDD'),'00000000'),
      CASE
        WHEN NOT (docXEst.id IS NULL)
        THEN 'D' || LPAD(itemDoc.idDocumentoFiscal,14,'0')
        WHEN NOT (preXEst.id IS NULL)
        THEN 'P' || LPAD(itemPre.preDocumento,14,'0')
        ELSE 'M' || LPAD(itemEst.idEstoque,14,'0')
      END
    ),0) preco
  INTO v_preco
  FROM DUAL;
  IF v_preco = 0 THEN
    v_preco := v_precoInventario;
  END IF;
  IF v_preco = 0 AND (p_dataInicial IS NULL OR p_dataInicial = TO_DATE ('01/01/1900','DD/MM/YYYY')) THEN
    SELECT COALESCE(MAX(preco.precoCustoInicial),0)
    INTO v_preco      
    FROM CAPRODUTOXESTABELECIMENTO preco
    WHERE preco.produto = p_gradProd_produto
    AND preco.estabelecimento = p_estabelecimento
    AND preco.ativo = 1;
    IF p_estabelecimento <> 0 AND v_preco = 0 THEN
      SELECT COALESCE(MAX(preco.precoCustoInicial),0)
      INTO v_preco      
      FROM CAPRODUTOXESTABELECIMENTO preco
      WHERE preco.produto = p_gradProd_produto
      AND preco.ativo = 1
      AND (p_estabelecimento = 0
        OR p_estabelecimento <> 0
        AND p_config_209_filtrarGrupoEcon = 0
        AND EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
          WHERE est.estabelecimento = preco.estabelecimento
          AND (est.estabelecimento = p_estabelecimento
            OR est2.estabelecimento = p_estabelecimento))
        OR p_estabelecimento <> 0
        AND p_config_209_filtrarGrupoEcon = 1
        AND EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN CAPESSOAS pessEst ON pessEst.pessoa = est.pessoaEstabelecimento
          JOIN CAPESSOAS pessEst2 ON pessEst2.grupoEconomico = pessEst.grupoEconomico
          JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = pessEst2.pessoa
          WHERE est.estabelecimento = preco.estabelecimento
          AND (est.estabelecimento = p_estabelecimento
            OR est2.estabelecimento = p_estabelecimento)));
    END IF;
    IF p_estabelecimento <> 0 AND v_preco = 0 THEN
      SELECT COALESCE(MAX(preco.precoCustoInicial),0)
      INTO v_preco      
      FROM CAPRODUTOXESTABELECIMENTO preco
      WHERE preco.produto = p_gradProd_produto
      AND preco.estabelecimento = 0
      AND preco.ativo = 1;
    END IF;
  END IF;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_FORMACAO(
    p_config_209_filtrarGrupoEcon IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_estabelecimento             IN NUMBER,
    p_dataInicial                 IN DATE,
    p_dataFinal                   IN DATE,
    p_item_personalizacao         IN NUMBER,
    p_gradProd_produto            IN NUMBER,
    p_gradProd_cor                IN NUMBER,
    p_gradProd_tamanho            IN VARCHAR)
  RETURN NUMBER
IS
  v_dataInventario  DATE;
  v_precoInventario NUMBER;
  v_preco           NUMBER;
BEGIN
  SELECT
    TO_DATE(SUBSTR(a.ordenacao,1,8),'YYYYMMDD'),
    COALESCE ((TO_NUMBER(SUBSTR(a.ordenacao,9,15)) / 10000000),0)
  INTO
    v_dataInventario,
    v_precoInventario
  FROM (
    SELECT MAX((COALESCE(TO_CHAR(invEst.data,'YYYYMMDD'),'19000101')
      || LPAD((itemEst.precoCustoUltimaFormacao * 10000000),15,'0'))) ordenacao
    FROM MOINVENTARIOESTOQUEXITENS itemEst
    JOIN MOINVENTARIOSESTOQUE invEst ON invEst.inventarioEstoque = itemEst.inventarioEstoque
    JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = itemEst.gradeProduto
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
    WHERE itemEst.precoCustoUltimaFormacao <> 0
    AND gradProd.produto = p_gradProd_produto
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_cor = 0
      OR gradProd.cor = p_gradProd_cor)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_tamanho = ''
      OR p_gradProd_tamanho = ' '
      OR gradProd.tamanho = p_gradProd_tamanho)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_item_personalizacao = 0
      OR itemEst.personalizacao = p_item_personalizacao)
    AND invEst.data >= CASE
        WHEN NOT(p_dataInicial IS NULL)
        THEN TRUNC(p_dataInicial)
        ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
      END
    AND invEst.data < TRUNC(p_dataFinal) + CASE WHEN invEst.motivoInventarioEstoque = '01' THEN 1 ELSE 0 END) a;
  SELECT COALESCE ((TO_NUMBER(SUBSTR(a.ordenacao,9,15)) / 10000000),0)
  INTO v_preco
  FROM (
    SELECT MAX((COALESCE(TO_CHAR(data,'YYYYMMDD'),'19000101')
      || LPAD((novoPrecoCusto * 10000000),15,'0'))) ordenacao
    FROM CAPRODUTOXCUSTOS
    WHERE produto = p_gradProd_produto
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_cor = 0
      OR cor = p_gradProd_cor)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_gradProd_tamanho = ''
      OR p_gradProd_tamanho = ' '
      OR tamanho = p_gradProd_tamanho)
    AND (p_config_362_calcCustoPorGrade = 0
      OR p_item_personalizacao = 0
      OR personalizacao = p_item_personalizacao)
    AND data >= CASE
          WHEN NOT(v_dataInventario IS NULL)
          THEN v_dataInventario + 1
          WHEN NOT(p_dataInicial IS NULL)
          THEN TRUNC(p_dataInicial)
          ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
        END
    AND data < TRUNC(p_dataFinal) + 1
    AND ativo = 1) a;
  IF v_preco = 0 THEN
    v_preco := v_precoInventario;
  END IF;
  IF v_preco = 0 AND (p_dataInicial IS NULL OR p_dataInicial = TO_DATE ('01/01/1900','DD/MM/YYYY')) THEN
    SELECT COALESCE(MAX(preco.precoCustoInicial),0)
    INTO v_preco      
    FROM CAPRODUTOXESTABELECIMENTO preco
    WHERE preco.produto = p_gradProd_produto
    AND preco.estabelecimento = p_estabelecimento
    AND preco.ativo = 1;
    IF p_estabelecimento <> 0 AND v_preco = 0 THEN
      SELECT COALESCE(MAX(preco.precoCustoInicial),0)
      INTO v_preco      
      FROM CAPRODUTOXESTABELECIMENTO preco
      JOIN PAESTABELECIMENTOS est ON est.estabelecimento = preco.estabelecimento
      JOIN CAPESSOAS pessEst ON pessEst.pessoa = est.pessoaEstabelecimento
      JOIN PAESTABELECIMENTOS est2 ON est2.estabelecimento = p_estabelecimento
      JOIN CAPESSOAS pessEst2 ON pessEst2.pessoa = est2.pessoaEstabelecimento
      WHERE preco.produto = p_gradProd_produto
      AND preco.ativo = 1
      AND (p_config_209_filtrarGrupoEcon = 0 AND est.pessoaEstabelecimento = est2.pessoaEstabelecimento
        OR p_config_209_filtrarGrupoEcon = 1 AND pessEst.grupoEconomico = pessEst2.grupoEconomico);
    END IF;  
    IF p_estabelecimento <> 0 AND v_preco = 0 THEN
      SELECT COALESCE(MAX(preco.precoCustoInicial),0)
      INTO v_preco      
      FROM CAPRODUTOXESTABELECIMENTO preco
      WHERE preco.produto = p_gradProd_produto
      AND preco.estabelecimento = 0
      AND preco.ativo = 1;
    END IF;
  END IF;
  IF v_preco = 0 THEN
    SELECT
      TO_DATE(SUBSTR(a.ordenacao,1,8),'YYYYMMDD'),
      COALESCE ((TO_NUMBER(SUBSTR(a.ordenacao,9,15)) / 10000000),0)
    INTO
      v_dataInventario,
      v_precoInventario
    FROM (
      SELECT MAX((COALESCE(TO_CHAR(invEst.data,'YYYYMMDD'),'19000101')
        || LPAD((itemEst.precoUnitarioUltimaCompra * 10000000),15,'0'))) ordenacao
      FROM MOINVENTARIOESTOQUEXITENS itemEst
      JOIN MOINVENTARIOSESTOQUE invEst ON invEst.inventarioEstoque = itemEst.inventarioEstoque
      JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = itemEst.gradeProduto
      JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
      WHERE itemEst.precoUnitarioUltimaCompra <> 0
      AND gradProd.produto = p_gradProd_produto
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gradProd_cor = 0
        OR gradProd.cor = p_gradProd_cor)
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_gradProd_tamanho = ''
        OR p_gradProd_tamanho = ' '
        OR gradProd.tamanho = p_gradProd_tamanho)
      AND (p_config_362_calcCustoPorGrade = 0
        OR p_item_personalizacao = 0
        OR itemEst.personalizacao = p_item_personalizacao)
      AND invEst.data >= CASE
          WHEN NOT(p_dataInicial IS NULL)
          THEN TRUNC(p_dataInicial)
          ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
        END
      AND invEst.data < TRUNC(p_dataFinal) + CASE WHEN invEst.motivoInventarioEstoque = '01' THEN 1 ELSE 0 END) a;
    SELECT COALESCE ((
      SELECT TO_NUMBER(SUBSTR(MAX (a.dataPreco),9,15)) / 10000000
      FROM (
        SELECT COALESCE(TO_CHAR(doc.dataEntradaSaida,'YYYYMMDD'),'00000000')
          || LPAD(((item.precoUnitario
          - CASE WHEN item.quantidade = 0 THEN 0 ELSE ROUND(item.valorDescontoTotal / item.quantidade,7) END
          ) * 10000000),15,'0') dataPreco
        FROM MODOCFISCALXITENS item
        JOIN CAGRADESPRODUTO grad ON grad.gradeProduto = item.gradeProduto
        JOIN MODOCUMENTOSFISCAIS doc ON doc.idDocumentoFiscal = item.idDocumentoFiscal
        WHERE item.cancelado = 0
        AND grad.produto = p_gradProd_produto
        AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_cor = 0 OR cor = p_gradProd_cor)
        AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_tamanho = '' OR p_gradProd_tamanho = ' ' OR tamanho = p_gradProd_tamanho)
        AND (p_config_362_calcCustoPorGrade = 0 OR p_item_personalizacao = 0 OR personalizacao = p_item_personalizacao)
        AND doc.entradaSaida = 'E'
        AND doc.devolucaoAnulacaoRetorno = 0
        AND doc.situacaoDocumentoFiscal IN (21,22,23)
        AND doc.atualizaUltimaCompra = 1
        AND doc.dataEntradaSaida >= CASE
            WHEN NOT(v_dataInventario IS NULL)
            THEN v_dataInventario + 1
            WHEN NOT(p_dataInicial IS NULL)
            THEN TRUNC(p_dataInicial)
            ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
          END
        AND doc.dataEntradaSaida < TRUNC(p_dataFinal) + 1
        AND (p_estabelecimento = 0
          OR p_estabelecimento <> 0
          AND p_config_209_filtrarGrupoEcon = 0
          AND EXISTS (
            SELECT 1
            FROM PAESTABELECIMENTOS est
            JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
            WHERE est.estabelecimento = doc.estabelecimento
            AND (est.estabelecimento = p_estabelecimento
              OR est2.estabelecimento = p_estabelecimento))
          OR p_estabelecimento <> 0
          AND p_config_209_filtrarGrupoEcon = 1
          AND EXISTS (
            SELECT 1
            FROM PAESTABELECIMENTOS est
            JOIN CAPESSOAS pessEst ON pessEst.pessoa = est.pessoaEstabelecimento
            JOIN CAPESSOAS pessEst2 ON pessEst2.grupoEconomico = pessEst.grupoEconomico
            JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = pessEst2.pessoa
            WHERE est.estabelecimento = doc.estabelecimento
            AND (est.estabelecimento = p_estabelecimento
              OR est2.estabelecimento = p_estabelecimento)))
        UNION ALL
        SELECT COALESCE(TO_CHAR(doc.dataEntradaSaida,'YYYYMMDD'),'00000000')
          || LPAD(((item.precoUnitario
          - CASE WHEN item.quantidade = 0 THEN 0 ELSE ROUND(item.valorDescontoTotal / item.quantidade,7) END
          ) * 10000000),15,'0') dataPreco
        FROM MOPREDOCUMXITENS item
        JOIN CAGRADESPRODUTO grad ON grad.gradeProduto = item.gradeProduto
        JOIN MOPREDOCUMENTOS doc ON doc.preDocumento = item.preDocumento
        WHERE item.cancelado = 0
        AND grad.produto = p_gradProd_produto
        AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_cor = 0 OR cor = p_gradProd_cor)
        AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_tamanho = '' OR p_gradProd_tamanho = ' ' OR tamanho = p_gradProd_tamanho)
        AND (p_config_362_calcCustoPorGrade = 0 OR p_item_personalizacao = 0 OR personalizacao = p_item_personalizacao)
        AND doc.entradaSaida = 'E'
        AND doc.devolucaoAnulacaoRetorno = 0
        AND doc.statusPreDocumento = 'A'
        AND doc.atualizaUltimaCompra = 1
        AND doc.dataEntradaSaida >= CASE
            WHEN NOT(v_dataInventario IS NULL)
            THEN v_dataInventario + 1
            WHEN NOT(p_dataInicial IS NULL)
            THEN TRUNC(p_dataInicial)
            ELSE TO_DATE ('01/01/1900','DD/MM/YYYY')
          END
        AND doc.dataEntradaSaida < TRUNC(p_dataFinal) + 1
        AND (p_estabelecimento = 0
          OR p_estabelecimento <> 0
          AND p_config_209_filtrarGrupoEcon = 0
          AND EXISTS (
            SELECT 1
            FROM PAESTABELECIMENTOS est
            JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
            WHERE est.estabelecimento = doc.estabelecimento
            AND (est.estabelecimento = p_estabelecimento
              OR est2.estabelecimento = p_estabelecimento))
          OR p_estabelecimento <> 0
          AND p_config_209_filtrarGrupoEcon = 1
          AND EXISTS (
            SELECT 1
            FROM PAESTABELECIMENTOS est
            JOIN CAPESSOAS pessEst ON pessEst.pessoa = est.pessoaEstabelecimento
            JOIN CAPESSOAS pessEst2 ON pessEst2.grupoEconomico = pessEst.grupoEconomico
            JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = pessEst2.pessoa
            WHERE est.estabelecimento = doc.estabelecimento
            AND (est.estabelecimento = p_estabelecimento
              OR est2.estabelecimento = p_estabelecimento)))) a),0)
    INTO v_preco
    FROM DUAL;    
    IF v_preco = 0 THEN
      v_preco := v_precoInventario;
    END IF;
    IF v_preco = 0 AND (p_dataInicial IS NULL OR p_dataInicial = TO_DATE ('01/01/1900','DD/MM/YYYY')) THEN
      SELECT COALESCE(MAX(preco.precoUltimaCompraInicial),0)
      INTO v_preco      
      FROM CAPRODUTOXESTABELECIMENTO preco
      WHERE preco.produto = p_gradProd_produto
      AND preco.estabelecimento = p_estabelecimento
      AND preco.ativo = 1;  
      IF p_estabelecimento <> 0 AND v_preco = 0 THEN
        SELECT COALESCE(MAX(preco.precoUltimaCompraInicial),0)
        INTO v_preco      
        FROM CAPRODUTOXESTABELECIMENTO preco
        WHERE preco.produto = p_gradProd_produto
        AND preco.ativo = 1
        AND (p_config_209_filtrarGrupoEcon = 0
          AND EXISTS (
            SELECT 1
            FROM PAESTABELECIMENTOS est
            JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
            WHERE est.estabelecimento = preco.estabelecimento
            AND (est.estabelecimento = p_estabelecimento
              OR est2.estabelecimento = p_estabelecimento))
          OR p_config_209_filtrarGrupoEcon = 1
          AND EXISTS (
            SELECT 1
            FROM PAESTABELECIMENTOS est
            JOIN CAPESSOAS pessEst ON pessEst.pessoa = est.pessoaEstabelecimento
            JOIN CAPESSOAS pessEst2 ON pessEst2.grupoEconomico = pessEst.grupoEconomico
            JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = pessEst2.pessoa
            WHERE est.estabelecimento = preco.estabelecimento
            AND (est.estabelecimento = p_estabelecimento
              OR est2.estabelecimento = p_estabelecimento)));
      END IF;
      IF p_estabelecimento <> 0 AND v_preco = 0 THEN
        SELECT COALESCE(MAX(preco.precoUltimaCompraInicial),0)
        INTO v_preco      
        FROM CAPRODUTOXESTABELECIMENTO preco
        WHERE preco.produto = p_gradProd_produto
        AND preco.estabelecimento = 0
        AND preco.ativo = 1;
      END IF;
    END IF;
  END IF;
  RETURN v_preco;
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_MEDIO_INT(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_estabelecimento              IN NUMBER,
    p_dataPosicaoEstoque           IN DATE,
    p_item_personalizacao          IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_indicadorPropriedadePosseIt  IN CHAR,
    p_pessoaParticipante           IN NUMBER,
    p_buscarPrecoGerencial         IN NUMBER,
    p_especial                     IN NUMBER, -- 1 = Gerando Inventário, 2 = Valorizando Estoque
    p_dataInventarioEstoque        IN DATE)
  RETURN NUMBER
IS
  v_dataAtual          DATE;
  v_quantidadeEstoque  NUMBER;
  v_precoCustoMedio    NUMBER;
  v_totalCustoMedio    NUMBER;
CURSOR c_estoque IS
  SELECT itemEst.data,
    itemEst.idEstoque,
    itemEst.entradaSaida,
    itemEst.atualizaCustoMedio,
    itemEst.operacaoInternaEstoque,
    itemEst.quantidade,
    itemEst.totalCustoOperacao,
    CASE
      WHEN itemEst.atualizaCustoMedio = 0
      THEN 0
      ELSE COALESCE((
        SELECT
          CASE
            WHEN itemDoc.quantidade = 0
              OR prod.controleEstoque IN (3,4)
              AND COALESCE(kit.ativo,0) = 1
              AND COALESCE(kit.manterUltimoCusto,0) = 1
            THEN 0
            ELSE ROUND(itemDoc.valorAcrescimoExtempTotal * itemEst.quantidade / itemDoc.quantidade,2)
          END
        FROM MODOCFISCALXESTOQUE estXDoc
        JOIN MODOCFISCALXITENS itemDoc ON itemDoc.idItemDocFiscal = estXDoc.idItemDocFiscal
        LEFT JOIN CAGRADEPRODUTOXKITSCOMBOS kit ON kit.gradeProduto = itemDoc.gradeProduto
        WHERE estXDoc.idEstoque = itemEst.idEstoque
        AND (kit.gradeProdutoFilho IS NULL OR kit.gradeProdutoFilho = itemEst.gradeProduto)),COALESCE((
        SELECT
          CASE
            WHEN itemDoc.quantidade = 0
              OR prod.controleEstoque IN (3,4)
              AND COALESCE(kit.ativo,0) = 1
              AND COALESCE(kit.manterUltimoCusto,0) = 1
            THEN 0
            ELSE ROUND(itemDoc.valorAcrescimoExtempTotal * itemEst.quantidade / itemDoc.quantidade,2)
          END
        FROM MOPREDOCUMXESTOQUE estXDoc
        JOIN MOPREDOCUMXITENS itemDoc ON itemDoc.idItemPreDocumento = estXDoc.idItemPreDocumento
        LEFT JOIN CAGRADEPRODUTOXKITSCOMBOS kit ON kit.gradeProduto = itemDoc.gradeProduto
        WHERE estXDoc.idEstoque = itemEst.idEstoque
        AND (kit.gradeProdutoFilho IS NULL OR kit.gradeProdutoFilho = itemEst.gradeProduto)),0))
    END valorAcrescimoExtempTotal
  FROM MOESTOQUES itemEst
  JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = itemEst.gradeProduto
  JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
  WHERE gradProd.produto = p_gradProd_produto
  AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_cor = 0 OR gradProd.cor = p_gradProd_cor)
  AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_tamanho = '' OR p_gradProd_tamanho = ' ' OR gradProd.tamanho = p_gradProd_tamanho)
  AND (p_config_362_calcCustoPorGrade = 0 OR p_item_personalizacao = 0 OR itemEst.personalizacao = p_item_personalizacao)
  AND itemEst.indicadorPropriedadePosseItem = '' || CASE WHEN p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = '' OR p_indicadorPropriedadePosseIt = ' ' THEN '0' ELSE p_indicadorPropriedadePosseIt END || ''
  AND itemEst.pessoaParticipante = p_pessoaParticipante
  AND (p_buscarPrecoGerencial = 1 OR itemEst.operacaoInternaEstoque <> 101)
  AND itemEst.data >= CASE WHEN NOT(p_dataInventarioEstoque IS NULL) THEN p_dataInventarioEstoque + 1 ELSE TO_DATE('01/01/1900','DD/MM/YYYY') END
  AND itemEst.data < TRUNC(p_dataPosicaoEstoque) + 1
  AND (p_estabelecimento = 0
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 0
    AND EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
      WHERE est.estabelecimento = itemEst.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento))
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 1
    AND EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN CAPESSOAS pessEst ON pessEst.pessoa = est.pessoaEstabelecimento
      JOIN CAPESSOAS pessEst2 ON pessEst2.grupoEconomico = pessEst.grupoEconomico
      JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = pessEst2.pessoa
      WHERE est.estabelecimento = itemEst.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento)))
  ORDER BY TRUNC(itemEst.data),
    itemEst.operacaoInternaEstoque DESC,
    itemEst.atualizaCustoMedio DESC,
    itemEst.data,
    itemEst.idEstoque;
BEGIN
  v_dataAtual         := COALESCE(TRUNC(p_dataInventarioEstoque)+1,TO_DATE('01/01/1900','DD/MM/YYYY'));
  v_quantidadeEstoque := 0;
  v_precoCustoMedio   := 0;
  v_totalCustoMedio   := 0;
  -- Saldo Inicial Inventário Estoque Gerencial
  IF NOT(p_dataInventarioEstoque IS NULL) AND p_buscarPrecoGerencial = 1 THEN
  SELECT
    COALESCE(SUM(itemEst.quantidadeGerencial),0),
    COALESCE((
      CASE
        WHEN SUM(itemEst.quantidadeGerencial) = 0
          OR SUM(ROUND(itemEst.quantidadeGerencial*itemEst.precoUnitarioCMVGerencial,2)) = 0
          OR SUM(itemEst.quantidadeGerencial) =  MAX(itemEst.quantidadeGerencial)
          AND SUM(ROUND(itemEst.quantidadeGerencial*itemEst.precoUnitarioCMVGerencial,2))
           =  MAX(ROUND(itemEst.quantidadeGerencial*itemEst.precoUnitarioCMVGerencial,2))
        THEN MAX(itemEst.precoUnitarioCMVGerencial)
        ELSE ROUND(SUM(ROUND(itemEst.quantidadeGerencial*itemEst.precoUnitarioCMVGerencial,2))
          / SUM(itemEst.quantidadeGerencial),7)
      END),0),
    COALESCE(SUM(ROUND(itemEst.quantidadeGerencial*itemEst.precoUnitarioCMVGerencial,2)),0)
  INTO
    v_quantidadeEstoque,
    v_precoCustoMedio,
    v_totalCustoMedio
  FROM MOINVENTARIOESTOQUEXITENS itemEst
  JOIN MOINVENTARIOSESTOQUE invEst ON invEst.inventarioEstoque = itemEst.inventarioEstoque
  JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = itemEst.gradeProduto
  WHERE gradProd.produto = p_gradProd_produto
  AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_cor = 0 OR gradProd.cor = p_gradProd_cor)
  AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_tamanho = '' OR p_gradProd_tamanho = ' ' OR gradProd.tamanho = p_gradProd_tamanho)
  AND (p_config_362_calcCustoPorGrade = 0 OR p_item_personalizacao = 0 OR itemEst.personalizacao = p_item_personalizacao)
  AND itemEst.indicadorPropriedadePosseItem = '' || CASE WHEN p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = '' OR p_indicadorPropriedadePosseIt = ' ' THEN '0' ELSE p_indicadorPropriedadePosseIt END || ''
  AND itemEst.pessoaParticipante = p_pessoaParticipante
  AND invEst.data >= TRUNC(p_dataInventarioEstoque)
  AND invEst.data < TRUNC(p_dataInventarioEstoque) + 1
  AND (p_estabelecimento = 0
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 0
    AND EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
      WHERE est.estabelecimento = invEst.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento))
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 1
    AND EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN CAPESSOAS pessEst ON pessEst.pessoa = est.pessoaEstabelecimento
      JOIN CAPESSOAS pessEst2 ON pessEst2.grupoEconomico = pessEst.grupoEconomico
      JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = pessEst2.pessoa
      WHERE est.estabelecimento = invEst.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento)));
  -- Saldo Inicial Inventário Estoque Fiscal
  ELSIF NOT(p_dataInventarioEstoque IS NULL) THEN
  SELECT
    COALESCE(SUM(itemEst.quantidadeFiscal),0),
    COALESCE((
      CASE
        WHEN SUM(itemEst.quantidadeFiscal) = 0
          OR SUM(ROUND(itemEst.quantidadeFiscal*itemEst.precoUnitarioCMVFiscal,2)) = 0
          OR SUM(itemEst.quantidadeFiscal) =  MAX(itemEst.quantidadeFiscal)
          AND SUM(ROUND(itemEst.quantidadeFiscal*itemEst.precoUnitarioCMVFiscal,2))
           =  MAX(ROUND(itemEst.quantidadeFiscal*itemEst.precoUnitarioCMVFiscal,2))
        THEN MAX(itemEst.precoUnitarioCMVFiscal)
        ELSE ROUND(SUM(ROUND(itemEst.quantidadeFiscal*itemEst.precoUnitarioCMVFiscal,2))
          / SUM(itemEst.quantidadeFiscal),7)
      END),0),
    COALESCE(SUM(ROUND(itemEst.quantidadeFiscal*itemEst.precoUnitarioCMVFiscal,2)),0)
  INTO
    v_quantidadeEstoque,
    v_precoCustoMedio,
    v_totalCustoMedio
  FROM MOINVENTARIOESTOQUEXITENS itemEst
  JOIN MOINVENTARIOSESTOQUE invEst ON invEst.inventarioEstoque = itemEst.inventarioEstoque
  JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = itemEst.gradeProduto
  WHERE gradProd.produto = p_gradProd_produto
  AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_cor = 0 OR gradProd.cor = p_gradProd_cor)
  AND (p_config_362_calcCustoPorGrade = 0 OR p_gradProd_tamanho = '' OR p_gradProd_tamanho = ' ' OR gradProd.tamanho = p_gradProd_tamanho)
  AND (p_config_362_calcCustoPorGrade = 0 OR p_item_personalizacao = 0 OR itemEst.personalizacao = p_item_personalizacao)
  AND itemEst.indicadorPropriedadePosseItem = '' || CASE WHEN p_indicadorPropriedadePosseIt IS NULL OR p_indicadorPropriedadePosseIt = '' OR p_indicadorPropriedadePosseIt = ' ' THEN '0' ELSE p_indicadorPropriedadePosseIt END || ''
  AND itemEst.pessoaParticipante = p_pessoaParticipante
  AND invEst.data >= TRUNC(p_dataInventarioEstoque)
  AND invEst.data < TRUNC(p_dataInventarioEstoque) + 1
  AND (p_estabelecimento = 0
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 0
    AND EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
      WHERE est.estabelecimento = invEst.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento))
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 1
    AND EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN CAPESSOAS pessEst ON pessEst.pessoa = est.pessoaEstabelecimento
      JOIN CAPESSOAS pessEst2 ON pessEst2.grupoEconomico = pessEst.grupoEconomico
      JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = pessEst2.pessoa
      WHERE est.estabelecimento = invEst.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento)));
  END IF;
  FOR dados IN c_estoque
  LOOP
    IF dados.operacaoInternaEstoque = 1 AND dados.data > v_dataAtual
    THEN
      v_quantidadeEstoque := 0;
      v_precoCustoMedio := 0;
      v_totalCustoMedio := 0;
    END IF;
    v_dataAtual := dados.data;
    -- Se atualiza custo médio
    IF dados.atualizaCustoMedio = 1 THEN
      IF dados.entradaSaida = 'E' THEN
        v_quantidadeEstoque := v_quantidadeEstoque + dados.quantidade;
        IF v_quantidadeEstoque <= 0 THEN
          v_totalCustoMedio := 0;
        ELSE
          IF v_quantidadeEstoque > dados.quantidade THEN
            IF v_totalCustoMedio + dados.totalCustoOperacao + dados.valorAcrescimoExtempTotal > 9999999999999.99 THEN
               v_totalCustoMedio := 9999999999999.99;
            ELSE
               v_totalCustoMedio := v_totalCustoMedio + dados.totalCustoOperacao + dados.valorAcrescimoExtempTotal;
            END IF;
          ELSE
            IF ROUND (((dados.totalCustoOperacao + dados.valorAcrescimoExtempTotal) * v_quantidadeEstoque / dados.quantidade),2) > 9999999999999.99 THEN
               v_totalCustoMedio := 9999999999999.99;
            ELSE
               v_totalCustoMedio := ROUND (((dados.totalCustoOperacao + dados.valorAcrescimoExtempTotal) * v_quantidadeEstoque / dados.quantidade),2);
            END IF;
          END IF;
        END IF;
     ELSE
        v_quantidadeEstoque := v_quantidadeEstoque - dados.quantidade;
        v_totalCustoMedio := v_totalCustoMedio - dados.totalCustoOperacao - dados.valorAcrescimoExtempTotal;
        IF v_totalCustoMedio < 0 OR v_quantidadeEstoque <= 0 THEN
          v_totalCustoMedio := 0;
        END IF;
      END IF;
      IF v_totalCustoMedio > 0 AND v_quantidadeEstoque >= 0 AND ROUND(v_totalCustoMedio / CASE WHEN v_quantidadeEstoque = 0 THEN 1 ELSE v_quantidadeEstoque END, 7) > 99999999.9999999 THEN
        v_precoCustoMedio := 99999999.9999999;
      ELSE
        IF v_totalCustoMedio > 0 AND v_quantidadeEstoque >= 0 THEN
          v_precoCustoMedio := ROUND(v_totalCustoMedio / CASE WHEN v_quantidadeEstoque = 0 THEN 1 ELSE v_quantidadeEstoque END, 7);
        END IF;
      END IF;
    -- Se não atualiza custo médio
    ELSE
      IF dados.entradaSaida = 'E' THEN
        v_quantidadeEstoque := v_quantidadeEstoque + dados.quantidade;
        IF v_quantidadeEstoque <= 0 THEN
          v_totalCustoMedio := 0;
        ELSE
          IF v_quantidadeEstoque > dados.quantidade THEN
            IF v_totalCustoMedio + ROUND((dados.quantidade * v_precoCustoMedio),2) > 9999999999999.99 THEN
               v_totalCustoMedio := 9999999999999.99;
            ELSE
               v_totalCustoMedio := v_totalCustoMedio + dados.totalCustoOperacao + dados.valorAcrescimoExtempTotal;
            END IF;
          ELSE
            IF ROUND((v_quantidadeEstoque * v_precoCustoMedio),2) > 9999999999999.99 THEN
               v_totalCustoMedio := 9999999999999.99;
            ELSE
               v_totalCustoMedio := ROUND((v_quantidadeEstoque * v_precoCustoMedio),2);
            END IF;
          END IF;
        END IF;
      ELSE
        v_quantidadeEstoque := v_quantidadeEstoque - dados.quantidade;
        v_totalCustoMedio := v_totalCustoMedio - dados.quantidade * v_precoCustoMedio;
        IF v_totalCustoMedio < 0 OR v_quantidadeEstoque <= 0 THEN
          v_totalCustoMedio := 0;
        END IF;
      END IF;
    END IF;
    -- Se é registro de movimento, atualiza ele
    IF p_especial = 2 THEN
      IF dados.atualizaCustoMedio = 1 THEN
        UPDATE MOESTOQUES a SET
          a.precoCMV = v_precoCustoMedio,
          a.valorCMV = ROUND(a.quantidade * v_precoCustoMedio,2)
        WHERE a.idEstoque = dados.idEstoque;
      ELSE
        UPDATE MOESTOQUES a SET
          a.precoCustoOperacao = v_precoCustoMedio,
          a.totalCustoOperacao = ROUND(a.quantidade * v_precoCustoMedio,2),
          a.precoCMV = v_precoCustoMedio,
          a.valorCMV = ROUND(a.quantidade * v_precoCustoMedio,2)
        WHERE a.idEstoque = dados.idEstoque;
      END IF;
    END IF;
  END LOOP;
  IF p_especial <> 2 AND v_precoCustoMedio = 0 THEN
    SELECT COALESCE(MAX(preco.precoMedioInicial),0)
    INTO v_precoCustoMedio      
    FROM CAPRODUTOXESTABELECIMENTO preco
    WHERE preco.produto = p_gradProd_produto
    AND preco.estabelecimento = p_estabelecimento
    AND preco.ativo = 1;
    IF p_estabelecimento <> 0 AND v_precoCustoMedio = 0 THEN
      SELECT COALESCE(MAX(preco.precoMedioInicial),0)
      INTO v_precoCustoMedio      
      FROM CAPRODUTOXESTABELECIMENTO preco
      WHERE preco.produto = p_gradProd_produto
      AND preco.ativo = 1
      AND (p_estabelecimento = 0
        OR p_estabelecimento <> 0
        AND p_config_209_filtrarGrupoEcon = 0
        AND EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
          WHERE est.estabelecimento = preco.estabelecimento
          AND (est.estabelecimento = p_estabelecimento
            OR est2.estabelecimento = p_estabelecimento))
        OR p_estabelecimento <> 0
        AND p_config_209_filtrarGrupoEcon = 1
        AND EXISTS (
          SELECT 1
          FROM PAESTABELECIMENTOS est
          JOIN CAPESSOAS pessEst ON pessEst.pessoa = est.pessoaEstabelecimento
          JOIN CAPESSOAS pessEst2 ON pessEst2.grupoEconomico = pessEst.grupoEconomico
          JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = pessEst2.pessoa
          WHERE est.estabelecimento = preco.estabelecimento
          AND (est.estabelecimento = p_estabelecimento
            OR est2.estabelecimento = p_estabelecimento)));
    END IF;
    IF p_estabelecimento <> 0 AND v_precoCustoMedio = 0 THEN
      SELECT COALESCE(MAX(preco.precoMedioInicial),0)
      INTO v_precoCustoMedio      
      FROM CAPRODUTOXESTABELECIMENTO preco
      WHERE preco.produto = p_gradProd_produto
      AND preco.estabelecimento = 0
      AND preco.ativo = 1;
    END IF;
  END IF;
  RETURN v_precoCustoMedio;  
END;

/

create or replace FUNCTION FUNC_ADD_BUSCA_PRECO_MEDIO(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_estabelecimento              IN NUMBER,
    p_dataPosicaoEstoque           IN DATE,
    p_item_personalizacao          IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_indicadorPropriedadePosseIt  IN CHAR,
    p_pessoaParticipante           IN NUMBER,
    p_buscarPrecoGerencial         IN NUMBER,
    p_especial                     IN NUMBER -- 1 = Gerando Inventário, 2 = Valorizando Estoque
  )
  RETURN NUMBER
IS 
  v_dataInventarioEstoque DATE;
  v_precoCustoMedio       NUMBER;
BEGIN
  -- v_dataInventarioEstoque
  SELECT MAX(TRUNC(invEst.data))
  INTO v_dataInventarioEstoque
  FROM MOINVENTARIOSESTOQUE invEst
  WHERE invEst.inventarioEstoque <> 0
  AND invEst.data < TRUNC(p_dataPosicaoEstoque) + CASE WHEN invEst.motivoInventarioEstoque = '01' THEN 1 ELSE 0 END
  AND (invEst.motivoInventarioEstoque = '01'
    OR EXISTS(
      SELECT 1
      FROM MOINVENTARIOESTOQUEXITENS itemInv
      JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = itemInv.gradeProduto
      WHERE itemInv.inventarioEstoque = invEst.inventarioEstoque
      AND gradProd.produto = p_gradProd_produto))
  AND (p_estabelecimento = 0
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 0
    AND EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = est.pessoaEstabelecimento
      WHERE est.estabelecimento = invEst.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento))
    OR p_estabelecimento <> 0
    AND p_config_209_filtrarGrupoEcon = 1
    AND EXISTS (
      SELECT 1
      FROM PAESTABELECIMENTOS est
      JOIN CAPESSOAS pessEst ON pessEst.pessoa = est.pessoaEstabelecimento
      JOIN CAPESSOAS pessEst2 ON pessEst2.grupoEconomico = pessEst.grupoEconomico
      JOIN PAESTABELECIMENTOS est2 ON est2.pessoaEstabelecimento = pessEst2.pessoa
      WHERE est.estabelecimento = invEst.estabelecimento
      AND (est.estabelecimento = p_estabelecimento
        OR est2.estabelecimento = p_estabelecimento)));
  v_precoCustoMedio :=
    FUNC_ADD_BUSCA_PRECO_MEDIO_INT(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_estabelecimento,
      p_dataPosicaoEstoque,
      p_item_personalizacao,
      p_gradProd_produto,
      p_gradProd_cor,
      p_gradProd_tamanho,
      p_indicadorPropriedadePosseIt,
      p_pessoaParticipante,
      p_buscarPrecoGerencial,
      p_especial,
      v_dataInventarioEstoque);
  RETURN v_precoCustoMedio;
END;

/

create or replace PROCEDURE ADD_GERA_TEMP_ESTOQUE (
  p_uniqueMachineID     IN VARCHAR2,
  p_contadorSessao      IN NUMBER,
  p_dataPosicaoEstoque  IN DATE,
  p_inEstabelecimentos  IN VARCHAR2,
  p_inLocaisEstoque     IN VARCHAR2,
  p_joinProdutos        IN VARCHAR2,
  p_andWhereProdutos    IN VARCHAR2,
  p_joinInventarios     IN VARCHAR2,
  p_andWhereInventarios IN VARCHAR2,
  p_joinMovimentos      IN VARCHAR2,
  p_andWhereMovimentos  IN VARCHAR2)
IS
BEGIN
  DELETE TEMPESTOQUE
  WHERE  uniqueMachineID = p_uniqueMachineID
  AND contadorSessao = p_contadorSessao;
  EXECUTE IMMEDIATE
'INSERT INTO TEMPESTOQUE (
  uniqueMachineID,
  contadorSessao,
  gradeProduto,
  estabelecimento,
  localEstoque,
  indicadorPropriedadePosseItem,
  pessoaParticipante,
  personalizacao,
  idLoteEstoque,
  idEnderecoEstoque,
  idNumeroSerie,
  quantidadeFiscal,
  quantidadeGerencial)
SELECT
  ''' || CASE WHEN p_uniqueMachineID IS NULL OR p_uniqueMachineID = ' ' THEN ' ' ELSE RTRIM(p_uniqueMachineID) END || ''',
  ' || TO_CHAR(p_contadorSessao) || ',
  a.gradeProduto,
  a.estabelecimento,
  a.localEstoque,
  a.indicadorPropriedadePosseItem,
  a.pessoaParticipante,
  a.personalizacao,
  a.idLoteEstoque,
  a.idEnderecoEstoque,
  a.idNumeroSerie,
  SUM(a.quantidadeFiscal) quantidadeFiscal,
  SUM(a.quantidadeGerencial) quantidadeGerencial
FROM (
  SELECT DISTINCT
    itemInv.inventarioEstoque id,
    itemInv.gradeProduto,
    invEst.estabelecimento,
    itemInv.localEstoque,
    itemInv.indicadorPropriedadePosseItem,
    itemInv.pessoaParticipante,
    itemInv.personalizacao,
    itemInv.idLoteEstoque,
    itemInv.idEnderecoEstoque,
    itemInv.idNumeroSerie,
    itemInv.quantidadeFiscal,
    itemInv.quantidadeGerencial
  FROM MOINVENTARIOESTOQUEXITENS itemInv
  JOIN MOINVENTARIOSESTOQUE invEst
  ON invEst.inventarioEstoque = itemInv.inventarioEstoque
  JOIN PAESTABELECIMENTOS est
  ON est.estabelecimento = invEst.estabelecimento
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = itemInv.gradeProduto
  JOIN CAPRODUTOS prod
  ON prod.produto = gradProd.produto'
|| CASE
     WHEN p_joinProdutos IS NULL OR p_joinProdutos = ' '
     THEN ''
     ELSE '
  ' || RTRIM(p_joinProdutos)
   END
|| CASE
     WHEN p_joinInventarios IS NULL OR p_joinInventarios = ' '
     THEN ''
     ELSE '
  ' || RTRIM(p_joinInventarios)
   END
|| '
  WHERE itemInv.inventarioEstoque <> 0
  AND itemInv.gradeProduto <> 0'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     WHEN INSTR(p_inEstabelecimentos,',') = 0
     THEN '
  AND invEst.estabelecimento = ' || TRIM(TO_CHAR(p_inEstabelecimentos))
     ELSE '
  AND INSTR('',' || RTRIM(p_inEstabelecimentos) || ','','','' || TRIM(TO_CHAR(invEst.estabelecimento)) || '','') > 0'
   END
|| CASE
     WHEN p_inLocaisEstoque IS NULL OR p_inLocaisEstoque = ' ' OR p_inLocaisEstoque = '0'
     THEN ''
     WHEN INSTR(p_inLocaisEstoque,',') = 0
     THEN '
  AND itemInv.localEstoque = ' || TRIM(TO_CHAR(p_inLocaisEstoque))
     ELSE '
  AND INSTR('',' || RTRIM(p_inLocaisEstoque) || ','','','' || TRIM(TO_CHAR(itemInv.localEstoque)) || '','') > 0'
   END
|| CASE
     WHEN p_andWhereProdutos IS NULL OR p_andWhereProdutos = ' '
     THEN ''
     ELSE '
  ' || RTRIM(p_andWhereProdutos)
   END
|| CASE
     WHEN p_andWhereInventarios IS NULL OR p_andWhereInventarios = ' '
     THEN ''
     ELSE '
  ' || RTRIM(p_andWhereInventarios)
   END
|| '
  AND NOT (EXISTS(
    SELECT 1
    FROM MOESTOQUES mov
    JOIN CAGRADESPRODUTO gradProdMov ON gradProdMov.gradeProduto = mov.gradeProduto
    WHERE gradProdMov.produto = gradProd.produto
    AND mov.estabelecimento = est.estabelecimento
    AND mov.operacaoInternaEstoque = 1
    AND mov.data >= TRUNC(invEst.data) + 1
    AND mov.data < '
|| CASE
     WHEN  p_dataPosicaoEstoque IS NULL
     THEN 'TRUNC (SYSDATE) + 1'
     ELSE 'TO_DATE(''' || TO_CHAR(p_dataPosicaoEstoque, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') + 1'
   END || '))
  AND TRUNC(invEst.data) = (
    SELECT COALESCE(MAX(TRUNC(invEst2.data)),TO_DATE (''01/01/1900'',''DD/MM/YYYY''))
    FROM MOINVENTARIOSESTOQUE invEst2
    WHERE invEst2.estabelecimento = invEst.estabelecimento
    AND invEst2.inventarioEstoque <> 0
    AND TRUNC (invEst2.data) < '
|| CASE
    WHEN p_dataPosicaoEstoque IS NULL
    THEN 'TRUNC (SYSDATE)'
    ELSE 'TO_DATE(''' || TO_CHAR(p_dataPosicaoEstoque, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')'
  END
|| ' + CASE WHEN invEst2.motivoInventarioEstoque = ''01'' THEN 1 ELSE 0 END
    AND (invEst2.motivoInventarioEstoque = ''01''
      OR EXISTS(
        SELECT 1
        FROM MOINVENTARIOESTOQUEXITENS itemInv2
        JOIN CAGRADESPRODUTO gradProdInv2 ON gradProdInv2.gradeProduto = itemInv2.gradeProduto
        WHERE itemInv2.inventarioEstoque = invEst2.inventarioEstoque
        AND gradProdInv2.produto = gradProd.produto)))
  AND (invEst.motivoInventarioEstoque = ''01''
    OR EXISTS(
      SELECT 1
      FROM MOINVENTARIOESTOQUEXITENS itemInv2
      JOIN CAGRADESPRODUTO gradProdInv2 ON gradProdInv2.gradeProduto = itemInv2.gradeProduto
      WHERE itemInv2.inventarioEstoque = invEst.inventarioEstoque
      AND gradProdInv2.produto = gradProd.produto))
  UNION ALL
  SELECT DISTINCT
    mov.idEstoque id,
    mov.gradeProduto,
    mov.estabelecimento,
    mov.localEstoque,
    mov.indicadorPropriedadePosseItem,
    mov.pessoaParticipante,
    mov.personalizacao,
    mov.idLoteEstoque,
    mov.idEnderecoEstoque,
    mov.idNumeroSerie,
    CASE WHEN operacaoInternaEstoque = 101 THEN 0 ELSE mov.quantidade * CASE WHEN mov.entradaSaida = ''S'' THEN -1 ELSE 1 END END quantidadeFiscal,
    mov.quantidade * CASE WHEN mov.entradaSaida = ''S'' THEN -1 ELSE 1 END quantidadeGerencial
  FROM MOESTOQUES mov
  JOIN PAESTABELECIMENTOS est
  ON est.estabelecimento = mov.estabelecimento
  JOIN CAGRADESPRODUTO gradProd
  ON gradProd.gradeProduto = mov.gradeProduto
  JOIN CAPRODUTOS prod
  ON prod.produto = gradProd.produto'
|| CASE
     WHEN p_joinProdutos IS NULL OR p_joinProdutos = ' '
     THEN ''
     ELSE '
 ' || RTRIM(p_joinProdutos)
   END
|| CASE
     WHEN p_joinMovimentos IS NULL OR p_joinMovimentos = ' '
     THEN ''
     ELSE '
  ' || RTRIM(p_joinMovimentos)
   END
|| '
  WHERE mov.idEstoque > 0
  AND mov.gradeProduto > 0'
|| CASE
     WHEN p_inEstabelecimentos IS NULL OR p_inEstabelecimentos = ' ' OR p_inEstabelecimentos = '0'
     THEN ''
     WHEN INSTR(p_inEstabelecimentos,',') = 0
     THEN '
  AND mov.estabelecimento = ' || TRIM(TO_CHAR(p_inEstabelecimentos))
     ELSE '
  AND INSTR('',' || RTRIM(p_inEstabelecimentos) || ','','','' || TRIM(TO_CHAR(mov.estabelecimento)) || '','') > 0'
   END
|| CASE
     WHEN p_inLocaisEstoque IS NULL OR p_inLocaisEstoque = ' ' OR p_inLocaisEstoque = '0'
     THEN ''
     WHEN INSTR(p_inLocaisEstoque,',') = 0
     THEN '
  AND mov.localEstoque = ' || TRIM(TO_CHAR(p_inLocaisEstoque))
     ELSE '
  AND INSTR('',' || RTRIM(p_inLocaisEstoque) || ','','','' || TRIM(TO_CHAR(mov.localEstoque)) || '','') > 0'
   END
|| CASE
     WHEN p_andWhereProdutos IS NULL OR p_andWhereProdutos = ' '
     THEN ''
     ELSE '
  ' || RTRIM(p_andWhereProdutos)
   END
|| CASE
     WHEN p_andWhereMovimentos IS NULL OR p_andWhereMovimentos = ' '
     THEN ''
     ELSE '
 ' || RTRIM(p_andWhereMovimentos)
   END
|| '
  AND mov.data >= COALESCE(
    ( SELECT MAX (movIni.data)
      FROM MOESTOQUES movIni
      JOIN CAGRADESPRODUTO gradProdIni ON gradProdIni.gradeProduto = movIni.gradeProduto
      WHERE gradProdIni.produto = gradProd.produto
      AND movIni.estabelecimento = mov.estabelecimento
      AND movIni.operacaoInternaEstoque = 1
      AND TRUNC(movIni.data) BETWEEN
        ( SELECT COALESCE(MAX(TRUNC(invEst.data)+1),TO_DATE (''01/01/1900'',''DD/MM/YYYY''))
          FROM MOINVENTARIOSESTOQUE invEst
          WHERE invEst.estabelecimento = movIni.estabelecimento
          AND invEst.inventarioEstoque <> 0
          AND invEst.data < '
|| CASE
     WHEN p_dataPosicaoEstoque IS NULL
     THEN 'TRUNC (SYSDATE)'
     ELSE 'TO_DATE(''' || TO_CHAR(p_dataPosicaoEstoque, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')'
   END
|| ' + CASE WHEN invEst.motivoInventarioEstoque = ''01'' THEN 1 ELSE 0 END
          AND (invEst.motivoInventarioEstoque = ''01''
            OR EXISTS(
              SELECT 1
              FROM MOINVENTARIOESTOQUEXITENS itemInv
              JOIN CAGRADESPRODUTO gradProdInv ON gradProdInv.gradeProduto = itemInv.gradeProduto
              WHERE itemInv.inventarioEstoque = invEst.inventarioEstoque
              AND gradProdInv.produto = gradProdIni.produto)))
        AND '
|| CASE
     WHEN  p_dataPosicaoEstoque IS NULL
     THEN 'TRUNC (SYSDATE)'
     ELSE 'TO_DATE(''' || TO_CHAR(p_dataPosicaoEstoque, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')'
   END
|| '),
  ( SELECT COALESCE(MAX(TRUNC(invEst.data)+1),TO_DATE (''01/01/1900'',''DD/MM/YYYY''))
    FROM MOINVENTARIOSESTOQUE invEst
    WHERE invEst.estabelecimento = mov.estabelecimento
    AND invEst.inventarioEstoque <> 0
    AND TRUNC (invEst.data) < '
|| CASE
    WHEN p_dataPosicaoEstoque IS NULL
    THEN 'TRUNC (SYSDATE)'
    ELSE 'TO_DATE(''' || TO_CHAR(p_dataPosicaoEstoque, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'')'
  END
|| ' + CASE WHEN invEst.motivoInventarioEstoque = ''01'' THEN 1 ELSE 0 END
    AND (invEst.motivoInventarioEstoque = ''01''
      OR EXISTS(
        SELECT 1
        FROM MOINVENTARIOESTOQUEXITENS itemInv
        JOIN CAGRADESPRODUTO gradProdInv ON gradProdInv.gradeProduto = itemInv.gradeProduto
        WHERE itemInv.inventarioEstoque = invEst.inventarioEstoque
        AND gradProdInv.produto = gradProd.produto))'
|| '))
  AND mov.data < '
|| CASE
    WHEN p_dataPosicaoEstoque IS NULL
    THEN 'TRUNC (SYSDATE) + 1'
    ELSE 'TO_DATE(''' || TO_CHAR(p_dataPosicaoEstoque, 'DD/MM/YYYY') || ''', ''DD/MM/YYYY'') + 1'
  END
|| ') a
GROUP BY
  a.gradeProduto,
  a.estabelecimento,
  a.localEstoque,
  a.indicadorPropriedadePosseItem,
  a.pessoaParticipante,
  a.personalizacao,
  a.idLoteEstoque,
  a.idEnderecoEstoque,
  a.idNumeroSerie';
END ADD_GERA_TEMP_ESTOQUE;

/

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

/

UPDATE SICONFIGURACOES SET conteudoSugestao = 'G' WHERE configuracao = 377;

COMMIT;

-- SIWSWHATSAPP
CREATE TABLE SIWSWHATSAPP
  (
    wsWhatsapp  NUMERIC (3,0) DEFAULT 0 NOT NULL,
    descricao   VARCHAR (60) DEFAULT ' ' NOT NULL,
    ativo       NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE SIWSWHATSAPP ADD CONSTRAINT SIWSWHATSAPP_PK1 PRIMARY KEY (wsWhatsapp);
CREATE INDEX SIWSWHATSAPP_K2 ON SIWSWHATSAPP (descricao);

INSERT INTO SIWSWHATSAPP (wsWhatsapp, descricao, ativo, observacoes) values (0,'SELECIONE',1,' ');
INSERT INTO SIWSWHATSAPP (wsWhatsapp, descricao, ativo, observacoes) values (1,'chatPro',1,' ');

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('SIWSWHATSAPP', 'Web Services Whatsapp', 1, 74, 'SI', 'wsWhatsapp', 'N', 3, 'descricao', 0, ' ', 0, 999999, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqWSWhatsapp', 1, 1, ' '); 

COMMIT;

INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, categoriaConfiguracao, categoriaPersonalCampo, categoriaMemoriaSistema, permiteReport, observacoes) values (841, 'Web Services Whatsapp', 1, 99000074, 'SI', 999999, 841, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqWSWhatsapp', 0, 0, 0, 0, ' ');

COMMIT;

-- PAWHATSAPPCONEXOES
CREATE TABLE PAWHATSAPPCONEXOES
  (
    id              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    estabelecimento NUMERIC (4,0) DEFAULT 0 NOT NULL,
    wsWhatsapp      NUMERIC (3,0) DEFAULT 0 NOT NULL,
    ativo           NUMERIC (1,0) DEFAULT 0 NOT NULL,
    usuario         VARCHAR (256) DEFAULT ' ' NOT NULL,
    token           VARCHAR (256) DEFAULT ' ' NOT NULL,
    observacoes     VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
CREATE UNIQUE INDEX PAWHATSAPPCONEXOES_PK1 ON PAWHATSAPPCONEXOES (id);
CREATE UNIQUE INDEX PAWHATSAPPCONEXOES_K2 ON PAWHATSAPPCONEXOES (estabelecimento);
ALTER TABLE PAWHATSAPPCONEXOES ADD CONSTRAINT PAWHATSAPPCONEXOES_FK1 FOREIGN KEY (estabelecimento) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE PAWHATSAPPCONEXOES ADD CONSTRAINT PAWHATSAPPCONEXOES_FK2 FOREIGN KEY (wsWhatsapp) REFERENCES SIWSWHATSAPP (wsWhatsapp);

INSERT INTO PAWHATSAPPCONEXOES (id, estabelecimento, wsWhatsapp, ativo, usuario, token, observacoes) VALUES (0, 0, 0, 1, ' ', ' ', ' ');

COMMIT;

INSERT INTO SITABELASSISTEMA (tabelaSistema, descricao, ativo, ordenacao, tipoTabela, nomeCampoCodigo, tipoCampoCodigo, numeroDigitosCodigo, nomeCampoDescricao, adicionarCodigoNaDescricao, nomeCampoIdSeDiferenteCodigo, numeroDigitosCampoId, categoriaTabelaSistema, aplicacaoZoom, nomePublicoZoom, versaoTabela, versaoDados, observacoes) values ('PAWHATSAPPCONEXOES', 'Whatsapp Conexões', 1, 31444, 'PA', 'id', 'N', 14, ' ', 1, ' ', 0, 100001, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqWhatsappConexoes', 1, 1, ' '); 

COMMIT;

INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, categoriaConfiguracao, categoriaPersonalCampo, categoriaMemoriaSistema, permiteReport, observacoes) values (842, 'Whatsapp Conexões', 1, 90001714, 'PA', 100001, 842, '%SYS_DIR%Versoes\%SYS_VER%\Framework.ecf', 'PesqWhatsappConexoes', 0, 0, 0, 0, ' ');

COMMIT;

UPDATE SICAMPOSCOMPOSICAOCREDITO SET campoSelect = 'CASE WHEN TO_CHAR(pessoa.nascimentoFundacao, ''MM'') = TO_CHAR(SYSDATE,''MM'') THEN 1 ELSE 0 END' WHERE campoComposicaoCredito = 252;
UPDATE SICAMPOSCOMPOSICAOCREDITO SET campoSelect = 'COALESCE((SELECT SUM (financ.saldo) FROM MOFINANCEIROS financ WHERE financ.pessoa = pessoa.pessoa AND financ.efetivado = 0 AND EXISTS (SELECT 1 FROM MOBAIXAXNOVOFINANCEIRO novo JOIN MOFINANCEIROXBAIXAS baixa ON baixa.idBaixaFinanceiro = novo.idBaixaFinanceiro WHERE novo.idNovoFinanceiro = financ.idFinanceiro AND baixa.unificadoReparcelado = 1 AND baixa.meioPagamento <> 17 AND NOT (baixa.meioPagamento BETWEEN 20 AND 28))),0)' WHERE campoComposicaoCredito = 821;
UPDATE SICAMPOSCOMPOSICAOCREDITO SET campoSelect = 'CASE WHEN COALESCE((SELECT COUNT(1) FROM MOFINANCEIROS financ WHERE financ.pessoa = pessoa.pessoa AND EXISTS (SELECT 1 FROM MOBAIXAXNOVOFINANCEIRO novo JOIN MOFINANCEIROXBAIXAS baixa ON baixa.idBaixaFinanceiro = novo.idBaixaFinanceiro WHERE novo.idNovoFinanceiro = financ.idFinanceiro AND baixa.unificadoReparcelado = 1 AND baixa.meioPagamento <> 17 AND NOT (baixa.meioPagamento BETWEEN 20 AND 28))),0) = 0 THEN 0 ELSE ROUND((100 * COALESCE((SELECT COUNT(1) FROM MOFINANCEIROS financ WHERE financ.pessoa = pessoa.pessoa AND financ.efetivado = 0 AND EXISTS (SELECT 1 FROM MOBAIXAXNOVOFINANCEIRO novo JOIN MOFINANCEIROXBAIXAS baixa ON baixa.idBaixaFinanceiro = novo.idBaixaFinanceiro WHERE novo.idNovoFinanceiro = financ.idFinanceiro AND baixa.unificadoReparcelado = 1 AND baixa.meioPagamento <> 17 AND NOT (baixa.meioPagamento BETWEEN 20 AND 28))),0) / COALESCE((SELECT COUNT(1) FROM MOFINANCEIROS financ WHERE financ.pessoa = pessoa.pessoa AND EXISTS (SELECT 1 FROM MOBAIXAXNOVOFINANCEIRO novo JOIN MOFINANCEIROXBAIXAS baixa ON baixa.idBaixaFinanceiro = novo.idBaixaFinanceiro WHERE novo.idNovoFinanceiro = financ.idFinanceiro AND baixa.unificadoReparcelado = 1 AND baixa.meioPagamento <> 17 AND NOT (baixa.meioPagamento BETWEEN 20 AND 28))),0)),2) END' WHERE campoComposicaoCredito = 822;
UPDATE SICAMPOSCOMPOSICAOCREDITO SET campoSelect = 'CASE WHEN COALESCE((SELECT SUM (financ.valor) FROM MOFINANCEIROS financ WHERE financ.pessoa = pessoa.pessoa AND EXISTS (SELECT 1 FROM MOBAIXAXNOVOFINANCEIRO novo JOIN MOFINANCEIROXBAIXAS baixa ON baixa.idBaixaFinanceiro = novo.idBaixaFinanceiro WHERE novo.idNovoFinanceiro = financ.idFinanceiro AND baixa.unificadoReparcelado = 1 AND baixa.meioPagamento <> 17 AND NOT (baixa.meioPagamento BETWEEN 20 AND 28))),0) = 0 THEN 0 ELSE ROUND((100 * COALESCE((SELECT SUM (financ.saldo) FROM MOFINANCEIROS financ WHERE financ.pessoa = pessoa.pessoa AND EXISTS (SELECT 1 FROM MOBAIXAXNOVOFINANCEIRO novo JOIN MOFINANCEIROXBAIXAS baixa ON baixa.idBaixaFinanceiro = novo.idBaixaFinanceiro WHERE novo.idNovoFinanceiro = financ.idFinanceiro)),0) / COALESCE((SELECT SUM (financ.valor) FROM MOFINANCEIROS financ WHERE financ.pessoa = pessoa.pessoa AND EXISTS (SELECT 1 FROM MOBAIXAXNOVOFINANCEIRO novo JOIN MOFINANCEIROXBAIXAS baixa ON baixa.idBaixaFinanceiro = novo.idBaixaFinanceiro WHERE novo.idNovoFinanceiro = financ.idFinanceiro AND baixa.unificadoReparcelado = 1 AND baixa.meioPagamento <> 17 AND NOT (baixa.meioPagamento BETWEEN 20 AND 28))),0)),2) END' WHERE campoComposicaoCredito = 823;
UPDATE SICAMPOSCOMPOSICAOCREDITO SET campoSelect = 'CASE WHEN COALESCE((SELECT COUNT(1) FROM MOFINANCEIROS financ WHERE financ.pessoa = pessoa.pessoa AND EXISTS (SELECT 1 FROM MOBAIXAXNOVOFINANCEIRO novo JOIN MOFINANCEIROXBAIXAS baixa ON baixa.idBaixaFinanceiro = novo.idBaixaFinanceiro JOIN MOBAIXAXNOVOFINANCEIRO novo2 ON novo2.idBaixaFinanceiro = novo.idBaixaFinanceiro JOIN MOFINANCEIROXBAIXAS baixa2 ON baixa2.idBaixaFinanceiro = novo2.idBaixaFinanceiro JOIN MOFINANCEIROS financ2 ON financ2.idFinanceiro = novo2.idNovoFinanceiro WHERE novo.idNovoFinanceiro = financ.idFinanceiro AND baixa.unificadoReparcelado = 1 AND baixa.meioPagamento <> 17 AND NOT (baixa.meioPagamento BETWEEN 20 AND 28) AND baixa2.unificadoReparcelado = 1 AND baixa2.meioPagamento <> 17 AND NOT (baixa2.meioPagamento BETWEEN 20 AND 28) AND financ2.efetivado = 0)),0) = 0 THEN 0 ELSE ROUND((100 * COALESCE((SELECT COUNT(1) FROM MOFINANCEIROS financ WHERE financ.pessoa = pessoa.pessoa AND financ.efetivado = 1 AND EXISTS (SELECT 1 FROM MOBAIXAXNOVOFINANCEIRO novo JOIN MOFINANCEIROXBAIXAS baixa ON baixa.idBaixaFinanceiro = novo.idBaixaFinanceiro JOIN MOBAIXAXNOVOFINANCEIRO novo2 ON novo2.idBaixaFinanceiro = novo.idBaixaFinanceiro JOIN MOFINANCEIROXBAIXAS baixa2 ON baixa2.idBaixaFinanceiro = novo2.idBaixaFinanceiro JOIN MOFINANCEIROS financ2 ON financ2.idFinanceiro = novo2.idNovoFinanceiro WHERE novo.idNovoFinanceiro = financ.idFinanceiro AND baixa.unificadoReparcelado = 1 AND baixa.meioPagamento <> 17 AND NOT (baixa.meioPagamento BETWEEN 20 AND 28) AND baixa2.unificadoReparcelado = 1 AND baixa2.meioPagamento <> 17 AND NOT (baixa2.meioPagamento BETWEEN 20 AND 28) AND financ2.efetivado = 0)),0) / COALESCE((SELECT COUNT(1) FROM MOFINANCEIROS financ WHERE financ.pessoa = pessoa.pessoa AND EXISTS (SELECT 1 FROM MOBAIXAXNOVOFINANCEIRO novo JOIN MOBAIXAXNOVOFINANCEIRO novo2 ON novo2.idBaixaFinanceiro = novo.idBaixaFinanceiro JOIN MOFINANCEIROXBAIXAS baixa2 ON baixa2.idBaixaFinanceiro = novo2.idBaixaFinanceiro JOIN MOFINANCEIROS financ2 ON financ2.idFinanceiro = novo2.idNovoFinanceiro WHERE novo.idNovoFinanceiro = financ.idFinanceiro AND baixa2.unificadoReparcelado = 1 AND baixa2.meioPagamento <> 17 AND NOT (baixa2.meioPagamento BETWEEN 20 AND 28) AND financ2.efetivado = 0)),0)),2) END' WHERE campoComposicaoCredito = 824;
UPDATE SICAMPOSCOMPOSICAOCREDITO SET campoSelect = 'CASE WHEN COALESCE((SELECT SUM (financ.valor) FROM MOFINANCEIROS financ WHERE financ.pessoa = pessoa.pessoa AND EXISTS (SELECT 1 FROM MOBAIXAXNOVOFINANCEIRO novo JOIN MOFINANCEIROXBAIXAS baixa ON baixa.idBaixaFinanceiro = novo.idBaixaFinanceiro JOIN MOBAIXAXNOVOFINANCEIRO novo2 ON novo2.idBaixaFinanceiro = novo.idBaixaFinanceiro JOIN MOFINANCEIROXBAIXAS baixa2 ON baixa2.idBaixaFinanceiro = novo2.idBaixaFinanceiro JOIN MOFINANCEIROS financ2 ON financ2.idFinanceiro = novo2.idNovoFinanceiro WHERE novo.idNovoFinanceiro = financ.idFinanceiro AND baixa.unificadoReparcelado = 1 AND baixa.meioPagamento <> 17 AND NOT (baixa.meioPagamento BETWEEN 20 AND 28) AND baixa2.unificadoReparcelado = 1 AND baixa2.meioPagamento <> 17 AND NOT (baixa2.meioPagamento BETWEEN 20 AND 28) AND financ2.efetivado = 0)),0) = 0 THEN 0 ELSE ROUND((100 * COALESCE((SELECT SUM (financ.valor - financ.saldo) FROM MOFINANCEIROS financ WHERE financ.pessoa = pessoa.pessoa AND EXISTS (SELECT 1 FROM MOBAIXAXNOVOFINANCEIRO novo JOIN MOFINANCEIROXBAIXAS baixa ON baixa.idBaixaFinanceiro = novo.idBaixaFinanceiro JOIN MOBAIXAXNOVOFINANCEIRO novo2 ON novo2.idBaixaFinanceiro = novo.idBaixaFinanceiro JOIN MOFINANCEIROXBAIXAS baixa2 ON baixa2.idBaixaFinanceiro = novo2.idBaixaFinanceiro JOIN MOFINANCEIROS financ2 ON financ2.idFinanceiro = novo2.idNovoFinanceiro WHERE novo.idNovoFinanceiro = financ.idFinanceiro AND baixa.unificadoReparcelado = 1 AND baixa.meioPagamento <> 17 AND NOT (baixa.meioPagamento BETWEEN 20 AND 28) AND baixa2.unificadoReparcelado = 1 AND baixa2.meioPagamento <> 17 AND NOT (baixa2.meioPagamento BETWEEN 20 AND 28) AND financ2.efetivado = 0)),0) / COALESCE((SELECT SUM (financ.valor) FROM MOFINANCEIROS financ WHERE financ.pessoa = pessoa.pessoa AND EXISTS (SELECT 1 FROM MOBAIXAXNOVOFINANCEIRO novo JOIN MOBAIXAXNOVOFINANCEIRO novo2 ON novo2.idBaixaFinanceiro = novo.idBaixaFinanceiro JOIN MOFINANCEIROXBAIXAS baixa2 ON baixa2.idBaixaFinanceiro = novo2.idBaixaFinanceiro JOIN MOFINANCEIROS financ2 ON financ2.idFinanceiro = novo2.idNovoFinanceiro WHERE novo.idNovoFinanceiro = financ.idFinanceiro AND baixa2.unificadoReparcelado = 1 AND baixa2.meioPagamento <> 17 AND NOT (baixa2.meioPagamento BETWEEN 20 AND 28) AND financ2.efetivado = 0)),0)),2) END' WHERE campoComposicaoCredito = 825;
UPDATE SICAMPOSCOMPOSICAOCREDITO SET campoSelect = 'CASE WHEN EXISTS (SELECT 1 FROM MOSPCREGISTROS spc JOIN MOFINANCEIROS financ ON financ.idFinanceiro = spc.idFinanceiro WHERE spc.pessoa = pessoa.pessoa AND spc.removidoSPC = 0 AND financ.desconsiderarSPC = 0) THEN 1 ELSE 0 END' WHERE campoComposicaoCredito = 250;
UPDATE SICAMPOSCOMPOSICAOCREDITO SET campoSelect = '(SELECT COALESCE(COUNT(1),0) FROM MOSPCREGISTROS spc JOIN MOFINANCEIROS financ ON financ.idFinanceiro = spc.idFinanceiro WHERE spc.pessoa = pessoa.pessoa AND spc.removidoSPC = 1 AND financ.desconsiderarSPC = 0)' WHERE campoComposicaoCredito = 322;
UPDATE SICAMPOSCOMPOSICAOCREDITO SET campoSelect = 'COALESCE((SELECT MAX(CASE WHEN financ.desconsiderarSPC = 0 AND EXISTS(SELECT 1 FROM MOSPCREGISTROS spc WHERE spc.idFinanceiro = financ.idFinanceiro) THEN 1 ELSE 0 END) FROM MOFINANCEIROS financ WHERE financ.pessoa = pessoa.pessoa AND financ.meioPagamento > 50 AND financ.operacaoFinanceira IN (21,22,32) AND (SELECT MAX(TRUNC(baixa.data)) FROM MOFINANCEIROXBAIXAS baixa WHERE baixa.idFinanceiro = financ.idFinanceiro) = (SELECT MAX(TRUNC(baixa.data)) FROM MOFINANCEIROXBAIXAS baixa JOIN MOFINANCEIROS financ2 ON financ2.idFinanceiro = baixa.idFinanceiro WHERE financ2.pessoa = financ.pessoa)),0)' WHERE campoComposicaoCredito = 323;

COMMIT;

INSERT INTO SICONFIGURACOES (configuracao, descricao, ativo, subcategoriaConfiguracao, tipoCampo, mascara, exibirCampo, tipoArquivo, conteudoSugestao, tabelaSistema, observacoes) values (396, 'Percentual máximo Desconto sobre nominal no recebimento crediário', 1, 40002, 'N', '3.2%', 'E', 0, '0', ' ', ' ');

COMMIT;

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

COMMIT;

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

/*
DROP TABLE CAGRADESPRODUTO_2203;
DROP TABLE CAPRODUTOS_2203;
*/