    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_entradaSaida,
      v_cab_estabelecimento,
      v_cab_dataEmissao,
      v_cab_dataEntrega,
      v_etOrc_situacaoOrcamento,
      0,
      v_item_sequencia,
      0,
      0,
      p_item_modeloDocumento,
      p_item_estabelecimentoOriginal,
      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);
    ELSIF p_tempComp_nomeTempComposicao <> ' ' THEN
      ADD_ORCAMENTO_ITEM_COMP_TEMP (
        p_uniqueMachineID,
        p_estabelecimentoAtivo,
        p_tempComp_nomeTempComposicao,
        p_tempComp_sequencia,
        r_idItemOrcamento);
    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_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);
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 a IN (
      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)
  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,
      a.idFormulaTinta,
      a.personalizacao,
      a.localEstoque,
      a.pessoaParticipante,
      a.quantidade,
      a.valorFreteTotal,
      a.valorSeguroTotal,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      0,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMSOperacao,
      a.valorICMSDiferido,
      a.valorICMS,
      a.valorICMSDesoneracao,
      a.valorICMSST,
      a.valorICMSSTAnteriormente,
      a.valorICMSUFDestinatario,
      a.valorICMSUFRemetente,
      a.valorFCP,
      a.valorFCPST,
      a.valorFCPSTAnteriormente,
      a.valorFCPUFDestinatario,
      a.valorLiquidoItem,
      a.produto,
      a.cor,
      a.tamanho,
      a.controleEstoque,
      a.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 a.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,
      a.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_CALC_IMP_ITENS (
    p_config_64_casasDecSaidas     IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_cab_orcamento                IN NUMBER,
    p_cab_origemDocumento          IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEntradaSaida         IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_cab_localDestinoOperacao     IN CHAR,
    p_cab_indicadorConsumidorFinal IN CHAR,
    p_cab_tipoPagamentoFrete       IN CHAR,
    p_pess_indicadorInscricaoEstad IN CHAR,
    /* Retornos */
    r_cab_valorProdutos            OUT NUMBER,
    r_cab_valorServicos            OUT NUMBER,
    r_cab_valorBasePagamento       OUT NUMBER,
    r_cab_valorAVistaMinimo        OUT NUMBER,
    r_cab_valorFreteTotal          OUT NUMBER,
    r_cab_valorSeguroTotal         OUT NUMBER,
    r_cab_valorDescontoTotal       OUT NUMBER,
    r_cab_valorOutrasDespesasTotal OUT NUMBER,
    r_cab_valorAdicFreteMarinTotal OUT NUMBER,
    r_cab_valorDespesasAduanTotal  OUT NUMBER,
    r_cab_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;
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 a IN (
      SELECT
        a.*,
        gradProd.produto,
        gradProd.cor,
        gradProd.tamanho,
        prod.controleEstoque,
        prod.tipoProduto,
        modDoc.geraFinanceiro modDoc_geraFinanceiro,
        modDoc.diminuiDescontoPrUnit,
        modDoc.somaAcrescimosPrUnit,
        modDoc.somaFreteSeguroPrUnit
      FROM MOORCAMENTOXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN PAMODELOSDOCUMENTO modDoc
      ON modDoc.modeloDocumento = a.modeloDocumento
      WHERE a.orcamento = p_cab_orcamento
      AND a.cancelado = 0
      ORDER BY a.sequencia)
  LOOP
    v_precoUnitario                := a.precoUnitario;
    v_precoUnitarioConvertido      := a.precoUnitarioConvertido;
    v_valorProdutoServico          := a.valorProdutoServico;
    v_valorBasePagamento           := a.valorBasePagamento;
    v_valorFreteTotal              := a.valorFreteTotal;
    v_valorSeguroTotal             := a.valorSeguroTotal;
    v_valorDescontoTotal           := a.valorDescontoTotal;
    v_valorOutrasDespesasTotal     := a.valorOutrasDespesasTotal;
    v_valorAdicFreteMarinMerTotal  := a.valorAdicFreteMarinhaMerTotal;
    v_valorDespesasAduaneirasTotal := a.valorDespesasAduaneirasTotal;
    v_baseISSQN                    := a.baseISSQN;
    v_valorISSQN                   := a.valorISSQN;
    v_baseIRRF                     := a.baseIRRF;
    v_valorIRRF                    := a.valorIRRF;
    v_baseINSS                     := a.baseINSS;
    v_valorINSS                    := a.valorINSS;
    v_baseRetPIS                   := a.baseRetPIS;
    v_valorRetPIS                  := a.valorRetPIS;
    v_baseRetCOFINS                := a.baseRetCOFINS;
    v_valorRetCOFINS               := a.valorRetCOFINS;
    v_baseRetCSLL                  := a.baseRetCSLL;
    v_valorRetCSLL                 := a.valorRetCSLL;
    v_baseII                       := a.baseII;
    v_valorII                      := a.valorII;
    v_baseIOF                      := a.baseIOF;
    v_valorIOF                     := a.valorIOF;
    v_baseIPI                      := a.baseIPI;
    v_valorIPI                     := a.valorIPI;
    v_basePIS                      := a.basePIS;
    v_valorPIS                     := a.valorPIS;
    v_basePISST                    := a.basePISST;
    v_valorPISST                   := a.valorPISST;
    v_baseCOFINS                   := a.baseCOFINS;
    v_valorCOFINS                  := a.valorCOFINS;
    v_baseCOFINSST                 := a.baseCOFINSST;
    v_valorCOFINSST                := a.valorCOFINSST;
    v_baseCreditoSimplesNacional   := a.baseCreditoSimplesNacional;
    v_valorCreditoSimplesNacional  := a.valorCreditoSimplesNacional;
    v_baseICMS                     := a.baseICMS;
    v_valorICMSOperacao            := a.valorICMSOperacao;
    v_valorICMSDiferido            := a.valorICMSDiferido;
    v_valorICMS                    := a.valorICMS;
    v_valorICMSDesoneracao         := a.valorICMSDesoneracao;
    v_baseICMSST                   := a.baseICMSST;
    v_valorICMSST                  := a.valorICMSST;
    v_baseICMSSTAnteriormente      := a.baseICMSSTAnteriormente;
    v_valorICMSSTAnteriormente     := a.valorICMSSTAnteriormente;
    v_valorICMSProprioSubstituto   := a.valorICMSProprioSubstituto;
    v_baseICMSEfetivo              := a.baseICMSEfetivo;
    v_valorICMSEfetivo             := a.valorICMSEfetivo;
    v_baseICMSUFDestinatario       := a.baseICMSUFDestinatario;
    v_valorICMSUFDestinatario      := a.valorICMSUFDestinatario;
    v_baseICMSUFRemetente          := a.baseICMSUFRemetente;
    v_valorICMSUFRemetente         := a.valorICMSUFRemetente;
    v_baseFCP                      := a.baseFCP;
    v_valorFCP                     := a.valorFCP;
    v_baseFCPST                    := a.baseFCPST;
    v_valorFCPST                   := a.valorFCPST;
    v_baseFCPSTAnteriormente       := a.baseFCPSTAnteriormente;
    v_valorFCPSTAnteriormente      := a.valorFCPSTAnteriormente;
    v_baseFCPUFDestinatario        := a.baseFCPUFDestinatario;
    v_valorFCPUFDestinatario       := a.valorFCPUFDestinatario;
    v_baseEstimadaImpostos         := a.baseEstimadaImpostos;
    v_valorEstimadoImpFederais     := a.valorEstimadoImpFederais;
    v_valorEstimadoImpEstaduais    := a.valorEstimadoImpEstaduais;
    v_valorEstimadoImpMunicipais   := a.valorEstimadoImpMunicipais;
    v_valorImpSomaPagamento        := a.valorImpostosSomaPagamento;
    v_valorImpDiminuiPagamento     := a.valorImpostosDiminuiPagamento;
    v_valorLiquidoItem             := a.valorLiquidoItem;
    ADD_CALCULA_TOTAIS_ITEM(
      p_cab_tipoPagamentoFrete,
      a.diminuiDescontoPrUnit,
      a.somaAcrescimosPrUnit,
      a.somaFreteSeguroPrUnit,
      a.quantidade,
      a.quantidadeConvertida,
      a.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao,
      a.precoUnitario,
      a.valorDescontoItem,
      a.valorAcrescimoItem,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorDescontoGeral,
      a.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      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_362_calcCustoPorGrade,
      p_cab_entradaSaida,
      0,
      p_cab_estabelecimento,
      0,
      p_cab_dataEntradaSaida,
      p_cab_pessoa,
      p_cab_localDestinoOperacao,
      p_cab_indicadorConsumidorFinal,
      p_cab_tipoPagamentoFrete,
      p_pess_indicadorInscricaoEstad,
      a.personalizacao,
      a.quantidade,
      a.precoPautaTabelado,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal,
      a.cfop,
      1,
      a.indicadorISSQN,
      a.aliquotaISSQN,
      v_baseISSQN,
      v_valorISSQN,
      1,
      a.aliquotaIRRF,
      v_baseIRRF,
      v_valorIRRF,
      1,
      a.aliquotaINSS,
      v_baseINSS,
      v_valorINSS,
      1,
      a.retencaoPIS,
      v_baseRetPIS,
      v_valorRetPIS,
      1,
      a.retencaoCOFINS,
      v_baseRetCOFINS,
      v_valorRetCOFINS,
      1,
      a.retencaoCSLL,
      v_baseRetCSLL,
      v_valorRetCSLL,
      1,
      a.aliquotaII,
      v_baseII,
      v_valorII,
      1,
      a.aliquotaIOF,
      v_baseIOF,
      v_valorIOF,
      1,
      a.aliquotaIPI,
      a.valorAliquotaIPI,
      v_baseIPI,
      v_valorIPI,
      0,
      1,
      a.aliquotaPIS,
      a.valorAliquotaPIS,
      v_basePIS,
      v_valorPIS,
      1,
      a.aliquotaPISST,
      a.valorAliquotaPISST,
      v_basePISST,
      v_valorPISST,
      1,
      a.aliquotaCOFINS,
      a.valorAliquotaCOFINS,
      v_baseCOFINS,
      v_valorCOFINS,
      1,
      a.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST,
      v_baseCOFINSST,
      v_valorCOFINSST,
      1,
      a.stSimplesNacional,
      a.creditoSimplesNacional,
      v_baseCreditoSimplesNacional,
      v_valorCreditoSimplesNacional,
      1,
      a.stICMS,
      a.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS,
      a.aliquotaICMS,
      a.diferimentoICMS,
      v_baseICMS,
      v_valorICMSOperacao,
      v_valorICMSDiferido,
      v_valorICMS,
      v_valorICMSDesoneracao,
      1,
      a.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST,
      a.reducaoBaseST,
      a.aliquotaICMSST,
      v_baseICMSST,
      v_valorICMSST,
      1,
      v_baseICMSSTAnteriormente,
      v_valorICMSSTAnteriormente,
      v_valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo,
      v_baseICMSEfetivo,
      v_valorICMSEfetivo,
      0,
      '  ',
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      1,
      a.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual,
      v_baseICMSUFDestinatario,
      v_valorICMSUFDestinatario,
      v_baseICMSUFRemetente,
      v_valorICMSUFRemetente,
      1,
      a.aliquotaFCP,
      v_baseFCP,
      v_valorFCP,
      a.aliquotaFCPST,
      v_baseFCPST,
      v_valorFCPST,
      a.aliquotaFCPSTAnteriormente,
      v_baseFCPSTAnteriormente,
      v_valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario,
      v_baseFCPUFDestinatario,
      v_valorFCPUFDestinatario,
      1,
      a.aliquotaEstimadaImpFederais,
      a.aliquotaEstimadaImpEstaduais,
      a.aliquotaEstimadaImpMunicipais,
      v_baseEstimadaImpostos,
      v_valorEstimadoImpFederais,
      v_valorEstimadoImpEstaduais,
      v_valorEstimadoImpMunicipais,
      a.produto,
      a.cor,
      a.tamanho,
      a.controleEstoque,
      a.tipoProduto,
      /* 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 (
      p_cab_origemDocumento,
      0,
      p_cab_tipoPagamentoFrete,
      a.geraFinanceiro,
      v_valorProdutoServico,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.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,
      a.modDoc_geraFinanceiro,
      /* 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           = a.idItemOrcamento;
    IF a.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 a.usarPrecoAVista = 1 AND a.geraFinanceiro = 1 THEN
      r_cab_valorAVistaMinimo        := r_cab_valorAVistaMinimo + v_valorProdutoServico + a.valorDescontoPagamento - a.valorOutrasDespesasPagamento - a.valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
    END IF;
    r_cab_valorFreteTotal          := r_cab_valorFreteTotal + v_valorFreteTotal;
    r_cab_valorSeguroTotal         := r_cab_valorSeguroTotal + v_valorSeguroTotal;
    r_cab_valorDescontoTotal       := r_cab_valorDescontoTotal + v_valorDescontoTotal;
    r_cab_valorOutrasDespesasTotal := r_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
    r_cab_valorAdicFreteMarinTotal := r_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
    r_cab_valorDespesasAduanTotal  := r_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
    r_cab_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_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;
BEGIN
  FOR a IN (
    SELECT a.*,
      pess.indicadorInscricaoEstadual,
      COALESCE((
        SELECT MIN(munEndEst.uf)
        FROM PAESTABELECIMENTOS est
        JOIN CAENDERECOSPESSOA endEst
        ON endEst.pessoa = est.pessoaEstabelecimento
        JOIN SIMUNICIPIOS munEndEst
        ON munEndEst.municipio = endEst.municipio
        WHERE est.estabelecimento = a.estabelecimento
        AND endEst.ativo = 1
        AND endEst.principal = 1
        ),'  ') munEndEst_uf
    FROM MOORCAMENTOS a
    JOIN CAPESSOAS pess
    ON pess.pessoa = a.pessoa
    WHERE a.orcamento = p_cab_orcamento)
  LOOP
    v_cab_valorProdutos            := a.valorProdutos;
    v_cab_valorServicos            := a.valorServicos;
    v_cab_valorBasePagamento       := a.valorBasePagamento;
    v_cab_valorAVistaMinimo        := a.valorAVistaMinimo;
    v_cab_valorFreteTotal          := a.valorFreteTotal;
    v_cab_valorSeguroTotal         := a.valorSeguroTotal;
    v_cab_valorDescontoTotal       := a.valorDescontoTotal;
    v_cab_valorOutrasDespesasTotal := a.valorOutrasDespesasTotal;
    v_cab_valorAdicFreteMarinTotal := a.valorAdicFreteMarinhaMerTotal;
    v_cab_valorDespesasAduanTotal  := a.valorDespesasAduaneirasTotal;
    v_cab_valorImpSomaPagamento    := a.valorImpostosSomaPagamento;
    v_cab_valorImpDiminuiPagamento := a.valorImpostosDiminuiPagamento;
    v_cab_valorLiquidoItem         := a.valorLiquidoItem;
    ADD_ORCAMENTO_CALC_IMP_RATEIO (
      a.orcamento,
      p_troca_tipoPagamentoFrete,
      p_a_cab_tipoPagamentoFrete,
      a.origemDocumento,
      a.modeloDocumento,
      a.entradaSaida,
      a.atualizaCustoMedio,
      a.tipoPagamentoFrete,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorDescontoGeral,
      a.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      a.impostosEditados,
      /* Retornos */
      v_cab_valorProdutos,
      v_cab_valorServicos,
      v_cab_valorBasePagamento,
      v_cab_valorAVistaMinimo,
      v_cab_valorFreteTotal,
      v_cab_valorSeguroTotal,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespesasTotal,
      v_cab_valorAdicFreteMarinTotal,
      v_cab_valorDespesasAduanTotal,
      v_cab_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_362_calcCustoPorGrade,
        a.orcamento,
        a.origemDocumento,
        a.entradaSaida,
        a.estabelecimento,
        a.dataEmissao,
        a.pessoa,
        a.localDestinoOperacao,
        a.indicadorConsumidorFinal,
        a.tipoPagamentoFrete,
        a.indicadorInscricaoEstadual,
        /* Retornos */
        v_cab_valorProdutos,
        v_cab_valorServicos,
        v_cab_valorBasePagamento,
        v_cab_valorAVistaMinimo,
        v_cab_valorFreteTotal,
        v_cab_valorSeguroTotal,
        v_cab_valorDescontoTotal,
        v_cab_valorOutrasDespesasTotal,
        v_cab_valorAdicFreteMarinTotal,
        v_cab_valorDespesasAduanTotal,
        v_cab_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                 = a.orcamento;
  END LOOP;
END ADD_ORCAMENTO_CALC_IMP_CAB;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_FIL_KIT(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_bufferIdProdutoFilho         IN VARCHAR2,
    p_estabelecimentoAtivo         IN NUMBER,
    p_cab_atualizaCustoMedio       IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEmissao              IN DATE,
    p_cab_dataEntradaSaida         IN DATE,
    p_item_idItemPreDocumento      IN NUMBER,
    p_item_gradeProduto            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_item_valorCustoOperacao      IN NUMBER,
    p_item_observacoes             IN VARCHAR2,
    p_endEst_idEnderecoEstoquePreD IN NUMBER,
    p_idEnderecoEstoque            IN NUMBER,
    p_locEst_indicProprPosseItem   IN CHAR,
    r_bufferIdProdutoFilho         OUT VARCHAR2)
IS  
  v_quantidadeNumerosSerie NUMBER;
  v_quantidadeRateioTotal  NUMBER;
  v_quantSaldoRateioTotal  NUMBER;
  v_valorSaldoRateioTotal  NUMBER;
  v_valorCustoManter       NUMBER;
  v_precoCustoKit          NUMBER;
  v_valorCustoKit          NUMBER;
BEGIN
  r_bufferIdProdutoFilho := p_bufferIdProdutoFilho;
  IF p_cab_atualizaCustoMedio = 1 THEN
    SELECT COALESCE(SUM(ROUND(p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida)),0)
    INTO v_quantidadeRateioTotal
    FROM CAGRADEPRODUTOXKITSCOMBOS a
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = a.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE a.gradeProduto = p_item_gradeProduto
    AND a.ativo = 1
    AND a.manterUltimoCusto = 0
    AND a.gradeProduto <> a.gradeProdutoFilho;
    SELECT ROUND((COALESCE(SUM(ROUND(p_item_quantidade * a.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,
          p_item_pessoaParticipante,
          gradProdFilho.produto,
          0,
          ' ',
          p_locEst_indicProprPosseItem,
          0)),0)),2)
    INTO v_valorCustoManter
    FROM CAGRADEPRODUTOXKITSCOMBOS a 
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = a.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE a.gradeProduto = p_item_gradeProduto
    AND a.ativo = 1
    AND a.manterUltimoCusto = 1
    AND a.gradeProduto <> a.gradeProdutoFilho;
  ELSE
    v_quantidadeRateioTotal := 0;
    v_valorCustoManter      := 0;
  END IF;
  v_quantSaldoRateioTotal := v_quantidadeRateioTotal;
  v_valorSaldoRateioTotal := p_item_valorCustoOperacao - v_valorCustoManter;
  FOR a IN (
    SELECT 
      a.gradeProdutoFilho,
      a.manterUltimoCusto,
      gradProdFilho.produto,
      prodFilho.controleEstoque,
      prodFilho.controlaNumeroSerie,
      ROUND(p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida) quantidade
    FROM CAGRADEPRODUTOXKITSCOMBOS a
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = a.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE a.gradeProduto = p_item_gradeProduto
    AND a.ativo = 1
    AND a.gradeProduto <> a.gradeProdutoFilho
    AND ROUND(p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida) > 0)
  LOOP  
    IF p_cab_atualizaCustoMedio = 1 AND a.manterUltimoCusto = 1 THEN
      v_precoCustoKit := FUNC_ADD_BUSCA_PRECO_ULT_CUSTO(
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          TO_DATE ('01/01/1900','DD/MM/YYYY'),
          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,
          p_item_pessoaParticipante,
          a.produto,
          0,
          ' ',
          p_locEst_indicProprPosseItem,
          0);
      v_valorCustoKit := ROUND (a.quantidade * v_precoCustoKit,2);
    ELSIF p_cab_atualizaCustoMedio = 1 AND p_item_valorCustoOperacao > v_valorCustoManter AND v_quantSaldoRateioTotal > a.quantidade THEN
      v_valorCustoKit := ROUND((p_item_valorCustoOperacao - v_valorCustoManter) * a.quantidade / v_quantidadeRateioTotal,2);
      v_precoCustoKit := ROUND(v_valorCustoKit / a.quantidade,7);
      v_quantSaldoRateioTotal := v_quantSaldoRateioTotal - a.quantidade;
      v_valorSaldoRateioTotal := v_valorSaldoRateioTotal - v_valorCustoKit;
    ELSIF p_cab_atualizaCustoMedio = 1 AND v_valorSaldoRateioTotal > 0 THEN
      v_valorCustoKit := v_valorSaldoRateioTotal;
      v_precoCustoKit := ROUND(v_valorCustoKit / a.quantidade,7);
      v_quantSaldoRateioTotal := 0;
      v_valorSaldoRateioTotal := 0;
    ELSE
      v_precoCustoKit := 0;
      v_valorCustoKit := 0;
    END IF;
    IF a.controleEstoque IN (3,4) THEN
      ADD_PRE_DOC_ITEM_FIL_KIT(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_item_idItemPreDocumento,
        a.gradeProdutoFilho,
        p_item_pessoaParticipante,
        a.quantidade,
        v_valorCustoKit,
        p_item_observacoes,
        p_endEst_idEnderecoEstoquePreD,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        r_bufferIdProdutoFilho);
    ELSIF a.controleEstoque IN(1,5,11,12) THEN
      v_quantidadeNumerosSerie := 0;
      IF a.controlaNumeroSerie > 0 THEN
        ADD_PRE_DOC_ITEM_FIL_N_SERIE(
          r_bufferIdProdutoFilho,
          p_estabelecimentoAtivo,
          p_item_idItemPreDocumento,
          a.gradeProdutoFilho,
          0, -- p_item_personalizacao
          0, -- p_item_idLoteEstoque
          v_precoCustoKit, -- p_item_precoCustoOperacao,
          0, -- p_item_precoCMV,
          p_item_observacoes,
          p_endEst_idEnderecoEstoquePreD,
          p_idEnderecoEstoque,
          r_bufferIdProdutoFilho,
          v_quantidadeNumerosSerie);
      END IF;    
      IF a.quantidade > v_quantidadeNumerosSerie THEN
        ADD_PRE_DOC_ITEM_FIL_INSERE(
          r_bufferIdProdutoFilho,
          p_estabelecimentoAtivo,
          p_item_idItemPreDocumento,
          a.gradeProdutoFilho,
          0, -- p_personalizacao
          0, -- p_idLoteEstoque
          p_idEnderecoEstoque,
          0, -- p_idNumeroSerie
          a.quantidade - v_quantidadeNumerosSerie,
          v_precoCustoKit, -- p_precoCustoOperacao
          CASE WHEN v_quantidadeNumerosSerie = 0 THEN v_valorCustoKit WHEN a.quantidade = 0 THEN 0 ELSE ROUND ((v_valorCustoKit * (a.quantidade - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_totalCustoOperacao
          0, -- p_precoCMV
          0, -- p_valorCMV
          p_item_observacoes,
          r_bufferIdProdutoFilho);
      END IF;    
    END IF;
  END LOOP;
END ADD_PRE_DOC_ITEM_FIL_KIT;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_FIL_PROD_TIN(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_bufferIdProdutoFilho         IN VARCHAR2,
    p_estabelecimentoAtivo         IN NUMBER,
    p_cab_atualizaCustoMedio       IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEmissao              IN DATE,
    p_cab_dataEntradaSaida         IN DATE,
    p_idItemPreDocumento           IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_item_observacoes             IN VARCHAR2,
    p_endEst_idEnderecoEstoquePreD IN NUMBER,
    p_idEnderecoEstoque            IN NUMBER,
    p_locEst_indicProprPosseItem   IN CHAR,
    p_tinta_gradeProduto           IN NUMBER,
    p_tinta_quantidade             IN NUMBER,
    r_bufferIdProdutoFilho         OUT VARCHAR2)
IS  
BEGIN
  r_bufferIdProdutoFilho := p_bufferIdProdutoFilho;
  FOR a IN (
    SELECT 
      prod.controleEstoque,
      ROUND(p_item_quantidade * p_tinta_quantidade / 900, uniMed.casasDecimaisUnidadeMedida) quantidade
    FROM CAGRADESPRODUTO gradProd 
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN SIUNIDADESMEDIDA uniMed
    ON uniMed.unidadeMedida = prod.unidadeMedida
    WHERE gradProd.gradeProduto = p_tinta_gradeProduto
    AND ROUND(p_item_quantidade * p_tinta_quantidade / 900, uniMed.casasDecimaisUnidadeMedida) > 0)
  LOOP
    IF a.controleEstoque IN (3,4) THEN
      ADD_PRE_DOC_ITEM_FIL_KIT(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_idItemPreDocumento,
        p_tinta_gradeProduto,
        p_item_pessoaParticipante,
        a.quantidade,
        0, --p_item_valorCustoOperacao
        p_item_observacoes,
        p_endEst_idEnderecoEstoquePreD,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        r_bufferIdProdutoFilho);
    ELSIF a.controleEstoque IN(1,5,11,12) THEN
      ADD_PRE_DOC_ITEM_FIL_INSERE(
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_idItemPreDocumento,
        p_tinta_gradeProduto,
        0, -- p_personalizacao
        0, -- p_idLoteEstoque
        p_idEnderecoEstoque,
        0, -- p_idNumeroSerie
        a.quantidade,
        0, -- p_precoCustoOperacao,
        0, -- p_totalCustoOperacao,
        0, -- p_precoCMV,
        0, -- p_valorCMV,
        p_item_observacoes,
        r_bufferIdProdutoFilho);
    END IF;    
  END LOOP;
END ADD_PRE_DOC_ITEM_FIL_PROD_TIN;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_FIL_FORM_TIN(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_bufferIdProdutoFilho         IN VARCHAR2,
    p_estabelecimentoAtivo         IN NUMBER,
    p_cab_atualizaCustoMedio       IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEmissao              IN DATE,
    p_cab_dataEntradaSaida         IN DATE,
    p_idItemPreDocumento           IN NUMBER,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_item_observacoes             IN VARCHAR2,
    p_endEst_idEnderecoEstoquePreD IN NUMBER,
    p_idEnderecoEstoque            IN NUMBER,
    p_locEst_indicProprPosseItem   IN CHAR,
    r_bufferIdProdutoFilho         OUT VARCHAR2)
IS
BEGIN
  r_bufferIdProdutoFilho := p_bufferIdProdutoFilho;
  FOR a IN (
    SELECT 
      a.idBaseTinta,
      baseTinta.gradeProduto,
      a.idColoranteTintaA,
      a.quantidadeA,
      COALESCE(colTintaA.gradeProduto,0) gradeProdutoA,
      a.idColoranteTintaB,
      a.quantidadeB,
      COALESCE(colTintaB.gradeProduto,0) gradeProdutoB,
      a.idColoranteTintaC,
      a.quantidadeC,
      COALESCE(colTintaC.gradeProduto,0) gradeProdutoC,
      a.idColoranteTintaD,
      a.quantidadeD,
      COALESCE(colTintaD.gradeProduto,0) gradeProdutoD,
      a.idColoranteTintaE,
      a.quantidadeE,
      COALESCE(colTintaE.gradeProduto,0) gradeProdutoE,
      a.idColoranteTintaF,
      a.quantidadeF,
      COALESCE(colTintaF.gradeProduto,0) gradeProdutoF,
      a.idColoranteTintaG,
      a.quantidadeG,
      COALESCE(colTintaG.gradeProduto,0) gradeProdutoG,
      a.idColoranteTintaH,
      a.quantidadeH,
      COALESCE(colTintaH.gradeProduto,0) gradeProdutoH,
      a.idColoranteTintaI,
      a.quantidadeI,
      COALESCE(colTintaI.gradeProduto,0) gradeProdutoI,
      a.idColoranteTintaJ,
      a.quantidadeJ,
      COALESCE(colTintaJ.gradeProduto,0) gradeProdutoJ,
      a.idColoranteTintaK,
      a.quantidadeK,
      COALESCE(colTintaK.gradeProduto,0) gradeProdutoK,
      a.idColoranteTintaL,
      a.quantidadeL,
      COALESCE(colTintaL.gradeProduto,0) gradeProdutoL,
      a.idColoranteTintaM,
      a.quantidadeM,
      COALESCE(colTintaM.gradeProduto,0) gradeProdutoM,
      a.idColoranteTintaN,
      a.quantidadeN,
      COALESCE(colTintaN.gradeProduto,0) gradeProdutoN,
      a.idColoranteTintaO,
      a.quantidadeO,
      COALESCE(colTintaO.gradeProduto,0) gradeProdutoO
    FROM CAFORMULASTINTAS a
    JOIN CABASESTINTAS baseTinta
    ON baseTinta.idBaseTinta = a.idBaseTinta
    JOIN CACOLORANTESTINTAS colTintaA
    ON colTintaA.idColoranteTinta = a.idColoranteTintaA
    JOIN CACOLORANTESTINTAS colTintaB
    ON colTintaB.idColoranteTinta = a.idColoranteTintaB
    JOIN CACOLORANTESTINTAS colTintaC
    ON colTintaC.idColoranteTinta = a.idColoranteTintaC
    JOIN CACOLORANTESTINTAS colTintaD
    ON colTintaD.idColoranteTinta = a.idColoranteTintaD
    JOIN CACOLORANTESTINTAS colTintaE
    ON colTintaE.idColoranteTinta = a.idColoranteTintaE
    JOIN CACOLORANTESTINTAS colTintaF
    ON colTintaF.idColoranteTinta = a.idColoranteTintaF
    JOIN CACOLORANTESTINTAS colTintaG
    ON colTintaG.idColoranteTinta = a.idColoranteTintaG
    JOIN CACOLORANTESTINTAS colTintaH
    ON colTintaH.idColoranteTinta = a.idColoranteTintaH
    JOIN CACOLORANTESTINTAS colTintaI
    ON colTintaI.idColoranteTinta = a.idColoranteTintaI
    JOIN CACOLORANTESTINTAS colTintaJ
    ON colTintaJ.idColoranteTinta = a.idColoranteTintaJ
    JOIN CACOLORANTESTINTAS colTintaK
    ON colTintaK.idColoranteTinta = a.idColoranteTintaK
    JOIN CACOLORANTESTINTAS colTintaL
    ON colTintaL.idColoranteTinta = a.idColoranteTintaL
    JOIN CACOLORANTESTINTAS colTintaM
    ON colTintaM.idColoranteTinta = a.idColoranteTintaM
    JOIN CACOLORANTESTINTAS colTintaN
    ON colTintaN.idColoranteTinta = a.idColoranteTintaN
    JOIN CACOLORANTESTINTAS colTintaO
    ON colTintaO.idColoranteTinta = a.idColoranteTintaO
    WHERE a.idFormulaTinta = p_item_idFormulaTinta
    AND a.idBaseTinta > 0
    AND baseTinta.gradeProduto > 0)
  LOOP
    ADD_PRE_DOC_ITEM_FIL_PROD_TIN(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      r_bufferIdProdutoFilho,
      p_estabelecimentoAtivo,
      p_cab_atualizaCustoMedio,
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_cab_dataEntradaSaida,
      p_idItemPreDocumento,
      p_item_pessoaParticipante,
      p_item_quantidade,
      p_item_observacoes,
      p_endEst_idEnderecoEstoquePreD,
      p_idEnderecoEstoque,
      p_locEst_indicProprPosseItem,
      a.gradeProduto,
      900, -- p_tinta_quantidade,
      r_bufferIdProdutoFilho);    
    IF a.idColoranteTintaA > 0
      AND a.gradeProdutoA > 0
      AND a.quantidadeA > 0
    THEN
      ADD_PRE_DOC_ITEM_FIL_PROD_TIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_idItemPreDocumento,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_endEst_idEnderecoEstoquePreD,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoA,
        a.quantidadeA,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaB > 0
      AND a.gradeProdutoB > 0
      AND a.quantidadeB > 0
    THEN
      ADD_PRE_DOC_ITEM_FIL_PROD_TIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_idItemPreDocumento,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_endEst_idEnderecoEstoquePreD,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoB,
        a.quantidadeB,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaC > 0
      AND a.gradeProdutoC > 0
      AND a.quantidadeC > 0
    THEN
      ADD_PRE_DOC_ITEM_FIL_PROD_TIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_idItemPreDocumento,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_endEst_idEnderecoEstoquePreD,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoC,
        a.quantidadeC,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaD > 0
      AND a.gradeProdutoD > 0
      AND a.quantidadeD > 0
    THEN
      ADD_PRE_DOC_ITEM_FIL_PROD_TIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_idItemPreDocumento,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_endEst_idEnderecoEstoquePreD,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoD,
        a.quantidadeD,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaE > 0
      AND a.gradeProdutoE > 0
      AND a.quantidadeE > 0
    THEN
      ADD_PRE_DOC_ITEM_FIL_PROD_TIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_idItemPreDocumento,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_endEst_idEnderecoEstoquePreD,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoE,
        a.quantidadeE,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaF > 0
      AND a.gradeProdutoF > 0
      AND a.quantidadeF > 0
    THEN
      ADD_PRE_DOC_ITEM_FIL_PROD_TIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_idItemPreDocumento,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_endEst_idEnderecoEstoquePreD,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoF,
        a.quantidadeF,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaG > 0
      AND a.gradeProdutoG > 0
      AND a.quantidadeG > 0
    THEN
      ADD_PRE_DOC_ITEM_FIL_PROD_TIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_idItemPreDocumento,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_endEst_idEnderecoEstoquePreD,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoG,
        a.quantidadeG,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaH > 0
      AND a.gradeProdutoH > 0
      AND a.quantidadeH > 0
    THEN
      ADD_PRE_DOC_ITEM_FIL_PROD_TIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_idItemPreDocumento,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_endEst_idEnderecoEstoquePreD,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoH,
        a.quantidadeH,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaI > 0
      AND a.gradeProdutoI > 0
      AND a.quantidadeI > 0
    THEN
      ADD_PRE_DOC_ITEM_FIL_PROD_TIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_idItemPreDocumento,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_endEst_idEnderecoEstoquePreD,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoI,
        a.quantidadeI,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaJ > 0
      AND a.gradeProdutoJ > 0
      AND a.quantidadeJ > 0
    THEN
      ADD_PRE_DOC_ITEM_FIL_PROD_TIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_idItemPreDocumento,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_endEst_idEnderecoEstoquePreD,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoJ,
        a.quantidadeJ,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaK > 0
      AND a.gradeProdutoK > 0
      AND a.quantidadeK > 0
    THEN
      ADD_PRE_DOC_ITEM_FIL_PROD_TIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_idItemPreDocumento,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_endEst_idEnderecoEstoquePreD,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoK,
        a.quantidadeK,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaL > 0
      AND a.gradeProdutoL > 0
      AND a.quantidadeL > 0
    THEN
      ADD_PRE_DOC_ITEM_FIL_PROD_TIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_idItemPreDocumento,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_endEst_idEnderecoEstoquePreD,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoL,
        a.quantidadeL,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaM > 0
      AND a.gradeProdutoM > 0
      AND a.quantidadeM > 0
    THEN
      ADD_PRE_DOC_ITEM_FIL_PROD_TIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_idItemPreDocumento,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_endEst_idEnderecoEstoquePreD,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoM,
        a.quantidadeM,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaN > 0
      AND a.gradeProdutoN > 0
      AND a.quantidadeN > 0
    THEN
      ADD_PRE_DOC_ITEM_FIL_PROD_TIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_idItemPreDocumento,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_endEst_idEnderecoEstoquePreD,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoN,
        a.quantidadeN,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaO > 0
      AND a.gradeProdutoO > 0
      AND a.quantidadeO > 0
    THEN
      ADD_PRE_DOC_ITEM_FIL_PROD_TIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_idItemPreDocumento,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_endEst_idEnderecoEstoquePreD,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoO,
        a.quantidadeO,
        r_bufferIdProdutoFilho);
    END IF;
  END LOOP;
END ADD_PRE_DOC_ITEM_FIL_FORM_TIN;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_FIL_ENDERECO(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_bufferIdProdutoFilho         IN VARCHAR2,
    p_estabelecimentoAtivo         IN NUMBER,
    p_cab_atualizaCustoMedio       IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEmissao              IN DATE,
    p_cab_dataEntradaSaida         IN DATE,
    p_item_idItemPreDocumento      IN NUMBER,
    p_item_gradeProduto            IN NUMBER,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_item_valorCustoOperacao      IN NUMBER,
    p_item_observacoes             IN VARCHAR2,
    p_prod_controleEstoque         IN NUMBER,
    p_locEst_indicProprPosseItem   IN CHAR,
    r_bufferIdProdutoFilho         OUT VARCHAR2,
    r_quantidadeEnderecoEstoque    OUT NUMBER)
IS
  v_quantidadeNumerosSerie NUMBER (14,0);
BEGIN
  r_bufferIdProdutoFilho      := p_bufferIdProdutoFilho;
  r_quantidadeEnderecoEstoque := 0;
  FOR a IN (
    SELECT idEnderecoEstoque,
      idEnderecoEstoquePreDocumento,
      quantidade
    FROM MOPREDOCUMXENDERECOESTOQ
    WHERE idItemPreDocumento = p_item_idItemPreDocumento
    AND quantidade > 0)
  LOOP
    r_quantidadeEnderecoEstoque := r_quantidadeEnderecoEstoque + a.quantidade;
    IF p_prod_controleEstoque = 12 AND p_item_idFormulaTinta > 0 THEN
      ADD_PRE_DOC_ITEM_FIL_FORM_TIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho, 
        p_estabelecimentoAtivo, 
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_item_idItemPreDocumento,
        p_item_idFormulaTinta,
        p_item_pessoaParticipante,
        a.quantidade,
        p_item_observacoes,
        a.idEnderecoEstoquePreDocumento,
        a.idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        r_bufferIdProdutoFilho);
    ELSIF p_prod_controleEstoque IN (3,4) THEN
      ADD_PRE_DOC_ITEM_FIL_KIT(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_item_idItemPreDocumento,
        p_item_gradeProduto,
        p_item_pessoaParticipante,
        a.quantidade,
        CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCustoOperacao * (a.quantidade - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
        p_item_observacoes,
        a.idEnderecoEstoquePreDocumento,
        a.idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        r_bufferIdProdutoFilho);
    END IF;
  END LOOP;
END ADD_PRE_DOC_ITEM_FIL_ENDERECO;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_FIL_GRAVA(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_bufferIdProdutoFilho         IN VARCHAR2,
    p_estabelecimentoAtivo         IN NUMBER,
    p_cab_atualizaCustoMedio       IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEmissao              IN DATE,
    p_cab_dataEntradaSaida         IN DATE,
    p_item_idItemPreDocumento      IN NUMBER,
    p_item_gradeProduto            IN NUMBER,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_item_valorCustoOperacao      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,
    r_bufferIdProdutoFilho         OUT VARCHAR2)
IS
  v_quantidadeEnderecoEstoque NUMBER (14,0);
  v_quantidadeNumerosSerie    NUMBER (14,0);
BEGIN
  r_bufferIdProdutoFilho      := p_bufferIdProdutoFilho;
  v_quantidadeEnderecoEstoque := 0;
  v_quantidadeNumerosSerie    := 0;
  IF p_estXLoc_solicitaEnderecoEst = 1 AND p_prod_controleEstoque IN (3,4,12) THEN
    ADD_PRE_DOC_ITEM_FIL_ENDERECO(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      r_bufferIdProdutoFilho,
      p_estabelecimentoAtivo,
      p_cab_atualizaCustoMedio,
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_cab_dataEntradaSaida,
      p_item_idItemPreDocumento,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_pessoaParticipante,
      p_item_quantidade,
      p_item_valorCustoOperacao,
      p_item_observacoes,
      p_prod_controlaNumeroSerie,
      p_prod_controleEstoque,
      r_bufferIdProdutoFilho,
      v_quantidadeEnderecoEstoque);
  END IF;
  IF p_item_quantidade > v_quantidadeEnderecoEstoque THEN
    IF p_prod_controleEstoque = 12 AND p_item_idFormulaTinta > 0 THEN
      ADD_PRE_DOC_ITEM_FIL_FORM_TIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho, 
        p_estabelecimentoAtivo, 
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_item_idItemPreDocumento,
        p_item_idFormulaTinta,
        p_item_pessoaParticipante,
        p_item_quantidade - v_quantidadeEnderecoEstoque,
        p_item_observacoes,
        0, -- p_endEst_idEnderecoEstoquePreD,
        0, -- p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        r_bufferIdProdutoFilho);
    ELSIF p_prod_controleEstoque IN (3,4) THEN
      ADD_PRE_DOC_ITEM_FIL_KIT(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo, 
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_item_idItemPreDocumento,
        p_item_gradeProduto,
        p_item_pessoaParticipante,
        p_item_quantidade - v_quantidadeEnderecoEstoque,
        CASE WHEN v_quantidadeEnderecoEstoque = 0 THEN p_item_valorCustoOperacao WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCustoOperacao * (p_item_quantidade - v_quantidadeEnderecoEstoque) / p_item_quantidade), 2) END,
        p_item_observacoes,
        0, -- p_endEst_idEnderecoEstoquePreD
        0, -- p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        r_bufferIdProdutoFilho);
    END IF;
  END IF;
END ADD_PRE_DOC_ITEM_FIL_GRAVA;

/

create or replace PROCEDURE ADD_PRE_DOC_ITEM_FIL_ATUALIZA(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_idItemPreDocumento           IN NUMBER,
    p_estabelecimentoAtivo         IN NUMBER)
IS
  v_bufferIdProdutoFilho VARCHAR2 (32000);
BEGIN
  v_bufferIdProdutoFilho := '';
  FOR a IN (
    SELECT id
    FROM MOPREDOCUMXPRODUTOFILHO
    WHERE idItemPreDocumento = p_idItemPreDocumento
    ORDER BY id)
  LOOP
    v_bufferIdProdutoFilho :=
      CASE
        WHEN v_bufferIdProdutoFilho IS NULL
          OR v_bufferIdProdutoFilho = ''
          OR v_bufferIdProdutoFilho = ' '
        THEN ''
        ELSE RTRIM (v_bufferIdProdutoFilho) || ';'
      END
      || TO_CHAR (LPAD(a.id,14,'0'));
    DELETE MOPREDOCUMXPRODUTOFILHO b
    WHERE b.id = a.id;
  END LOOP;
  FOR a IN (
    SELECT 
      cab.atualizaCustoMedio,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      item.idItemPreDocumento,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.pessoaParticipante,
      item.quantidade,
      item.valorCustoOperacao,
      item.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem locEst_indicProprPosseItem,
      COALESCE (estXLoc.solicitaEnderecoEstoque,0) estXLoc_solicitaEnderecoEst
    FROM MOPREDOCUMXITENS item
    JOIN MOPREDOCUMENTOS cab
    ON cab.preDocumento = item.preDocumento
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = item.localEstoque
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc
    ON estXLoc.estabelecimento = cab.estabelecimento
    AND estXLoc.localEstoque = item.localEstoque
    WHERE item.idItemPreDocumento = p_idItemPreDocumento
    AND item.cancelado = 0
    AND item.quantidade > 0
    AND cab.statusPreDocumento IN ('A','F'))
  LOOP
    ADD_PRE_DOC_ITEM_FIL_GRAVA(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_bufferIdProdutoFilho,
      p_estabelecimentoAtivo,
      a.atualizaCustoMedio,
      a.estabelecimento,
      a.dataEmissao,
      a.dataEntradaSaida,
      a.idItemPreDocumento,
      a.gradeProduto,
      a.idFormulaTinta,
      a.personalizacao,
      a.pessoaParticipante,
      a.quantidade,
      a.valorCustoOperacao,
      a.observacoes,
      a.controlaNumeroSerie,
      a.controleEstoque,
      a.locEst_indicProprPosseItem,
      a.estXLoc_solicitaEnderecoEst,
      v_bufferIdProdutoFilho);
  END LOOP;
END ADD_PRE_DOC_ITEM_FIL_ATUALIZA;

/

create or replace PROCEDURE ADD_PRE_DOC_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_idItemPreDocumento      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_idEnderecoEstoquePreD 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;
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  IF p_cab_atualizaCustoMedio = 1 THEN
    SELECT COALESCE(SUM(ROUND(p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida)),0)
    INTO v_quantidadeRateioTotal
    FROM CAGRADEPRODUTOXKITSCOMBOS a 
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = a.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE a.gradeProduto = p_item_gradeProduto
    AND a.ativo = 1
    AND a.manterUltimoCusto = 0
    AND a.gradeProduto <> a.gradeProdutoFilho;
    SELECT ROUND((COALESCE(SUM(ROUND(p_item_quantidade * a.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,
          p_item_pessoaParticipante,
          gradProdFilho.produto,
          gradProdFilho.cor,
          gradProdFilho.tamanho,
          p_locEst_indicProprPosseItem,
          0)),0)),2)
    INTO v_valorCustoManter
    FROM CAGRADEPRODUTOXKITSCOMBOS a
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = a.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE a.gradeProduto = p_item_gradeProduto
    AND a.ativo = 1
    AND a.manterUltimoCusto = 1
    AND a.gradeProduto <> a.gradeProdutoFilho;
  ELSE
    v_quantidadeRateioTotal := 0;
    v_valorCustoManter      := 0;
  END IF;
  v_quantSaldoRateioTotal := v_quantidadeRateioTotal;
  v_valorSaldoRateioTotal := p_item_valorCustoOperacao - v_valorCustoManter;
  FOR a IN (
    SELECT 
      a.gradeProdutoFilho,
      a.manterUltimoCusto,
      gradProdFilho.produto,
      gradProdFilho.cor,
      gradProdFilho.tamanho,
      prodFilho.controleEstoque,
      prodFilho.controlaNumeroSerie,
      ROUND(p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida) quantidade
    FROM CAGRADEPRODUTOXKITSCOMBOS a
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = a.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE a.gradeProduto = p_item_gradeProduto
    AND a.ativo = 1
    AND a.gradeProduto <> a.gradeProdutoFilho
    AND ROUND(p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida) > 0)
  LOOP  
    IF p_cab_atualizaCustoMedio = 1 AND a.manterUltimoCusto = 1 THEN
      v_precoCustoKit := FUNC_ADD_BUSCA_PRECO_ULT_CUSTO(
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          TO_DATE ('01/01/1900','DD/MM/YYYY'),
          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,
          p_item_pessoaParticipante,
          a.produto,
          a.cor,
          a.tamanho,
          p_locEst_indicProprPosseItem,
          0);
      v_valorCustoKit := ROUND (a.quantidade * v_precoCustoKit,2);
    ELSIF p_cab_atualizaCustoMedio = 1 AND p_item_valorCustoOperacao > v_valorCustoManter AND v_quantSaldoRateioTotal > a.quantidade THEN
      v_valorCustoKit := ROUND((p_item_valorCustoOperacao - v_valorCustoManter) * a.quantidade / v_quantidadeRateioTotal,2);
      v_precoCustoKit := ROUND(v_valorCustoKit / a.quantidade,7);
      v_quantSaldoRateioTotal := v_quantSaldoRateioTotal - a.quantidade;
      v_valorSaldoRateioTotal := v_valorSaldoRateioTotal - v_valorCustoKit;
    ELSIF p_cab_atualizaCustoMedio = 1 AND v_valorSaldoRateioTotal > 0 THEN
      v_valorCustoKit := v_valorSaldoRateioTotal;
      v_precoCustoKit := ROUND(v_valorCustoKit / a.quantidade,7);
      v_quantSaldoRateioTotal := 0;
      v_valorSaldoRateioTotal := 0;
    ELSE
      v_precoCustoKit := 0;
      v_valorCustoKit := 0;
    END IF;
    IF a.controleEstoque IN (3,4) THEN
      ADD_PRE_DOC_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_idItemPreDocumento,
        a.gradeProdutoFilho,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidade,
        v_valorCustoKit,
        p_item_observacoes,
        p_endEst_idEnderecoEstoquePreD,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        r_bufferIdEstoque);
    ELSIF a.controleEstoque IN(1,5,11,12) THEN
      v_quantidadeNumerosSerie := 0;
      IF a.controlaNumeroSerie > 0 THEN
        ADD_PRE_DOC_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_idItemPreDocumento,
          a.gradeProdutoFilho,
          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_idEnderecoEstoquePreD,
          p_idEnderecoEstoque,
          p_locEst_indicProprPosseItem,
          p_docTransf_estabelecEntrada,
          p_docTransf_estabelecSaida,
          r_bufferIdEstoque,
          v_quantidadeNumerosSerie);
      END IF;    
      IF a.quantidade > v_quantidadeNumerosSerie THEN
        ADD_ESTOQUE_INSERE(
          r_bufferIdEstoque,
          p_estabelecimentoAtivo,
          p_cab_estabelecimento,
          CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, --p_data
          a.gradeProdutoFilho,
          p_cab_modeloDocumento,
          101, --p_cab_operacaoInternaEstoque
          p_cab_atualizaCustoMedio,
          p_cab_atualizaUltimaCompra,
          p_cab_entradaSaida,
          p_locEst_indicProprPosseItem,
          p_item_pessoaParticipante,
          p_item_localEstoque,
          0, -- p_personalizacao
          0, -- p_idLoteEstoque
          p_idEnderecoEstoque,
          0, -- p_idNumeroSerie
          a.quantidade - v_quantidadeNumerosSerie,
          v_precoCustoKit, -- p_precoCustoOperacao
          CASE WHEN v_quantidadeNumerosSerie = 0 THEN v_valorCustoKit WHEN a.quantidade = 0 THEN 0 ELSE ROUND ((v_valorCustoKit * (a.quantidade - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_totalCustoOperacao
          0, -- p_precoCMV
          0, -- p_valorCMV
          p_item_observacoes,
          p_item_idItemPreDocumento,
          0, -- p_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
            a.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
            a.quantidade - v_quantidadeNumerosSerie,
            v_precoCustoKit, -- p_precoCustoOperacao
            CASE WHEN v_quantidadeNumerosSerie = 0 THEN v_valorCustoKit WHEN a.quantidade = 0 THEN 0 ELSE ROUND ((v_valorCustoKit * (a.quantidade - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_totalCustoOperacao
            0, -- p_precoCMV
            0, -- p_valorCMV
            p_item_observacoes,
            p_item_idItemPreDocumento,
            0, -- p_idItemDocFiscal,
            0, -- p_idItemSeparacao,
            0, -- p_divergenciaBalanco,
            0, -- p_idItemDocTransferencia,
            r_bufferIdEstoque);
        END IF;    
      END IF;    
    END IF;
  END LOOP;
END ADD_PRE_DOC_ITEM_EST_KIT;

/

create or replace PROCEDURE ADD_PRE_DOC_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_idItemPreDocumento      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_valorAcrescimoExtempTot IN NUMBER,
    p_item_observacoes             IN VARCHAR2,
    p_prod_controlaNumeroSerie     IN NUMBER,
    p_prod_controleEstoque         IN NUMBER,
    p_uniMed_casasDecimaisUnidadeM IN VARCHAR2,
    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;
BEGIN
  r_bufferIdEstoque           := p_bufferIdEstoque;
  r_quantidadeEnderecoEstoque := 0;
  FOR a IN (
    SELECT idEnderecoEstoque,
      idEnderecoEstoquePreDocumento,
      CASE
        WHEN p_item_quantidade = 0
          OR p_item_quantidadeExtemporanea = 0
          OR p_item_quantidade + p_item_quantidadeExtemporanea = 0
        THEN quantidade
        ELSE ROUND(quantidade * (p_item_quantidade + p_item_quantidadeExtemporanea) / p_item_quantidade, TO_NUMBER(p_uniMed_casasDecimaisUnidadeM))
      END quantidade
    FROM MOPREDOCUMXENDERECOESTOQ
    WHERE idItemPreDocumento = p_item_idItemPreDocumento
    AND quantidade > 0)
  LOOP
    r_quantidadeEnderecoEstoque := r_quantidadeEnderecoEstoque + a.quantidade;
    IF p_prod_controleEstoque = 12 AND p_item_idFormulaTinta > 0 THEN
      ADD_ESTOQUE_FORMULA_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_modeloDocumento,
        101,
        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,
        a.quantidade,
        p_item_observacoes,
        a.idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_item_idItemPreDocumento,
        0, -- p_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_PRE_DOC_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_idItemPreDocumento,
        p_item_gradeProduto,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidade,
        CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND (((p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) * (a.quantidade - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
        p_item_observacoes,
        a.idEnderecoEstoquePreDocumento,
        a.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_PRE_DOC_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_idItemPreDocumento,
          p_item_gradeProduto,
          p_item_personalizacao,
          p_item_idLoteEstoque,
          p_item_localEstoque,
          p_item_pessoaParticipante,
          CASE
            WHEN p_item_valorCustoOperacao = 0
              OR p_item_valorAcrescimoExtempTot = 0
              OR p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot = 0
            THEN p_item_precoCustoOperacao
            ELSE ROUND(p_item_precoCustoOperacao * (p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) / p_item_valorCustoOperacao,7)
          END,
          p_item_precoCMV,
          p_item_observacoes,
          a.idEnderecoEstoquePreDocumento,
          a.idEnderecoEstoque,
          p_locEst_indicProprPosseItem,
          p_docTransf_estabelecEntrada,
          p_docTransf_estabelecSaida,
          r_bufferIdEstoque,
          v_quantidadeNumerosSerie);
      END IF;
      IF a.quantidade > v_quantidadeNumerosSerie THEN
        ADD_ESTOQUE_INSERE(
          r_bufferIdEstoque, 
          p_estabelecimentoAtivo, 
          p_cab_estabelecimento,
          CASE
            WHEN p_cab_dataEntradaSaida IS NULL
              OR p_cab_dataEntradaSaida < p_cab_dataEmissao
            THEN p_cab_dataEmissao
            ELSE p_cab_dataEntradaSaida
          END, -- p_data
          p_item_gradeProduto,
          p_cab_modeloDocumento,
          101, --p_operacaoInternaEstoque
          p_cab_atualizaCustoMedio,
          p_cab_atualizaUltimaCompra,
          p_cab_entradaSaida,
          p_locEst_indicProprPosseItem,
          p_item_pessoaParticipante,
          p_item_localEstoque,
          p_item_personalizacao,
          p_item_idLoteEstoque,
          a.idEnderecoEstoque,
          0, -- p_idNumeroSerie
          a.quantidade - v_quantidadeNumerosSerie,
          CASE
            WHEN p_item_valorCustoOperacao = 0
              OR p_item_valorAcrescimoExtempTot = 0
              OR p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot = 0
            THEN p_item_precoCustoOperacao
            ELSE ROUND(p_item_precoCustoOperacao * (p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) / p_item_valorCustoOperacao,7)
          END,
          CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND (((p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) * (a.quantidade - v_quantidadeNumerosSerie) / p_item_quantidadeExtemporanea), 2) END,
          p_item_precoCMV,
          CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCMV * (a.quantidade - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
          p_item_observacoes,
          p_item_idItemPreDocumento,
          0, -- p_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, --p_operacaoInternaEstoque
            0, --p_atualizaCustoMedio
            0, --p_atualizaUltimaCompra
            CASE
              WHEN p_cab_entradaSaida = 'S'
              THEN 'E'
              ELSE 'S'
            END, --p_entradaSaida
            p_locEstTransito_indicProprPos,
            p_item_pessoaParticipante,
            p_modDoc_transitoLocalEstoque,
            p_item_personalizacao,
            p_item_idLoteEstoque,
            a.idEnderecoEstoque,
            0, -- p_idNumeroSerie
            a.quantidade - v_quantidadeNumerosSerie,
            CASE
              WHEN p_item_valorCustoOperacao = 0
                OR p_item_valorAcrescimoExtempTot = 0
                OR p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot = 0
              THEN p_item_precoCustoOperacao
              ELSE ROUND(p_item_precoCustoOperacao * (p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) / p_item_valorCustoOperacao,7)
            END,
            CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND (((p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) * (a.quantidade - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
            p_item_precoCMV,
            CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCMV * (a.quantidade - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
            p_item_observacoes,
            p_item_idItemPreDocumento,
            0, -- p_idItemDocFiscal
            0, -- p_idItemSeparacao
            0, -- p_divergenciaBalanco
            0, -- p_idItemDocTransferencia
            r_bufferIdEstoque);
        END IF;
      END IF;
    END IF;
  END LOOP;
END ADD_PRE_DOC_ITEM_EST_ENDERECO;

/

create or replace PROCEDURE ADD_PRE_DOC_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_idItemPreDocumento      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_valorAcrescimoExtempTot IN NUMBER,
    p_item_observacoes             IN VARCHAR2,
    p_prod_controlaNumeroSerie     IN NUMBER,
    p_prod_controleEstoque         IN NUMBER,
    p_uniMed_casasDecimaisUnidadeM IN VARCHAR2,
    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_PRE_DOC_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_idItemPreDocumento,
      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_valorAcrescimoExtempTot,
      p_item_observacoes,
      p_prod_controlaNumeroSerie,
      p_prod_controleEstoque,
      p_uniMed_casasDecimaisUnidadeM,
      p_locEst_indicProprPosseItem,
      p_docTransf_estabelecEntrada,
      p_docTransf_estabelecSaida,
      r_bufferIdEstoque,
      v_quantidadeEnderecoEstoque);
  END IF;
  IF p_item_quantidade + p_item_quantidadeExtemporanea > 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,
        101,
        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 + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque,
        p_item_observacoes,
        0, -- p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_item_idItemPreDocumento,
        0, -- p_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_PRE_DOC_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_idItemPreDocumento,
        p_item_gradeProduto,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque,
        CASE WHEN v_quantidadeEnderecoEstoque = 0 THEN (p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND (((p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) * (p_item_quantidade + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque) / p_item_quantidade), 2) END,
        p_item_observacoes,
        0, -- p_idEnderecoEstoquePreDocumento,
        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_PRE_DOC_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_idItemPreDocumento,
          p_item_gradeProduto,
          p_item_personalizacao,
          p_item_idLoteEstoque,
          p_item_localEstoque,
          p_item_pessoaParticipante,
          CASE
            WHEN p_item_valorCustoOperacao = 0
              OR p_item_valorAcrescimoExtempTot = 0
              OR p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot = 0
            THEN p_item_precoCustoOperacao
            ELSE ROUND(p_item_precoCustoOperacao * (p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) / p_item_valorCustoOperacao,7)
          END,
          p_item_precoCMV,
          p_item_observacoes,
          0, -- p_idEnderecoEstoquePreDocumento,
          0, -- p_idEnderecoEstoque,
          p_locEst_indicProprPosseItem,
          p_docTransf_estabelecEntrada,
          p_docTransf_estabelecSaida,
          r_bufferIdEstoque,
          v_quantidadeNumerosSerie);
      END IF;
      IF p_item_quantidade + p_item_quantidadeExtemporanea - 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,
          101,
          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 + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque - v_quantidadeNumerosSerie,
          CASE
            WHEN p_item_valorCustoOperacao = 0
              OR p_item_valorAcrescimoExtempTot = 0
              OR p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot = 0
            THEN p_item_precoCustoOperacao
            ELSE ROUND(p_item_precoCustoOperacao * (p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) / p_item_valorCustoOperacao,7)
          END,
          CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND (((p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) * (p_item_quantidade + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
          p_item_precoCMV,
          CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCMV * (p_item_quantidade + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
          p_item_observacoes,
          p_item_idItemPreDocumento,
          0, -- p_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 + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque - v_quantidadeNumerosSerie,
            CASE
              WHEN p_item_valorCustoOperacao = 0
                OR p_item_valorAcrescimoExtempTot = 0
                OR p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot = 0
              THEN p_item_precoCustoOperacao
              ELSE ROUND(p_item_precoCustoOperacao * (p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) / p_item_valorCustoOperacao,7)
            END,
            CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND (((p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) * (p_item_quantidade + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
            p_item_precoCMV,
            CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCMV * (p_item_quantidade + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
            p_item_observacoes,
            p_item_idItemPreDocumento,
            0, -- p_idItemDocFiscal,
            0, -- p_idItemSeparacao,
            0, -- p_divergenciaBalanco,
            0, -- p_idItemDocTransferencia,
            r_bufferIdEstoque);
        END IF;
      END IF;
    END IF;
  END IF;
END ADD_PRE_DOC_ITEM_EST_GRAVA;

/

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

/

create or replace PROCEDURE ADD_PRE_DOC_GERA_TEMP_MARGEM (
    p_uniqueMachineID              IN VARCHAR2,
    p_config_65_casasDecEntrada    IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_regMarg_tipoPreco            IN CHAR,
    p_regMarg_tabelaPreco          IN VARCHAR2,
    p_regMarg_fatorMultiplicador   IN NUMBER,
    p_regMarg_tipoPrecoB           IN CHAR,
    p_regMarg_tabelaPrecoB         IN VARCHAR2,
    p_regMarg_fatorMultiplicadorB  IN NUMBER,
    p_regMarg_reduzirImpostos      IN NUMBER,
    p_regMarg_reduzirTarifaCartao  IN NUMBER,
    p_regMarg_taxaCapitacaoCustoFi IN NUMBER,
    p_regMarg_exibImagemMargemCab  IN NUMBER,
    p_regMarg_regraImagemCab       IN NUMBER,
    p_regMarg_exibImagemMargemItem IN NUMBER,
    p_regMarg_regraImagemItem      IN NUMBER,
    p_cab_preDocumento             IN NUMBER,
    /* 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);
BEGIN
  r_cab_valorTarifaCartao := FUNC_ADD_TARIFA_CART_PRE_DOC (p_cab_preDocumento);
  r_cab_valorMargem       := 0;
  r_cab_valorMargem       := 0;
  r_cab_percentualMargem  := 0;
  r_cab_imagemMargem      := ' ';
  DELETE TEMPMARGEMCONTRIBUICAO
  WHERE uniqueMachineID = p_uniqueMachineID
  AND orcamentoPredocumentoDocumento = 'P'
  AND idCabecalho = p_cab_preDocumento;
  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 MOPREDOCUMENTOS cab
  JOIN PAESTABELECIMENTOS est
  ON est.estabelecimento = cab.estabelecimento
  WHERE cab.preDocumento = p_cab_preDocumento;
  FOR a IN (
    SELECT
      a.sequencia,
      a.cancelado,
      a.idFormulaTinta,
      a.personalizacao,
      a.localEstoque,
      a.pessoaParticipante,
      a.quantidade,
      a.valorFreteTotal,
      a.valorSeguroTotal,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorIPIDevolucao,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMSOperacao,
      a.valorICMSDiferido,
      a.valorICMS,
      a.valorICMSDesoneracao,
      a.valorICMSST,
      a.valorICMSSTAnteriormente,
      a.valorICMSUFDestinatario,
      a.valorICMSUFRemetente,
      a.valorFCP,
      a.valorFCPST,
      a.valorFCPSTAnteriormente,
      a.valorFCPUFDestinatario,
      a.valorLiquidoItem,
      gradProd.produto,
      gradProd.cor,
      gradProd.tamanho,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem
    FROM MOPREDOCUMXITENS a
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = a.localEstoque
    WHERE preDocumento = p_cab_preDocumento)
  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,
      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,
      a.produto,
      a.cor,
      a.tamanho,
      a.controleEstoque,
      a.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 a.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,
      'P',
      p_cab_preDocumento,
      a.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_PRE_DOC_GERA_TEMP_MARGEM;

/

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

/

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

/

create or replace PROCEDURE ADD_PRE_DOC_CAB_FIL_ATUALIZA(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_preDocumento                 IN NUMBER,
    p_estabelecimentoAtivo         IN NUMBER)
IS
  v_bufferIdProdutoFilho VARCHAR2 (32000);
BEGIN
  v_bufferIdProdutoFilho := '';
  FOR a IN (
    SELECT a.id
    FROM MOPREDOCUMXPRODUTOFILHO a
    JOIN MOPREDOCUMXITENS b
    ON b.idItemPreDocumento = a.idItemPreDocumento
    WHERE b.preDocumento = p_preDocumento
    ORDER BY a.id)
  LOOP
    v_bufferIdProdutoFilho :=
      CASE
        WHEN v_bufferIdProdutoFilho IS NULL
          OR v_bufferIdProdutoFilho = ''
          OR v_bufferIdProdutoFilho = ' '
        THEN ''
        ELSE RTRIM (v_bufferIdProdutoFilho) || ';'
      END
      || TO_CHAR (LPAD(a.id,14,'0'));
    DELETE MOPREDOCUMXPRODUTOFILHO b
    WHERE b.id = a.id;
  END LOOP;
  FOR a IN (
    SELECT 
      cab.atualizaCustoMedio,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      item.idItemPreDocumento,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.pessoaParticipante,
      item.quantidade,
      item.valorCustoOperacao,
      item.valorAcrescimoExtempTotal,
      item.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem locEst_indicProprPosseItem,
      COALESCE (estXLoc.solicitaEnderecoEstoque,0) estXLoc_solicitaEnderecoEst
    FROM MOPREDOCUMXITENS item
    JOIN MOPREDOCUMENTOS cab
    ON cab.preDocumento = item.preDocumento
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PALOCAISESTOQUE locEst
    ON locEst.localEstoque = item.localEstoque
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc
    ON estXLoc.estabelecimento = cab.estabelecimento
    AND estXLoc.localEstoque = item.localEstoque
    WHERE item.preDocumento = p_preDocumento
    AND item.cancelado = 0
    AND item.quantidade > 0
    AND cab.statusPreDocumento IN ('A','F'))
  LOOP
    ADD_PRE_DOC_ITEM_FIL_GRAVA(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_bufferIdProdutoFilho,
      p_estabelecimentoAtivo,
      a.atualizaCustoMedio,
      a.estabelecimento,
      a.dataEmissao,
      a.dataEntradaSaida,
      a.idItemPreDocumento,
      a.gradeProduto,
      a.idFormulaTinta,
      a.personalizacao,
      a.pessoaParticipante,
      a.quantidade,
      a.valorCustoOperacao,
      a.observacoes,
      a.controlaNumeroSerie,
      a.controleEstoque,
      a.locEst_indicProprPosseItem,
      a.estXLoc_solicitaEnderecoEst,
      v_bufferIdProdutoFilho);
  END LOOP;
END ADD_PRE_DOC_CAB_FIL_ATUALIZA;

/

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

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_FIL_KIT(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_bufferIdProdutoFilho         IN VARCHAR2,
    p_estabelecimentoAtivo         IN NUMBER,
    p_cab_atualizaCustoMedio       IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEmissao              IN DATE,
    p_cab_dataEntradaSaida         IN DATE,
    p_item_idItemDocFiscal         IN NUMBER,
    p_item_gradeProduto            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,
    r_bufferIdProdutoFilho         OUT VARCHAR2)
IS  
  v_quantidadeNumerosSerie NUMBER;
  v_quantidadeRateioTotal  NUMBER;
  v_quantSaldoRateioTotal  NUMBER;
  v_valorSaldoRateioTotal  NUMBER;
  v_valorCustoManter       NUMBER;
  v_precoCustoKit          NUMBER;
  v_valorCustoKit          NUMBER;
BEGIN
  r_bufferIdProdutoFilho := p_bufferIdProdutoFilho;
  IF p_cab_atualizaCustoMedio = 1 THEN
    SELECT COALESCE(SUM(ROUND(p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida)),0)
    INTO v_quantidadeRateioTotal
    FROM CAGRADEPRODUTOXKITSCOMBOS a
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = a.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE a.gradeProduto = p_item_gradeProduto
    AND a.ativo = 1
    AND a.manterUltimoCusto = 0
    AND a.gradeProduto <> a.gradeProdutoFilho;
    SELECT ROUND((COALESCE(SUM(ROUND(p_item_quantidade * a.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,
          p_item_pessoaParticipante,
          gradProdFilho.produto,
          0,
          ' ',
          p_locEst_indicProprPosseItem,
          0)),0)),2)
    INTO v_valorCustoManter
    FROM CAGRADEPRODUTOXKITSCOMBOS a 
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = a.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE a.gradeProduto = p_item_gradeProduto
    AND a.ativo = 1
    AND a.manterUltimoCusto = 1
    AND a.gradeProduto <> a.gradeProdutoFilho;
  ELSE
    v_quantidadeRateioTotal := 0;
    v_valorCustoManter      := 0;
  END IF;
  v_quantSaldoRateioTotal := v_quantidadeRateioTotal;
  v_valorSaldoRateioTotal := p_item_valorCustoOperacao - v_valorCustoManter;
  FOR a IN (
    SELECT 
      a.gradeProdutoFilho,
      a.manterUltimoCusto,
      gradProdFilho.produto,
      prodFilho.controleEstoque,
      prodFilho.controlaNumeroSerie,
      ROUND(p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida) quantidade
    FROM CAGRADEPRODUTOXKITSCOMBOS a
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = a.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE a.gradeProduto = p_item_gradeProduto
    AND a.ativo = 1
    AND a.gradeProduto <> a.gradeProdutoFilho
    AND ROUND(p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida) > 0)
  LOOP  
    IF p_cab_atualizaCustoMedio = 1 AND a.manterUltimoCusto = 1 THEN
      v_precoCustoKit := FUNC_ADD_BUSCA_PRECO_ULT_CUSTO(
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          TO_DATE ('01/01/1900','DD/MM/YYYY'),
          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,
          p_item_pessoaParticipante,
          a.produto,
          0,
          ' ',
          p_locEst_indicProprPosseItem,
          0);
      v_valorCustoKit := ROUND (a.quantidade * v_precoCustoKit,2);
    ELSIF p_cab_atualizaCustoMedio = 1 AND p_item_valorCustoOperacao > v_valorCustoManter AND v_quantSaldoRateioTotal > a.quantidade THEN
      v_valorCustoKit := ROUND((p_item_valorCustoOperacao - v_valorCustoManter) * a.quantidade / v_quantidadeRateioTotal,2);
      v_precoCustoKit := ROUND(v_valorCustoKit / a.quantidade,7);
      v_quantSaldoRateioTotal := v_quantSaldoRateioTotal - a.quantidade;
      v_valorSaldoRateioTotal := v_valorSaldoRateioTotal - v_valorCustoKit;
    ELSIF p_cab_atualizaCustoMedio = 1 AND v_valorSaldoRateioTotal > 0 THEN
      v_valorCustoKit := v_valorSaldoRateioTotal;
      v_precoCustoKit := ROUND(v_valorCustoKit / a.quantidade,7);
      v_quantSaldoRateioTotal := 0;
      v_valorSaldoRateioTotal := 0;
    ELSE
      v_precoCustoKit := 0;
      v_valorCustoKit := 0;
    END IF;
    IF a.controleEstoque IN (3,4) THEN
      ADD_DOC_FISC_ITEM_FIL_KIT(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_item_idItemDocFiscal,
        a.gradeProdutoFilho,
        p_item_pessoaParticipante,
        a.quantidade,
        v_valorCustoKit,
        p_item_observacoes,
        p_endEst_idEnderecoEstoqueDocF,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        r_bufferIdProdutoFilho);
    ELSIF a.controleEstoque IN(1,5,11,12) THEN
      v_quantidadeNumerosSerie := 0;
      IF a.controlaNumeroSerie > 0 THEN
        ADD_DOC_FISC_ITEM_FIL_N_SERIE(
          r_bufferIdProdutoFilho,
          p_estabelecimentoAtivo,
          p_item_idItemDocFiscal,
          a.gradeProdutoFilho,
          0, -- p_item_personalizacao
          0, -- p_item_idLoteEstoque
          v_precoCustoKit, -- p_item_precoCustoOperacao,
          0, -- p_item_precoCMV,
          p_item_observacoes,
          p_endEst_idEnderecoEstoqueDocF,
          p_idEnderecoEstoque,
          r_bufferIdProdutoFilho,
          v_quantidadeNumerosSerie);
      END IF;    
      IF a.quantidade > v_quantidadeNumerosSerie THEN
        ADD_DOC_FISC_ITEM_FIL_INSERE(
          r_bufferIdProdutoFilho,
          p_estabelecimentoAtivo,
          p_item_idItemDocFiscal,
          a.gradeProdutoFilho,
          0, -- p_personalizacao
          0, -- p_idLoteEstoque
          p_idEnderecoEstoque,
          0, -- p_idNumeroSerie
          a.quantidade - v_quantidadeNumerosSerie,
          v_precoCustoKit, -- p_precoCustoOperacao
          CASE WHEN v_quantidadeNumerosSerie = 0 THEN v_valorCustoKit WHEN a.quantidade = 0 THEN 0 ELSE ROUND ((v_valorCustoKit * (a.quantidade - v_quantidadeNumerosSerie) / a.quantidade), 2) END, -- p_totalCustoOperacao
          0, -- p_precoCMV
          0, -- p_valorCMV
          p_item_observacoes,
          r_bufferIdProdutoFilho);
      END IF;    
    END IF;
  END LOOP;
END ADD_DOC_FISC_ITEM_FIL_KIT;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_FIL_PROD_TIN(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_bufferIdProdutoFilho         IN VARCHAR2,
    p_estabelecimentoAtivo         IN NUMBER,
    p_cab_atualizaCustoMedio       IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEmissao              IN DATE,
    p_cab_dataEntradaSaida         IN DATE,
    p_idItemDocFiscal              IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_item_observacoes             IN VARCHAR2,
    p_endEst_idEnderecoEstoqueDocF IN NUMBER,
    p_idEnderecoEstoque            IN NUMBER,
    p_locEst_indicProprPosseItem   IN CHAR,
    p_tinta_gradeProduto           IN NUMBER,
    p_tinta_quantidade             IN NUMBER,
    r_bufferIdProdutoFilho         OUT VARCHAR2)
IS  
BEGIN
  r_bufferIdProdutoFilho := p_bufferIdProdutoFilho;
  FOR a IN (
    SELECT 
      prod.controleEstoque,
      ROUND(p_item_quantidade * p_tinta_quantidade / 900, uniMed.casasDecimaisUnidadeMedida) quantidade
    FROM CAGRADESPRODUTO gradProd 
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN SIUNIDADESMEDIDA uniMed
    ON uniMed.unidadeMedida = prod.unidadeMedida
    WHERE gradProd.gradeProduto = p_tinta_gradeProduto
    AND ROUND(p_item_quantidade * p_tinta_quantidade / 900, uniMed.casasDecimaisUnidadeMedida) > 0)
  LOOP
    IF a.controleEstoque IN (3,4) THEN
      ADD_DOC_FISC_ITEM_FIL_KIT(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_idItemDocFiscal,
        p_tinta_gradeProduto,
        p_item_pessoaParticipante,
        a.quantidade,
        0, --p_item_valorCustoOperacao
        p_item_observacoes,
        p_endEst_idEnderecoEstoqueDocF,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        r_bufferIdProdutoFilho);
    ELSIF a.controleEstoque IN(1,5,11,12) THEN
      ADD_DOC_FISC_ITEM_FIL_INSERE(
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_idItemDocFiscal,
        p_tinta_gradeProduto,
        0, -- p_personalizacao
        0, -- p_idLoteEstoque
        p_idEnderecoEstoque,
        0, -- p_idNumeroSerie
        a.quantidade,
        0, -- p_precoCustoOperacao,
        0, -- p_totalCustoOperacao,
        0, -- p_precoCMV,
        0, -- p_valorCMV,
        p_item_observacoes,
        r_bufferIdProdutoFilho);
    END IF;    
  END LOOP;
END ADD_DOC_FISC_ITEM_FIL_PROD_TIN;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_FIL_FORM_TIN(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_bufferIdProdutoFilho         IN VARCHAR2,
    p_estabelecimentoAtivo         IN NUMBER,
    p_cab_atualizaCustoMedio       IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEmissao              IN DATE,
    p_cab_dataEntradaSaida         IN DATE,
    p_idItemDocFiscal              IN NUMBER,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_item_observacoes             IN VARCHAR2,
    p_endEst_idEnderecoEstoqueDocF IN NUMBER,
    p_idEnderecoEstoque            IN NUMBER,
    p_locEst_indicProprPosseItem   IN CHAR,
    r_bufferIdProdutoFilho         OUT VARCHAR2)
IS
BEGIN
  r_bufferIdProdutoFilho := p_bufferIdProdutoFilho;
  FOR a IN (
    SELECT 
      a.idBaseTinta,
      baseTinta.gradeProduto,
      a.idColoranteTintaA,
      a.quantidadeA,
      COALESCE(colTintaA.gradeProduto,0) gradeProdutoA,
      a.idColoranteTintaB,
      a.quantidadeB,
      COALESCE(colTintaB.gradeProduto,0) gradeProdutoB,
      a.idColoranteTintaC,
      a.quantidadeC,
      COALESCE(colTintaC.gradeProduto,0) gradeProdutoC,
      a.idColoranteTintaD,
      a.quantidadeD,
      COALESCE(colTintaD.gradeProduto,0) gradeProdutoD,
      a.idColoranteTintaE,
      a.quantidadeE,
      COALESCE(colTintaE.gradeProduto,0) gradeProdutoE,
      a.idColoranteTintaF,
      a.quantidadeF,
      COALESCE(colTintaF.gradeProduto,0) gradeProdutoF,
      a.idColoranteTintaG,
      a.quantidadeG,
      COALESCE(colTintaG.gradeProduto,0) gradeProdutoG,
      a.idColoranteTintaH,
      a.quantidadeH,
      COALESCE(colTintaH.gradeProduto,0) gradeProdutoH,
      a.idColoranteTintaI,
      a.quantidadeI,
      COALESCE(colTintaI.gradeProduto,0) gradeProdutoI,
      a.idColoranteTintaJ,
      a.quantidadeJ,
      COALESCE(colTintaJ.gradeProduto,0) gradeProdutoJ,
      a.idColoranteTintaK,
      a.quantidadeK,
      COALESCE(colTintaK.gradeProduto,0) gradeProdutoK,
      a.idColoranteTintaL,
      a.quantidadeL,
      COALESCE(colTintaL.gradeProduto,0) gradeProdutoL,
      a.idColoranteTintaM,
      a.quantidadeM,
      COALESCE(colTintaM.gradeProduto,0) gradeProdutoM,
      a.idColoranteTintaN,
      a.quantidadeN,
      COALESCE(colTintaN.gradeProduto,0) gradeProdutoN,
      a.idColoranteTintaO,
      a.quantidadeO,
      COALESCE(colTintaO.gradeProduto,0) gradeProdutoO
    FROM CAFORMULASTINTAS a
    JOIN CABASESTINTAS baseTinta
    ON baseTinta.idBaseTinta = a.idBaseTinta
    JOIN CACOLORANTESTINTAS colTintaA
    ON colTintaA.idColoranteTinta = a.idColoranteTintaA
    JOIN CACOLORANTESTINTAS colTintaB
    ON colTintaB.idColoranteTinta = a.idColoranteTintaB
    JOIN CACOLORANTESTINTAS colTintaC
    ON colTintaC.idColoranteTinta = a.idColoranteTintaC
    JOIN CACOLORANTESTINTAS colTintaD
    ON colTintaD.idColoranteTinta = a.idColoranteTintaD
    JOIN CACOLORANTESTINTAS colTintaE
    ON colTintaE.idColoranteTinta = a.idColoranteTintaE
    JOIN CACOLORANTESTINTAS colTintaF
    ON colTintaF.idColoranteTinta = a.idColoranteTintaF
    JOIN CACOLORANTESTINTAS colTintaG
    ON colTintaG.idColoranteTinta = a.idColoranteTintaG
    JOIN CACOLORANTESTINTAS colTintaH
    ON colTintaH.idColoranteTinta = a.idColoranteTintaH
    JOIN CACOLORANTESTINTAS colTintaI
    ON colTintaI.idColoranteTinta = a.idColoranteTintaI
    JOIN CACOLORANTESTINTAS colTintaJ
    ON colTintaJ.idColoranteTinta = a.idColoranteTintaJ
    JOIN CACOLORANTESTINTAS colTintaK
    ON colTintaK.idColoranteTinta = a.idColoranteTintaK
    JOIN CACOLORANTESTINTAS colTintaL
    ON colTintaL.idColoranteTinta = a.idColoranteTintaL
    JOIN CACOLORANTESTINTAS colTintaM
    ON colTintaM.idColoranteTinta = a.idColoranteTintaM
    JOIN CACOLORANTESTINTAS colTintaN
    ON colTintaN.idColoranteTinta = a.idColoranteTintaN
    JOIN CACOLORANTESTINTAS colTintaO
    ON colTintaO.idColoranteTinta = a.idColoranteTintaO
    WHERE a.idFormulaTinta = p_item_idFormulaTinta
    AND a.idBaseTinta > 0
    AND baseTinta.gradeProduto > 0)
  LOOP
    ADD_DOC_FISC_ITEM_FIL_PROD_TIN(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      r_bufferIdProdutoFilho,
      p_estabelecimentoAtivo,
      p_cab_atualizaCustoMedio,
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_cab_dataEntradaSaida,
      p_idItemDocFiscal,
      p_item_pessoaParticipante,
      p_item_quantidade,
      p_item_observacoes,
      p_endEst_idEnderecoEstoqueDocF,
      p_idEnderecoEstoque,
      p_locEst_indicProprPosseItem,
      a.gradeProduto,
      900, -- p_tinta_quantidade,
      r_bufferIdProdutoFilho);    
    IF a.idColoranteTintaA > 0
      AND a.gradeProdutoA > 0
      AND a.quantidadeA > 0
    THEN
      ADD_DOC_FISC_ITEM_FIL_PROD_TIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_idItemDocFiscal,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_endEst_idEnderecoEstoqueDocF,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoA,
        a.quantidadeA,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaB > 0
      AND a.gradeProdutoB > 0
      AND a.quantidadeB > 0
    THEN
      ADD_DOC_FISC_ITEM_FIL_PROD_TIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_idItemDocFiscal,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_endEst_idEnderecoEstoqueDocF,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoB,
        a.quantidadeB,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaC > 0
      AND a.gradeProdutoC > 0
      AND a.quantidadeC > 0
    THEN
      ADD_DOC_FISC_ITEM_FIL_PROD_TIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_idItemDocFiscal,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_endEst_idEnderecoEstoqueDocF,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoC,
        a.quantidadeC,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaD > 0
      AND a.gradeProdutoD > 0
      AND a.quantidadeD > 0
    THEN
      ADD_DOC_FISC_ITEM_FIL_PROD_TIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_idItemDocFiscal,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_endEst_idEnderecoEstoqueDocF,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoD,
        a.quantidadeD,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaE > 0
      AND a.gradeProdutoE > 0
      AND a.quantidadeE > 0
    THEN
      ADD_DOC_FISC_ITEM_FIL_PROD_TIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_idItemDocFiscal,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_endEst_idEnderecoEstoqueDocF,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoE,
        a.quantidadeE,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaF > 0
      AND a.gradeProdutoF > 0
      AND a.quantidadeF > 0
    THEN
      ADD_DOC_FISC_ITEM_FIL_PROD_TIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_idItemDocFiscal,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_endEst_idEnderecoEstoqueDocF,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoF,
        a.quantidadeF,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaG > 0
      AND a.gradeProdutoG > 0
      AND a.quantidadeG > 0
    THEN
      ADD_DOC_FISC_ITEM_FIL_PROD_TIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_idItemDocFiscal,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_endEst_idEnderecoEstoqueDocF,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoG,
        a.quantidadeG,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaH > 0
      AND a.gradeProdutoH > 0
      AND a.quantidadeH > 0
    THEN
      ADD_DOC_FISC_ITEM_FIL_PROD_TIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_idItemDocFiscal,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_endEst_idEnderecoEstoqueDocF,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoH,
        a.quantidadeH,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaI > 0
      AND a.gradeProdutoI > 0
      AND a.quantidadeI > 0
    THEN
      ADD_DOC_FISC_ITEM_FIL_PROD_TIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_idItemDocFiscal,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_endEst_idEnderecoEstoqueDocF,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoI,
        a.quantidadeI,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaJ > 0
      AND a.gradeProdutoJ > 0
      AND a.quantidadeJ > 0
    THEN
      ADD_DOC_FISC_ITEM_FIL_PROD_TIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_idItemDocFiscal,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_endEst_idEnderecoEstoqueDocF,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoJ,
        a.quantidadeJ,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaK > 0
      AND a.gradeProdutoK > 0
      AND a.quantidadeK > 0
    THEN
      ADD_DOC_FISC_ITEM_FIL_PROD_TIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_idItemDocFiscal,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_endEst_idEnderecoEstoqueDocF,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoK,
        a.quantidadeK,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaL > 0
      AND a.gradeProdutoL > 0
      AND a.quantidadeL > 0
    THEN
      ADD_DOC_FISC_ITEM_FIL_PROD_TIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_idItemDocFiscal,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_endEst_idEnderecoEstoqueDocF,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoL,
        a.quantidadeL,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaM > 0
      AND a.gradeProdutoM > 0
      AND a.quantidadeM > 0
    THEN
      ADD_DOC_FISC_ITEM_FIL_PROD_TIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_idItemDocFiscal,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_endEst_idEnderecoEstoqueDocF,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoM,
        a.quantidadeM,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaN > 0
      AND a.gradeProdutoN > 0
      AND a.quantidadeN > 0
    THEN
      ADD_DOC_FISC_ITEM_FIL_PROD_TIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_idItemDocFiscal,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_endEst_idEnderecoEstoqueDocF,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoN,
        a.quantidadeN,
        r_bufferIdProdutoFilho);
    END IF;
    IF a.idColoranteTintaO > 0
      AND a.gradeProdutoO > 0
      AND a.quantidadeO > 0
    THEN
      ADD_DOC_FISC_ITEM_FIL_PROD_TIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_idItemDocFiscal,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_observacoes,
        p_endEst_idEnderecoEstoqueDocF,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        a.gradeProdutoO,
        a.quantidadeO,
        r_bufferIdProdutoFilho);
    END IF;
  END LOOP;
END ADD_DOC_FISC_ITEM_FIL_FORM_TIN;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_FIL_ENDERECO(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_bufferIdProdutoFilho         IN VARCHAR2,
    p_estabelecimentoAtivo         IN NUMBER,
    p_cab_atualizaCustoMedio       IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEmissao              IN DATE,
    p_cab_dataEntradaSaida         IN DATE,
    p_item_idItemDocFiscal         IN NUMBER,
    p_item_gradeProduto            IN NUMBER,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_item_valorCustoOperacao      IN NUMBER,
    p_item_observacoes             IN VARCHAR2,
    p_prod_controleEstoque         IN NUMBER,
    p_locEst_indicProprPosseItem   IN CHAR,
    r_bufferIdProdutoFilho         OUT VARCHAR2,
    r_quantidadeEnderecoEstoque    OUT NUMBER)
IS
  v_quantidadeNumerosSerie NUMBER (14,0);
BEGIN
  r_bufferIdProdutoFilho      := p_bufferIdProdutoFilho;
  r_quantidadeEnderecoEstoque := 0;
  FOR a IN (
    SELECT idEnderecoEstoque,
      idEnderecoEstoqueDocFiscal,
      quantidade
    FROM MODOCFISCALXENDERECOESTOQ
    WHERE idItemDocFiscal = p_item_idItemDocFiscal
    AND quantidade > 0)
  LOOP
    r_quantidadeEnderecoEstoque := r_quantidadeEnderecoEstoque + a.quantidade;
    IF p_prod_controleEstoque = 12 AND p_item_idFormulaTinta > 0 THEN
      ADD_DOC_FISC_ITEM_FIL_FORM_TIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho, 
        p_estabelecimentoAtivo, 
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_item_idItemDocFiscal,
        p_item_idFormulaTinta,
        p_item_pessoaParticipante,
        a.quantidade,
        p_item_observacoes,
        a.idEnderecoEstoqueDocFiscal,
        a.idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        r_bufferIdProdutoFilho);
    ELSIF p_prod_controleEstoque IN (3,4) THEN
      ADD_DOC_FISC_ITEM_FIL_KIT(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_item_idItemDocFiscal,
        p_item_gradeProduto,
        p_item_pessoaParticipante,
        a.quantidade,
        CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCustoOperacao * (a.quantidade - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
        p_item_observacoes,
        a.idEnderecoEstoqueDocFiscal,
        a.idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        r_bufferIdProdutoFilho);
    END IF;
  END LOOP;
END ADD_DOC_FISC_ITEM_FIL_ENDERECO;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_FIL_GRAVA(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_bufferIdProdutoFilho         IN VARCHAR2,
    p_estabelecimentoAtivo         IN NUMBER,
    p_cab_atualizaCustoMedio       IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEmissao              IN DATE,
    p_cab_dataEntradaSaida         IN DATE,
    p_item_idItemDocFiscal         IN NUMBER,
    p_item_gradeProduto            IN NUMBER,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_item_valorCustoOperacao      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,
    r_bufferIdProdutoFilho         OUT VARCHAR2)
IS
  v_quantidadeEnderecoEstoque NUMBER (14,0);
  v_quantidadeNumerosSerie    NUMBER (14,0);
BEGIN
  r_bufferIdProdutoFilho      := p_bufferIdProdutoFilho;
  v_quantidadeEnderecoEstoque := 0;
  v_quantidadeNumerosSerie    := 0;
  IF p_estXLoc_solicitaEnderecoEst = 1 AND p_prod_controleEstoque IN (3,4,12) THEN
    ADD_DOC_FISC_ITEM_FIL_ENDERECO(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      r_bufferIdProdutoFilho,
      p_estabelecimentoAtivo,
      p_cab_atualizaCustoMedio,
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_cab_dataEntradaSaida,
      p_item_idItemDocFiscal,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_pessoaParticipante,
      p_item_quantidade,
      p_item_valorCustoOperacao,
      p_item_observacoes,
      p_prod_controlaNumeroSerie,
      p_prod_controleEstoque,
      r_bufferIdProdutoFilho,
      v_quantidadeEnderecoEstoque);
  END IF;
  IF p_item_quantidade > v_quantidadeEnderecoEstoque THEN
    IF p_prod_controleEstoque = 12 AND p_item_idFormulaTinta > 0 THEN
      ADD_DOC_FISC_ITEM_FIL_FORM_TIN(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho, 
        p_estabelecimentoAtivo, 
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_item_idItemDocFiscal,
        p_item_idFormulaTinta,
        p_item_pessoaParticipante,
        p_item_quantidade - v_quantidadeEnderecoEstoque,
        p_item_observacoes,
        0, -- p_endEst_idEnderecoEstoqueDocF,
        0, -- p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        r_bufferIdProdutoFilho);
    ELSIF p_prod_controleEstoque IN (3,4) THEN
      ADD_DOC_FISC_ITEM_FIL_KIT(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdProdutoFilho,
        p_estabelecimentoAtivo, 
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_item_idItemDocFiscal,
        p_item_gradeProduto,
        p_item_pessoaParticipante,
        p_item_quantidade - v_quantidadeEnderecoEstoque,
        CASE WHEN v_quantidadeEnderecoEstoque = 0 THEN p_item_valorCustoOperacao WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCustoOperacao * (p_item_quantidade - v_quantidadeEnderecoEstoque) / p_item_quantidade), 2) END,
        p_item_observacoes,
        0, -- p_endEst_idEnderecoEstoqueDocF
        0, -- p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        r_bufferIdProdutoFilho);
    END IF;
  END IF;
END ADD_DOC_FISC_ITEM_FIL_GRAVA;

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_FIL_ATUALIZA(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_idItemDocFiscal              IN NUMBER,
    p_estabelecimentoAtivo         IN NUMBER)
IS
  v_bufferIdProdutoFilho VARCHAR2 (32000);
BEGIN
  v_bufferIdProdutoFilho := '';
  FOR a IN (
    SELECT id
    FROM MODOCFISCALXPRODUTOFILHO
    WHERE idItemDocFiscal = p_idItemDocFiscal
    ORDER BY id)
  LOOP
    v_bufferIdProdutoFilho :=
      CASE
        WHEN v_bufferIdProdutoFilho IS NULL
          OR v_bufferIdProdutoFilho = ''
          OR v_bufferIdProdutoFilho = ' '
        THEN ''
        ELSE RTRIM (v_bufferIdProdutoFilho) || ';'
      END
      || TO_CHAR (LPAD(a.id,14,'0'));
    DELETE MODOCFISCALXPRODUTOFILHO b
    WHERE b.id = a.id;
  END LOOP;
  FOR a IN (
    SELECT 
      cab.atualizaCustoMedio,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      item.idItemDocFiscal,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.pessoaParticipante,
      item.quantidade,
      item.valorCustoOperacao,
      item.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem locEst_indicProprPosseItem,
      COALESCE (estXLoc.solicitaEnderecoEstoque,0) estXLoc_solicitaEnderecoEst
    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 PALOCAISESTOQUE locEst
    ON locEst.localEstoque = item.localEstoque
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc
    ON estXLoc.estabelecimento = cab.estabelecimento
    AND estXLoc.localEstoque = item.localEstoque
    WHERE item.idItemDocFiscal = p_idItemDocFiscal
    AND item.cancelado = 0
    AND item.quantidade > 0
    AND cab.situacaoDocumentoFiscal BETWEEN 21 AND 23)
  LOOP
    ADD_DOC_FISC_ITEM_FIL_GRAVA(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_bufferIdProdutoFilho,
      p_estabelecimentoAtivo,
      a.atualizaCustoMedio,
      a.estabelecimento,
      a.dataEmissao,
      a.dataEntradaSaida,
      a.idItemDocFiscal,
      a.gradeProduto,
      a.idFormulaTinta,
      a.personalizacao,
      a.pessoaParticipante,
      a.quantidade,
      a.valorCustoOperacao,
      a.observacoes,
      a.controlaNumeroSerie,
      a.controleEstoque,
      a.locEst_indicProprPosseItem,
      a.estXLoc_solicitaEnderecoEst,
      v_bufferIdProdutoFilho);
  END LOOP;
END ADD_DOC_FISC_ITEM_FIL_ATUALIZA;

/

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;
BEGIN
  r_bufferIdEstoque := p_bufferIdEstoque;
  IF p_cab_atualizaCustoMedio = 1 THEN
    SELECT COALESCE(SUM(ROUND(p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida)),0)
    INTO v_quantidadeRateioTotal
    FROM CAGRADEPRODUTOXKITSCOMBOS a
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = a.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE a.gradeProduto = p_item_gradeProduto
    AND a.ativo = 1
    AND a.manterUltimoCusto = 0
    AND a.gradeProduto <> a.gradeProdutoFilho;
    SELECT ROUND((COALESCE(SUM(ROUND(p_item_quantidade * a.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,
          p_item_pessoaParticipante,
          gradProdFilho.produto,
          0,
          ' ',
          p_locEst_indicProprPosseItem,
          0)),0)),2)
    INTO v_valorCustoManter
    FROM CAGRADEPRODUTOXKITSCOMBOS a 
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = a.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE a.gradeProduto = p_item_gradeProduto
    AND a.ativo = 1
    AND a.manterUltimoCusto = 1
    AND a.gradeProduto <> a.gradeProdutoFilho;
  ELSE
    v_quantidadeRateioTotal := 0;
    v_valorCustoManter      := 0;
  END IF;
  v_quantSaldoRateioTotal := v_quantidadeRateioTotal;
  v_valorSaldoRateioTotal := p_item_valorCustoOperacao - v_valorCustoManter;
  FOR a IN (
    SELECT 
      a.gradeProdutoFilho,
      a.manterUltimoCusto,
      gradProdFilho.produto,
      prodFilho.controleEstoque,
      prodFilho.controlaNumeroSerie,
      ROUND(p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida) quantidade
    FROM CAGRADEPRODUTOXKITSCOMBOS a
    JOIN CAGRADESPRODUTO gradProdFilho
    ON gradProdFilho.gradeProduto = a.gradeProdutoFilho
    JOIN CAPRODUTOS prodFilho
    ON prodFilho.produto = gradProdFilho.produto
    JOIN SIUNIDADESMEDIDA uniFilho
    ON uniFilho.unidadeMedida = prodFilho.unidadeMedida
    WHERE a.gradeProduto = p_item_gradeProduto
    AND a.ativo = 1
    AND a.gradeProduto <> a.gradeProdutoFilho
    AND ROUND(p_item_quantidade * a.quantidade, uniFilho.casasDecimaisUnidadeMedida) > 0)
  LOOP  
    IF p_cab_atualizaCustoMedio = 1 AND a.manterUltimoCusto = 1 THEN
      v_precoCustoKit := FUNC_ADD_BUSCA_PRECO_ULT_CUSTO(
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_cab_estabelecimento,
          TO_DATE ('01/01/1900','DD/MM/YYYY'),
          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,
          p_item_pessoaParticipante,
          a.produto,
          0,
          ' ',
          p_locEst_indicProprPosseItem,
          0);
      v_valorCustoKit := ROUND (a.quantidade * v_precoCustoKit,2);
    ELSIF p_cab_atualizaCustoMedio = 1 AND p_item_valorCustoOperacao > v_valorCustoManter AND v_quantSaldoRateioTotal > a.quantidade THEN
      v_valorCustoKit := ROUND((p_item_valorCustoOperacao - v_valorCustoManter) * a.quantidade / v_quantidadeRateioTotal,2);
      v_precoCustoKit := ROUND(v_valorCustoKit / a.quantidade,7);
      v_quantSaldoRateioTotal := v_quantSaldoRateioTotal - a.quantidade;
      v_valorSaldoRateioTotal := v_valorSaldoRateioTotal - v_valorCustoKit;
    ELSIF p_cab_atualizaCustoMedio = 1 AND v_valorSaldoRateioTotal > 0 THEN
      v_valorCustoKit := v_valorSaldoRateioTotal;
      v_precoCustoKit := ROUND(v_valorCustoKit / a.quantidade,7);
      v_quantSaldoRateioTotal := 0;
      v_valorSaldoRateioTotal := 0;
    ELSE
      v_precoCustoKit := 0;
      v_valorCustoKit := 0;
    END IF;
    IF a.controleEstoque IN (3,4) THEN
      ADD_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,
        a.gradeProdutoFilho,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidade,
        v_valorCustoKit,
        p_item_observacoes,
        p_endEst_idEnderecoEstoqueDocF,
        p_idEnderecoEstoque,
        p_locEst_indicProprPosseItem,
        p_docTransf_estabelecEntrada,
        p_docTransf_estabelecSaida,
        r_bufferIdEstoque);
    ELSIF a.controleEstoque IN(1,5,11,12) THEN
      v_quantidadeNumerosSerie := 0;
      IF a.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,
          a.gradeProdutoFilho,
          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 a.quantidade > v_quantidadeNumerosSerie THEN
        ADD_ESTOQUE_INSERE(
          r_bufferIdEstoque,
          p_estabelecimentoAtivo,
          p_cab_estabelecimento,
          CASE WHEN p_cab_dataEntradaSaida IS NULL OR p_cab_dataEntradaSaida < p_cab_dataEmissao THEN p_cab_dataEmissao ELSE p_cab_dataEntradaSaida END, --p_data
          a.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
          a.quantidade - v_quantidadeNumerosSerie,
          v_precoCustoKit, -- p_precoCustoOperacao
          CASE WHEN v_quantidadeNumerosSerie = 0 THEN v_valorCustoKit WHEN a.quantidade = 0 THEN 0 ELSE ROUND ((v_valorCustoKit * (a.quantidade - v_quantidadeNumerosSerie) / a.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
            a.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
            a.quantidade - v_quantidadeNumerosSerie,
            v_precoCustoKit, -- p_precoCustoOperacao
            CASE WHEN v_quantidadeNumerosSerie = 0 THEN v_valorCustoKit WHEN a.quantidade = 0 THEN 0 ELSE ROUND ((v_valorCustoKit * (a.quantidade - v_quantidadeNumerosSerie) / a.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_valorAcrescimoExtempTot IN NUMBER,
    p_item_observacoes             IN VARCHAR2,
    p_prod_controlaNumeroSerie     IN NUMBER,
    p_prod_controleEstoque         IN NUMBER,
    p_uniMed_casasDecimaisUnidadeM IN VARCHAR2,
    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);
BEGIN
  r_bufferIdEstoque           := p_bufferIdEstoque;
  r_quantidadeEnderecoEstoque := 0;
  FOR a IN (
    SELECT idEnderecoEstoque,
      idEnderecoEstoqueDocFiscal,
      CASE
        WHEN p_item_quantidade = 0
          OR p_item_quantidadeExtemporanea = 0
          OR p_item_quantidade + p_item_quantidadeExtemporanea = 0
        THEN quantidade
        ELSE ROUND(quantidade * (p_item_quantidade + p_item_quantidadeExtemporanea) / p_item_quantidade, TO_NUMBER(p_uniMed_casasDecimaisUnidadeM))
      END quantidade
    FROM MODOCFISCALXENDERECOESTOQ
    WHERE idItemDocFiscal = p_item_idItemDocFiscal
    AND quantidade > 0)
  LOOP
    r_quantidadeEnderecoEstoque := r_quantidadeEnderecoEstoque + a.quantidade;
    IF p_prod_controleEstoque = 12 AND p_item_idFormulaTinta > 0 THEN
      ADD_ESTOQUE_FORMULA_TINTA(
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        r_bufferIdEstoque, 
        p_estabelecimentoAtivo, 
        p_cab_modeloDocumento,
        100, --p_operacaoInternaEstoque
        p_cab_atualizaCustoMedio,
        p_cab_atualizaUltimaCompra,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntradaSaida,
        p_modDoc_geraTransferencia,
        p_modDoc_geraOperacaoEmTransit,
        p_modDoc_transitoLocalEstoque,
        p_locEstTransito_indicProprPos,
        p_item_idFormulaTinta,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidade,
        p_item_observacoes,
        a.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,
        a.quantidade,
        CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND (((p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) * (a.quantidade - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
        p_item_observacoes,
        a.idEnderecoEstoqueDocFiscal,
        a.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_personalizacao,
          p_item_idLoteEstoque,
          p_item_localEstoque,
          p_item_pessoaParticipante,
          CASE
            WHEN p_item_valorCustoOperacao = 0
              OR p_item_valorAcrescimoExtempTot = 0
              OR p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot = 0
            THEN p_item_precoCustoOperacao
            ELSE ROUND(p_item_precoCustoOperacao * (p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) / p_item_valorCustoOperacao,7)
          END,
          p_item_precoCMV,
          p_item_observacoes,
          a.idEnderecoEstoqueDocFiscal,
          a.idEnderecoEstoque,
          p_locEst_indicProprPosseItem,
          p_docTransf_estabelecEntrada,
          p_docTransf_estabelecSaida,
          r_bufferIdEstoque,
          v_quantidadeNumerosSerie);
      END IF;
      IF a.quantidade > v_quantidadeNumerosSerie THEN
        ADD_ESTOQUE_INSERE(
          r_bufferIdEstoque, 
          p_estabelecimentoAtivo, 
          p_cab_estabelecimento,
          CASE
            WHEN p_cab_dataEntradaSaida IS NULL
              OR p_cab_dataEntradaSaida < p_cab_dataEmissao
            THEN p_cab_dataEmissao
            ELSE p_cab_dataEntradaSaida
          END, -- p_data
          p_item_gradeProduto,
          p_cab_modeloDocumento,
          100, --p_operacaoInternaEstoque
          p_cab_atualizaCustoMedio,
          p_cab_atualizaUltimaCompra,
          p_cab_entradaSaida,
          p_locEst_indicProprPosseItem,
          p_item_pessoaParticipante,
          p_item_localEstoque,
          p_item_personalizacao,
          p_item_idLoteEstoque,
          a.idEnderecoEstoque,
          0, -- p_idNumeroSerie
          a.quantidade - v_quantidadeNumerosSerie,
          CASE
            WHEN p_item_valorCustoOperacao = 0
              OR p_item_valorAcrescimoExtempTot = 0
              OR p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot = 0
            THEN p_item_precoCustoOperacao
            ELSE ROUND(p_item_precoCustoOperacao * (p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) / p_item_valorCustoOperacao,7)
          END,
          CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND (((p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) * (a.quantidade - v_quantidadeNumerosSerie) / p_item_quantidadeExtemporanea), 2) END,
          p_item_precoCMV,
          CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCMV * (a.quantidade - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
          p_item_observacoes,
          0, -- p_idItemPreDocumento,
          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, --p_operacaoInternaEstoque
            0, --p_atualizaCustoMedio
            0, --p_atualizaUltimaCompra
            CASE
              WHEN p_cab_entradaSaida = 'S'
              THEN 'E'
              ELSE 'S'
            END, --p_entradaSaida
            p_locEstTransito_indicProprPos,
            p_item_pessoaParticipante,
            p_modDoc_transitoLocalEstoque,
            p_item_personalizacao,
            p_item_idLoteEstoque,
            a.idEnderecoEstoque,
            0, -- p_idNumeroSerie
            a.quantidade - v_quantidadeNumerosSerie,
            CASE
              WHEN p_item_valorCustoOperacao = 0
                OR p_item_valorAcrescimoExtempTot = 0
                OR p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot = 0
              THEN p_item_precoCustoOperacao
              ELSE ROUND(p_item_precoCustoOperacao * (p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) / p_item_valorCustoOperacao,7)
            END,
            CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND (((p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) * (a.quantidade - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
            p_item_precoCMV,
            CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCMV * (a.quantidade - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
            p_item_observacoes,
            0, -- p_idItemPreDocumento,
            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_valorAcrescimoExtempTot IN NUMBER,
    p_item_observacoes             IN VARCHAR2,
    p_prod_controlaNumeroSerie     IN NUMBER,
    p_prod_controleEstoque         IN NUMBER,
    p_uniMed_casasDecimaisUnidadeM IN VARCHAR2,
    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_valorAcrescimoExtempTot,
      p_item_observacoes,
      p_prod_controlaNumeroSerie,
      p_prod_controleEstoque,
      p_uniMed_casasDecimaisUnidadeM,
      p_locEst_indicProprPosseItem,
      p_docTransf_estabelecEntrada,
      p_docTransf_estabelecSaida,
      r_bufferIdEstoque,
      v_quantidadeEnderecoEstoque);
  END IF;
  IF p_item_quantidade + p_item_quantidadeExtemporanea > 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 + p_item_quantidadeExtemporanea - 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 + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque,
        CASE WHEN v_quantidadeEnderecoEstoque = 0 THEN (p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND (((p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) * (p_item_quantidade + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque) / p_item_quantidade), 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_personalizacao,
          p_item_idLoteEstoque,
          p_item_localEstoque,
          p_item_pessoaParticipante,
          CASE
            WHEN p_item_valorCustoOperacao = 0
              OR p_item_valorAcrescimoExtempTot = 0
              OR p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot = 0
            THEN p_item_precoCustoOperacao
            ELSE ROUND(p_item_precoCustoOperacao * (p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) / p_item_valorCustoOperacao,7)
          END,
          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 + p_item_quantidadeExtemporanea - 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 + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque - v_quantidadeNumerosSerie,
          CASE
            WHEN p_item_valorCustoOperacao = 0
              OR p_item_valorAcrescimoExtempTot = 0
              OR p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot = 0
            THEN p_item_precoCustoOperacao
            ELSE ROUND(p_item_precoCustoOperacao * (p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) / p_item_valorCustoOperacao,7)
          END,
          CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND (((p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) * (p_item_quantidade + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
          p_item_precoCMV,
          CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCMV * (p_item_quantidade + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque - v_quantidadeNumerosSerie) / p_item_quantidade), 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 + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque - v_quantidadeNumerosSerie,
            CASE
              WHEN p_item_valorCustoOperacao = 0
                OR p_item_valorAcrescimoExtempTot = 0
                OR p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot = 0
              THEN p_item_precoCustoOperacao
              ELSE ROUND(p_item_precoCustoOperacao * (p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) / p_item_valorCustoOperacao,7)
            END,
            CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND (((p_item_valorCustoOperacao + p_item_valorAcrescimoExtempTot) * (p_item_quantidade + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque - v_quantidadeNumerosSerie) / p_item_quantidade), 2) END,
            p_item_precoCMV,
            CASE WHEN p_item_quantidade = 0 THEN 0 ELSE ROUND ((p_item_valorCMV * (p_item_quantidade + p_item_quantidadeExtemporanea - v_quantidadeEnderecoEstoque - v_quantidadeNumerosSerie) / p_item_quantidade), 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);
BEGIN
  v_bufferIdEstoque := '';
  FOR a IN (
    SELECT a.idEstoque
    FROM MOESTOQUES a
    JOIN MODOCFISCALXESTOQUE b
    ON b.idEstoque = a.idEstoque
    WHERE b.idItemDocFiscal = p_idItemDocFiscal
    ORDER BY a.idEstoque)
  LOOP
    v_bufferIdEstoque :=
    CASE
      WHEN v_bufferIdEstoque
      IS NULL
      OR v_bufferIdEstoque = ''
      OR v_bufferIdEstoque = ' '
      THEN ''
      ELSE RTRIM (v_bufferIdEstoque) || ';'
    END
    || TO_CHAR (LPAD(a.idEstoque,14,'0'));
    ADD_MOESTOQUES_EXCLUI (a.idEstoque);
  END LOOP;
  FOR a IN (
    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.valorAcrescimoExtempTotal,
      item.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      uniMed.casasDecimaisUnidadeMedida,
      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 SIUNIDADESMEDIDA uniMed
    ON uniMed.unidadeMedida = prod.unidadeMedida
    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)
  LOOP
    ADD_DOC_FISC_ITEM_EST_GRAVA(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_bufferIdEstoque,
      p_estabelecimentoAtivo,
      a.modeloDocumento,
      a.atualizaCustoMedio,
      a.atualizaUltimaCompra,
      a.entradaSaida,
      a.estabelecimento,
      a.dataEmissao,
      a.dataEntradaSaida,
      a.geraTransferencia,
      a.geraOperacaoEmTransito,
      a.transitoLocalEstoque,
      a.locEstTransito_indicProprPos,
      a.idItemDocFiscal,
      a.gradeProduto,
      a.idFormulaTinta,
      a.personalizacao,
      a.idLoteEstoque,
      a.localEstoque,
      a.pessoaParticipante,
      a.quantidade,
      a.precoCustoOperacao,
      a.valorCustoOperacao,
      a.precoCMV,
      a.valorCMV,
      a.quantidadeExtemporanea,
      a.valorAcrescimoExtempTotal,
      a.observacoes,
      a.controlaNumeroSerie,
      a.controleEstoque,
      a.casasDecimaisUnidadeMedida,
      a.locEst_indicProprPosseItem,
      a.estXLoc_solicitaEnderecoEst,
      a.docTransf_estabelecEntrada,
      a.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);
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 a IN (
    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)
  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,
      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,
      a.produto,
      a.cor,
      a.tamanho,
      a.controleEstoque,
      a.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 a.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,
      a.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_362_calcCustoPorGrade IN NUMBER,
    p_cab_idDocumentoFiscal        IN NUMBER,
    p_cab_origemDocumento          IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_devolucaoAnulacaoRetorno IN NUMBER,
    p_cab_atualizaCustoMedio       IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_nfFornecedor             IN NUMBER,
    p_cab_dataEntradaSaida         IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_cab_localDestinoOperacao     IN CHAR,
    p_cab_indicadorConsumidorFinal IN CHAR,
    p_cab_tipoPagamentoFrete       IN CHAR,
    p_pess_indicadorInscricaoEstad IN CHAR,
    /* Retornos */
    r_cab_valorProdutos            OUT NUMBER,
    r_cab_valorServicos            OUT NUMBER,
    r_cab_valorBasePagamento       OUT NUMBER,
    r_cab_valorAVistaMinimo        OUT NUMBER,
    r_cab_valorFreteTotal          OUT NUMBER,
    r_cab_valorSeguroTotal         OUT NUMBER,
    r_cab_valorDescontoTotal       OUT NUMBER,
    r_cab_valorOutrasDespesasTotal OUT NUMBER,
    r_cab_valorAdicFreteMarinTotal OUT NUMBER,
    r_cab_valorDespesasAduanTotal  OUT NUMBER,
    r_cab_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;
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 a IN (
    SELECT
      a.*,
      gradProd.produto,
      gradProd.cor,
      gradProd.tamanho,
      prod.controleEstoque,
      prod.tipoProduto,
      modDoc.geraFinanceiro modDoc_geraFinanceiro,
      modDoc.diminuiDescontoPrUnit,
      modDoc.somaAcrescimosPrUnit,
      modDoc.somaFreteSeguroPrUnit
    FROM MODOCFISCALXITENS a
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = a.modeloDocumento
    WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
    AND a.cancelado = 0
    ORDER BY a.sequencia)
  LOOP
    v_precoUnitario                := a.precoUnitario;
    v_precoUnitarioConvertido      := a.precoUnitarioConvertido;
    v_valorProdutoServico          := a.valorProdutoServico;
    v_valorBasePagamento           := a.valorBasePagamento;
    v_valorFreteTotal              := a.valorFreteTotal;
    v_valorSeguroTotal             := a.valorSeguroTotal;
    v_valorDescontoTotal           := a.valorDescontoTotal;
    v_valorOutrasDespesasTotal     := a.valorOutrasDespesasTotal;
    v_valorAdicFreteMarinMerTotal  := a.valorAdicFreteMarinhaMerTotal;
    v_valorDespesasAduaneirasTotal := a.valorDespesasAduaneirasTotal;
    v_baseISSQN                    := a.baseISSQN;
    v_valorISSQN                   := a.valorISSQN;
    v_baseIRRF                     := a.baseIRRF;
    v_valorIRRF                    := a.valorIRRF;
    v_baseINSS                     := a.baseINSS;
    v_valorINSS                    := a.valorINSS;
    v_baseRetPIS                   := a.baseRetPIS;
    v_valorRetPIS                  := a.valorRetPIS;
    v_baseRetCOFINS                := a.baseRetCOFINS;
    v_valorRetCOFINS               := a.valorRetCOFINS;
    v_baseRetCSLL                  := a.baseRetCSLL;
    v_valorRetCSLL                 := a.valorRetCSLL;
    v_baseII                       := a.baseII;
    v_valorII                      := a.valorII;
    v_baseIOF                      := a.baseIOF;
    v_valorIOF                     := a.valorIOF;
    v_baseIPI                      := a.baseIPI;
    v_valorIPI                     := a.valorIPI;
    v_basePIS                      := a.basePIS;
    v_valorPIS                     := a.valorPIS;
    v_basePISST                    := a.basePISST;
    v_valorPISST                   := a.valorPISST;
    v_baseCOFINS                   := a.baseCOFINS;
    v_valorCOFINS                  := a.valorCOFINS;
    v_baseCOFINSST                 := a.baseCOFINSST;
    v_valorCOFINSST                := a.valorCOFINSST;
    v_baseCreditoSimplesNacional   := a.baseCreditoSimplesNacional;
    v_valorCreditoSimplesNacional  := a.valorCreditoSimplesNacional;
    v_baseICMS                     := a.baseICMS;
    v_valorICMSOperacao            := a.valorICMSOperacao;
    v_valorICMSDiferido            := a.valorICMSDiferido;
    v_valorICMS                    := a.valorICMS;
    v_valorICMSDesoneracao         := a.valorICMSDesoneracao;
    v_baseICMSST                   := a.baseICMSST;
    v_valorICMSST                  := a.valorICMSST;
    v_baseICMSSTAnteriormente      := a.baseICMSSTAnteriormente;
    v_valorICMSSTAnteriormente     := a.valorICMSSTAnteriormente;
    v_valorICMSProprioSubstituto   := a.valorICMSProprioSubstituto;
    v_baseICMSEfetivo              := a.baseICMSEfetivo;
    v_valorICMSEfetivo             := a.valorICMSEfetivo;
    v_baseICMSEscrituracao         := a.baseICMSEscrituracao;
    v_valorICMSEscrituracao        := a.valorICMSEscrituracao;
    v_valorICMSDesonEscrituracao   := a.valorICMSDesonEscrituracao;
    v_baseICMSSTEscrituracao       := a.baseICMSSTEscrituracao;
    v_valorICMSSTEscrituracao      := a.valorICMSSTEscrituracao;
    v_baseICMSUFDestinatario       := a.baseICMSUFDestinatario;
    v_valorICMSUFDestinatario      := a.valorICMSUFDestinatario;
    v_baseICMSUFRemetente          := a.baseICMSUFRemetente;
    v_valorICMSUFRemetente         := a.valorICMSUFRemetente;
    v_baseFCP                      := a.baseFCP;
    v_valorFCP                     := a.valorFCP;
    v_baseFCPST                    := a.baseFCPST;
    v_valorFCPST                   := a.valorFCPST;
    v_baseFCPSTAnteriormente       := a.baseFCPSTAnteriormente;
    v_valorFCPSTAnteriormente      := a.valorFCPSTAnteriormente;
    v_baseFCPUFDestinatario        := a.baseFCPUFDestinatario;
    v_valorFCPUFDestinatario       := a.valorFCPUFDestinatario;
    v_baseEstimadaImpostos         := a.baseEstimadaImpostos;
    v_valorEstimadoImpFederais     := a.valorEstimadoImpFederais;
    v_valorEstimadoImpEstaduais    := a.valorEstimadoImpEstaduais;
    v_valorEstimadoImpMunicipais   := a.valorEstimadoImpMunicipais;
    v_valorImpSomaPagamento        := a.valorImpostosSomaPagamento;
    v_valorImpDiminuiPagamento     := a.valorImpostosDiminuiPagamento;
    v_valorLiquidoItem             := a.valorLiquidoItem;
    v_valorDescontoCustoOpTotal    := a.valorDescontoCustoOpTotal;
    v_valorAcrescimoCustoOpTotal   := a.valorAcrescimoCustoOpTotal;
    v_precoCustoOperacao           := a.precoCustoOperacao;
    v_valorCustoOperacao           := a.valorCustoOperacao;
    v_precoCMV                     := a.precoCMV;
    v_valorCMV                     := a.valorCMV;
    v_valorAcrescimoExtempSubtotal := a.valorAcrescimoExtempSubtotal;
    v_valorAcrescimoExtempTotal    := a.valorAcrescimoExtempTotal;
    ADD_CALCULA_TOTAIS_ITEM(
      p_cab_tipoPagamentoFrete,
      a.diminuiDescontoPrUnit,
      a.somaAcrescimosPrUnit,
      a.somaFreteSeguroPrUnit,
      a.quantidade,
      a.quantidadeConvertida,
      a.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao,
      a.precoUnitario,
      a.valorDescontoItem,
      a.valorAcrescimoItem,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorDescontoGeral,
      a.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      a.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo,
      a.valorAcrescimoExtempItem,
      a.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_362_calcCustoPorGrade,
      p_cab_entradaSaida,
      p_cab_devolucaoAnulacaoRetorno,
      p_cab_estabelecimento,
      p_cab_nfFornecedor,
      p_cab_dataEntradaSaida,
      p_cab_pessoa,
      p_cab_localDestinoOperacao,
      p_cab_indicadorConsumidorFinal,
      p_cab_tipoPagamentoFrete,
      p_pess_indicadorInscricaoEstad,
      a.personalizacao,
      a.quantidade,
      a.precoPautaTabelado,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal,
      a.cfop,
      1,
      a.indicadorISSQN,
      a.aliquotaISSQN,
      v_baseISSQN,
      v_valorISSQN,
      1,
      a.aliquotaIRRF,
      v_baseIRRF,
      v_valorIRRF,
      1,
      a.aliquotaINSS,
      v_baseINSS,
      v_valorINSS,
      1,
      a.retencaoPIS,
      v_baseRetPIS,
      v_valorRetPIS,
      1,
      a.retencaoCOFINS,
      v_baseRetCOFINS,
      v_valorRetCOFINS,
      1,
      a.retencaoCSLL,
      v_baseRetCSLL,
      v_valorRetCSLL,
      1,
      a.aliquotaII,
      v_baseII,
      v_valorII,
      1,
      a.aliquotaIOF,
      v_baseIOF,
      v_valorIOF,
      1,
      a.aliquotaIPI,
      a.valorAliquotaIPI,
      v_baseIPI,
      v_valorIPI,
      a.valorIPIDevolucao,
      1,
      a.aliquotaPIS,
      a.valorAliquotaPIS,
      v_basePIS,
      v_valorPIS,
      1,
      a.aliquotaPISST,
      a.valorAliquotaPISST,
      v_basePISST,
      v_valorPISST,
      1,
      a.aliquotaCOFINS,
      a.valorAliquotaCOFINS,
      v_baseCOFINS,
      v_valorCOFINS,
      1,
      a.aliquotaCOFINSST,
      a.valorAliquotaCOFINSST,
      v_baseCOFINSST,
      v_valorCOFINSST,
      1,
      a.stSimplesNacional,
      a.creditoSimplesNacional,
      v_baseCreditoSimplesNacional,
      v_valorCreditoSimplesNacional,
      1,
      a.stICMS,
      a.modalidadeBaseCalcICMS,
      a.reducaoBaseICMS,
      a.aliquotaICMS,
      a.diferimentoICMS,
      v_baseICMS,
      v_valorICMSOperacao,
      v_valorICMSDiferido,
      v_valorICMS,
      v_valorICMSDesoneracao,
      1,
      a.modalidadeBaseCalcICMSST,
      a.margemValorAdicionadoST,
      a.reducaoBaseST,
      a.aliquotaICMSST,
      v_baseICMSST,
      v_valorICMSST,
      1,
      v_baseICMSSTAnteriormente,
      v_valorICMSSTAnteriormente,
      v_valorICMSProprioSubstituto,
      a.reducaoBaseICMSEfetivo,
      a.aliquotaICMSEfetivo,
      v_baseICMSEfetivo,
      v_valorICMSEfetivo,
      1,
      a.stICMSEscrituracao,
      a.reducaoBaseICMSEscrituracao,
      a.aliquotaICMSEscrituracao,
      v_baseICMSEscrituracao,
      v_valorICMSEscrituracao,
      v_valorICMSDesonEscrituracao,
      1,
      a.margemValorAdicSTEscrituracao,
      a.reducaoBaseSTEscrituracao,
      a.aliquotaICMSSTEscrituracao,
      v_baseICMSSTEscrituracao,
      v_valorICMSSTEscrituracao,
      1,
      a.aliquotaICMSUFDestinatario,
      a.aliquotaICMSInterestadual,
      a.partilhaICMSInterestadual,
      v_baseICMSUFDestinatario,
      v_valorICMSUFDestinatario,
      v_baseICMSUFRemetente,
      v_valorICMSUFRemetente,
      1,
      a.aliquotaFCP,
      v_baseFCP,
      v_valorFCP,
      a.aliquotaFCPST,
      v_baseFCPST,
      v_valorFCPST,
      a.aliquotaFCPSTAnteriormente,
      v_baseFCPSTAnteriormente,
      v_valorFCPSTAnteriormente,
      a.aliquotaFCPUFDestinatario,
      v_baseFCPUFDestinatario,
      v_valorFCPUFDestinatario,
      1,
      a.aliquotaEstimadaImpFederais,
      a.aliquotaEstimadaImpEstaduais,
      a.aliquotaEstimadaImpMunicipais,
      v_baseEstimadaImpostos,
      v_valorEstimadoImpFederais,
      v_valorEstimadoImpEstaduais,
      v_valorEstimadoImpMunicipais,
      a.produto,
      a.cor,
      a.tamanho,
      a.controleEstoque,
      a.tipoProduto,
      /* 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_origemDocumento,
      p_cab_nfFornecedor,
      p_cab_tipoPagamentoFrete,
      a.geraFinanceiro,
      v_valorProdutoServico,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorIRRF,
      v_valorINSS,
      v_valorRetPIS,
      v_valorRetCOFINS,
      v_valorRetCSLL,
      v_valorII,
      v_valorIOF,
      v_valorIPI,
      a.valorIPIDevolucao,
      v_valorICMSST,
      v_valorICMSSTEscrituracao,
      a.somarICMSST,
      v_valorAcrescimoExtempTotal,
      a.modDoc_geraFinanceiro,
      /* Retornos */
      v_valorBasePagamento,
      v_valorImpSomaPagamento,
      v_valorImpDiminuiPagamento,
      v_valorLiquidoItem);
    ADD_CALCULA_CUSTO_CMV (
      p_cab_atualizaCustoMedio,
      p_cab_nfFornecedor,
      a.modeloDocumento,
      a.quantidade,
      v_valorII,
      v_valorIOF,
      v_valorIPI,
      a.valorIPIDevolucao,
      v_valorPIS,
      v_valorPISST,
      v_valorCOFINS,
      v_valorCOFINSST,
      v_valorCreditoSimplesNacional,
      v_valorICMS,
      v_valorICMSST,
      v_valorICMSSTEscrituracao,
      v_valorLiquidoItem,
      a.valorDescontoCustoOpItem,
      a.valorDescontoCustoOpGeral,
      a.valorAcrescimoCustoOpItem,
      a.valorAcrescimoCustoOpGeral,
      v_valorAcrescimoExtempTotal,
      /* Retornos */
      v_valorDescontoCustoOpTotal,
      v_valorAcrescimoCustoOpTotal,
      v_precoCustoOperacao,
      v_valorCustoOperacao,
      v_precoCMV,
      v_valorCMV);
    UPDATE MODOCFISCALXITENS SET
      precoUnitario                 = v_precoUnitario,
      precoUnitarioConvertido       = v_precoUnitarioConvertido,
      valorProdutoServico           = v_valorProdutoServico,
      valorBasePagamento            = v_valorBasePagamento,
      valorFreteTotal               = v_valorFreteTotal,
      valorSeguroTotal              = v_valorSeguroTotal,
      valorDescontoTotal            = v_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
      valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
      baseISSQN                     = v_baseISSQN,
      valorISSQN                    = v_valorISSQN,
      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           = a.idItemDocFiscal;
    IF a.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 a.usarPrecoAVista = 1 AND a.geraFinanceiro = 1 THEN
      r_cab_valorAVistaMinimo        := r_cab_valorAVistaMinimo + v_valorProdutoServico + a.valorDescontoPagamento - a.valorOutrasDespesasPagamento - a.valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
    END IF;
    r_cab_valorFreteTotal          := r_cab_valorFreteTotal + v_valorFreteTotal;
    r_cab_valorSeguroTotal         := r_cab_valorSeguroTotal + v_valorSeguroTotal;
    r_cab_valorDescontoTotal       := r_cab_valorDescontoTotal + v_valorDescontoTotal;
    r_cab_valorOutrasDespesasTotal := r_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
    r_cab_valorAdicFreteMarinTotal := r_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
    r_cab_valorDespesasAduanTotal  := r_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
    r_cab_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_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_habilitaControleEntrega      NUMBER;
BEGIN
  FOR a IN (
    SELECT a.*,
      pess.indicadorInscricaoEstadual,
      COALESCE((
        SELECT MIN(munEndEst.uf)
        FROM PAESTABELECIMENTOS est
        JOIN CAENDERECOSPESSOA endEst
        ON endEst.pessoa = est.pessoaEstabelecimento
        JOIN SIMUNICIPIOS munEndEst
        ON munEndEst.municipio = endEst.municipio
        WHERE est.estabelecimento = a.estabelecimento
        AND endEst.ativo = 1
        AND endEst.principal = 1),'  ') munEndEst_uf
    FROM MODOCUMENTOSFISCAIS a
    JOIN CAPESSOAS pess
    ON pess.pessoa = a.pessoa
    WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal)
  LOOP
    v_cab_valorProdutos            := a.valorProdutos;
    v_cab_valorServicos            := a.valorServicos;
    v_cab_valorBasePagamento       := a.valorBasePagamento;
    v_cab_valorAVistaMinimo        := a.valorAVistaMinimo;
    v_cab_valorFreteTotal          := a.valorFreteTotal;
    v_cab_valorSeguroTotal         := a.valorSeguroTotal;
    v_cab_valorDescontoTotal       := a.valorDescontoTotal;
    v_cab_valorOutrasDespesasTotal := a.valorOutrasDespesasTotal;
    v_cab_valorAdicFreteMarinTotal := a.valorAdicFreteMarinhaMerTotal;
    v_cab_valorDespesasAduanTotal  := a.valorDespesasAduaneirasTotal;
    v_cab_valorImpSomaPagamento    := a.valorImpostosSomaPagamento;
    v_cab_valorImpDiminuiPagamento := a.valorImpostosDiminuiPagamento;
    v_cab_valorLiquidoItem         := a.valorLiquidoItem;
    v_cab_valorDescCustoOpTotal    := a.valorDescontoCustoOpTotal;
    v_cab_valorAcrescCustoOpTotal  := a.valorAcrescimoCustoOpTotal;
    v_cab_valorCustoOperacao       := a.valorCustoOperacao;
    v_cab_valorCMV                 := a.valorCMV;
    v_cab_valorAcrescExtempTotal   := a.valorAcrescimoExtempTotal;
    SELECT
      CASE
        WHEN EXISTS (
          SELECT 1
          FROM MODOCFISCALXITENS a
          JOIN MODOCFISCALXORCAMENTOITEM docXorc
          ON docXorc.idItemDocFiscal = a.idItemDocFiscal
          JOIN MOORCAMENTOXITENS itemOrc
          ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento
          JOIN PACONTROLESENTREGA contr
          ON contr.controleEntrega = itemOrc.controleEntrega
          WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
          AND itemOrc.controleEntrega <> 0
          AND contr.habilitaFrete = 1)
        THEN 1
        ELSE 0
      END
    INTO v_habilitaControleEntrega
    FROM DUAL;
    ADD_DOC_FISC_CALC_IMP_RATEIO (
      a.idDocumentoFiscal,
      p_troca_tipoPagamentoFrete,
      p_a_cab_tipoPagamentoFrete,
      a.origemDocumento,
      a.entradaSaida,
      a.devolucaoAnulacaoRetorno,
      a.atualizaCustoMedio,
      a.nfFornecedor,
      a.tipoPagamentoFrete,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorDescontoGeral,
      a.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      a.impostosEditados,
      a.valorDescontoCustoOpGeral,
      a.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoExtempGeral,
      v_habilitaControleEntrega,
      /* Retornos */
      v_cab_valorProdutos,
      v_cab_valorServicos,
      v_cab_valorBasePagamento,
      v_cab_valorAVistaMinimo,
      v_cab_valorFreteTotal,
      v_cab_valorSeguroTotal,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespesasTotal,
      v_cab_valorAdicFreteMarinTotal,
      v_cab_valorDespesasAduanTotal,
      v_cab_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_362_calcCustoPorGrade,
        a.idDocumentoFiscal,
        a.origemDocumento,
        a.entradaSaida,
        a.devolucaoAnulacaoRetorno,
        a.atualizaCustoMedio,
        a.estabelecimento,
        a.nfFornecedor,
        a.dataEntradaSaida,
        a.pessoa,
        a.localDestinoOperacao,
        a.indicadorConsumidorFinal,
        a.tipoPagamentoFrete,
        a.indicadorInscricaoEstadual,
        /* Retornos */
        v_cab_valorProdutos,
        v_cab_valorServicos,
        v_cab_valorBasePagamento,
        v_cab_valorAVistaMinimo,
        v_cab_valorFreteTotal,
        v_cab_valorSeguroTotal,
        v_cab_valorDescontoTotal,
        v_cab_valorOutrasDespesasTotal,
        v_cab_valorAdicFreteMarinTotal,
        v_cab_valorDespesasAduanTotal,
        v_cab_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         = a.idDocumentoFiscal;
  END LOOP;
END ADD_DOC_FISC_CALC_IMP_CAB;

/

create or replace PROCEDURE ADD_DOC_FISC_CAB_FIL_ATUALIZA(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_idDocumentoFiscal            IN NUMBER,
    p_estabelecimentoAtivo         IN NUMBER)
IS
  v_bufferIdProdutoFilho VARCHAR2 (32000);
BEGIN
  v_bufferIdProdutoFilho := '';
  FOR a IN (
    SELECT a.id
    FROM MODOCFISCALXPRODUTOFILHO a
    JOIN MODOCFISCALXITENS b
    ON b.idItemDocFiscal = a.idItemDocFiscal
    WHERE b.idDocumentoFiscal = p_idDocumentoFiscal
    ORDER BY a.id)
  LOOP
    v_bufferIdProdutoFilho :=
      CASE
        WHEN v_bufferIdProdutoFilho IS NULL
          OR v_bufferIdProdutoFilho = ''
          OR v_bufferIdProdutoFilho = ' '
        THEN ''
        ELSE RTRIM (v_bufferIdProdutoFilho) || ';'
      END
      || TO_CHAR (LPAD(a.id,14,'0'));
    DELETE MODOCFISCALXPRODUTOFILHO b
    WHERE b.id = a.id;
  END LOOP;
  FOR a IN (
    SELECT 
      cab.atualizaCustoMedio,
      cab.estabelecimento,
      cab.dataEmissao,
      cab.dataEntradaSaida,
      item.idItemDocFiscal,
      item.gradeProduto,
      item.idFormulaTinta,
      item.personalizacao,
      item.pessoaParticipante,
      item.quantidade,
      item.valorCustoOperacao,
      item.valorAcrescimoExtempTotal,
      item.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      locEst.indicadorPropriedadePosseItem locEst_indicProprPosseItem,
      COALESCE (estXLoc.solicitaEnderecoEstoque,0) estXLoc_solicitaEnderecoEst
    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 PALOCAISESTOQUE locEst
    ON locEst.localEstoque = item.localEstoque
    LEFT JOIN PAESTABELECIMENTOXLOCAISE estXLoc
    ON estXLoc.estabelecimento = cab.estabelecimento
    AND estXLoc.localEstoque = item.localEstoque
    WHERE item.idDocumentoFiscal = p_idDocumentoFiscal
    AND item.cancelado = 0
    AND item.quantidade > 0
    AND cab.situacaoDocumentoFiscal BETWEEN 21 AND 23)
  LOOP
    ADD_DOC_FISC_ITEM_FIL_GRAVA(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_bufferIdProdutoFilho,
      p_estabelecimentoAtivo,
      a.atualizaCustoMedio,
      a.estabelecimento,
      a.dataEmissao,
      a.dataEntradaSaida,
      a.idItemDocFiscal,
      a.gradeProduto,
      a.idFormulaTinta,
      a.personalizacao,
      a.pessoaParticipante,
      a.quantidade,
      a.valorCustoOperacao,
      a.observacoes,
      a.controlaNumeroSerie,
      a.controleEstoque,
      a.locEst_indicProprPosseItem,
      a.estXLoc_solicitaEnderecoEst,
      v_bufferIdProdutoFilho);
  END LOOP;
END ADD_DOC_FISC_CAB_FIL_ATUALIZA;

/

create or replace PROCEDURE ADD_DOC_FISC_CAB_EST_ATUALIZA(
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_idDocumentoFiscal            IN NUMBER,
    p_estabelecimentoAtivo         IN NUMBER
  )
IS
  v_bufferIdEstoque        VARCHAR2 (32000);
BEGIN
  v_bufferIdEstoque := '';
  FOR a IN (
    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)
  LOOP
    v_bufferIdEstoque :=
      CASE
        WHEN v_bufferIdEstoque IS NULL
          OR v_bufferIdEstoque = ''
          OR v_bufferIdEstoque = ' '
        THEN ''
        ELSE RTRIM (v_bufferIdEstoque) || ';'
      END
      || TO_CHAR (LPAD(a.idEstoque,14,'0'));
    ADD_MOESTOQUES_EXCLUI (a.idEstoque);
  END LOOP;
  FOR a IN (
    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.valorAcrescimoExtempTotal,
      item.observacoes,
      prod.controlaNumeroSerie,
      prod.controleEstoque,
      uniMed.casasDecimaisUnidadeMedida,
      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 SIUNIDADESMEDIDA uniMed
    ON uniMed.unidadeMedida = prod.unidadeMedida
    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)
  LOOP
    ADD_DOC_FISC_ITEM_EST_GRAVA(
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      v_bufferIdEstoque,
      p_estabelecimentoAtivo,
      a.modeloDocumento,
      a.atualizaCustoMedio,
      a.atualizaUltimaCompra,
      a.entradaSaida,
      a.estabelecimento,
      a.dataEmissao,
      a.dataEntradaSaida,
      a.geraTransferencia,
      a.geraOperacaoEmTransito,
      a.transitoLocalEstoque,
      a.locEstTransito_indicProprPos,
      a.idItemDocFiscal,
      a.gradeProduto,
      a.idFormulaTinta,
      a.personalizacao,
      a.idLoteEstoque,
      a.localEstoque,
      a.pessoaParticipante,
      a.quantidade,
      a.precoCustoOperacao,
      a.valorCustoOperacao,
      a.precoCMV,
      a.valorCMV,
      a.quantidadeExtemporanea,
      a.valorAcrescimoExtempTotal,
      a.observacoes,
      a.controlaNumeroSerie,
      a.controleEstoque,
      a.casasDecimaisUnidadeMedida,
      a.locEst_indicProprPosseItem,
      a.estXLoc_solicitaEnderecoEst,
      a.docTransf_estabelecEntrada,
      a.docTransf_estabelecSaida,
      v_bufferIdEstoque);
  END LOOP;
END ADD_DOC_FISC_CAB_EST_ATUALIZA;

/

