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

/

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

/

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

/

create or replace PROCEDURE ADD_DOC_FISC_CALC_IMP_RATEIO (
  p_cab_idDocumentoFiscal        IN NUMBER,
  p_troca_tipoPagamentoFrete     IN NUMBER,
  p_a_cab_tipoPagamentoFrete     IN CHAR,
  p_cab_origemDocumento          IN NUMBER,
  p_cab_entradaSaida             IN CHAR,
  p_cab_devolucaoAnulacaoRetorno IN NUMBER,
  p_cab_atualizaCustoMedio       IN NUMBER,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_nfFornecedor             IN NUMBER,
  p_cab_tipoPagamentoFrete       IN CHAR,
  p_cab_valorFreteGeral          IN NUMBER,
  p_cab_valorSeguroGeral         IN NUMBER,
  p_cab_valorDescontoGeral       IN NUMBER,
  p_cab_valorOutrasDespesasGeral IN NUMBER,
  p_cab_valorAdicFreteMarinGeral IN NUMBER,
  p_cab_valorDespesasAduanGeral  IN NUMBER,
  p_cab_valorDescontoPagamento   IN NUMBER,
  p_cab_valorOutrasDespPagamento IN NUMBER,
  p_cab_valorJurosPagamento      IN NUMBER,
  p_cab_impostosEditados         IN NUMBER,
  p_cab_valorDescCustoOpGeral    IN NUMBER,
  p_cab_valorAcrescCustoOpGeral  IN NUMBER,
  p_cab_valorAcrescExtempGeral   IN NUMBER,
  p_habilitaControleEntrega      IN NUMBER,
  /* Retornos */
  r_cab_valorProdutos            OUT NUMBER,
  r_cab_valorServicos            OUT NUMBER,
  r_cab_valorBasePagamento       OUT NUMBER,
  r_cab_valorAVistaMinimo        OUT NUMBER,
  r_cab_valorFreteTotal          OUT NUMBER,
  r_cab_valorSeguroTotal         OUT NUMBER,
  r_cab_valorDescontoTotal       OUT NUMBER,
  r_cab_valorOutrasDespesasTotal OUT NUMBER,
  r_cab_valorAdicFreteMarinTotal OUT NUMBER,
  r_cab_valorDespesasAduanTotal  OUT NUMBER,
  r_cab_valorLiquidoItem         OUT NUMBER,
  r_cab_valorDescCustoOpTotal    OUT NUMBER,
  r_cab_valorAcrescCustoOpTotal  OUT NUMBER,
  r_cab_valorCustoOperacao       OUT NUMBER,
  r_cab_valorCMV                 OUT NUMBER,
  r_cab_valorAcrescExtempTotal   OUT NUMBER,
  r_calcularImpostosItem         OUT NUMBER)
IS
  v_auxNumber                    NUMBER;
  v_valorDescontoPromocaoGeral   NUMBER;
  v_valorDescontoPromocaoPagamen NUMBER;
  v_rateioDescontofiltrarSemProm NUMBER;
  v_rateioDescontofiltrarAPrazo  NUMBER;
  v_rateioFretePorControleEntr   NUMBER;
  v_valorBaseFreteSemFinSemEntr  NUMBER;
  v_valorBaseFreteComFinSemEntr  NUMBER;
  v_valorBaseFreteSemFinComEntr  NUMBER;
  v_valorBaseFreteComFinComEntr  NUMBER;
  v_valorBaseRateio              NUMBER;
  v_valorBaseRateioComEntrega    NUMBER;
  v_valorBaseRateioFinanceiro    NUMBER;
  v_valorBaseRateioOutrasDespGer NUMBER;
  v_valorBaseRateioOutrasDespFin NUMBER;
  v_valorBaseRateioDescontoGeral NUMBER;
  v_valorBaseRateioPagamento     NUMBER;
  v_valorBaseRateioPagamFinanc   NUMBER;
  v_valorBaseRateioPagamDesconto NUMBER;
  v_valorBaseRateioPagamFinDesc  NUMBER;
  v_saldoRatFreteGeral           NUMBER;
  v_saldoRatSeguroGeral          NUMBER;
  v_saldoRatDescontoGeral        NUMBER;
  v_saldoRatOutrasDespesasGeral  NUMBER;
  v_saldoRatAdicFreteMarinGeral  NUMBER;
  v_saldoRatDespesasAduanGeral   NUMBER;
  v_saldoRatDescontoPagamento    NUMBER;
  v_saldoRatOutrasDespPagamento  NUMBER;
  v_saldoRatJurosPagamento       NUMBER;
  v_saldoRatDescCustoOpGeral     NUMBER;
  v_saldoRatAcrescCustoOpGeral   NUMBER;
  v_saldoRatAcrescExtempGeral    NUMBER;
  v_residuoFreteGeral            NUMBER;
  v_residuoSeguroGeral           NUMBER;
  v_residuoDescontoGeral         NUMBER;
  v_residuoOutrasDespesasGeral   NUMBER;
  v_residuoAdicFreteMarinGeral   NUMBER;
  v_residuoDespesasAduanGeral    NUMBER;
  v_residuoDescontoPagamento     NUMBER;
  v_residuoOutrasDespPagamento   NUMBER;
  v_residuoJurosPagamento        NUMBER;
  v_residuoDescCustoOpGeral      NUMBER;
  v_residuoAcrescCustoOpGeral    NUMBER;
  v_residuoAcrescExtempGeral     NUMBER;
  v_idItemDocFiscalUltimoItem    NUMBER;
  v_idItemDocFiscalRateioFrete   NUMBER;
  v_precoUnitario                NUMBER;
  v_precoUnitarioConvertido      NUMBER;
  v_valorProdutoServico          NUMBER;
  v_valorFreteGeral              NUMBER;
  v_valorSeguroGeral             NUMBER;
  v_valorDescontoGeral           NUMBER;
  v_valorOutrasDespesasGeral     NUMBER;
  v_valorAdicFreteMarinMerGeral  NUMBER;
  v_valorDespesasAduaneirasGeral NUMBER;
  v_valorBasePagamento           NUMBER;
  v_valorDescontoPagamento       NUMBER;
  v_valorOutrasDespesasPagamento NUMBER;
  v_valorJurosPagamento          NUMBER;
  v_valorFreteTotal              NUMBER;
  v_valorSeguroTotal             NUMBER;
  v_valorDescontoTotal           NUMBER;
  v_valorOutrasDespesasTotal     NUMBER;
  v_valorAdicFreteMarinMerTotal  NUMBER;
  v_valorDespesasAduaneirasTotal NUMBER;
  v_valorLiquidoItem             NUMBER;
  v_valorDescontoCustoOpGeral    NUMBER;
  v_valorDescontoCustoOpTotal    NUMBER;
  v_valorAcrescimoCustoOpGeral   NUMBER;
  v_valorAcrescimoCustoOpTotal   NUMBER;
  v_precoCustoOperacao           NUMBER;
  v_valorCustoOperacao           NUMBER;
  v_precoCMV                     NUMBER;
  v_valorCMV                     NUMBER;
  v_valorAcrescimoExtempSubtotal NUMBER;
  v_valorAcrescimoExtempGeral    NUMBER;
  v_valorAcrescimoExtempTotal    NUMBER;
  v_calculoImpostosPendenteItem  NUMBER;
BEGIN
  r_cab_valorProdutos            := 0;
  r_cab_valorServicos            := 0;
  r_cab_valorBasePagamento       := 0;
  r_cab_valorAVistaMinimo        := 0;
  r_cab_valorFreteTotal          := 0;
  r_cab_valorSeguroTotal         := 0;
  r_cab_valorDescontoTotal       := 0;
  r_cab_valorOutrasDespesasTotal := 0;
  r_cab_valorAdicFreteMarinTotal := 0;
  r_cab_valorDespesasAduanTotal  := 0;
  r_cab_valorLiquidoItem         := 0;
  r_cab_valorDescCustoOpTotal    := 0;
  r_cab_valorAcrescCustoOpTotal  := 0;
  r_cab_valorCustoOperacao       := 0;
  r_cab_valorCMV                 := 0;
  r_cab_valorAcrescExtempTotal   := 0;
  r_calcularImpostosItem         := 0;
  v_saldoRatFreteGeral           := p_cab_valorFreteGeral;
  v_saldoRatSeguroGeral          := p_cab_valorSeguroGeral;
  v_saldoRatDescontoGeral        := p_cab_valorDescontoGeral;
  v_saldoRatOutrasDespesasGeral  := p_cab_valorOutrasDespesasGeral;
  v_saldoRatAdicFreteMarinGeral  := p_cab_valorAdicFreteMarinGeral;
  v_saldoRatDespesasAduanGeral   := p_cab_valorDespesasAduanGeral;
  v_saldoRatDescontoPagamento    := p_cab_valorDescontoPagamento;
  v_saldoRatOutrasDespPagamento  := p_cab_valorOutrasDespPagamento;
  v_saldoRatJurosPagamento       := p_cab_valorJurosPagamento;
  v_saldoRatDescCustoOpGeral     := p_cab_valorDescCustoOpGeral;
  v_saldoRatAcrescCustoOpGeral   := p_cab_valorAcrescCustoOpGeral;
  v_saldoRatAcrescExtempGeral    := p_cab_valorAcrescExtempGeral;
  v_residuoFreteGeral            := 0;
  v_residuoSeguroGeral           := 0;
  v_residuoDescontoGeral         := 0;
  v_residuoOutrasDespesasGeral   := 0;
  v_residuoAdicFreteMarinGeral   := 0;
  v_residuoDespesasAduanGeral    := 0;
  v_residuoDescontoPagamento     := 0;
  v_residuoOutrasDespPagamento   := 0;
  v_residuoJurosPagamento        := 0;
  v_residuoDescCustoOpGeral      := 0;
  v_residuoAcrescCustoOpGeral    := 0;
  v_residuoAcrescExtempGeral     := 0;
  v_idItemDocFiscalUltimoItem    := 0;
  v_idItemDocFiscalRateioFrete   := 0;
  v_valorDescontoPromocaoGeral   := 0;
  v_valorDescontoPromocaoPagamen := 0;
  v_rateioDescontofiltrarSemProm := 0;
  v_rateioDescontofiltrarAPrazo  := 0;
  
  -- v_valorDescontoPromocaoGeral
  IF p_cab_valorDescontoGeral > 0 THEN
    SELECT COALESCE(SUM(promo.valorDesconto),0)
    INTO v_valorDescontoPromocaoGeral
    FROM MODOCFISCALXITENS a
    JOIN MODOCFISCALXPROMOCOES promo
    ON promo.idItemDocFiscal = a.idItemDocFiscal
    WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
    AND a.cancelado = 0
    AND promo.cabecalhoItemPagamento ='C';
  END IF;
  
  -- v_valorDescontoPromocaoPagamen
  IF p_cab_valorDescontoPagamento > 0 THEN
    SELECT COALESCE(SUM(promo.valorDesconto),0)
    INTO v_valorDescontoPromocaoPagamen
    FROM MODOCFISCALXITENS a
    JOIN MODOCFISCALXPROMOCOES promo
    ON promo.idItemDocFiscal = a.idItemDocFiscal
    WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
    AND a.cancelado = 0
    AND promo.cabecalhoItemPagamento ='P';
  END IF;

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

  -- v_rateioDescontofiltrarAPrazo
  IF p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral OR p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen THEN
    SELECT
      CASE
        WHEN COALESCE ((
          SELECT SUM (CASE WHEN modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem)
          FROM MODOCFISCALXITENS a
          JOIN PAMODELOSDOCUMENTO modDoc
          ON modDoc.modeloDocumento = a.modeloDocumento
          WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
          AND a.cancelado = 0
          AND a.precoSugestaoAPrazo <> a.precoSugestaoAVista
          AND a.usarPrecoAVista = 1
          AND (v_rateioDescontofiltrarSemProm = 0
            OR NOT(EXISTS(
              SELECT 1
              FROM MODOCFISCALXPROMOCOES promo
              WHERE promo.idItemDocFiscal = a.idItemDocFiscal)))),0) > (
            CASE
              WHEN p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral
              THEN p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral
              ELSE 0
            END +
            CASE
              WHEN p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen
              THEN p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen
              ELSE 0
            END)
          AND EXISTS (
            SELECT 1
            FROM MODOCFISCALXITENS a
            WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
            AND a.cancelado = 0
            AND (a.precoSugestaoAPrazo = a.precoSugestaoAVista
              OR a.usarPrecoAVista = 0)
            AND (v_rateioDescontofiltrarSemProm = 0
              OR NOT(EXISTS(
                SELECT 1
                FROM MODOCFISCALXPROMOCOES promo
                WHERE promo.idItemDocFiscal = a.idItemDocFiscal))))
        THEN 1
        ELSE 0
      END
    INTO v_rateioDescontofiltrarAPrazo
    FROM DUAL;
  END IF;
  
  -- Bases Rateio
  SELECT
    MAX(COALESCE((CASE WHEN p_habilitaControleEntrega = 0 OR EXISTS(SELECT 1 FROM MODOCFISCALXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemDocFiscal = a.idItemDocFiscal AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1) THEN 1 ELSE 0 END),0)),
    COALESCE(SUM(CASE WHEN modDoc.geraFinanceiro = 1 THEN CASE WHEN modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 THEN CASE WHEN modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN modDoc.geraFinanceiro = 1 AND (p_habilitaControleEntrega = 0 OR EXISTS(SELECT 1 FROM MODOCFISCALXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemDocFiscal = a.idItemDocFiscal AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1)) THEN CASE WHEN modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 AND (p_habilitaControleEntrega = 0 OR EXISTS(SELECT 1 FROM MODOCFISCALXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemDocFiscal = a.idItemDocFiscal AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1)) THEN CASE WHEN modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem),0),
    COALESCE(SUM(CASE WHEN p_habilitaControleEntrega = 0 OR EXISTS(SELECT 1 FROM MODOCFISCALXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemDocFiscal = a.idItemDocFiscal AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1) THEN CASE WHEN modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 THEN CASE WHEN modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico - a.valorDescontoItem + a.valorAcrescimoItem END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 THEN CASE WHEN modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico - a.valorDescontoItem + a.valorAcrescimoItem END ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN (v_rateioDescontofiltrarAPrazo = 0 OR a.precoSugestaoAPrazo = a.precoSugestaoAVista OR a.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MODOCFISCALXPROMOCOES promo WHERE promo.idItemDocFiscal = a.idItemDocFiscal))) THEN CASE WHEN modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico - a.valorDescontoItem + a.valorAcrescimoItem END ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 THEN CASE WHEN modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN (v_rateioDescontofiltrarAPrazo = 0 OR a.precoSugestaoAPrazo = a.precoSugestaoAVista OR a.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MODOCFISCALXPROMOCOES promo WHERE promo.idItemDocFiscal = a.idItemDocFiscal))) THEN CASE WHEN modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 AND (v_rateioDescontofiltrarAPrazo = 0 OR a.precoSugestaoAPrazo = a.precoSugestaoAVista OR a.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MODOCFISCALXPROMOCOES promo WHERE promo.idItemDocFiscal = a.idItemDocFiscal))) THEN CASE WHEN modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1 THEN a.valorProdutoServicoBruto ELSE a.valorProdutoServico END - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0)
  INTO
    v_rateioFretePorControleEntr,
    v_valorBaseFreteSemFinSemEntr,
    v_valorBaseFreteComFinSemEntr,
    v_valorBaseFreteSemFinComEntr,
    v_valorBaseFreteComFinComEntr,
    v_valorBaseRateio,
    v_valorBaseRateioComEntrega,
    v_valorBaseRateioFinanceiro,
    v_valorBaseRateioOutrasDespGer,
    v_valorBaseRateioOutrasDespFin,
    v_valorBaseRateioDescontoGeral,
    v_valorBaseRateioPagamento,
    v_valorBaseRateioPagamFinanc,
    v_valorBaseRateioPagamDesconto,
    v_valorBaseRateioPagamFinDesc
  FROM MODOCFISCALXITENS a
  JOIN PAMODELOSDOCUMENTO modDoc
  ON modDoc.modeloDocumento = a.modeloDocumento
  WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND a.cancelado = 0;

  -- Efetua rateio
  FOR a IN (
    SELECT
      a.idItemDocFiscal,
      a.modeloDocumento,
      a.geraFinanceiro,
      a.quantidade,
      a.quantidadeConvertida,
      a.usarPrecoAVista,
      a.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao,
      a.precoUnitario,
      a.precoUnitarioConvertido,
      a.valorProdutoServicoBruto,
      a.valorProdutoServico,
      a.valorDescontoItem,
      a.valorAcrescimoItem,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorDescontoGeral,
      a.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral,
      a.valorBasePagamento,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      a.valorFreteTotal,
      a.valorSeguroTotal,
      a.valorDescontoTotal,
      a.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.valorIPIDevolucao,
      a.retidoISSQN,
      a.valorISSQN,
      a.valorRetIRRF,
      a.valorRetINSS,
      a.valorRetPIS,
      a.valorRetCOFINS,
      a.valorRetCSLL,
      a.valorRetOutros,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMS,
      a.valorICMSST,
      a.valorICMSSTEscrituracao,
      a.somarICMSST,
      a.valorLiquidoItem,
      a.valorDescontoCustoOpItem,
      a.valorDescontoCustoOpGeral,
      a.valorDescontoCustoOpTotal,
      a.valorAcrescimoCustoOpItem,
      a.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoCustoOpTotal,
      a.precoCustoOperacao,
      a.valorCustoOperacao,
      a.precoCMV,
      a.valorCMV,
      a.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo,
      a.valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem,
      a.valorAcrescimoExtempGeral,
      a.valorAcrescimoExtempTotal,
      modDoc.geraFinanceiro modDoc_geraFinanceiro,
      modDoc.diminuiDescontoPrUnit,
      modDoc.somaAcrescimosPrUnit,
      modDoc.somaFreteSeguroPrUnit,
      prod.tipoProduto,
      CASE WHEN p_habilitaControleEntrega = 0 OR EXISTS(
        SELECT 1
        FROM MODOCFISCALXORCAMENTOITEM docXorc
        JOIN MOORCAMENTOXITENS itemOrc
        ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento
        JOIN PACONTROLESENTREGA contr
        ON contr.controleEntrega = itemOrc.controleEntrega
        WHERE docXorc.idItemDocFiscal = a.idItemDocFiscal
        AND contr.habilitaFrete = 1) THEN 1 ELSE 0 END rateioFrete,
      CASE WHEN a.precoSugestaoAPrazo <> a.precoSugestaoAVista AND a.usarPrecoAVista = 1 THEN 1 ELSE 0 END aVista,
      CASE WHEN EXISTS(
        SELECT 1
        FROM MODOCFISCALXPROMOCOES promo
        WHERE promo.idItemDocFiscal = a.idItemDocFiscal) THEN 1 ELSE 0 END promocao,
      COALESCE((
        SELECT SUM(promo.valorDesconto)
        FROM MODOCFISCALXPROMOCOES promo
        WHERE promo.idItemDocFiscal = a.idItemDocFiscal
        AND promo.cabecalhoItemPagamento ='C'),0) valorDescontoPromocaoGeral,
      COALESCE((
        SELECT SUM(promo.valorDesconto)
        FROM MODOCFISCALXPROMOCOES promo
        WHERE promo.idItemDocFiscal = a.idItemDocFiscal
        AND promo.cabecalhoItemPagamento ='P'),0) valorDescontoPromocaoPagamento,
      CASE
        WHEN EXISTS (
          SELECT 1
          FROM CAPRODUTOXCOMPOSICOESPREC compPrec
          WHERE compPrec.produto = gradProd.produto
          AND compPrec.ativo = 1)
        THEN 1
        ELSE 0
      END composicaoPreco
    FROM MODOCFISCALXITENS a
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = a.modeloDocumento
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
    AND a.cancelado = 0
    ORDER BY a.sequencia)
  LOOP
    v_idItemDocFiscalUltimoItem    := a.idItemDocFiscal;
    v_precoUnitario                := a.precoUnitario;
    v_precoUnitarioConvertido      := a.precoUnitarioConvertido;
    v_valorProdutoServico          := a.valorProdutoServico;
    v_valorDescontoGeral           := v_residuoDescontoGeral;
    v_valorFreteGeral              := v_residuoFreteGeral;
    v_valorSeguroGeral             := v_residuoSeguroGeral;
    v_valorAdicFreteMarinMerGeral  := v_residuoAdicFreteMarinGeral;
    v_valorDespesasAduaneirasGeral := v_residuoDespesasAduanGeral;
    v_valorOutrasDespesasGeral     := v_residuoOutrasDespesasGeral;
    v_valorBasePagamento           := a.valorBasePagamento;
    v_valorDescontoPagamento       := v_residuoDescontoPagamento;
    v_valorOutrasDespesasPagamento := v_residuoOutrasDespPagamento;
    v_valorJurosPagamento          := v_residuoJurosPagamento;
    v_valorDescontoCustoOpGeral    := v_residuoDescCustoOpGeral;
    v_valorAcrescimoCustoOpGeral   := v_residuoAcrescCustoOpGeral;
    v_valorAcrescimoExtempGeral    := v_residuoAcrescExtempGeral;
    v_valorFreteTotal              := a.valorFreteTotal;
    v_valorSeguroTotal             := a.valorSeguroTotal;
    v_valorDescontoTotal           := a.valorDescontoTotal;
    v_valorOutrasDespesasTotal     := a.valorOutrasDespesasTotal;
    v_valorAdicFreteMarinMerTotal  := a.valorAdicFreteMarinhaMerTotal;
    v_valorDespesasAduaneirasTotal := a.valorDespesasAduaneirasTotal;
    v_valorLiquidoItem             := a.valorLiquidoItem;
    v_valorDescontoCustoOpTotal    := a.valorDescontoCustoOpTotal;
    v_valorAcrescimoCustoOpTotal   := a.valorAcrescimoCustoOpTotal;
    v_precoCustoOperacao           := a.precoCustoOperacao;
    v_valorCustoOperacao           := a.valorCustoOperacao;
    v_precoCMV                     := a.precoCMV;
    v_valorCMV                     := a.valorCMV;
    v_valorAcrescimoExtempSubtotal := a.valorAcrescimoExtempSubtotal;
    v_valorAcrescimoExtempTotal    := a.valorAcrescimoExtempTotal;

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

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

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

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

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

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

    -- Recalcula Valores
    ADD_CALCULA_TOTAIS_ITEM(
      p_cab_tipoPagamentoFrete,
      a.quantidade,
      a.quantidadeConvertida,
      a.precoUnitarioBruto,
      a.acrescimoUnitarioComposicao,
      a.precoUnitario,
      a.valorDescontoItem,
      a.valorAcrescimoItem,
      a.valorFreteItem,
      a.valorSeguroItem,
      a.valorAdicFreteMarinhaMerItem,
      a.valorDespesasAduaneirasItem,
      v_valorFreteGeral,
      v_valorSeguroGeral,
      v_valorDescontoGeral,
      v_valorOutrasDespesasGeral,
      v_valorAdicFreteMarinMerGeral,
      v_valorDespesasAduaneirasGeral,
      v_valorDescontoPagamento,
      v_valorOutrasDespesasPagamento,
      v_valorJurosPagamento,
      a.diminuiDescontoPrUnit,
      a.somaAcrescimosPrUnit,
      a.somaFreteSeguroPrUnit,
      a.composicaoPreco,
      /* Retornos */
      v_precoUnitario,
      v_precoUnitarioConvertido,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal);
    v_valorAcrescimoExtempSubtotal := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
      a.quantidade,
      v_precoUnitario,
      a.quantidadeExtemporanea,
      a.acrescimoUnitarioExtemporaneo);
    v_valorAcrescimoExtempTotal := FUNC_ADD_CALC_EXTEMP_TOTAL(
      v_valorAcrescimoExtempSubtotal,
      a.valorAcrescimoExtempItem,
      v_valorAcrescimoExtempGeral);
    IF p_cab_impostosEditados = 0 
        OR v_valorProdutoServico <> a.valorProdutoServico
        OR CASE WHEN p_cab_tipoPagamentoFrete   = 'V' THEN 0 ELSE v_valorFreteTotal END
        <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE p_cab_tipoPagamentoFrete END = 'V' THEN 0 ELSE a.valorFreteTotal END
        OR CASE WHEN p_cab_tipoPagamentoFrete   = 'V' THEN 0 ELSE v_valorSeguroTotal END
        <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE p_cab_tipoPagamentoFrete END = 'V' THEN 0 ELSE a.valorSeguroTotal END
        OR v_valorDescontoTotal <> a.valorDescontoTotal
        OR v_valorOutrasDespesasTotal <> a.valorOutrasDespesasTotal
        OR v_valorAdicFreteMarinMerTotal <> a.valorAdicFreteMarinhaMerTotal
        OR v_valorDespesasAduaneirasTotal <> a.valorDespesasAduaneirasTotal
        OR v_precoUnitario <> a.precoUnitario
        OR v_valorProdutoServico <> a.valorProdutoServico
    THEN
      r_calcularImpostosItem := 1;
    END IF;
    v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
      p_cab_origemDocumento,
      p_cab_nfFornecedor,
      p_cab_tipoPagamentoFrete,
      a.geraFinanceiro,
      v_valorProdutoServico,
      v_valorDescontoPagamento,
      v_valorOutrasDespesasPagamento,
      v_valorJurosPagamento,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      a.valorIPIDevolucao,
      a.retidoISSQN,
      a.valorISSQN,
      a.valorRetIRRF,
      a.valorRetINSS,
      a.valorRetPIS,
      a.valorRetCOFINS,
      a.valorRetCSLL,
      a.valorRetOutros,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorICMSST,
      a.valorICMSSTEscrituracao,
      a.somarICMSST,
      v_valorAcrescimoExtempTotal,
      a.modDoc_geraFinanceiro);
    v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
      p_cab_nfFornecedor,
      p_cab_tipoPagamentoFrete,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      a.valorIPIDevolucao,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorICMSST,
      a.valorICMSSTEscrituracao,
      a.somarICMSST);
    ADD_CALCULA_CUSTO_CMV (
      p_cab_atualizaCustoMedio,
      p_cab_estabelecimento,
      p_cab_nfFornecedor,
      a.modeloDocumento,
      a.quantidade,
      a.valorII,
      a.valorIOF,
      a.valorIPI,
      a.valorIPIDevolucao,
      a.valorPIS,
      a.valorPISST,
      a.valorCOFINS,
      a.valorCOFINSST,
      a.valorCreditoSimplesNacional,
      a.valorICMS,
      a.valorICMSST,
      a.valorICMSSTEscrituracao,
      v_valorLiquidoItem,
      a.valorDescontoCustoOpItem,
      v_valorDescontoCustoOpGeral,
      a.valorAcrescimoCustoOpItem,
      v_valorAcrescimoCustoOpGeral,
      v_valorAcrescimoExtempTotal,
      /* Retornos */
      v_valorDescontoCustoOpTotal,
      v_valorAcrescimoCustoOpTotal,
      v_precoCustoOperacao,
      v_valorCustoOperacao,
      v_precoCMV,
      v_valorCMV);

    -- Atualiza Item
    UPDATE MODOCFISCALXITENS SET
      precoUnitario                 = v_precoUnitario,
      precoUnitarioConvertido       = v_precoUnitarioConvertido,
      valorProdutoServico           = v_valorProdutoServico,
      valorFreteGeral               = v_valorFreteGeral,
      valorSeguroGeral              = v_valorSeguroGeral,
      valorDescontoGeral            = v_valorDescontoGeral,
      valorOutrasDespesasGeral      = v_valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral = v_valorAdicFreteMarinMerGeral,
      valorDespesasAduaneirasGeral  = v_valorDespesasAduaneirasGeral,
      valorBasePagamento            = v_valorBasePagamento,
      valorDescontoPagamento        = v_valorDescontoPagamento,
      valorOutrasDespesasPagamento  = v_valorOutrasDespesasPagamento,
      valorJurosPagamento           = v_valorJurosPagamento,
      valorFreteTotal               = v_valorFreteTotal,
      valorSeguroTotal              = v_valorSeguroTotal,
      valorDescontoTotal            = v_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
      valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
      valorLiquidoItem              = v_valorLiquidoItem,
      valorDescontoCustoOpGeral     = v_valorDescontoCustoOpGeral,
      valorDescontoCustoOpTotal     = v_valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpGeral    = v_valorAcrescimoCustoOpGeral,
      valorAcrescimoCustoOpTotal    = v_valorAcrescimoCustoOpTotal,
      precoCustoOperacao            = v_precoCustoOperacao,
      valorCustoOperacao            = v_valorCustoOperacao,
      precoCMV                      = v_precoCMV,
      valorCMV                      = v_valorCMV,
      valorAcrescimoExtempSubtotal  = v_valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempGeral     = v_valorAcrescimoExtempGeral,
      valorAcrescimoExtempTotal     = v_valorAcrescimoExtempTotal
    WHERE idItemDocFiscal           = a.idItemDocFiscal;
    IF a.tipoProduto = '09' THEN
      r_cab_valorServicos            := r_cab_valorServicos + v_valorProdutoServico;
    ELSE
      r_cab_valorProdutos            := r_cab_valorProdutos + v_valorProdutoServico;
    END IF;
    r_cab_valorBasePagamento       := r_cab_valorBasePagamento + v_valorBasePagamento;
    IF a.usarPrecoAVista = 1 AND a.geraFinanceiro = 1 THEN
      r_cab_valorAVistaMinimo        := r_cab_valorAVistaMinimo + v_valorProdutoServico + v_valorDescontoPagamento - v_valorOutrasDespesasPagamento - v_valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
    END IF;
    r_cab_valorFreteTotal          := r_cab_valorFreteTotal + v_valorFreteTotal;
    r_cab_valorSeguroTotal         := r_cab_valorSeguroTotal + v_valorSeguroTotal;
    r_cab_valorDescontoTotal       := r_cab_valorDescontoTotal + v_valorDescontoTotal;
    r_cab_valorOutrasDespesasTotal := r_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
    r_cab_valorAdicFreteMarinTotal := r_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
    r_cab_valorDespesasAduanTotal  := r_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
    r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem + v_valorLiquidoItem;
    r_cab_valorDescCustoOpTotal    := r_cab_valorDescCustoOpTotal + v_valorDescontoCustoOpTotal;
    r_cab_valorAcrescCustoOpTotal  := r_cab_valorAcrescCustoOpTotal + v_valorAcrescimoCustoOpTotal;
    r_cab_valorCustoOperacao       := r_cab_valorCustoOperacao + v_valorCustoOperacao;
    r_cab_valorCMV                 := r_cab_valorCMV + v_valorCMV;
    r_cab_valorAcrescExtempTotal   := r_cab_valorAcrescExtempTotal + v_valorAcrescimoExtempTotal;
  END LOOP;
  IF v_idItemDocFiscalUltimoItem <> 0 AND (v_saldoRatDescontoGeral <> 0 OR v_saldoRatOutrasDespesasGeral <> 0 OR v_saldoRatDescontoPagamento <> 0 OR v_saldoRatOutrasDespPagamento <> 0 OR v_saldoRatJurosPagamento <> 0 OR v_saldoRatFreteGeral <> 0 OR v_saldoRatSeguroGeral <> 0 OR v_saldoRatAdicFreteMarinGeral <> 0 OR v_saldoRatDespesasAduanGeral <> 0) THEN
    ADD_DOC_FISC_CALC_IMP_RESIDUO (
      p_troca_tipoPagamentoFrete,
      p_a_cab_tipoPagamentoFrete,
      p_cab_origemDocumento,
      p_cab_atualizaCustoMedio,
      p_cab_estabelecimento,
      p_cab_nfFornecedor,
      p_cab_tipoPagamentoFrete,
      r_cab_valorProdutos,
      r_cab_valorServicos,
      r_cab_valorBasePagamento,
      r_cab_valorAVistaMinimo,
      r_cab_valorFreteTotal,
      r_cab_valorSeguroTotal,
      r_cab_valorDescontoTotal,
      r_cab_valorOutrasDespesasTotal,
      r_cab_valorAdicFreteMarinTotal,
      r_cab_valorDespesasAduanTotal,
      p_cab_impostosEditados,
      r_cab_valorLiquidoItem,
      r_cab_valorDescCustoOpTotal,
      r_cab_valorAcrescCustoOpTotal,
      r_cab_valorCustoOperacao,
      r_cab_valorCMV,
      r_cab_valorAcrescExtempTotal,
      v_idItemDocFiscalUltimoItem,
      v_saldoRatFreteGeral,
      v_saldoRatSeguroGeral,
      v_saldoRatDescontoGeral,
      v_saldoRatOutrasDespesasGeral,
      v_saldoRatAdicFreteMarinGeral,
      v_saldoRatDespesasAduanGeral,
      v_saldoRatDescontoPagamento,
      v_saldoRatOutrasDespPagamento,
      v_saldoRatJurosPagamento,
      v_saldoRatDescCustoOpGeral,
      v_saldoRatAcrescCustoOpGeral,
      v_saldoRatAcrescExtempGeral,
      r_calcularImpostosItem,
      /* Retornos */
      r_cab_valorProdutos,
      r_cab_valorServicos,
      r_cab_valorBasePagamento,
      r_cab_valorAVistaMinimo,
      r_cab_valorFreteTotal,
      r_cab_valorSeguroTotal,
      r_cab_valorDescontoTotal,
      r_cab_valorOutrasDespesasTotal,
      r_cab_valorAdicFreteMarinTotal,
      r_cab_valorDespesasAduanTotal,
      r_cab_valorLiquidoItem,
      r_cab_valorDescCustoOpTotal,
      r_cab_valorAcrescCustoOpTotal,
      r_cab_valorCustoOperacao,
      r_cab_valorCMV,
      r_cab_valorAcrescExtempTotal,
      r_calcularImpostosItem);
  END IF;
END ADD_DOC_FISC_CALC_IMP_RATEIO;

/

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

/

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

/

create or replace FUNCTION FUNC_ADD_BUSCA_MARGEMMARKUP (
  p_produto     IN NUMBER,
  p_precoCusto  IN NUMBER,
  p_tabelaPreco IN VARCHAR)
  RETURN NUMBER
IS 
  v_margemMarkup NUMBER;
BEGIN
  SELECT COALESCE (MAX (a.margemMarkup),0)
  INTO v_margemMarkup
  FROM (
    SELECT
      a.margemMarkup,
      ROW_NUMBER() OVER (
        ORDER BY
          a.produto DESC,
          CASE
            WHEN d.filtrarProdutos = 1
              AND EXISTS (
                SELECT 1
                FROM PAFILTROPRODUTOXPRODUTOS x
                WHERE x.filtroProduto = a.filtroProduto
                AND x.produto = p_produto
                AND x.ativo = 1)
            THEN 1
            ELSE 0
          END DESC,
          d.filtrarListasServicos DESC,
          d.filtrarNCMs DESC,
          d.filtrarCaracteristicasE DESC,
          d.filtrarCaracteristicasD DESC,
          d.filtrarCaracteristicasC DESC,
          d.filtrarCaracteristicasB DESC,
          d.filtrarCaracteristicasA DESC,
          d.filtrarMarcas DESC,
          d.filtrarSubcategoriasProdutos DESC,
          d.filtrarCategoriasProdutos DESC,
          a.tabelaPreco DESC) ordenacao
    FROM CAPRODUTOXMARGEMMARKUP a
    JOIN CAPRODUTOS b
    ON b.produto = p_produto
    JOIN PASUBCATEGORIASPRODUTO c
    ON c.subCategoriaProduto = b.subCategoriaProduto
    JOIN PAFILTROSPRODUTO d
    ON d.filtroProduto = a.filtroProduto
    WHERE a.ativo = 1    
    AND (p_precoCusto = 0
      OR p_precoCusto BETWEEN a.precoCustoDe AND a.precoCustoAte)
    AND (a.produto = 0
      OR a.produto = p_produto)
    AND (a.tabelaPreco = ' '
      OR a.tabelaPreco = p_tabelaPreco)
    AND (a.filtroProduto = 0
      OR d.filtrarProdutos = 1
      AND EXISTS (
        SELECT 1
        FROM PAFILTROPRODUTOXPRODUTOS x
        WHERE x.filtroProduto = a.filtroProduto
        AND x.produto = p_produto
        AND x.ativo = 1)
      OR ( d.filtrarCategoriasProdutos    = 1
        OR d.filtrarSubcategoriasProdutos = 1
        OR d.filtrarMarcas                = 1
        OR d.filtrarCaracteristicasA      = 1
        OR d.filtrarCaracteristicasB      = 1
        OR d.filtrarCaracteristicasC      = 1
        OR d.filtrarCaracteristicasD      = 1
        OR d.filtrarCaracteristicasE      = 1
        OR d.filtrarNCMs                  = 1
        OR d.filtrarListasServicos        = 1)      
      AND (d.filtrarCategoriasProdutos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCATEGPROD x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.categoriaProduto = c.categoriaProduto
          AND x.ativo = 1))
      AND (d.filtrarSubcategoriasProdutos = 0
        OR EXISTS (
          SELECT 1 FROM PAFILTROPRODUTOXSUBCAPROD x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.subcategoriaProduto = b.subcategoriaProduto
          AND x.ativo = 1))
      AND (d.filtrarMarcas = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXMARCAS x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.marca = b.marca
          AND x.ativo = 1))
      AND (d.filtrarCaracteristicasA = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERA x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaA = b.caracteristicaA
          AND x.ativo = 1))
      AND (d.filtrarCaracteristicasB = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERB x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaB = b.caracteristicaB
          AND x.ativo = 1))
      AND (d.filtrarCaracteristicasC = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERC x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaC = b.caracteristicaC
          AND x.ativo = 1))
      AND (d.filtrarCaracteristicasD = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERD x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaD = b.caracteristicaD
          AND x.ativo = 1))
      AND (d.filtrarCaracteristicasE = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERE x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaE = b.caracteristicaE
          AND x.ativo = 1))
      AND (d.filtrarNCMs = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXNCMS x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.idNcm = b.idNcm
          AND x.ativo = 1))
      AND (d.filtrarListasServicos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXLISTASSE x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.listaServicos = b.listaServicos
          AND x.ativo = 1)))) a
  WHERE a.ordenacao = 1;
  RETURN v_margemMarkup;
END;

/

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

/

create or replace PROCEDURE ADD_PRE_DOC_REGRA_DESC_CAB (
  p_usuarioLogado                IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_preDocumento                 IN NUMBER,
  p_orc_pessoa                   IN NUMBER,
  /* Retornos */
  r_possuiRegra                  OUT NUMBER,
  r_valorDescontoSugestao        OUT NUMBER,
  r_valorDescontoMaximoSemSenha  OUT NUMBER)
IS
BEGIN
  WITH
  CABECALHO AS (
    SELECT
      a.estabelecimento,
      a.pessoa,
      COALESCE((
        CASE
          WHEN a.pessoa = 0
          THEN (
            SELECT MAX(munPess.uf)
            FROM CAENDERECOSPESSOA endPess
            JOIN SIMUNICIPIOS munPess
            ON munPess.municipio = endPess.municipio
            WHERE endPess.pessoa = est.pessoaEstabelecimento
            AND endPess.ativo = 1
            AND endPess.principal = 1)
          ELSE COALESCE((
            SELECT MAX(munPess.uf)
            FROM CAENDERECOSPESSOA endPess
            JOIN SIMUNICIPIOS munPess
            ON munPess.municipio = endPess.municipio
            WHERE endPess.pessoa = a.pessoa
            AND endPess.ativo = 1
            AND endPess.principal = 1),(
            SELECT MAX(munPess.uf)
            FROM CAENDERECOSPESSOA endPess
            JOIN SIMUNICIPIOS munPess
            ON munPess.municipio = endPess.municipio
            WHERE endPess.pessoa = est.pessoaEstabelecimento
            AND endPess.ativo = 1
            AND endPess.principal = 1))
        END
      ),'  ') uf,
      CASE
        WHEN pess.nascimentoFundacao IS NULL
          OR TRUNC (pess.nascimentoFundacao) > TRUNC (SYSDATE)
        THEN 0
        ELSE EXTRACT(YEAR FROM SYSDATE)
          - EXTRACT(YEAR FROM pess.nascimentoFundacao)
          - CASE
              WHEN TO_CHAR (SYSDATE, 'MMDD') < TO_CHAR (pess.nascimentoFundacao, 'MMDD')
              THEN 1
              ELSE 0
            END
      END idade,
      a.valorBasePagamento
    FROM (
      SELECT
        a.estabelecimento,
        CASE
          WHEN p_orc_pessoa = 0
            OR p_config_227_manterPessoaOrcam = 0
          THEN a.pessoa
          ELSE p_orc_pessoa
        END pessoa,
        a.valorBasePagamento
      FROM MOPREDOCUMENTOS a
      WHERE a.preDocumento = p_preDocumento
      AND a.valorBasePagamento > 0) a
    JOIN PAESTABELECIMENTOS est
    ON est.estabelecimento = a.estabelecimento
    JOIN CAPESSOAS pess
    ON pess.pessoa = a.pessoa),
  ITENS AS (
    SELECT
      a.sequencia,
      a.vendedor,
      a.gradeProduto,
      a.localEstoque,
      a.personalizacao,
      a.quantidade,
      ROUND (a.quantidade * (a.precoUnitarioBruto + a.acrescimoUnitarioComposicao),2) valorBaseRegra,
      a.valorDescontoItem,
      a.tabelaPreco,
      gradProd.produto,
      gradProd.cor,
      gradProd.tamanho,
      prod.subcategoriaProduto,
      prod.marca,
      prod.caracteristicaA,
      prod.caracteristicaB,
      prod.caracteristicaC,
      prod.caracteristicaD,
      prod.caracteristicaE,
      prod.idNcm,
      prod.listaServicos,
      subCatProd.categoriaProduto
    FROM MOPREDOCUMXITENS a
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PASUBCATEGORIASPRODUTO subCatProd
    ON subCatProd.subCategoriaProduto = prod.subCategoriaProduto
    WHERE a.preDocumento = p_preDocumento
    AND a.cancelado = 0
    AND a.quantidade > 0),
  REGRAS AS (
    SELECT
      a.regraDescontoMargem,
      a.ordenacao,
      a.tipoRegraDescontoMargem,
      a.valorSugestao,
      a.valorMaximoSemSenha,
      a.filtrarTabelaPreco,
      cab.idade,
      cab.valorBasePagamento
    FROM PAREGRASDESCONTOSMARGEM a
    JOIN CABECALHO cab
    ON 1=1
    JOIN PAFILTROSCABECALHO filtroCab
    ON filtroCab.filtroCabecalho = a.filtroCabecalho
    JOIN CAPESSOAS pess
    ON pess.pessoa = cab.pessoa
    JOIN PAFILTROSPAGAMENTO filtroPag
    ON filtroPag.filtroPagamento = a.filtroPagamento
    WHERE a.regraDescontoMargem > 0
    AND a.ativo = 1
    AND a.dataValidadeInicial <= TRUNC(SYSDATE)
    AND a.dataValidadeFinal >= TRUNC(SYSDATE)
    AND a.cabecalhoItemPagamento = 'C'
    AND a.tipoRegraDescontoMargem BETWEEN 1 AND 6
    -- Filtro Cabeçalho
    AND (a.filtroCabecalho = 0
      OR (filtroCab.filtrarEstabelecimentos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROCABECXESTABELEC filtroCabX
          WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
          AND filtroCabX.estabelecimento = cab.estabelecimento
          AND filtroCabX.ativo = 1))
      AND (filtroCab.filtrarUfs = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROCABECXUFS filtroCabX
          WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
          AND filtroCabX.uf = cab.uf
          AND filtroCabX.ativo = 1))
      AND (filtroCab.filtrarPessoas = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROCABECXPESSOAS filtroCabX
          WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
          AND filtroCabX.pessoa = cab.pessoa
          AND filtroCabX.ativo = 1))
      AND (filtroCab.filtrarPerfisUsuario = 0
        AND filtroCab.filtrarUsuarios = 0
        OR filtroCab.filtrarPerfisUsuario = 1
        AND EXISTS (
          SELECT 1
          FROM PAFILTROCABECXPERFISUSUAR filtroCabX
          WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
          AND filtroCabX.perfilUsuario = p_perfilUsuarioLogado
          AND filtroCabX.ativo = 1)
        OR filtroCab.filtrarUsuarios = 1
        AND EXISTS (
          SELECT 1
          FROM PAFILTROCABECXUSUARIOS filtroCabX
          WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
          AND filtroCabX.usuario = p_usuarioLogado
          AND filtroCabX.ativo = 1))
      AND (filtroCab.indicadorPessoa = ' '
        OR filtroCab.indicadorPessoa = pess.indicadorPessoa)
      AND (filtroCab.colaborador = ' '
        OR filtroCab.colaborador = 'N'
        AND (cab.pessoa = 0
          OR NOT (EXISTS (
            SELECT 1
            FROM CACOLABORADORES colab
            WHERE colab.colaborador = cab.pessoa
            AND colab.ativo = 1 )))
        OR filtroCab.colaborador = 'S'
        AND cab.pessoa <> 0
        AND EXISTS (
          SELECT 1
          FROM CACOLABORADORES colab
          WHERE colab.colaborador = cab.pessoa
          AND colab.ativo = 1)))),
  FILTROSPRODUTOS AS (
    SELECT
      a.regraDescontoMargem,
      a.filtroProduto,
      b.quantidadeMinima,
      b.quantidadeMaxima,
      b.filtrarVendedores,
      b.filtrarLocaisEstoque,
      b.filtrarPersonalizacoes,
      b.filtrarProdutos,
      b.filtrarCategoriasProdutos,
      b.filtrarSubcategoriasProdutos,
      b.filtrarMarcas,
      b.filtrarCaracteristicasA,
      b.filtrarCaracteristicasB,
      b.filtrarCaracteristicasC,
      b.filtrarCaracteristicasD,
      b.filtrarCaracteristicasE,
      b.filtrarCores,
      b.filtrarTamanhos,
      b.filtrarNCMs,
      b.filtrarListasServicos,
      c.filtrarTabelaPreco
    FROM PAREGRADESCMARGXFILTPROD a
    JOIN PAFILTROSPRODUTO b
    ON b.filtroProduto = a.filtroProduto
    JOIN REGRAS c
    ON c.regraDescontoMargem = a.regraDescontoMargem
    AND a.filtroProduto > 0
    AND a.ativo = 1),
  REGRASXITENS AS (
    SELECT
      a.regraDescontoMargem,
      a.filtroProduto,
      a.quantidadeMinima,
      a.quantidadeMaxima,
      b.sequencia,
      b.quantidade,
      b.valorBaseRegra,
      b.valorDescontoItem
    FROM FILTROSPRODUTOS a
    JOIN ITENS b
	  ON 1=1
    WHERE (a.filtrarTabelaPreco = 0
      OR EXISTS (
        SELECT 1
        FROM PAREGRADESCMARGXTABELASPR x
        WHERE x.regraDescontoMargem = a.regraDescontoMargem
        AND x.tabelaPreco = b.tabelaPreco
        AND x.ativo = 1))
    AND (a.filtrarVendedores = 0
    OR EXISTS (
      SELECT 1
      FROM PAFILTROPRODUTOXVENDEDOR x
      WHERE x.filtroProduto = a.filtroProduto
      AND x.vendedor = b.vendedor
      AND x.ativo = 1))
    AND (a.filtrarLocaisEstoque = 0
    OR EXISTS (
      SELECT 1
      FROM PAFILTROPRODUTOXLOCAISEST x
      WHERE x.filtroProduto = a.filtroProduto
      AND x.localEstoque = b.localEstoque
      AND x.ativo = 1))
    AND (a.filtrarPersonalizacoes = 0
    OR EXISTS (
      SELECT 1
      FROM PAFILTROPRODUTOXPERSONAL x
      WHERE x.filtroProduto = a.filtroProduto
      AND x.personalizacao = b.personalizacao
      AND x.ativo = 1))
    AND (a.filtrarProdutos = 0
      AND a.filtrarCategoriasProdutos = 0
      AND a.filtrarSubcategoriasProdutos = 0
      AND a.filtrarMarcas = 0
      AND a.filtrarCaracteristicasA = 0
      AND a.filtrarCaracteristicasB = 0
      AND a.filtrarCaracteristicasC = 0
      AND a.filtrarCaracteristicasD = 0
      AND a.filtrarCaracteristicasE = 0
      AND a.filtrarCores = 0
      AND a.filtrarTamanhos = 0
      AND a.filtrarNCMs = 0
      AND a.filtrarListasServicos = 0
      OR a.filtrarProdutos = 1
      AND EXISTS (
        SELECT 1
        FROM PAFILTROPRODUTOXPRODUTOS x
        WHERE x.filtroProduto = a.filtroProduto
        AND x.produto = b.produto
        AND x.ativo = 1)
      OR (a.filtrarCategoriasProdutos = 1
        OR a.filtrarSubcategoriasProdutos = 1
        OR a.filtrarMarcas = 1
        OR a.filtrarCaracteristicasA = 1
        OR a.filtrarCaracteristicasB = 1
        OR a.filtrarCaracteristicasC = 1
        OR a.filtrarCaracteristicasD = 1
        OR a.filtrarCaracteristicasE = 1
        OR a.filtrarCores = 1
        OR a.filtrarTamanhos = 1
        OR a.filtrarNCMs = 1
        OR a.filtrarListasServicos = 1)
      AND (a.filtrarCategoriasProdutos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCATEGPROD x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.categoriaProduto = b.categoriaProduto
          AND x.ativo = 1))
      AND (a.filtrarSubcategoriasProdutos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXSUBCAPROD x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.subcategoriaProduto = b.subcategoriaProduto
          AND x.ativo = 1))
      AND (a.filtrarMarcas = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXMARCAS x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.marca = b.marca
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasA = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERA x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaA = b.caracteristicaA
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasB = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERB x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaB = b.caracteristicaB
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasC = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERC x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaC = b.caracteristicaC
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasD = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERD x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaD = b.caracteristicaD
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasE = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERE x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaE = b.caracteristicaE
          AND x.ativo = 1))
      AND (a.filtrarCores = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCORES x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.cor = b.cor
          AND x.ativo = 1))
      AND (a.filtrarTamanhos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXTAMANHOS x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.tamanho = b.tamanho
          AND x.ativo = 1))
      AND (a.filtrarNCMs = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXNCMS x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.idNcm = b.idNcm
          AND x.ativo = 1))
      AND (a.filtrarListasServicos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXLISTASSE x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.listaServicos = b.listaServicos
          AND x.ativo = 1)))),
  REGRASXFILTROS AS (
    SELECT
      a.regraDescontoMargem,
      a.filtroProduto
    FROM (
      SELECT
        a.regraDescontoMargem,
        a.filtroProduto,
        a.quantidadeMinima,
        a.quantidadeMaxima,
        SUM (a.quantidade) quantidade
      FROM REGRASXITENS a
      GROUP BY
        a.regraDescontoMargem,
        a.filtroProduto,
        a.quantidadeMinima,
        a.quantidadeMaxima) a
    WHERE a.quantidade >= a.quantidadeMinima
    AND (a.quantidadeMaxima = 0
      OR a.quantidade <= a.quantidadeMaxima)),
  REGRASVALIDAS AS (
    SELECT
      a.regraDescontoMargem,
      a.ordenacao,
      a.tipoRegraDescontoMargem,
      a.valorSugestao,
      a.valorMaximoSemSenha,
      a.filtrarTabelaPreco,
      a.idade,
      a.valorBasePagamento,
      COALESCE((
        SELECT COUNT(1)
        FROM FILTROSPRODUTOS b
        WHERE b.regraDescontoMargem = a.regraDescontoMargem),0) filtrosProdutos
    FROM REGRAS a
    WHERE
      ( SELECT COUNT(1)
        FROM FILTROSPRODUTOS b
        WHERE b.regraDescontoMargem = a.regraDescontoMargem)
    = ( SELECT COUNT(1)
        FROM REGRASXFILTROS b
        WHERE b.regraDescontoMargem = a.regraDescontoMargem))
  SELECT
    COALESCE (MAX(a.possuiRegra), 0) possuiRegra,
    COALESCE (ROUND(
      CASE
        WHEN SUM (
          CASE
            WHEN a.valorDescontoSugestao < 0
            THEN 0
            ELSE a.valorDescontoSugestao
          END) >= MAX(a.valorBasePagamento)
        THEN MAX(a.valorBasePagamento) - 0.01
        ELSE SUM (
          CASE
            WHEN a.valorDescontoSugestao < 0
            THEN 0
            ELSE a.valorDescontoSugestao
          END)
      END, 2), 0) valorDescontoSugestao,
    COALESCE (ROUND(
      CASE
        WHEN SUM (
          CASE
            WHEN a.valorDescontoMaximoSemSenha < 0
            THEN 0
            ELSE a.valorDescontoMaximoSemSenha
          END) >= MAX(a.valorBasePagamento)
        THEN MAX(a.valorBasePagamento) - 0.01
        ELSE SUM (
          CASE
            WHEN a.valorDescontoMaximoSemSenha < 0
            THEN 0
            ELSE a.valorDescontoMaximoSemSenha
          END)
      END, 2), 0) valorDescontoMaximoSemSenha
  INTO
    r_possuiRegra,
    r_valorDescontoSugestao,
    r_valorDescontoMaximoSemSenha
  FROM (
    SELECT
      1 possuiRegra,
      a.valorBasePagamento,
      ROUND (
        CASE a.tipoRegraDescontoMargem
          -- Desconto em percentual
          WHEN 1
          THEN a.valorBaseRegra * a.valorSugestao / 100
          -- Desconto em valor
          WHEN 2
          THEN a.valorSugestao * a.multiplicador
           -- Preço unitário fixo
          WHEN 3
          THEN a.valorBaseRegra-ROUND (a.quantidadeRegra*a.valorSugestao,2)
          -- Desconto igual a idade em percentual
          WHEN 4
          THEN a.valorBaseRegra * a.idade / 100
          -- Desconto igual a idade em valor
          WHEN 5
          THEN a.idade * a.multiplicador
          -- Preço total fixado
          WHEN 6
          THEN a.valorBaseRegra
          ELSE 0
        END - a.valorDescontoItem, 2) valorDescontoSugestao,
      ROUND (
        CASE a.tipoRegraDescontoMargem
          -- Desconto em percentual
          WHEN 1
          THEN a.valorBaseRegra * a.valorMaximoSemSenha / 100
          -- Desconto em valor
          WHEN 2
          THEN a.valorMaximoSemSenha * a.multiplicador
          -- Preço unitário fixo
          WHEN 3
          THEN a.valorBaseRegra-ROUND (a.quantidadeRegra*a.valorMaximoSemSenha,2)
          -- Desconto igual a idade em percentual
          WHEN 4
          THEN a.valorBaseRegra * a.idade / 100
          -- Desconto igual a idade em valor
          WHEN 5
          THEN a.idade * a.multiplicador
          -- Preço total fixado
          WHEN 6
          THEN a.valorBaseRegra
          ELSE 0
        END, 2) valorDescontoMaximoSemSenha
    FROM (
      SELECT
        a.tipoRegraDescontoMargem,
        a.valorSugestao,
        a.valorMaximoSemSenha,
        a.idade,
        a.valorBasePagamento,
        SUM(a.quantidade) quantidadeRegra,
        CASE
          WHEN SUM (a.valorBaseRegraTodos - a.valorDescontoItemTodos) = 0
          THEN 0
          ELSE SUM (a.valorBaseRegra - a.valorDescontoItem)
            / SUM (a.valorBaseRegraTodos - a.valorDescontoItemTodos)
        END multiplicador,
        SUM (a.valorBaseRegra) valorBaseRegra,
        SUM (a.valorDescontoItem) valorDescontoItem
      FROM (
        SELECT 
          a.regraDescontoMargem,
          ROW_NUMBER() OVER (
            PARTITION BY a.sequencia
            ORDER BY
              a.sequencia,
              a.ordenacao,
              a.regraDescontoMargem) ordenacao,
          a.tipoRegraDescontoMargem,
          a.valorSugestao,
          a.valorMaximoSemSenha,
          a.idade,
          a.valorBasePagamento,
          a.sequencia,
          a.quantidade,
          a.valorBaseRegra,
          a.valorDescontoItem,
          a.valorBaseRegraTodos,
          a.valorDescontoItemTodos
        FROM (
          SELECT DISTINCT
            a.regraDescontoMargem,
            a.ordenacao,
            a.tipoRegraDescontoMargem,
            a.valorSugestao,
            a.valorMaximoSemSenha,
            a.idade,
            a.valorBasePagamento,
            b.sequencia,
            b.quantidade,
            b.valorBaseRegra,
            b.valorDescontoItem,
            0 valorBaseRegraTodos,
            0 valorDescontoItemTodos
          FROM REGRASVALIDAS a
          JOIN ITENS b
          ON 1=1
          WHERE a.filtrosProdutos = 0
          AND (a.filtrarTabelaPreco = 0
            OR EXISTS (
              SELECT 1
              FROM PAREGRADESCMARGXTABELASPR x
              WHERE x.regraDescontoMargem = a.regraDescontoMargem
              AND x.tabelaPreco = b.tabelaPreco
              AND x.ativo = 1))
          UNION ALL
          SELECT DISTINCT
            a.regraDescontoMargem,
            a.ordenacao,
            a.tipoRegraDescontoMargem,
            a.valorSugestao,
            a.valorMaximoSemSenha,
            a.idade,
            a.valorBasePagamento,
            b.sequencia,
            b.quantidade,
            b.valorBaseRegra,
            b.valorDescontoItem,
            0 valorBaseRegraTodos,
            0 valorDescontoItemTodos
          FROM REGRASVALIDAS a
          JOIN REGRASXITENS b
          ON b.regraDescontoMargem = a.regraDescontoMargem
          WHERE a.filtrosProdutos > 0
          UNION ALL
          SELECT DISTINCT
            a.regraDescontoMargem,
            a.ordenacao,
            a.tipoRegraDescontoMargem,
            a.valorSugestao,
            a.valorMaximoSemSenha,
            a.idade,
            a.valorBasePagamento,
            b.sequencia,
            b.quantidade,
            0 valorBaseRegra,
            0 valorDescontoItem,
            b.valorBaseRegra valorBaseRegraTodos,
            b.valorDescontoItem valorDescontoItemTodos
          FROM REGRASVALIDAS a
          JOIN ITENS b
          ON 1=1) a) a
      WHERE a.ordenacao = 1
      GROUP BY
        a.regraDescontoMargem,
        a.tipoRegraDescontoMargem,
        a.valorSugestao,
        a.valorMaximoSemSenha,
        a.idade,
        a.valorBasePagamento) a) a;
END ADD_PRE_DOC_REGRA_DESC_CAB;

/

create or replace PROCEDURE ADD_PRE_DOC_REGRA_DESC_PAG (
  p_usuarioLogado                IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_config_246_baseDescontoPagam IN CHAR,
  p_config_337_descontoSobreFret IN NUMBER,
  p_preDocumento                 IN NUMBER,
  p_soma_valorPagamentoBruto     IN NUMBER,
  p_orc_pessoa                   IN NUMBER,
  p_pag_meioPagamento            IN NUMBER,
  p_pag_condicaoPagamento        IN NUMBER,
  p_pag_valorPagamentoBruto      IN NUMBER,
  /* Retornos */
  r_possuiRegra                  OUT NUMBER,
  r_percentualDescontoSugestao   OUT NUMBER,
  r_valorDescontoSugestao        OUT NUMBER,
  r_valorDescontoMaximoSemSenha  OUT NUMBER)
IS
BEGIN
  WITH
  CABECALHO AS (
    SELECT
      a.estabelecimento,
      a.pessoa,
      COALESCE((
        CASE
          WHEN a.pessoa = 0
          THEN (
            SELECT MAX(munPess.uf)
            FROM CAENDERECOSPESSOA endPess
            JOIN SIMUNICIPIOS munPess
            ON munPess.municipio = endPess.municipio
            WHERE endPess.pessoa = est.pessoaEstabelecimento
            AND endPess.ativo = 1
            AND endPess.principal = 1)
          ELSE COALESCE((
            SELECT MAX(munPess.uf)
            FROM CAENDERECOSPESSOA endPess
            JOIN SIMUNICIPIOS munPess
            ON munPess.municipio = endPess.municipio
            WHERE endPess.pessoa = a.pessoa
            AND endPess.ativo = 1
            AND endPess.principal = 1),(
            SELECT MAX(munPess.uf)
            FROM CAENDERECOSPESSOA endPess
            JOIN SIMUNICIPIOS munPess
            ON munPess.municipio = endPess.municipio
            WHERE endPess.pessoa = est.pessoaEstabelecimento
            AND endPess.ativo = 1
            AND endPess.principal = 1))
        END
      ),'  ') uf,
      CASE
        WHEN pess.nascimentoFundacao IS NULL
          OR TRUNC (pess.nascimentoFundacao) > TRUNC (SYSDATE)
        THEN 0
        ELSE EXTRACT(YEAR FROM SYSDATE)
          - EXTRACT(YEAR FROM pess.nascimentoFundacao)
          - CASE
              WHEN TO_CHAR (SYSDATE, 'MMDD') < TO_CHAR (pess.nascimentoFundacao, 'MMDD')
              THEN 1
              ELSE 0
            END
      END idade,
      CASE
        WHEN p_config_246_baseDescontoPagam = 'S'
        THEN a.valorBasePagamento
          - CASE
              WHEN p_config_337_descontoSobreFret = 1
                OR a.tipoPagamentoFrete = 'V'
              THEN 0
              ELSE a.valorFreteTotal + a.valorSeguroTotal
            END
        WHEN p_soma_valorPagamentoBruto >= a.valorBasePagamento
        THEN 0
        WHEN p_soma_valorPagamentoBruto + p_pag_valorPagamentoBruto > a.valorBasePagamento
        THEN a.valorBasePagamento - p_soma_valorPagamentoBruto
          - CASE
              WHEN p_config_337_descontoSobreFret = 1
                OR a.tipoPagamentoFrete = 'V'
              THEN 0
              ELSE ROUND (
                (a.valorFreteTotal + a.valorSeguroTotal)
                * (a.valorBasePagamento - p_soma_valorPagamentoBruto)
                / a.valorBasePagamento,2)
            END
        ELSE p_pag_valorPagamentoBruto
          - CASE
              WHEN p_config_337_descontoSobreFret = 1
                OR a.tipoPagamentoFrete = 'V'
              THEN 0
              ELSE ROUND (
                (a.valorFreteTotal + a.valorSeguroTotal)
                * p_pag_valorPagamentoBruto
                / a.valorBasePagamento,2)
            END
      END valorBaseDesconto,
      ( CASE
          WHEN p_soma_valorPagamentoBruto >= a.valorBasePagamento
          THEN 0
          WHEN p_soma_valorPagamentoBruto + p_pag_valorPagamentoBruto > a.valorBasePagamento
          THEN a.valorBasePagamento - p_soma_valorPagamentoBruto
          ELSE p_pag_valorPagamentoBruto
        END
        / a.valorBasePagamento) proporcaoPagamento
    FROM (
      SELECT
        a.estabelecimento,
        CASE
          WHEN p_orc_pessoa = 0
            OR p_config_227_manterPessoaOrcam = 0
          THEN a.pessoa
          ELSE p_orc_pessoa
        END pessoa,
        a.valorBasePagamento,
        a.tipoPagamentoFrete,
        a.valorFreteTotal,
        a.valorSeguroTotal
      FROM MOPREDOCUMENTOS a
      WHERE a.preDocumento = p_preDocumento
      AND a.valorBasePagamento > 0) a
    JOIN PAESTABELECIMENTOS est
    ON est.estabelecimento = a.estabelecimento
    JOIN CAPESSOAS pess
    ON pess.pessoa = a.pessoa),
  ITENS AS (
    SELECT
      a.sequencia,
      a.vendedor,
      a.gradeProduto,
      a.localEstoque,
      a.personalizacao,
      a.quantidade,
      ROUND (a.quantidade * (a.precoUnitarioBruto + a.acrescimoUnitarioComposicao),2) valorBaseRegra,
      a.valorDescontoItem,
      a.valorDescontoGeral,
      a.tabelaPreco,
      gradProd.produto,
      gradProd.cor,
      gradProd.tamanho,
      prod.subcategoriaProduto,
      prod.marca,
      prod.caracteristicaA,
      prod.caracteristicaB,
      prod.caracteristicaC,
      prod.caracteristicaD,
      prod.caracteristicaE,
      prod.idNcm,
      prod.listaServicos,
      subCatProd.categoriaProduto
    FROM MOPREDOCUMXITENS a
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = a.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PASUBCATEGORIASPRODUTO subCatProd
    ON subCatProd.subCategoriaProduto = prod.subCategoriaProduto
    WHERE a.preDocumento = p_preDocumento
    AND a.cancelado = 0
    AND a.quantidade > 0),
  REGRAS AS (
    SELECT
      a.regraDescontoMargem,
      a.ordenacao,
      a.tipoRegraDescontoMargem,
      a.valorSugestao,
      a.valorMaximoSemSenha,
      a.filtrarTabelaPreco,
      cab.idade,
      cab.valorBaseDesconto,
      cab.proporcaoPagamento
    FROM PAREGRASDESCONTOSMARGEM a
    JOIN CABECALHO cab
    ON 1=1
    JOIN PAFILTROSCABECALHO filtroCab
    ON filtroCab.filtroCabecalho = a.filtroCabecalho
    JOIN CAPESSOAS pess
    ON pess.pessoa = cab.pessoa
    JOIN PAFILTROSPAGAMENTO filtroPag
    ON filtroPag.filtroPagamento = a.filtroPagamento
    WHERE a.regraDescontoMargem > 0
    AND a.ativo = 1
    AND a.dataValidadeInicial <= TRUNC(SYSDATE)
    AND a.dataValidadeFinal >= TRUNC(SYSDATE)
    AND a.cabecalhoItemPagamento = 'P'
    AND a.tipoRegraDescontoMargem BETWEEN 1 AND 6
    -- Filtro Cabeçalho
    AND (a.filtroCabecalho = 0
      OR (filtroCab.filtrarEstabelecimentos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROCABECXESTABELEC filtroCabX
          WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
          AND filtroCabX.estabelecimento = cab.estabelecimento
          AND filtroCabX.ativo = 1))
      AND (filtroCab.filtrarUfs = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROCABECXUFS filtroCabX
          WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
          AND filtroCabX.uf = cab.uf
          AND filtroCabX.ativo = 1))
      AND (filtroCab.filtrarPessoas = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROCABECXPESSOAS filtroCabX
          WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
          AND filtroCabX.pessoa = cab.pessoa
          AND filtroCabX.ativo = 1))
      AND (filtroCab.filtrarPerfisUsuario = 0
        AND filtroCab.filtrarUsuarios = 0
        OR filtroCab.filtrarPerfisUsuario = 1
        AND EXISTS (
          SELECT 1
          FROM PAFILTROCABECXPERFISUSUAR filtroCabX
          WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
          AND filtroCabX.perfilUsuario = p_perfilUsuarioLogado
          AND filtroCabX.ativo = 1)
        OR filtroCab.filtrarUsuarios = 1
        AND EXISTS (
          SELECT 1
          FROM PAFILTROCABECXUSUARIOS filtroCabX
          WHERE filtroCabX.filtroCabecalho = a.filtroCabecalho
          AND filtroCabX.usuario = p_usuarioLogado
          AND filtroCabX.ativo = 1))
      AND (filtroCab.indicadorPessoa = ' '
        OR filtroCab.indicadorPessoa = pess.indicadorPessoa)
      AND (filtroCab.colaborador = ' '
        OR filtroCab.colaborador = 'N'
        AND (cab.pessoa = 0
          OR NOT (EXISTS (
            SELECT 1
            FROM CACOLABORADORES colab
            WHERE colab.colaborador = cab.pessoa
            AND colab.ativo = 1 )))
        OR filtroCab.colaborador = 'S'
        AND cab.pessoa <> 0
        AND EXISTS (
          SELECT 1
          FROM CACOLABORADORES colab
          WHERE colab.colaborador = cab.pessoa
          AND colab.ativo = 1)))
    -- Filtro Pagamento
    AND (a.filtroPagamento = 0
      OR (filtroPag.filtrarMeiosPagamento = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPAGAMENTOXMEIOPAG filtroPagX
          WHERE filtroPagX.filtroPagamento = a.filtroPagamento
          AND filtroPagX.meioPagamento = p_pag_meioPagamento
          AND filtroPagX.ativo = 1))
      AND (filtroPag.filtrarCondicoesPagamento = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPAGAMENTOXCONDPAG filtroPagX
          WHERE filtroPagX.filtroPagamento = a.filtroPagamento
          AND filtroPagX.condicaoPagamento = p_pag_condicaoPagamento
          AND filtroPagX.ativo = 1)))),
  FILTROSPRODUTOS AS (
    SELECT
      a.regraDescontoMargem,
      a.filtroProduto,
      b.quantidadeMinima,
      b.quantidadeMaxima,
      b.filtrarVendedores,
      b.filtrarLocaisEstoque,
      b.filtrarPersonalizacoes,
      b.filtrarProdutos,
      b.filtrarCategoriasProdutos,
      b.filtrarSubcategoriasProdutos,
      b.filtrarMarcas,
      b.filtrarCaracteristicasA,
      b.filtrarCaracteristicasB,
      b.filtrarCaracteristicasC,
      b.filtrarCaracteristicasD,
      b.filtrarCaracteristicasE,
      b.filtrarCores,
      b.filtrarTamanhos,
      b.filtrarNCMs,
      b.filtrarListasServicos,
      c.filtrarTabelaPreco
    FROM PAREGRADESCMARGXFILTPROD a
    JOIN PAFILTROSPRODUTO b
    ON b.filtroProduto = a.filtroProduto
    JOIN REGRAS c
    ON c.regraDescontoMargem = a.regraDescontoMargem
    AND a.filtroProduto > 0
    AND a.ativo = 1),
  REGRASXITENS AS (
    SELECT
      a.regraDescontoMargem,
      a.filtroProduto,
      a.quantidadeMinima,
      a.quantidadeMaxima,
      b.sequencia,
      b.quantidade,
      b.valorBaseRegra,
      b.valorDescontoItem,
      b.valorDescontoGeral
    FROM FILTROSPRODUTOS a
    JOIN ITENS b
	  ON 1=1
    WHERE (a.filtrarTabelaPreco = 0
      OR EXISTS (
        SELECT 1
        FROM PAREGRADESCMARGXTABELASPR x
        WHERE x.regraDescontoMargem = a.regraDescontoMargem
        AND x.tabelaPreco = b.tabelaPreco
        AND x.ativo = 1))
    AND (a.filtrarVendedores = 0
    OR EXISTS (
      SELECT 1
      FROM PAFILTROPRODUTOXVENDEDOR x
      WHERE x.filtroProduto = a.filtroProduto
      AND x.vendedor = b.vendedor
      AND x.ativo = 1))
    AND (a.filtrarLocaisEstoque = 0
    OR EXISTS (
      SELECT 1
      FROM PAFILTROPRODUTOXLOCAISEST x
      WHERE x.filtroProduto = a.filtroProduto
      AND x.localEstoque = b.localEstoque
      AND x.ativo = 1))
    AND (a.filtrarPersonalizacoes = 0
    OR EXISTS (
      SELECT 1
      FROM PAFILTROPRODUTOXPERSONAL x
      WHERE x.filtroProduto = a.filtroProduto
      AND x.personalizacao = b.personalizacao
      AND x.ativo = 1))
    AND (a.filtrarProdutos = 0
      AND a.filtrarCategoriasProdutos = 0
      AND a.filtrarSubcategoriasProdutos = 0
      AND a.filtrarMarcas = 0
      AND a.filtrarCaracteristicasA = 0
      AND a.filtrarCaracteristicasB = 0
      AND a.filtrarCaracteristicasC = 0
      AND a.filtrarCaracteristicasD = 0
      AND a.filtrarCaracteristicasE = 0
      AND a.filtrarCores = 0
      AND a.filtrarTamanhos = 0
      AND a.filtrarNCMs = 0
      AND a.filtrarListasServicos = 0
      OR a.filtrarProdutos = 1
      AND EXISTS (
        SELECT 1
        FROM PAFILTROPRODUTOXPRODUTOS x
        WHERE x.filtroProduto = a.filtroProduto
        AND x.produto = b.produto
        AND x.ativo = 1)
      OR (a.filtrarCategoriasProdutos = 1
        OR a.filtrarSubcategoriasProdutos = 1
        OR a.filtrarMarcas = 1
        OR a.filtrarCaracteristicasA = 1
        OR a.filtrarCaracteristicasB = 1
        OR a.filtrarCaracteristicasC = 1
        OR a.filtrarCaracteristicasD = 1
        OR a.filtrarCaracteristicasE = 1
        OR a.filtrarCores = 1
        OR a.filtrarTamanhos = 1
        OR a.filtrarNCMs = 1
        OR a.filtrarListasServicos = 1)
      AND (a.filtrarCategoriasProdutos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCATEGPROD x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.categoriaProduto = b.categoriaProduto
          AND x.ativo = 1))
      AND (a.filtrarSubcategoriasProdutos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXSUBCAPROD x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.subcategoriaProduto = b.subcategoriaProduto
          AND x.ativo = 1))
      AND (a.filtrarMarcas = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXMARCAS x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.marca = b.marca
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasA = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERA x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaA = b.caracteristicaA
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasB = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERB x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaB = b.caracteristicaB
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasC = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERC x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaC = b.caracteristicaC
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasD = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERD x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaD = b.caracteristicaD
          AND x.ativo = 1))
      AND (a.filtrarCaracteristicasE = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCARACTERE x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.caracteristicaE = b.caracteristicaE
          AND x.ativo = 1))
      AND (a.filtrarCores = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXCORES x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.cor = b.cor
          AND x.ativo = 1))
      AND (a.filtrarTamanhos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXTAMANHOS x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.tamanho = b.tamanho
          AND x.ativo = 1))
      AND (a.filtrarNCMs = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXNCMS x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.idNcm = b.idNcm
          AND x.ativo = 1))
      AND (a.filtrarListasServicos = 0
        OR EXISTS (
          SELECT 1
          FROM PAFILTROPRODUTOXLISTASSE x
          WHERE x.filtroProduto = a.filtroProduto
          AND x.listaServicos = b.listaServicos
          AND x.ativo = 1)))),
  REGRASXFILTROS AS (
    SELECT
      a.regraDescontoMargem,
      a.filtroProduto
    FROM (
      SELECT
        a.regraDescontoMargem,
        a.filtroProduto,
        a.quantidadeMinima,
        a.quantidadeMaxima,
        SUM (a.quantidade) quantidade
      FROM REGRASXITENS a
      GROUP BY
        a.regraDescontoMargem,
        a.filtroProduto,
        a.quantidadeMinima,
        a.quantidadeMaxima) a
    WHERE a.quantidade >= a.quantidadeMinima
    AND (a.quantidadeMaxima = 0
      OR a.quantidade <= a.quantidadeMaxima)),
  REGRASVALIDAS AS (
    SELECT
      a.regraDescontoMargem,
      a.ordenacao,
      a.tipoRegraDescontoMargem,
      a.valorSugestao,
      a.valorMaximoSemSenha,
      a.filtrarTabelaPreco,
      a.idade,
      a.valorBaseDesconto,
      a.proporcaoPagamento,
      COALESCE((
        SELECT COUNT(1)
        FROM FILTROSPRODUTOS b
        WHERE b.regraDescontoMargem = a.regraDescontoMargem),0) filtrosProdutos
    FROM REGRAS a
    WHERE
      ( SELECT COUNT(1)
        FROM FILTROSPRODUTOS b
        WHERE b.regraDescontoMargem = a.regraDescontoMargem)
    = ( SELECT COUNT(1)
        FROM REGRASXFILTROS b
        WHERE b.regraDescontoMargem = a.regraDescontoMargem))
  SELECT
    COALESCE (MAX(a.possuiRegra), 0) possuiRegra,
    COALESCE (ROUND((
      CASE
        WHEN MIN (a.valorDescontoSugestao) < 0
          OR SUM (
          CASE
            WHEN a.valorDescontoSugestao < 0
            THEN 0
            ELSE a.valorDescontoSugestao
          END) >= p_pag_valorPagamentoBruto
          OR SUM(a.valorBaseDescontoSugestao) <> MAX(a.valorBaseDesconto)
          OR SUM(a.valorDescontoItem) <> 0
          OR SUM(a.valorDescontoGeral) <> 0
          OR SUM(a.possuiRegra) > 1
        THEN 100
          * ROUND(
              CASE
                WHEN SUM (
                  CASE
                    WHEN a.valorDescontoSugestao < 0
                    THEN 0
                    ELSE a.valorDescontoSugestao
                  END) >= p_pag_valorPagamentoBruto
                THEN p_pag_valorPagamentoBruto - 0.01
                ELSE SUM (
                  CASE
                    WHEN a.valorDescontoSugestao < 0
                    THEN 0
                    ELSE a.valorDescontoSugestao
                  END)
              END, 2) / MAX(a.valorBaseDesconto)
        ELSE MAX(a.percentualDescontoSugestao)
      END), 8), 0) percentualDescontoSugestao,
    COALESCE (ROUND(
      CASE
        WHEN SUM (
          CASE
            WHEN a.valorDescontoSugestao < 0
            THEN 0
            ELSE a.valorDescontoSugestao
          END) >= p_pag_valorPagamentoBruto
        THEN p_pag_valorPagamentoBruto - 0.01
        ELSE SUM (
          CASE
            WHEN a.valorDescontoSugestao < 0
            THEN 0
            ELSE a.valorDescontoSugestao
          END)
      END, 2), 0) valorDescontoSugestao,
    COALESCE (ROUND(
      CASE
        WHEN SUM (
          CASE
            WHEN a.valorDescontoMaximoSemSenha < 0
            THEN 0
            ELSE a.valorDescontoMaximoSemSenha
          END) >= p_pag_valorPagamentoBruto
        THEN p_pag_valorPagamentoBruto - 0.01
        ELSE SUM (
          CASE
            WHEN a.valorDescontoMaximoSemSenha < 0
            THEN 0
            ELSE a.valorDescontoMaximoSemSenha
          END)
      END, 2), 0) valorDescontoMaximoSemSenha
  INTO
    r_possuiRegra,
    r_percentualDescontoSugestao,
    r_valorDescontoSugestao,
    r_valorDescontoMaximoSemSenha
  FROM (
    SELECT
      1 possuiRegra,
      a.valorBaseDesconto,
      a.valorDescontoItem,
      a.valorDescontoGeral,
      ROUND (
        CASE a.tipoRegraDescontoMargem
          -- Desconto em percentual
          WHEN 1
          THEN a.valorBaseRegra
          -- Desconto em valor
          WHEN 2
          THEN a.valorBaseDesconto
          -- Preço unitário fixo
          WHEN 3
          THEN a.valorBaseDesconto
          -- Desconto igual a idade em percentual
          WHEN 4
          THEN a.valorBaseRegra
          -- Desconto igual a idade em valor
          WHEN 5
          THEN a.valorBaseDesconto
          -- Preço total fixado
          WHEN 6
          THEN a.valorBaseDesconto
          ELSE 0
        END, 2) valorBaseDescontoSugestao,
      ROUND (
        CASE a.tipoRegraDescontoMargem
          -- Desconto em percentual
          WHEN 1
          THEN a.valorSugestao
          -- Desconto em valor
          WHEN 2
          THEN 100 * a.valorSugestao * a.multiplicador / a.valorBaseDesconto
          -- Preço unitário fixo
          WHEN 3
          THEN 100 * (a.valorBaseRegra-ROUND (a.quantidadeRegra*a.valorMaximoSemSenha,2)) / a.valorBaseDesconto
          -- Desconto igual a idade em percentual
          WHEN 4
          THEN a.idade
          -- Desconto igual a idade em valor
          WHEN 5
          THEN 100 * a.idade * a.multiplicador / a.valorBaseDesconto
          -- Preço total fixado
          WHEN 6
          THEN 100 * a.valorBaseRegra / a.valorBaseDesconto
          ELSE 0
        END, 8) percentualDescontoSugestao,
      ROUND (
        ( CASE a.tipoRegraDescontoMargem
            -- Desconto em percentual
            WHEN 1
            THEN a.valorBaseRegra * a.valorSugestao / 100
            -- Desconto em valor
            WHEN 2
            THEN a.valorSugestao * a.multiplicador
             -- Preço unitário fixo
            WHEN 3
            THEN a.valorBaseRegra-ROUND (a.quantidadeRegra*a.valorSugestao,2)
            -- Desconto igual a idade em percentual
            WHEN 4
            THEN a.valorBaseRegra * a.idade / 100
            -- Desconto igual a idade em valor
            WHEN 5
            THEN a.idade * a.multiplicador
            -- Preço total fixado
            WHEN 6
            THEN a.valorBaseRegra
            ELSE 0
          END
          - a.valorDescontoItem
          - a.valorDescontoGeral)
        * a.proporcaoPagamento, 2) valorDescontoSugestao,
      ROUND (
        CASE a.tipoRegraDescontoMargem
          -- Desconto em percentual
          WHEN 1
          THEN a.valorBaseRegra * a.valorMaximoSemSenha / 100
          -- Desconto em valor
          WHEN 2
          THEN a.valorMaximoSemSenha * a.multiplicador
          -- Preço unitário fixo
          WHEN 3
          THEN a.valorBaseRegra-ROUND (a.quantidadeRegra*a.valorMaximoSemSenha,2)
          -- Desconto igual a idade em percentual
          WHEN 4
          THEN a.valorBaseRegra * a.idade / 100
          -- Desconto igual a idade em valor
          WHEN 5
          THEN a.idade * a.multiplicador
          -- Preço total fixado
          WHEN 6
          THEN a.valorBaseRegra
          ELSE 0
        END * a.proporcaoPagamento, 2) valorDescontoMaximoSemSenha
    FROM (
      SELECT
        a.tipoRegraDescontoMargem,
        a.valorSugestao,
        a.valorMaximoSemSenha,
        a.idade,
        a.valorBaseDesconto,
        a.proporcaoPagamento,
        SUM(a.quantidade) quantidadeRegra,
        CASE
          WHEN SUM (a.valorBaseRegraTodos - a.valorDescontoItemTodos - a.valorDescontoGeralTodos) = 0
          THEN 0
          ELSE SUM (a.valorBaseRegra - a.valorDescontoItem - a.valorDescontoGeral)
            / SUM (a.valorBaseRegraTodos - a.valorDescontoItemTodos - a.valorDescontoGeralTodos)
        END multiplicador,
        SUM (a.valorBaseRegra) valorBaseRegra,
        SUM (a.valorDescontoItem) valorDescontoItem,
        SUM (a.valorDescontoGeral) valorDescontoGeral
      FROM (
        SELECT 
          a.regraDescontoMargem,
          ROW_NUMBER() OVER (
            PARTITION BY a.sequencia
            ORDER BY
              a.sequencia,
              a.ordenacao,
              a.regraDescontoMargem) ordenacao,
          a.tipoRegraDescontoMargem,
          a.valorSugestao,
          a.valorMaximoSemSenha,
          a.idade,
          a.valorBaseDesconto,
          a.proporcaoPagamento,
          a.sequencia,
          a.quantidade,
          a.valorBaseRegra,
          a.valorDescontoItem,
          a.valorDescontoGeral,
          a.valorBaseRegraTodos,
          a.valorDescontoItemTodos,
          a.valorDescontoGeralTodos
        FROM (
          SELECT DISTINCT
            a.regraDescontoMargem,
            a.ordenacao,
            a.tipoRegraDescontoMargem,
            a.valorSugestao,
            a.valorMaximoSemSenha,
            a.idade,
            a.valorBaseDesconto,
            a.proporcaoPagamento,
            b.sequencia,
            b.quantidade,
            b.valorBaseRegra,
            b.valorDescontoItem,
            b.valorDescontoGeral,
            0 valorBaseRegraTodos,
            0 valorDescontoItemTodos,
            0 valorDescontoGeralTodos
          FROM REGRASVALIDAS a
          JOIN ITENS b
          ON 1=1
          WHERE a.filtrosProdutos = 0
          AND (a.filtrarTabelaPreco = 0
            OR EXISTS (
              SELECT 1
              FROM PAREGRADESCMARGXTABELASPR x
              WHERE x.regraDescontoMargem = a.regraDescontoMargem
              AND x.tabelaPreco = b.tabelaPreco
              AND x.ativo = 1))
          UNION ALL
          SELECT DISTINCT
            a.regraDescontoMargem,
            a.ordenacao,
            a.tipoRegraDescontoMargem,
            a.valorSugestao,
            a.valorMaximoSemSenha,
            a.idade,
            a.valorBaseDesconto,
            a.proporcaoPagamento,
            b.sequencia,
            b.quantidade,
            b.valorBaseRegra,
            b.valorDescontoItem,
            b.valorDescontoGeral,
            0 valorBaseRegraTodos,
            0 valorDescontoItemTodos,
            0 valorDescontoGeralTodos
          FROM REGRASVALIDAS a
          JOIN REGRASXITENS b
          ON b.regraDescontoMargem = a.regraDescontoMargem
          WHERE a.filtrosProdutos > 0
          UNION ALL
          SELECT DISTINCT
            a.regraDescontoMargem,
            a.ordenacao,
            a.tipoRegraDescontoMargem,
            a.valorSugestao,
            a.valorMaximoSemSenha,
            a.idade,
            a.valorBaseDesconto,
            a.proporcaoPagamento,
            b.sequencia,
            b.quantidade,
            0 valorBaseRegra,
            0 valorDescontoItem,
            0 valorDescontoGeral,
            b.valorBaseRegra valorBaseRegraTodos,
            b.valorDescontoItem valorDescontoItemTodos,
            b.valorDescontoGeral valorDescontoGeralTodos
          FROM REGRASVALIDAS a
          JOIN ITENS b
          ON 1=1) a) a
      WHERE a.ordenacao = 1
      GROUP BY
        a.regraDescontoMargem,
        a.tipoRegraDescontoMargem,
        a.valorSugestao,
        a.valorMaximoSemSenha,
        a.idade,
        a.valorBaseDesconto,
        a.proporcaoPagamento) a) a;
END ADD_PRE_DOC_REGRA_DESC_PAG;

/

create or replace PROCEDURE ADD_GRADE_PRODUTO_TROCA (
  p_config_28_somenteProdEst     IN NUMBER,
  p_config_31_pesqPeloIdProduto  IN NUMBER,
  p_config_32_pesqPeloEanGtin    IN NUMBER,
  p_config_33_pesqPelaReferencia IN NUMBER,
  p_config_34_pesqPeloIdGradePro IN NUMBER,
  p_config_35_pesqPeloProdutoImp IN NUMBER,
  p_config_36_pesqPeloCodFabrica IN NUMBER,
  p_config_37_pesqPeloCodAnterio IN NUMBER,
  p_config_38_pesqPeloProdXPess  IN CHAR,
  p_config_39_pesqPeloLote       IN NUMBER,
  p_config_40_pesqPeloNumSerie   IN NUMBER,
  p_config_142_digitosProdEanInt IN CHAR,
  p_config_348_excessaoBuscaCod  IN NUMBER,
  p_config_424_pesqPeloIdLoteEst IN NUMBER,
  p_config_429_pesqPeloProdXForn IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_gradeProduto                 IN NUMBER,
  p_codigoDescricao              IN VARCHAR2,
  p_trocou                       IN NUMBER,
  p_join                         IN CLOB,
  p_andWhere                     IN CLOB,
  p_cab_estabelecimento          IN NUMBER,
  p_cab_pessoa                   IN NUMBER,
  p_quantidade                   IN NUMBER,
  p_produto                      IN NUMBER,
  /* Retornos */
  r_gradeProduto                 OUT NUMBER,
  r_codigoDescricao              OUT VARCHAR2,
  r_trocou                       OUT NUMBER,
  r_selecionou                   OUT NUMBER,
  r_abrirTelaOnline              OUT NUMBER,
  r_mensagemErro                 OUT VARCHAR2,
  r_observacoesErro              OUT CLOB,
  r_codigoEANInterno             OUT VARCHAR2,
  r_idLoteEstoque                OUT NUMBER,
  r_loteEstoque                  OUT VARCHAR2,
  r_idNumeroSerie                OUT NUMBER,
  r_numeroSerie                  OUT VARCHAR2,
  r_quantidade                   OUT NUMBER)
IS
  v_codigoDescricaoComPontos   VARCHAR2(4000);
  v_codigoDescricaoSemPontos   VARCHAR2(4000);
  v_codigoDescricaoLoop        VARCHAR2(4000);
  v_contadorSubSelects         NUMBER;
  v_select                     CLOB;
  v_gradeProduto               NUMBER;
  v_produtoImpresso            VARCHAR2(60);
  v_descricaoImpressa          VARCHAR2(120);
  v_idLoteEstoque              NUMBER;
  v_loteEstoque                VARCHAR2(20);
  v_idNumeroSerie              NUMBER;
  v_numeroSerie                VARCHAR2(60);
  v_quantidade                 NUMBER;
  v_contaRegistros             NUMBER;
BEGIN
  r_gradeProduto               := p_gradeProduto;
  r_codigoDescricao            := p_codigoDescricao;
  r_trocou                     := p_trocou;
  r_selecionou                 := 0;
  r_abrirTelaOnline            := 0;
  r_mensagemErro               := ' ';
  r_observacoesErro            := ' ';
  r_codigoEANInterno           := ' ';
  r_idLoteEstoque              := 0;
  r_loteEstoque                := ' ';
  r_idNumeroSerie              := 0;
  r_numeroSerie                := ' ';
  r_quantidade                 := p_quantidade;
  v_codigoDescricaoComPontos   := ' ';
  v_codigoDescricaoSemPontos   := ' ';
  v_codigoDescricaoLoop        := ' ';
  v_contadorSubSelects         := 0;
  v_select                     := ' ';
  v_gradeProduto               := 0;
  v_produtoImpresso            := ' ';
  v_descricaoImpressa          := ' ';
  v_idLoteEstoque              := 0;
  v_loteEstoque                := ' ';
  v_idNumeroSerie              := 0;
  v_numeroSerie                := ' ';
  v_quantidade                 := 0;
  v_contaRegistros             := 0;
  IF p_codigoDescricao = ' ' AND p_produto = 0 THEN
    r_gradeProduto := 0;
    r_selecionou   := 1;
    r_trocou       := 0;
  ELSE
    IF p_config_142_digitosProdEanInt IN ('4','5','6')
      AND p_produto = 0
      AND SUBSTR(p_codigoDescricao,1,1)='2'
      AND LENGTH (RTRIM(p_codigoDescricao))=13
      AND FUNC_ADD_CONTEUDO_NUMERICO(p_codigoDescricao) = 1 THEN
      SELECT
        COALESCE(MAX(gradeProduto),0),
        COALESCE(MAX(produtoImpresso),' '),
        COALESCE(MAX(descricaoImpressa),' '),
        COUNT(1) contaRegistros
      INTO
        v_gradeProduto,
        v_produtoImpresso,
        v_descricaoImpressa,
        v_contaRegistros
      FROM CAGRADESPRODUTO
      WHERE produtoImpresso = TRIM(TO_CHAR(TO_NUMBER(SUBSTR(p_codigoDescricao,2,TO_NUMBER(p_config_142_digitosProdEanInt)))));
      IF v_contaRegistros = 1 THEN
        r_gradeProduto      := v_gradeProduto;
        r_codigoDescricao   := TRIM (v_produtoImpresso) || ' - ' || TRIM (v_descricaoImpressa);
        r_trocou            := 0;
        r_selecionou        := 1;
        r_codigoEANInterno  := p_codigoDescricao;
      ELSE
        v_gradeProduto      := 0;
        v_produtoImpresso   := ' ';
        v_descricaoImpressa := ' ';
        v_contaRegistros    := 0;
      END IF;
    END IF;
    IF v_contaRegistros = 0 THEN
      IF p_codigoDescricao = ' ' THEN
        v_select := 'SELECT
  COALESCE(MIN(a.gradeProduto),0),
  COALESCE(MIN(a.produtoImpresso),'' ''),
  COALESCE(MIN(a.descricaoImpressa),'' ''),
  COALESCE(MIN(a.idLoteEstoque),0),
  COALESCE(MIN(a.loteEstoque),'' ''),
  COALESCE(MIN(a.idNumeroSerie),0),
  COALESCE(MIN(a.numeroSerie),'' ''),
  COALESCE(MIN(a.quantidade),0),
  COUNT (1)
FROM (
  SELECT DISTINCT /*+ FIRST_ROWS(2) */
    a.gradeProduto,
    a.produtoImpresso,
    a.descricaoImpressa,
    a.idLoteEstoque,
    a.loteEstoque,
    a.idNumeroSerie,
    a.numeroSerie,
    a.quantidade
  FROM (
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.ativo = 1
    AND ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END
  || '
  ) a
  WHERE ROWNUM <=2
  ) a';
      ELSE
        v_codigoDescricaoComPontos := UPPER (REPLACE (REPLACE (TRIM (r_codigoDescricao), '*', '%'), '''', ''''''));
        IF p_config_348_excessaoBuscaCod = 1 AND LENGTH (TRIM (v_codigoDescricaoComPontos)) = 16 AND FUNC_ADD_CONTEUDO_NUMERICO (v_codigoDescricaoComPontos) = 1 THEN
          v_codigoDescricaoComPontos := SUBSTR(v_codigoDescricaoComPontos,1,12);
        END IF;
        v_codigoDescricaoSemPontos := REPLACE (REPLACE (REPLACE (REPLACE (RTRIM (v_codigoDescricaoComPontos), '.', ''), '-', ''), '/', ''), '\', '');
        IF v_codigoDescricaoSemPontos = ' ' THEN 
          v_select := 'SELECT
  COALESCE(MIN(a.gradeProduto),0),
  COALESCE(MIN(a.produtoImpresso),'' ''),
  COALESCE(MIN(a.descricaoImpressa),'' ''),
  COALESCE(MIN(a.idLoteEstoque),0),
  COALESCE(MIN(a.loteEstoque),'' ''),
  COALESCE(MIN(a.idNumeroSerie),0),
  COALESCE(MIN(a.numeroSerie),'' ''),
  COALESCE(MIN(a.quantidade),0),
  COUNT (1)
FROM (
  SELECT DISTINCT /*+ FIRST_ROWS(2) */
    a.gradeProduto,
    a.produtoImpresso,
    a.descricaoImpressa,
    a.idLoteEstoque,
    a.loteEstoque,
    a.idNumeroSerie,
    a.numeroSerie,
    a.quantidade
  FROM (
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.ativo = 1
    AND ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END
  || '
  ) a
  WHERE ROWNUM <=2
  ) a';
        ELSE
          v_select := 'SELECT
  COALESCE(MIN(a.gradeProduto),0),
  COALESCE(MIN(a.produtoImpresso),'' ''),
  COALESCE(MIN(a.descricaoImpressa),'' ''),
  COALESCE(MIN(a.idLoteEstoque),0),
  COALESCE(MIN(a.loteEstoque),'' ''),
  COALESCE(MIN(a.idNumeroSerie),0),
  COALESCE(MIN(a.numeroSerie),'' ''),
  COALESCE(MIN(a.quantidade),0),
  COUNT (1)
FROM (
  SELECT DISTINCT /*+ FIRST_ROWS(2) */
    a.gradeProduto,
    a.produtoImpresso,
    a.descricaoImpressa,
    a.idLoteEstoque,
    a.loteEstoque,
    a.idNumeroSerie,
    a.numeroSerie,
    a.quantidade
  FROM (';
          v_contadorSubSelects := 0;
          -- Se digitou número
          IF LENGTH (TRIM (v_codigoDescricaoSemPontos)) <= 14 AND FUNC_ADD_CONTEUDO_NUMERICO (v_codigoDescricaoSemPontos) = 1 THEN
            IF p_config_31_pesqPeloIdProduto = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.produto = ' || RTRIM (v_codigoDescricaoSemPontos)
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            END IF;
            IF p_config_32_pesqPeloEanGtin = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.eanGtin  = ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            END IF;
            IF p_config_34_pesqPeloIdGradePro = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.gradeProduto = ' || RTRIM (v_codigoDescricaoSemPontos)
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            END IF;
            IF p_config_35_pesqPeloProdutoImp = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
              IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoComPontos) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
              END IF;
              v_codigoDescricaoLoop := v_codigoDescricaoComPontos;
              WHILE (v_codigoDescricaoLoop <> '0' AND SUBSTR (v_codigoDescricaoLoop, 1, 1) = '0') LOOP
                v_codigoDescricaoLoop := SUBSTR (v_codigoDescricaoLoop, 2, 299);
              END LOOP;
              IF v_codigoDescricaoLoop <> ' ' THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoLoop) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
              END IF;
            END IF;
            IF p_config_36_pesqPeloCodFabrica = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.codigoFabrica = ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
              IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.codigoFabrica = ''' || RTRIM (v_codigoDescricaoComPontos) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
              END IF;
            END IF;
            IF p_config_424_pesqPeloIdLoteEst = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      prodXLote.idLoteEstoque,
      prodXLote.loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote
    ON prodXLote.gradeProduto = a.gradeProduto
    WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || '
    AND prodXLote.idLoteEstoque = ' || RTRIM (v_codigoDescricaoSemPontos) || '
    AND prodXLote.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            END IF;
          -- Se não digitou número
          ELSE
            v_contadorSubSelects := v_contadorSubSelects + 1;
            v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.descricaoImpressa LIKE ''' || RTRIM (REPLACE (RTRIM (v_codigoDescricaoComPontos), ' ', '%')) || '%'''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            IF p_config_32_pesqPeloEanGtin = 1 AND FUNC_ADD_CONTEUDO_NUMERICO (SUBSTR(v_codigoDescricaoSemPontos,1,1)) = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.eanGtin  = ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            END IF;
            IF p_config_35_pesqPeloProdutoImp = 1 AND FUNC_ADD_CONTEUDO_NUMERICO (SUBSTR(v_codigoDescricaoSemPontos,1,1)) = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
              IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoComPontos) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
              END IF;
              v_codigoDescricaoLoop := v_codigoDescricaoComPontos;
              WHILE (v_codigoDescricaoLoop <> '0' AND SUBSTR (v_codigoDescricaoLoop, 1, 1) = '0') LOOP
                v_codigoDescricaoLoop := SUBSTR (v_codigoDescricaoLoop, 2, 299);
              END LOOP;
              IF v_codigoDescricaoLoop <> ' ' THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoLoop) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
              END IF;
            END IF;
          END IF;
          -- Válido tanto para números quanto não números
          IF p_config_33_pesqPelaReferencia = 1 THEN
            v_contadorSubSelects := v_contadorSubSelects + 1;
            v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE produt.referencia LIKE ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE produt.referencia LIKE ''' || RTRIM (v_codigoDescricaoComPontos) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            END IF;
          END IF;
          IF p_config_37_pesqPeloCodAnterio = 1 THEN
            v_contadorSubSelects := v_contadorSubSelects + 1;
            v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.codigoAnterior LIKE ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    WHERE a.codigoAnterior LIKE ''' || RTRIM (v_codigoDescricaoComPontos) || ''''
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            END IF;
          END IF;
          IF p_config_38_pesqPeloProdXPess IN ('S','T') THEN
            v_contadorSubSelects := v_contadorSubSelects + 1;
            v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      prodXPess.quantidadePorEmbalagem quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    JOIN CAGRADEPRODUTOXPESSOAS prodXPess
    ON prodXPess.gradeProduto = a.gradeProduto
    WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || CASE WHEN p_config_38_pesqPeloProdXPess = 'T' THEN '' WHEN p_cab_pessoa = 0 THEN '
    AND prodXPess.pessoa = 0' ELSE '
    AND (prodXPess.pessoa = 0 OR prodXPess.pessoa = ' || p_cab_pessoa || ')' END
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || '
    AND prodXPess.codigoProduto = ''' || RTRIM (v_codigoDescricaoSemPontos) || '''
    AND prodXPess.ativo = 1'  
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      prodXPess.quantidadePorEmbalagem quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    JOIN CAGRADEPRODUTOXPESSOAS prodXPess
    ON prodXPess.gradeProduto = a.gradeProduto
    WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || CASE WHEN p_config_38_pesqPeloProdXPess = 'T' THEN '' WHEN p_cab_pessoa = 0 THEN '
    AND prodXPess.pessoa = 0' ELSE '
    AND (prodXPess.pessoa = 0 OR prodXPess.pessoa = ' || p_cab_pessoa || ')' END
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || '
    AND prodXPess.codigoProduto = ''' || RTRIM (v_codigoDescricaoComPontos) || '''
    AND prodXPess.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            END IF;
          END IF;
          IF p_config_39_pesqPeloLote = 1 THEN
            v_contadorSubSelects := v_contadorSubSelects + 1;
            v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      prodXLote.idLoteEstoque,
      prodXLote.loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote
    ON prodXLote.gradeProduto = a.gradeProduto
    WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || '
    AND prodXLote.loteEstoque = ''' || RTRIM (v_codigoDescricaoSemPontos) || '''
    AND prodXLote.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      prodXLote.idLoteEstoque,
      prodXLote.loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote
    ON prodXLote.gradeProduto = a.gradeProduto
    WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || '
    AND prodXLote.loteEstoque = ''' || RTRIM (v_codigoDescricaoComPontos) || '''
    AND prodXLote.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            END IF;
          END IF;
          IF p_config_40_pesqPeloNumSerie = 1 THEN
            v_contadorSubSelects := v_contadorSubSelects + 1;
            v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      prodXNumSer.idLoteEstoque,
      prodXLote.loteEstoque,
      prodXNumSer.idNumeroSerie,
      prodXNumSer.numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    JOIN CAGRADEPRODUTOXNUMEROSSER prodXNumSer
    ON prodXNumSer.gradeProduto = a.gradeProduto
    JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote
    ON prodXLote.idLoteEstoque = prodXNumSer.idLoteEstoque
    WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || '
    AND prodXNumSer.numeroSerie = ''' || RTRIM (v_codigoDescricaoSemPontos) || '''
    AND prodXNumSer.ativo = 1
    AND prodXLote.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      prodXNumSer.idLoteEstoque,
      prodXLote.loteEstoque,
      prodXNumSer.idNumeroSerie,
      prodXNumSer.numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    JOIN CAGRADEPRODUTOXNUMEROSSER prodXNumSer
    ON prodXNumSer.gradeProduto = a.gradeProduto
    JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote
    ON prodXLote.idLoteEstoque = prodXNumSer.idLoteEstoque
    WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || '
    AND prodXNumSer.numeroSerie = ''' || RTRIM (v_codigoDescricaoComPontos) || '''
    AND prodXNumSer.ativo = 1
    AND prodXLote.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            END IF;
          END IF;
          IF p_config_429_pesqPeloProdXForn = 1 THEN
            v_contadorSubSelects := v_contadorSubSelects + 1;
            v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    JOIN CAPRODUTOXFORNECEDORES prodXForn
    ON prodXForn.produto = a.produto
    WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || '
    AND prodXForn.codigoProduto = ''' || RTRIM (v_codigoDescricaoSemPontos) || '''
    AND prodXForn.ativo = 1'  
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
    UNION ALL' END || '
    SELECT
      a.gradeProduto,
      a.produtoImpresso,
      a.descricaoImpressa,
      0 idLoteEstoque,
      '' '' loteEstoque,
      0 idNumeroSerie,
      '' '' numeroSerie,
      0 quantidade
    FROM CAGRADESPRODUTO a
    JOIN CAPRODUTOS produt
    ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    JOIN CAPRODUTOXESTABELECIMENTO prodXEst
    ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
    ' || p_join ELSE '' END
  || '
    JOIN CAPRODUTOXFORNECEDORES prodXForn
    ON prodXForn.gradeProduto = a.gradeProduto
    WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
    AND a.ativo = 1
    AND produt.ativo = 1'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
    AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
    AND prodXEst.ativo = 1' ELSE '' END
  || '
    AND prodXForn.codigoProduto = ''' || RTRIM (v_codigoDescricaoComPontos) || '''
    AND prodXForn.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
    ' || p_andWhere END;
            END IF;
          END IF;
          v_select := v_select || '
  ) a
  WHERE ROWNUM <=2
) a';
          IF v_contadorSubSelects = 0 THEN
            v_select := 'SELECT
  0,
  '' '',
  '' '',
  0,
  '' '',
  0,
  '' '',
  0,
  0
FROM DUAL';
          END IF;
        END IF;
      END IF;
      EXECUTE IMMEDIATE v_select
      INTO
        v_gradeProduto,
        v_produtoImpresso,
        v_descricaoImpressa,
        v_idLoteEstoque,
        v_loteEstoque,
        v_idNumeroSerie,
        v_numeroSerie,
        v_quantidade,
        v_contaRegistros;
      IF v_contaRegistros = 1 THEN
        r_gradeProduto      := v_gradeProduto;
        r_codigoDescricao   := TRIM (v_produtoImpresso) || ' - ' || TRIM (v_descricaoImpressa);
        r_trocou            := 0;
        r_selecionou        := 1;
        r_idLoteEstoque     := v_idLoteEstoque;
        r_loteEstoque       := v_loteEstoque;
        r_idNumeroSerie     := v_idNumeroSerie;
        r_numeroSerie       := v_numeroSerie;
        IF v_quantidade > 0 THEN
          r_quantidade      := v_quantidade;
        END IF;
      ELSE
        IF v_contaRegistros > 1 THEN
          r_abrirTelaOnline   := 1;
        ELSE
          r_mensagemErro      := 'Nenhum produto encontrado.';
          r_observacoesErro   := '-- Componente: TrocaGradeProduto
-- Select da pesquisa:
' || v_select;
          IF v_codigoDescricaoSemPontos <> ' ' THEN
            v_select := 'SELECT COUNT (1)
FROM (';
            v_contadorSubSelects := 0;
            -- Se digitou número
            IF LENGTH (TRIM (v_codigoDescricaoSemPontos)) <= 14 AND FUNC_ADD_CONTEUDO_NUMERICO (v_codigoDescricaoSemPontos) = 1 THEN
              IF p_config_31_pesqPeloIdProduto = 1 THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.produto = ' || RTRIM (v_codigoDescricaoSemPontos)
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
              IF p_config_32_pesqPeloEanGtin = 1 THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.eanGtin  = ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
              IF p_config_34_pesqPeloIdGradePro = 1 THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.gradeProduto = ' || RTRIM (v_codigoDescricaoSemPontos)
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
              IF p_config_35_pesqPeloProdutoImp = 1 THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
                IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                  v_contadorSubSelects := v_contadorSubSelects + 1;
                  v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoComPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
                END IF;
                v_codigoDescricaoLoop := v_codigoDescricaoComPontos;
                WHILE (v_codigoDescricaoLoop <> '0' AND SUBSTR (v_codigoDescricaoLoop, 1, 1) = '0') LOOP
                  v_codigoDescricaoLoop := SUBSTR (v_codigoDescricaoLoop, 2, 299);
                END LOOP;
                IF v_codigoDescricaoLoop <> ' ' THEN
                  v_contadorSubSelects := v_contadorSubSelects + 1;
                  v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoLoop) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
                END IF;
              END IF;
              IF p_config_36_pesqPeloCodFabrica = 1 THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.codigoFabrica = ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
                IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                  v_contadorSubSelects := v_contadorSubSelects + 1;
                  v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.codigoFabrica = ''' || RTRIM (v_codigoDescricaoComPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
                END IF;
              END IF;
              IF p_config_424_pesqPeloIdLoteEst = 1 THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote
  ON prodXLote.gradeProduto = a.gradeProduto
  WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || '
  AND prodXLote.idLoteEstoque = ' || RTRIM (v_codigoDescricaoSemPontos) || '
  AND prodXLote.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
            -- Se não digitou número
            ELSE
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.descricaoImpressa LIKE ''' || RTRIM (REPLACE (RTRIM (v_codigoDescricaoComPontos), ' ', '%')) || '%'''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              IF p_config_32_pesqPeloEanGtin = 1 AND FUNC_ADD_CONTEUDO_NUMERICO (SUBSTR(v_codigoDescricaoSemPontos,1,1)) = 1 THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.eanGtin  = ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
              IF p_config_35_pesqPeloProdutoImp = 1 AND FUNC_ADD_CONTEUDO_NUMERICO (SUBSTR(v_codigoDescricaoSemPontos,1,1)) = 1 THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
                IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                  v_contadorSubSelects := v_contadorSubSelects + 1;
                  v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoComPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
                END IF;
                v_codigoDescricaoLoop := v_codigoDescricaoComPontos;
                WHILE (v_codigoDescricaoLoop <> '0' AND SUBSTR (v_codigoDescricaoLoop, 1, 1) = '0') LOOP
                  v_codigoDescricaoLoop := SUBSTR (v_codigoDescricaoLoop, 2, 299);
                END LOOP;
                IF v_codigoDescricaoLoop <> ' ' THEN
                  v_contadorSubSelects := v_contadorSubSelects + 1;
                  v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.produtoImpresso = ''' || RTRIM (v_codigoDescricaoLoop) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
                END IF;
              END IF;
            END IF;
            -- Válido tanto para números quanto não números
            IF p_config_33_pesqPelaReferencia = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE produt.referencia LIKE ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE produt.referencia LIKE ''' || RTRIM (v_codigoDescricaoComPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
            END IF;
            IF p_config_37_pesqPeloCodAnterio = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.codigoAnterior LIKE ''' || RTRIM (v_codigoDescricaoSemPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  WHERE a.codigoAnterior LIKE ''' || RTRIM (v_codigoDescricaoComPontos) || ''''
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
            END IF;
            IF p_config_38_pesqPeloProdXPess IN ('S','T') THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  JOIN CAGRADEPRODUTOXPESSOAS prodXPess
  ON prodXPess.gradeProduto = a.gradeProduto
  WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || CASE WHEN p_config_38_pesqPeloProdXPess = 'T' THEN '' WHEN p_cab_pessoa = 0 THEN '
  AND prodXPess.pessoa = 0' ELSE '
  AND (prodXPess.pessoa = 0 OR prodXPess.pessoa = ' || p_cab_pessoa || ')' END
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || '
  AND prodXPess.codigoProduto = ''' || RTRIM (v_codigoDescricaoSemPontos) || '''
  AND prodXPess.ativo = 1'  
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  JOIN CAGRADEPRODUTOXPESSOAS prodXPess
  ON prodXPess.gradeProduto = a.gradeProduto
  WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || CASE WHEN p_config_38_pesqPeloProdXPess = 'T' THEN '' WHEN p_cab_pessoa = 0 THEN '
    AND prodXPess.pessoa = 0' ELSE '
    AND (prodXPess.pessoa = 0 OR prodXPess.pessoa = ' || p_cab_pessoa || ')' END
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || '
  AND prodXPess.codigoProduto = ''' || RTRIM (v_codigoDescricaoComPontos) || '''
  AND prodXPess.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
            END IF;
            IF p_config_39_pesqPeloLote = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote
  ON prodXLote.gradeProduto = a.gradeProduto
  WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || '
  AND prodXLote.loteEstoque = ''' || RTRIM (v_codigoDescricaoSemPontos) || '''
  AND prodXLote.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote
  ON prodXLote.gradeProduto = a.gradeProduto
  WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || '
  AND prodXLote.loteEstoque = ''' || RTRIM (v_codigoDescricaoComPontos) || '''
  AND prodXLote.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
            END IF;
            IF p_config_40_pesqPeloNumSerie = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  JOIN CAGRADEPRODUTOXNUMEROSSER prodXNumSer
  ON prodXNumSer.gradeProduto = a.gradeProduto
  JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote
  ON prodXLote.idLoteEstoque = prodXNumSer.idLoteEstoque
  WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || '
  AND prodXNumSer.numeroSerie = ''' || RTRIM (v_codigoDescricaoSemPontos) || '''
  AND prodXNumSer.ativo = 1
  AND prodXLote.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  JOIN CAGRADEPRODUTOXNUMEROSSER prodXNumSer
  ON prodXNumSer.gradeProduto = a.gradeProduto
  JOIN CAGRADEPRODUTOXLOTESESTOQ prodXLote
  ON prodXLote.idLoteEstoque = prodXNumSer.idLoteEstoque
  WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || '
  AND prodXNumSer.numeroSerie = ''' || RTRIM (v_codigoDescricaoComPontos) || '''
  AND prodXNumSer.ativo = 1
  AND prodXLote.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
            END IF;
            IF p_config_429_pesqPeloProdXForn = 1 THEN
              v_contadorSubSelects := v_contadorSubSelects + 1;
              v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  JOIN CAPRODUTOXFORNECEDORES prodXForn
  ON prodXForn.gradeProduto = a.gradeProduto
  WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || '
  AND prodXForn.codigoProduto = ''' || RTRIM (v_codigoDescricaoSemPontos) || '''
  AND prodXForn.ativo = 1'  
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              IF v_codigoDescricaoComPontos <> v_codigoDescricaoSemPontos THEN
                v_contadorSubSelects := v_contadorSubSelects + 1;
                v_select := v_select || CASE WHEN v_contadorSubSelects = 1 THEN '' ELSE '
  UNION ALL' END || '
  SELECT a.gradeProduto
  FROM CAGRADESPRODUTO a
  JOIN CAPRODUTOS produt
  ON produt.produto = a.produto'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  JOIN CAPRODUTOXESTABELECIMENTO prodXEst
  ON prodXEst.produto = a.produto' ELSE '' END
  || CASE WHEN p_join IS NOT NULL AND p_join <> ' ' THEN '
  ' || p_join ELSE '' END
  || '
  JOIN CAPRODUTOXFORNECEDORES prodXForn
  ON prodXForn.gradeProduto = a.gradeProduto
  WHERE ' || CASE WHEN p_produto = 0 THEN 'a.gradeProduto <> 0' ELSE 'a.produto = ' || p_produto END
  || '
  AND produt.ativo = 0'
  || CASE WHEN p_config_28_somenteProdEst = 1 THEN '
  AND prodXEst.estabelecimento = '
  || CASE WHEN p_cab_estabelecimento = 0 THEN p_estabelecimentoAtivo ELSE p_cab_estabelecimento END || '
  AND prodXEst.ativo = 1' ELSE '' END
  || '
  AND prodXForn.codigoProduto = ''' || RTRIM (v_codigoDescricaoComPontos) || '''
  AND prodXForn.ativo = 1'
  || CASE WHEN p_andWhere IS NULL OR p_andWhere = ' ' THEN '' ELSE '
  ' || p_andWhere END;
              END IF;
            END IF;
            v_select := v_select || '
) a';
            IF v_contadorSubSelects = 0 THEN
              v_select := 'SELECT 0 FROM DUAL';
            END IF;
            EXECUTE IMMEDIATE v_select
            INTO v_contaRegistros;            
            IF v_contaRegistros > 0 THEN
              r_mensagemErro      := 'Produto inativo.';
            END IF;
          END IF;
        END IF;
      END IF;
    END IF;
  END IF;
END ADD_GRADE_PRODUTO_TROCA;

/

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

/

-- Caxias do Sul - RS
UPDATE SIMUNICIPIOS SET tecnologiaNFSe = 3, versaoNFSe = '2.03', certificadoDigitalAcessoSite = 0 WHERE municipio = 4305108;

DELETE SISERVICOSNFSE WHERE id IN (4305108000, 4305108020, 4305108100);

INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4305108000, 4305108, 'EnviarLoteRps', 'https://nfsehomol.caxias.rs.gov.br/services/nfse/ws/servicos', 'https://nfse.caxias.rs.gov.br/services/nfse/ws/Servicos', ' ', '<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soap:Body><enviarLoteNotas xmlns="http://ws.pc.gif.com.br/">', '</enviarLoteNotas></soap:Body></soap:Envelope>', 'confirmaLote', ' ' , ' ');
INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4305108020, 4305108, 'ConsultarLoteRps', 'https://nfsehomol.caxias.rs.gov.br/services/nfse/ws/servicos', 'https://nfse.caxias.rs.gov.br/services/nfse/ws/Servicos', ' ', '<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soap:Body><obterCriticaLote xmlns="http://ws.pc.gif.com.br/">', '</obterCriticaLote></soap:Body></soap:Envelope>', 'resultadoLote', '<pedidoStatusLote versao="1.0"><CNPJ><!$MG_cnpj></CNPJ><cLote><!$MG_protocolo></cLote></pedidoStatusLote>', ' ');
INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4305108100, 4305108, 'CancelarNfse', 'https://nfsehomol.caxias.rs.gov.br/services/nfse/ws/servicos', 'https://nfse.caxias.rs.gov.br/services/nfse/ws/Servicos', ' ', '<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soap:Body><cancelarNotaFiscal xmlns="http://ws.pc.gif.com.br/">', '</cancelarNotaFiscal></soap:Body></soap:Envelope>', 'resCancelaNFSe', '<pedCancelaNFSe versao="1.0"><CNPJ><!$MG_cnpj></CNPJ><chvAcessoNFS-e><!$MG_chaveNFe></chvAcessoNFS-e><motivo>1</motivo></pedCancelaNFSe>',  ' ');

COMMIT;

-- Garibaldi - RS
UPDATE SIMUNICIPIOS SET tecnologiaNFSe = 3, versaoNFSe = '2.03' WHERE municipio = 4308607;

DELETE SISERVICOSNFSE WHERE id IN (4308607000, 4308607020, 4308607100);

INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4308607000, 4308607, 'EnviarLoteRps', 'https://garibaldi-homol.infisc.com.br/services/nfse/ws/Servicos', 'https://nfse.garibaldi.rs.gov.br/services/nfse/ws/Servicos', ' ', '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://nfse.abrasf.org.br"><soapenv:Header/><soapenv:Body><RecepcionarLoteRpsSincrono><nfseCabecMsg><cabecalho xmlns="http://nfse.abrasf.org.br" versao="2.03"><versaoDados>2.03</versaoDados></cabecalho></nfseCabecMsg><nfseDadosMsg>', '</nfseDadosMsg></RecepcionarLoteRpsSincrono></soapenv:Body></soapenv:Envelope>', 'EnviarLoteRpsSincronoResposta', ' ' , ' ');
INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4308607020, 4308607, 'ConsultarLoteRps', 'https://garibaldi-homol.infisc.com.br/services/nfse/ws/Servicos', 'https://nfse.garibaldi.rs.gov.br/services/nfse/ws/Servicos', ' ', '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://nfse.abrasf.org.br"><soapenv:Header/><soapenv:Body><ConsultarLoteRps><nfseCabecMsg><cabecalho xmlns="http://nfse.abrasf.org.br" versao="2.03"><versaoDados>2.03</versaoDados></cabecalho></nfseCabecMsg><nfseDadosMsg>', '</nfseDadosMsg></ConsultarLoteRps></soapenv:Body></soapenv:Envelope>', 'ConsultarLoteRpsResposta', '<ConsultarLoteRpsEnvio xmlns="http://nfse.abrasf.org.br"><Prestador><CpfCnpj><Cnpj><!$MG_cnpj></Cnpj></CpfCnpj><InscricaoMunicipal><!$MG_inscricaoMunicipal></InscricaoMunicipal></Prestador><Protocolo><!$MG_protocolo></Protocolo></ConsultarLoteRpsEnvio>', ' ');
INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4308607100, 4308607, 'CancelarNfse', 'https://garibaldi-homol.infisc.com.br/services/nfse/ws/Servicos', 'https://nfse.garibaldi.rs.gov.br/services/nfse/ws/Servicos', ' ', '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://nfse.abrasf.org.br"><soapenv:Header/><soapenv:Body><CancelarNfse><nfseCabecMsg><cabecalho xmlns="http://nfse.abrasf.org.br" versao="2.03"><versaoDados>2.03</versaoDados></cabecalho></nfseCabecMsg><nfseDadosMsg>', '</nfseDadosMsg></CancelarNfse></soapenv:Body></soapenv:Envelope>', 'CancelarNfseResposta', '<CancelarNfseEnvio><Pedido><InfPedidoCancelamento Id="<!$MG_idPedidoCancelamento>"><IdentificacaoNfse><Numero><!$MG_numeroNFSe></Numero><CpfCnpj><Cnpj><!$MG_cnpj></Cnpj></CpfCnpj><InscricaoMunicipal><!$MG_inscricaoMunicipal></InscricaoMunicipal><CodigoMunicipio><!$MG_codigoMunicipio></CodigoMunicipio></IdentificacaoNfse><CodigoCancelamento><!$MG_codigoCancelamento></CodigoCancelamento></InfPedidoCancelamento></Pedido></CancelarNfseEnvio>',  ' ');

COMMIT;

-- Esteio - RS
UPDATE SIMUNICIPIOS SET tecnologiaNFSe = 1, versaoNFSe = '2.00' WHERE municipio = 4307708;

DELETE SISERVICOSNFSE WHERE id IN (4307708000, 4307708020, 4307708100);

INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4307708000, 4307708, 'EnviarLoteRps', 'https://grphml.esteio.rs.gov.br/nfsehml/services/NFSEremessa', 'https://grp.esteio.rs.gov.br/nfse/services/NFSEremessa', 'urn:recepcionarLoteRps', '<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><recepcionarLoteRps><xml>', '</xml></recepcionarLoteRps></S:Body></S:Envelope>', 'recepcionarLoteRpsResponse', ' ' , ' ');
INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4307708020, 4307708, 'ConsultarLoteRps', 'https://grphml.esteio.rs.gov.br/nfsehml/services/NFSEconsulta', 'https://grp.esteio.rs.gov.br/nfse/services/NFSEconsulta', 'urn:consultarLoteRps', '<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><recepcionarLoteRps><xml>', '</xml></recepcionarLoteRps></S:Body></S:Envelope>', 'consultarLoteRpsResponse', '<ConsultarLoteRpsEnvio xmlns="http://www.abrasf.org.br/nfse.xsd"><Prestador><Cnpj><!$MG_cnpj></Cnpj><InscricaoMunicipal><!$MG_inscricaoMunicipal></InscricaoMunicipal></Prestador><Protocolo><!$MG_protocolo></Protocolo></ConsultarLoteRpsEnvio>', ' ');
INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4307708100, 4307708, 'CancelarNfse', 'https://grphml.esteio.rs.gov.br/nfsehml/services/NFSEcancelamento', 'https://grp.esteio.rs.gov.br/nfse/services/NFSEcancelamento', 'urn:cancelarNfse', '<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><recepcionarLoteRps><xml>', '</xml></recepcionarLoteRps></S:Body></S:Envelope>', 'cancelarNfseResponse', '<CancelarNfseEnvio xmlns="http://www.abrasf.org.br/nfse.xsd"><Pedido xmlns="http://www.abrasf.org.br/nfse.xsd"><InfPedidoCancelamento Id="<!$MG_idPedidoCancelamento>"><IdentificacaoNfse><Numero><!$MG_numeroNFSe></Numero><Cnpj><!$MG_cnpj></Cnpj><InscricaoMunicipal><!$MG_inscricaoMunicipal></InscricaoMunicipal><CodigoMunicipio><!$MG_codigoMunicipio></CodigoMunicipio></IdentificacaoNfse><CodigoCancelamento><!$MG_codigoCancelamento></CodigoCancelamento></InfPedidoCancelamento></Pedido></CancelarNfseEnvio>',  ' ');

COMMIT;

-- Portão - RS
UPDATE SIMUNICIPIOS SET tecnologiaNFSe = 1, versaoNFSe = '2.00' WHERE municipio = 4314803;

DELETE SISERVICOSNFSE WHERE id IN (4314803000, 4314803020, 4314803100);

INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4314803000, 4314803, 'EnviarLoteRps', 'http://homologapor.nfse-tecnos.com.br:9091', 'http://portao.nfse-tecnos.com.br:9091', ' ', '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><mEnvioLoteRPSSincrono xmlns="http://tempuri.org/"><remessa>', '</remessa><cabecalho>' || '&' || 'lt;cabecalho xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.abrasf.org.br/nfse.xsd"' || '&' || 'lt;versaoDados' || '&' || 'lt;2.00' || '&' || 'lt;/versaoDados' || '&' || 'lt;' || '&' || 'lt;/cabecalho' || '&' || 'lt;</cabecalho></mEnvioLoteRPSSincrono></soap:Body></soap:Envelope>', 'EnviarLoteRpsSincronoResposta', ' ' , ' ');
INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4314803020, 4314803, 'ConsultarLoteRps', 'http://homologapor.nfse-tecnos.com.br:9097', 'http://portao.nfse-tecnos.com.br:9097', ' ', '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><mConsultaLoteRPS xmlns="http://tempuri.org/"><remessa>', '</remessa><cabecalho>' || '&' || 'lt;cabecalho xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.abrasf.org.br/nfse.xsd"' || '&' || 'lt;versaoDados' || '&' || 'lt;2.00' || '&' || 'lt;/versaoDados' || '&' || 'lt;' || '&' || 'lt;/cabecalho' || '&' || 'lt;</cabecalho></mConsultaLoteRPS></soap:Body></soap:Envelope>', 'mConsultaLoteRPSResult', '<ConsultarLoteRpsEnvio xmlns="http://www.abrasf.org.br/nfse.xsd"><Prestador><CpfCnpj><Cnpj><!$MG_cnpj></Cnpj></CpfCnpj><RazaoSocial><!$MG_razaoSocial></RazaoSocial><InscricaoMunicipal><!$MG_inscricaoMunicipal></InscricaoMunicipal></Prestador><Protocolo><!$MG_protocolo></Protocolo></ConsultarLoteRpsEnvio>', ' ');
INSERT INTO SISERVICOSNFSE (id, municipio, nomeServico, urlServicoHomologacao, urlServicoProducao, soapAction, soapPrefixo, soapSufixo, elementoRetorno, modeloXml, observacoes) VALUES (4314803100, 4314803, 'CancelarNfse', 'http://homologapor.nfse-tecnos.com.br:9098', 'http://portao.nfse-tecnos.com.br:9098', ' ', '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><mCancelamentoNFSe xmlns="http://tempuri.org/"><remessa>', '</remessa><cabecalho>' || '&' || 'lt;cabecalho xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.abrasf.org.br/nfse.xsd"' || '&' || 'lt;versaoDados' || '&' || 'lt;2.00' || '&' || 'lt;/versaoDados' || '&' || 'lt;' || '&' || 'lt;/cabecalho' || '&' || 'lt;</cabecalho></mCancelamentoNFSe></soap:Body></soap:Envelope>', 'CancelarNfseResposta', '<CancelarNfseEnvio xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.abrasf.org.br/nfse.xsd"><Pedido><InfPedidoCancelamento Id="<!$MG_idPedidoCancelamento>"><IdentificacaoNfse><Numero><!$MG_numeroNFSe></Numero><CpfCnpj><Cnpj><!$MG_cnpj></Cnpj></CpfCnpj><InscricaoMunicipal><!$MG_inscricaoMunicipal></InscricaoMunicipal><CodigoMunicipio><!$MG_codigoMunicipio></CodigoMunicipio></IdentificacaoNfse><CodigoCancelamento><!$MG_codigoCancelamento></CodigoCancelamento><MotivoCancelamento><!$MG_motivoCancelamento></MotivoCancelamento></InfPedidoCancelamento></Pedido></CancelarNfseEnvio>',  ' ');

COMMIT;

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

/

create or replace PROCEDURE ADD_DOC_FISC_ITEM_GRAVA (
  p_sessaoClient                 IN VARCHAR2,
  p_usuarioLogado                IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_198_obs_add_referenc  IN NUMBER,
  p_config_199_obs_add_caractA   IN NUMBER,
  p_config_200_obs_add_caractB   IN NUMBER,
  p_config_201_obs_add_caractC   IN NUMBER,
  p_config_202_obs_add_caractD   IN NUMBER,
  p_config_203_obs_add_caractE   IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_227_manterPessoaOrcam IN NUMBER,
  p_config_230_etapaPedComprParc IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     IN NUMBER,
  p_config_418_obs_efetarEnter   IN NUMBER,
  p_manterFinanceiro_Retotalizar IN NUMBER,
  p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
  p_buscarGeraFinanceiroEstoque  IN NUMBER,
  p_tipoDocumentoReferenciado    IN CHAR, -- B = Balanço, D = Documento Fiscal, G = Grade DF-e, O = Orçamento, P, Pré-Documento, T = Transferência
  p_idItemReferenciado           IN NUMBER,
  p_quantidadeReferenciada       IN NUMBER,
  p_tempComp_nomeTempComposicao  IN VARCHAR2,
  p_tempComp_sequencia           IN NUMBER,
  p_calcularImpostos             IN NUMBER,
  p_item_idItemDocFiscal         IN NUMBER,
  p_item_idDocumentoFiscal       IN NUMBER,
  p_item_pedidoCompraFornecedor  IN VARCHAR2,
  p_item_sequenciaPedidoCompraFo IN NUMBER,
  p_item_modeloDocumento         IN NUMBER,
  p_item_estabelecimentoOriginal IN NUMBER,
  p_item_vendedor                IN NUMBER,
  p_item_gradeProduto            IN NUMBER,
  p_item_idFormulaTinta          IN NUMBER,
  p_item_personalizacao          IN NUMBER,
  p_item_idLoteEstoque           IN NUMBER,
  p_item_idEnderecoEstoque       IN NUMBER,
  p_item_idNumeroSerie           IN NUMBER,
  p_item_localEstoque            IN NUMBER,
  p_item_pessoaParticipante      IN NUMBER,
  p_item_controleQuantidade      IN NUMBER,
  p_item_unidadeMedidaConversao  IN VARCHAR2,
  p_item_conversorQuantidade     IN NUMBER,
  p_item_loteMinimo              IN NUMBER,
  p_item_loteMultiplo            IN NUMBER,
  p_item_altura                  IN NUMBER,
  p_item_largura                 IN NUMBER,
  p_item_comprimento             IN NUMBER,
  p_item_pecas                   IN NUMBER,
  p_item_quantidade              IN NUMBER,
  p_item_quantidadeConvertida    IN NUMBER,
  p_item_pesoLiquido             IN NUMBER,
  p_item_pesoBruto               IN NUMBER,
  p_item_tipoPreco               IN CHAR,
  p_item_tabelaPreco             IN VARCHAR2,
  p_item_precoSugestaoAPrazo     IN NUMBER,
  p_item_precoSugestaoAVista     IN NUMBER,
  p_item_precoDesconto           IN NUMBER,
  p_item_precoMinimo             IN NUMBER,
  p_item_usarPrecoAVista         IN NUMBER,
  p_item_precoUnitarioBruto      IN NUMBER,
  p_item_acrescimoUnitarioCompos IN NUMBER,
  p_item_precoUnitario           IN NUMBER,
  p_item_percDescontoItem        IN NUMBER,
  p_item_valorDescontoItem       IN NUMBER,
  p_item_percAcrescimoItem       IN NUMBER,
  p_item_valorAcrescimoItem      IN NUMBER,
  p_item_valorFreteItem          IN NUMBER,
  p_item_valorSeguroItem         IN NUMBER,
  p_item_valorAdicFreteMarItem   IN NUMBER,
  p_item_valorDespesasAduanItem  IN NUMBER,
  p_item_quantidadeExtemporanea  IN NUMBER,
  p_item_acrescimoUnitarioExtemp IN NUMBER,
  p_item_valorAcrescimoExtempIte IN NUMBER,
  p_item_valorDescontoCustoOpIte IN NUMBER,
  p_item_valorAcrescimoCustoOpIt IN NUMBER,
  p_item_observacoesDigitadas    IN VARCHAR2,
  p_item_valorFreteGeral         IN NUMBER,
  p_item_valorSeguroGeral        IN NUMBER,
  p_item_valorDescontoGeral      IN NUMBER,
  p_item_valorOutrasDespesasGer  IN NUMBER,
  p_item_valorAdicFreteMarGeral  IN NUMBER,
  p_item_valorDespesasAduanGeral IN NUMBER,
  p_item_valorAcrescimoExtempGer IN NUMBER,
  p_item_valorDescontoCustoOpGer IN NUMBER,
  p_item_valorAcrescimoCustoOpGe IN NUMBER,
  p_item_valorDescontoPagamento  IN NUMBER,
  p_item_valorOutrasDespPagament IN NUMBER,
  p_item_valorJurosPagamento     IN NUMBER,
  p_item_percentualDevolucao     IN NUMBER,
  p_item_valorIPIDevolucao       IN NUMBER,
  p_item_operacaoFiscal          IN NUMBER,
  p_item_movimentaEstoque        IN NUMBER,
  p_item_movimentaEstoqueFiscal  IN NUMBER,
  p_item_geraFinanceiro          IN NUMBER,
  p_item_cfop                    IN NUMBER,
  p_item_indicadorISSQN          IN CHAR,
  p_item_aliquotaISSQN           IN NUMBER,
  p_item_retidoISSQN             IN NUMBER,
  p_item_tributadoForaMunicipio  IN NUMBER,
  p_item_incentivoFiscal         IN NUMBER,
  p_item_listaServicos           IN NUMBER,
  p_item_cnae                    IN NUMBER,
  p_item_idServicoMunicipio      IN NUMBER,
  p_item_numeroProcessoAdministr IN VARCHAR2,
  p_item_retencaoIRRF            IN NUMBER,
  p_item_retencaoINSS            IN NUMBER,
  p_item_retencaoPIS             IN NUMBER,
  p_item_retencaoCOFINS          IN NUMBER,
  p_item_retencaoCSLL            IN NUMBER,
  p_item_retencaoOutros          IN NUMBER,
  p_item_aliquotaII              IN NUMBER,
  p_item_aliquotaIOF             IN NUMBER,
  p_item_codigoEnquadramentoIPI  IN NUMBER,
  p_item_stIPI                   IN CHAR,
  p_item_aliquotaIPI             IN NUMBER,
  p_item_valorAliquotaIPI        IN NUMBER,
  p_item_stPIS                   IN CHAR,
  p_item_aliquotaPIS             IN NUMBER,
  p_item_valorAliquotaPIS        IN NUMBER,
  p_item_aliquotaPISST           IN NUMBER,
  p_item_valorAliquotaPISST      IN NUMBER,
  p_item_stCOFINS                IN CHAR,
  p_item_aliquotaCOFINS          IN NUMBER,
  p_item_valorAliquotaCOFINS     IN NUMBER,
  p_item_aliquotaCOFINSST        IN NUMBER,
  p_item_valorAliquotaCOFINSST   IN NUMBER,
  p_item_stSimplesNacional       IN CHAR,
  p_item_creditoSimplesNacional  IN NUMBER,
  p_item_stICMS                  IN CHAR,
  p_item_modalBaseCalcICMS       IN CHAR,
  p_item_reducaoBaseICMS         IN NUMBER,
  p_item_aliquotaICMS            IN NUMBER,
  p_item_diferimentoICMS         IN NUMBER,
  p_item_motivoDesoneracaoICMS   IN CHAR,
  p_item_idBeneficio             IN NUMBER,
  p_item_modalBaseCalcICMSST     IN CHAR,
  p_item_margemValorAdicionadoST IN NUMBER,
  p_item_reducaoBaseST           IN NUMBER,
  p_item_aliquotaICMSST          IN NUMBER,
  p_item_aliquotaSTSuportConsFin IN NUMBER,
  p_item_reducaoBaseICMSEfetivo  IN NUMBER,
  p_item_aliquotaICMSEfetivo     IN NUMBER,
  p_item_stICMSEscrituracao      IN CHAR,
  p_item_reducaoBaseICMSEscritur IN NUMBER,
  p_item_aliquotaICMSEscrituraca IN NUMBER,
  p_item_diferimentoICMSEscritur IN NUMBER,
  p_item_margemValorAdicSTEscrit IN NUMBER,
  p_item_reducaoBaseSTEscriturac IN NUMBER,
  p_item_aliquotaICMSSTEscritura IN NUMBER,
  p_item_somarICMSST             IN NUMBER,
  p_item_aliquotaICMSUFDestinat  IN NUMBER,
  p_item_aliquotaICMSInterestad  IN NUMBER,
  p_item_partilhaICMSInterestad  IN NUMBER,
  p_item_aliquotaFCP             IN NUMBER,
  p_item_aliquotaFCPST           IN NUMBER,
  p_item_aliquotaFCPSTAnteriorm  IN NUMBER,
  p_item_aliquotaFCPUFDestinat   IN NUMBER,
  p_item_aliquotaEstImpFederais  IN NUMBER,
  p_item_aliquotaEstImpEstaduais IN NUMBER,
  p_item_aliquotaEstImpMunicipai IN NUMBER,
  p_item_baseISSQN               IN NUMBER,
  p_item_valorISSQN              IN NUMBER,
  p_item_baseRetIRRF             IN NUMBER,
  p_item_valorRetIRRF            IN NUMBER,
  p_item_baseRetINSS             IN NUMBER,
  p_item_valorRetINSS            IN NUMBER,
  p_item_baseRetPIS              IN NUMBER,
  p_item_valorRetPIS             IN NUMBER,
  p_item_baseRetCOFINS           IN NUMBER,
  p_item_valorRetCOFINS          IN NUMBER,
  p_item_baseRetCSLL             IN NUMBER,
  p_item_valorRetCSLL            IN NUMBER,
  p_item_baseRetOutros           IN NUMBER,
  p_item_valorRetOutros          IN NUMBER,
  p_item_baseII                  IN NUMBER,
  p_item_valorII                 IN NUMBER,
  p_item_baseIOF                 IN NUMBER,
  p_item_valorIOF                IN NUMBER,
  p_item_baseIPI                 IN NUMBER,
  p_item_valorIPI                IN NUMBER,
  p_item_basePIS                 IN NUMBER,
  p_item_valorPIS                IN NUMBER,
  p_item_basePISST               IN NUMBER,
  p_item_valorPISST              IN NUMBER,
  p_item_baseCOFINS              IN NUMBER,
  p_item_valorCOFINS             IN NUMBER,
  p_item_baseCOFINSST            IN NUMBER,
  p_item_valorCOFINSST           IN NUMBER,
  p_item_baseCreditoSimplesNac   IN NUMBER,
  p_item_valorCreditoSimplesNac  IN NUMBER,
  p_item_baseICMS                IN NUMBER,
  p_item_valorICMSOperacao       IN NUMBER,
  p_item_valorICMSDiferido       IN NUMBER,
  p_item_valorICMS               IN NUMBER,
  p_item_valorICMSDesoneracao    IN NUMBER,
  p_item_baseICMSST              IN NUMBER,
  p_item_valorICMSST             IN NUMBER,
  p_item_baseICMSSTAnteriormente IN NUMBER,
  p_item_valorICMSSTAnteriorment IN NUMBER,
  p_item_valorICMSProprioSubstit IN NUMBER,
  p_item_baseICMSEfetivo         IN NUMBER,
  p_item_valorICMSEfetivo        IN NUMBER,
  p_item_baseICMSEscrituracao    IN NUMBER,
  p_item_valorICMSEscrituracao   IN NUMBER,
  p_item_valorICMSDesonEscritura IN NUMBER,
  p_item_baseICMSSTEscrituracao  IN NUMBER,
  p_item_valorICMSSTEscrituracao IN NUMBER,
  p_item_baseICMSUFDestinatario  IN NUMBER,
  p_item_valorICMSUFDestinatario IN NUMBER,
  p_item_baseICMSUFRemetente     IN NUMBER,
  p_item_valorICMSUFRemetente    IN NUMBER,
  p_item_baseFCP                 IN NUMBER,
  p_item_valorFCP                IN NUMBER,
  p_item_baseFCPST               IN NUMBER,
  p_item_valorFCPST              IN NUMBER,
  p_item_baseFCPSTAnteriormente  IN NUMBER,
  p_item_valorFCPSTAnteriormente IN NUMBER,
  p_item_baseFCPUFDestinatario   IN NUMBER,
  p_item_valorFCPUFDestinatario  IN NUMBER,
  p_item_baseEstimadaImpostos    IN NUMBER,
  p_item_valorEstImpFederais     IN NUMBER,
  p_item_valorEstImpEstaduais    IN NUMBER,
  p_item_valorEstImpMunicipais   IN NUMBER,
  p_nivel                        IN NUMBER,
  p_buffer_idItemDocFiscal       IN VARCHAR2,
  /* Retornos */
  r_calcularImpostos             OUT NUMBER,
  r_item_idItemDocFiscal         OUT NUMBER,
  r_buffer_idItemDocFiscal       OUT VARCHAR2,
  r_valorInserido                OUT NUMBER)
IS
  v_cab_origemDocumento          NUMBER;
  v_cab_tipoDocumento            NUMBER;
  v_cab_entradaSaida             CHAR (1);
  v_cab_devolucaoAnulacaoRetorno NUMBER;
  v_cab_finalidadeNota           CHAR (1);
  v_cab_atualizaCustoMedio       NUMBER;
  v_cab_nfFornecedor             NUMBER;
  v_cab_documentoFiscal          NUMBER;
  v_cab_estabelecimento          NUMBER;
  v_cab_dataEmissao              DATE;
  v_cab_pessoa                   NUMBER;
  v_cab_vendaConsumidor          NUMBER;
  v_cab_enderecoEntregaPessoa    NUMBER;
  v_cab_municipioFatoGerador     NUMBER;
  v_cab_localDestinoOperacao     CHAR (1);
  v_cab_indicadorConsumidorFinal CHAR (1);
  v_cab_projeto                  VARCHAR2 (60);
  v_cab_modalidadeFrete          CHAR (1);
  v_cab_tipoPagamentoFrete       CHAR (1);
  v_cab_situacaoDocumentoFiscal  NUMBER;
  v_cab_ultimoVendedorItem       NUMBER;
  v_cab_quantidadeVolume         NUMBER;
  v_cab_quantidade               NUMBER;
  v_cab_pesoLiquido              NUMBER;
  v_cab_pesoBruto                NUMBER;
  v_cab_valorProdutosBruto       NUMBER;
  v_cab_valorProdutos            NUMBER;
  v_cab_valorDescontoProdutos    NUMBER;
  v_cab_valorAcrescimoProdutos   NUMBER;
  v_cab_valorServicosBruto       NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorDescontoServicos    NUMBER;
  v_cab_valorAcrescimoServicos   NUMBER;
  v_cab_valorFreteItem           NUMBER;
  v_cab_valorSeguroItem          NUMBER;
  v_cab_valorAdicFreteMarItem    NUMBER;
  v_cab_valorDespesasAduanItem   NUMBER;
  v_cab_valorFreteGeral          NUMBER;
  v_cab_valorSeguroGeral         NUMBER;
  v_cab_valorDescontoGeral       NUMBER;
  v_cab_valorOutrasDespesasGeral NUMBER;
  v_cab_valorAdicFreteMarGeral   NUMBER;
  v_cab_valorDespesasAduanGeral  NUMBER;
  v_cab_condicaoPagamento        NUMBER;
  v_cab_numeroParcelas           NUMBER;
  v_cab_somaPrazoParcelas        NUMBER;
  v_cab_valorXPrazoParcelas      NUMBER;
  v_cab_prazoMedio               NUMBER;
  v_cab_prazoMedioPonderado      NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorEntradaMinima       NUMBER;
  v_cab_valorAVistaEntrada       NUMBER;
  v_cab_valorPagamentoBruto      NUMBER;
  v_cab_valorDescontoPagamento   NUMBER;
  v_cab_valorOutrasDespPagamento NUMBER;
  v_cab_valorJurosPagamento      NUMBER;
  v_cab_valorPagamentoLiquido    NUMBER;
  v_cab_valorTroco               NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarTotal   NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_cab_valorDescontoCustoOpItem NUMBER;
  v_cab_valorDescontoCustoOpGera NUMBER;
  v_cab_valorDescontoCustoOpTota NUMBER;
  v_cab_valorAcrescimoCustoOpIte NUMBER;
  v_cab_valorAcrescimoCustoOpGer NUMBER;
  v_cab_valorAcrescimoCustoOpTot NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_quantidadeExtemporanea   NUMBER;
  v_cab_valorAcrescimoExtempSubt NUMBER;
  v_cab_valorAcrescimoExtempItem NUMBER;
  v_cab_valorAcrescimoExtempGera NUMBER;
  v_cab_valorAcrescimoExtempTota NUMBER;
  v_est_grupoFiscal              NUMBER;
  v_pessEst_regimeTributario     CHAR (1);
  v_munEndEst_uf                 CHAR (2);
  v_pess_indicadorInscricaoEstad CHAR (1);
  v_endPess_enderecoPessoa       NUMBER;
  v_munEndPess_uf                CHAR (2);
  v_munEndEntr_uf                CHAR (2);
  v_inserindoItem                NUMBER;
  v_cab_promocaoExiste           NUMBER;
  v_ini_cab_valorFreteItem       NUMBER;
  v_ini_cab_valorFreteGeral      NUMBER;
  v_ini_gradeProduto             NUMBER;
  v_ini_personalizacao           NUMBER;
  v_ini_operacaoFiscal           NUMBER;
  v_ini_quantidade               NUMBER;
  v_ini_valorProdutoServicoBruto NUMBER;
  v_ini_valorProdutoServico      NUMBER;
  v_ini_valorDescontoItem        NUMBER;
  v_ini_valorAcrescimoItem       NUMBER;
  v_ini_valorBasePagamento       NUMBER;
  v_ini_valorFreteTotal          NUMBER;
  v_ini_valorSeguroTotal         NUMBER;
  v_ini_valorDescontoTotal       NUMBER;
  v_ini_valorOutrasDespesasTotal NUMBER;
  v_ini_valorAdicFreteMarTotal   NUMBER;
  v_ini_valorDespesasAduanTotal  NUMBER;
  v_item_sequencia               NUMBER;
  v_item_cancelado               NUMBER;
  v_item_quantidadeDevolvidaRet  NUMBER;
  v_item_precoUnitario           NUMBER;
  v_item_precoUnitarioConvertido NUMBER;
  v_item_valorProdutoServicoBrut NUMBER;
  v_item_valorProdutoServico     NUMBER;
  v_item_valorDescontoGeral      NUMBER;
  v_item_valorBasePagamento      NUMBER;
  v_item_valorDescontoPagamento  NUMBER;
  v_item_valorOutrasDespPagament NUMBER;
  v_item_valorJurosPagamento     NUMBER;
  v_item_valorFreteTotal         NUMBER;
  v_item_valorSeguroTotal        NUMBER;
  v_item_valorDescontoTotal      NUMBER;
  v_item_valorOutrasDespesasTot  NUMBER;
  v_item_valorAdicFreteMarTotal  NUMBER;
  v_item_valorDespesasAduanTotal NUMBER;
  v_item_movimentaEstoque        NUMBER;
  v_item_movimentaEstoqueFiscal  NUMBER;
  v_item_geraFinanceiro          NUMBER;
  v_item_cfop                    NUMBER;
  v_item_indicadorISSQN          CHAR (1);
  v_item_aliquotaISSQN           NUMBER;
  v_item_retidoISSQN             NUMBER;
  v_item_tributadoForaMunicipio  NUMBER;
  v_item_incentivoFiscal         NUMBER;
  v_item_listaServicos           NUMBER;
  v_item_cnae                    NUMBER;
  v_item_idServicoMunicipio      NUMBER;
  v_item_numeroProcessoAdministr VARCHAR2 (30);
  v_item_retencaoIRRF            NUMBER;
  v_item_retencaoINSS            NUMBER;
  v_item_retencaoPIS             NUMBER;
  v_item_retencaoCOFINS          NUMBER;
  v_item_retencaoCSLL            NUMBER;
  v_item_retencaoOutros          NUMBER;
  v_item_aliquotaII              NUMBER;
  v_item_aliquotaIOF             NUMBER;
  v_item_codigoEnquadramentoIPI  NUMBER;
  v_item_stIPI                   CHAR (2);
  v_item_aliquotaIPI             NUMBER;
  v_item_valorAliquotaIPI        NUMBER;
  v_item_stPIS                   CHAR (2);
  v_item_aliquotaPIS             NUMBER;
  v_item_valorAliquotaPIS        NUMBER;
  v_item_aliquotaPISST           NUMBER;
  v_item_valorAliquotaPISST      NUMBER;
  v_item_stCOFINS                CHAR (2);
  v_item_aliquotaCOFINS          NUMBER;
  v_item_valorAliquotaCOFINS     NUMBER;
  v_item_aliquotaCOFINSST        NUMBER;
  v_item_valorAliquotaCOFINSST   NUMBER;
  v_item_stSimplesNacional       CHAR (3);
  v_item_creditoSimplesNacional  NUMBER;
  v_item_stICMS                  CHAR (2);
  v_item_modalBaseCalcICMS       CHAR (1);
  v_item_reducaoBaseICMS         NUMBER;
  v_item_aliquotaICMS            NUMBER;
  v_item_diferimentoICMS         NUMBER;
  v_item_motivoDesoneracaoICMS   CHAR (2);
  v_item_idBeneficio             NUMBER;
  v_item_modalBaseCalcICMSST     CHAR (1);
  v_item_margemValorAdicionadoST NUMBER;
  v_item_reducaoBaseST           NUMBER;
  v_item_aliquotaICMSST          NUMBER;
  v_item_aliquotaSTSuportConsFin NUMBER;
  v_item_reducaoBaseICMSEfetivo  NUMBER;
  v_item_aliquotaICMSEfetivo     NUMBER;
  v_item_stICMSEscrituracao      CHAR (2);
  v_item_reducaoBaseICMSEscritur NUMBER;
  v_item_aliquotaICMSEscrituraca NUMBER;
  v_item_diferimentoICMSEscritur NUMBER;
  v_item_margemValorAdicSTEscrit NUMBER;
  v_item_reducaoBaseSTEscriturac NUMBER;
  v_item_aliquotaICMSSTEscritura NUMBER;
  v_item_somarICMSST             NUMBER;
  v_item_aliquotaICMSUFDestinat  NUMBER;
  v_item_aliquotaICMSInterestad  NUMBER;
  v_item_partilhaICMSInterestad  NUMBER;
  v_item_aliquotaFCP             NUMBER;
  v_item_aliquotaFCPST           NUMBER;
  v_item_aliquotaFCPSTAnteriorm  NUMBER;
  v_item_aliquotaFCPUFDestinat   NUMBER;
  v_item_aliquotaEstImpFederais  NUMBER;
  v_item_aliquotaEstImpEstaduais NUMBER;
  v_item_aliquotaEstImpMunicipai NUMBER;
  v_item_baseISSQN               NUMBER;
  v_item_valorISSQN              NUMBER;
  v_item_baseRetIRRF             NUMBER;
  v_item_valorRetIRRF            NUMBER;
  v_item_baseRetINSS             NUMBER;
  v_item_valorRetINSS            NUMBER;
  v_item_baseRetPIS              NUMBER;
  v_item_valorRetPIS             NUMBER;
  v_item_baseRetCOFINS           NUMBER;
  v_item_valorRetCOFINS          NUMBER;
  v_item_baseRetCSLL             NUMBER;
  v_item_valorRetCSLL            NUMBER;
  v_item_baseRetOutros           NUMBER;
  v_item_valorRetOutros          NUMBER;
  v_item_baseII                  NUMBER;
  v_item_valorII                 NUMBER;
  v_item_baseIOF                 NUMBER;
  v_item_valorIOF                NUMBER;
  v_item_baseIPI                 NUMBER;
  v_item_valorIPI                NUMBER;
  v_item_basePIS                 NUMBER;
  v_item_valorPIS                NUMBER;
  v_item_basePISST               NUMBER;
  v_item_valorPISST              NUMBER;
  v_item_baseCOFINS              NUMBER;
  v_item_valorCOFINS             NUMBER;
  v_item_baseCOFINSST            NUMBER;
  v_item_valorCOFINSST           NUMBER;
  v_item_baseCreditoSimplesNac   NUMBER;
  v_item_valorCreditoSimplesNac  NUMBER;
  v_item_baseICMS                NUMBER;
  v_item_valorICMSOperacao       NUMBER;
  v_item_valorICMSDiferido       NUMBER;
  v_item_valorICMS               NUMBER;
  v_item_valorICMSDesoneracao    NUMBER;
  v_item_baseICMSST              NUMBER;
  v_item_valorICMSST             NUMBER;
  v_item_baseICMSSTAnteriormente NUMBER;
  v_item_valorICMSSTAnteriorment NUMBER;
  v_item_valorICMSProprioSubstit NUMBER;
  v_item_baseICMSEfetivo         NUMBER;
  v_item_valorICMSEfetivo        NUMBER;
  v_item_baseICMSEscrituracao    NUMBER;
  v_item_valorICMSEscrituracao   NUMBER;
  v_item_valorICMSDesonEscritura NUMBER;
  v_item_baseICMSSTEscrituracao  NUMBER;
  v_item_valorICMSSTEscrituracao NUMBER;
  v_item_baseICMSUFDestinatario  NUMBER;
  v_item_valorICMSUFDestinatario NUMBER;
  v_item_baseICMSUFRemetente     NUMBER;
  v_item_valorICMSUFRemetente    NUMBER;
  v_item_baseFCP                 NUMBER;
  v_item_valorFCP                NUMBER;
  v_item_baseFCPST               NUMBER;
  v_item_valorFCPST              NUMBER;
  v_item_baseFCPSTAnteriormente  NUMBER;
  v_item_valorFCPSTAnteriormente NUMBER;
  v_item_baseFCPUFDestinatario   NUMBER;
  v_item_valorFCPUFDestinatario  NUMBER;
  v_item_baseEstimadaImpostos    NUMBER;
  v_item_valorEstImpFederais     NUMBER;
  v_item_valorEstImpEstaduais    NUMBER;
  v_item_valorEstImpMunicipais   NUMBER;
  v_item_valorLiquidoItem        NUMBER;
  v_item_valorDescontoCustoOpTot NUMBER;
  v_item_valorAcrescimoCustoOpTo NUMBER;
  v_item_precoCustoOperacao      NUMBER;
  v_item_valorCustoOperacao      NUMBER;
  v_item_precoCMV                NUMBER;
  v_item_valorCMV                NUMBER;
  v_item_valorAcrescimoExtempSub NUMBER;
  v_item_valorAcrescimoExtempTot NUMBER;
  v_modDoc_capituloNatFiscal     NUMBER;
  v_modDoc_movimentaEstoque      NUMBER;
  v_modDoc_geraFinanceiro        NUMBER;
  v_modDoc_tipoPreco             CHAR (1);
  v_modDoc_tabelaPreco           VARCHAR (10);
  v_modDoc_fatorMultipPreco      NUMBER;
  v_modDoc_tipoPrecoB            CHAR (1);
  v_modDoc_tabelaPrecoB          VARCHAR (10);
  v_modDoc_fatorMultipPrecoB     NUMBER;
  v_modDoc_diminuiDescontoPrUnit NUMBER;
  v_modDoc_somaAcrescimosPrUnit  NUMBER;
  v_modDoc_somaFreteSeguroPrUnit NUMBER;
  v_gradProd_produto             NUMBER;
  v_gradProd_cor                 NUMBER;
  v_gradProd_tamanho             CHAR(10);
  v_prod_controleEstoque         NUMBER;
  v_prod_tipoProduto             CHAR(2);
  v_prod_origemMercadoria        CHAR(1);
  v_prod_idNcm                   NUMBER;
  v_prod_listaServicos           NUMBER;
  v_prod_precoPautaTabelado      NUMBER;
  v_prod_composicaoPreco         NUMBER;
  v_observacoes                  VARCHAR2 (4000);
  v_idEnderecoEstoque            NUMBER;
  v_combo_operacaoFiscal         NUMBER;
  v_combo_controleQuantidade     NUMBER;
  v_combo_unidadeMedidaConversao VARCHAR2(6);
  v_combo_conversorQuantidade    NUMBER;
  v_combo_loteMinimo             NUMBER;
  v_combo_loteMultiplo           NUMBER;
  v_combo_altura                 NUMBER;
  v_combo_largura                NUMBER;
  v_combo_comprimento            NUMBER;
  v_combo_pecas                  NUMBER;
  v_combo_quantidadeConvertida   NUMBER;
  v_combo_pesoLiquido            NUMBER;
  v_combo_pesoBruto              NUMBER;
  v_combo_tipoPreco              CHAR(1);
  v_combo_tabelaPreco            VARCHAR2(10);
  v_combo_precoSugestaoAPrazo    NUMBER;
  v_combo_precoSugestaoAVista    NUMBER;
  v_combo_precoDesconto          NUMBER;
  v_combo_precoMinimo            NUMBER;
  v_combo_precoUnitario          NUMBER;
  v_combo_valorTotal             NUMBER;
  v_soma_valorProdutos           NUMBER;
  v_soma_valorDescontoProdutos   NUMBER;
  v_soma_valorAcrescimoProdutos  NUMBER;
  v_soma_valorServicos           NUMBER;
  v_soma_valorDescontoServicos   NUMBER;
  v_soma_valorAcrescimoServicos  NUMBER;
  v_ajuste_residuoDesconto       NUMBER;
  v_ajuste_residuoAcrescimo      NUMBER;
  v_ajuste_valorOriginal         NUMBER;
  v_ajuste_idItemDocFiscal       NUMBER;
  v_ajuste_quantidade            NUMBER;
  v_ajuste_precoUnitarioBruto    NUMBER;
  v_ajuste_valorProdutoServicoBr NUMBER;
  v_ajuste_valorDescontoItem     NUMBER;
  v_ajuste_valorAcrescimoItem    NUMBER;
  v_ajuste_prod_tipoProduto      CHAR(2);
  v_auxNumber                    NUMBER;
  v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_calcularImpostos := p_calcularImpostos;
  r_item_idItemDocFiscal := p_item_idItemDocFiscal;
  r_buffer_idItemDocFiscal := p_buffer_idItemDocFiscal;
  r_valorInserido := 0;
  SELECT
    capituloNaturezaFiscal,
    movimentaEstoque,
    geraFinanceiro,
    tipoPreco,
    tabelaPreco,
    fatorMultiplicadorPreco,
    tipoPrecoB,
    tabelaPrecoB,
    fatorMultiplicadorPrecoB,
    diminuiDescontoPrUnit,
    somaAcrescimosPrUnit,
    somaFreteSeguroPrUnit
  INTO
    v_modDoc_capituloNatFiscal,
    v_modDoc_movimentaEstoque,
    v_modDoc_geraFinanceiro,
    v_modDoc_tipoPreco,
    v_modDoc_tabelaPreco,
    v_modDoc_fatorMultipPreco,
    v_modDoc_tipoPrecoB,
    v_modDoc_tabelaPrecoB,
    v_modDoc_fatorMultipPrecoB,
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit
  FROM PAMODELOSDOCUMENTO
  WHERE modeloDocumento = p_item_modeloDocumento;
  SELECT
    cab.origemDocumento,
    cab.tipoDocumento,
    cab.entradaSaida,
    cab.devolucaoAnulacaoRetorno,
    cab.finalidadeNota,
    cab.atualizaCustoMedio,
    cab.nfFornecedor,
    cab.documentoFiscal,
    cab.estabelecimento,
    cab.dataEmissao,
    cab.pessoa,
    cab.vendaConsumidor,
    cab.enderecoEntregaPessoa,
    cab.municipioFatoGerador,
    cab.localDestinoOperacao,
    cab.indicadorConsumidorFinal,
    cab.projeto,
    cab.modalidadeFrete,
    cab.tipoPagamentoFrete,
    cab.situacaoDocumentoFiscal,
    cab.ultimoVendedorItem,
    cab.quantidadeVolume,
    cab.quantidade,
    cab.pesoLiquido,
    cab.pesoBruto,
    cab.valorProdutosBruto,
    cab.valorProdutos,
    cab.valorDescontoProdutos,
    cab.valorAcrescimoProdutos,
    cab.valorServicosBruto,
    cab.valorServicos,
    cab.valorDescontoServicos,
    cab.valorAcrescimoServicos,
    cab.valorFreteItem,
    cab.valorSeguroItem,
    cab.valorAdicFreteMarinhaMerItem,
    cab.valorDespesasAduaneirasItem,
    cab.valorFreteGeral,
    cab.valorSeguroGeral,
    cab.valorDescontoGeral,
    cab.valorOutrasDespesasGeral,
    cab.valorAdicFreteMarinhaMerGeral,
    cab.valorDespesasAduaneirasGeral,
    cab.condicaoPagamento,
    cab.numeroParcelas,
    cab.somaPrazoParcelas,
    cab.valorXPrazoParcelas,
    cab.prazoMedio,
    cab.prazoMedioPonderado,
    cab.valorBasePagamento,
    cab.valorAVistaMinimo,
    cab.valorEntradaMinima,
    cab.valorAVistaEntrada,
    cab.valorPagamentoBruto,
    cab.valorDescontoPagamento,
    cab.valorOutrasDespesasPagamento,
    cab.valorJurosPagamento,
    cab.valorPagamentoLiquido,
    cab.valorTroco,
    cab.valorFreteTotal,
    cab.valorSeguroTotal,
    cab.valorDescontoTotal,
    cab.valorOutrasDespesasTotal,
    cab.valorAdicFreteMarinhaMerTotal,
    cab.valorDespesasAduaneirasTotal,
    cab.valorLiquidoItem,
    cab.valorDescontoCustoOpItem,
    cab.valorDescontoCustoOpGeral,
    cab.valorDescontoCustoOpTotal,
    cab.valorAcrescimoCustoOpItem,
    cab.valorAcrescimoCustoOpGeral,
    cab.valorAcrescimoCustoOpTotal,
    cab.valorCustoOperacao,
    cab.valorCMV,
    cab.quantidadeExtemporanea,
    cab.valorAcrescimoExtempSubtotal,
    cab.valorAcrescimoExtempItem,
    cab.valorAcrescimoExtempGeral,
    cab.valorAcrescimoExtempTotal,
    est.grupoFiscal,
    COALESCE (pessEst.regimeTributario, ' '),
    COALESCE ((
      SELECT MIN(munEst.uf)
      FROM CAENDERECOSPESSOA endEst
      JOIN SIMUNICIPIOS munEst
      ON munEst.municipio = endEst.municipio
      WHERE endEst.pessoa = est.pessoaEstabelecimento
      AND endEst.ativo = 1
      AND endEst.principal = 1), '  '),
    pess.indicadorInscricaoEstadual,
    COALESCE ((
      SELECT MIN(enderecoPessoa)
      FROM CAENDERECOSPESSOA endPess
      JOIN SIMUNICIPIOS munPess
      ON munPess.municipio = endPess.municipio
      WHERE endPess.pessoa = cab.pessoa
      AND endPess.ativo = 1
      AND endPess.principal = 1), 0),
    COALESCE ((
      SELECT MIN(munPess.uf)
      FROM CAENDERECOSPESSOA endPess
      JOIN SIMUNICIPIOS munPess
      ON munPess.municipio = endPess.municipio
      WHERE endPess.pessoa = cab.pessoa
      AND endPess.ativo = 1
      AND endPess.principal = 1), '  '),
    munEndEntr.uf
  INTO
    v_cab_origemDocumento,
    v_cab_tipoDocumento,
    v_cab_entradaSaida,
    v_cab_devolucaoAnulacaoRetorno,
    v_cab_finalidadeNota,
    v_cab_atualizaCustoMedio,
    v_cab_nfFornecedor,
    v_cab_documentoFiscal,
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_pessoa,
    v_cab_vendaConsumidor,
    v_cab_enderecoEntregaPessoa,
    v_cab_municipioFatoGerador,
    v_cab_localDestinoOperacao,
    v_cab_indicadorConsumidorFinal,
    v_cab_projeto,
    v_cab_modalidadeFrete,
    v_cab_tipoPagamentoFrete,
    v_cab_situacaoDocumentoFiscal,
    v_cab_ultimoVendedorItem,
    v_cab_quantidadeVolume,
    v_cab_quantidade,
    v_cab_pesoLiquido,
    v_cab_pesoBruto,
    v_cab_valorProdutosBruto,
    v_cab_valorProdutos,
    v_cab_valorDescontoProdutos,
    v_cab_valorAcrescimoProdutos,
    v_cab_valorServicosBruto,
    v_cab_valorServicos,
    v_cab_valorDescontoServicos,
    v_cab_valorAcrescimoServicos,
    v_cab_valorFreteItem,
    v_cab_valorSeguroItem,
    v_cab_valorAdicFreteMarItem,
    v_cab_valorDespesasAduanItem,
    v_cab_valorFreteGeral,
    v_cab_valorSeguroGeral,
    v_cab_valorDescontoGeral,
    v_cab_valorOutrasDespesasGeral,
    v_cab_valorAdicFreteMarGeral,
    v_cab_valorDespesasAduanGeral,
    v_cab_condicaoPagamento,
    v_cab_numeroParcelas,
    v_cab_somaPrazoParcelas,
    v_cab_valorXPrazoParcelas,
    v_cab_prazoMedio,
    v_cab_prazoMedioPonderado,
    v_cab_valorBasePagamento,
    v_cab_valorAVistaMinimo,
    v_cab_valorEntradaMinima,
    v_cab_valorAVistaEntrada,
    v_cab_valorPagamentoBruto,
    v_cab_valorDescontoPagamento,
    v_cab_valorOutrasDespPagamento,
    v_cab_valorJurosPagamento,
    v_cab_valorPagamentoLiquido,
    v_cab_valorTroco,
    v_cab_valorFreteTotal,
    v_cab_valorSeguroTotal,
    v_cab_valorDescontoTotal,
    v_cab_valorOutrasDespesasTotal,
    v_cab_valorAdicFreteMarTotal,
    v_cab_valorDespesasAduanTotal,
    v_cab_valorLiquidoItem,
    v_cab_valorDescontoCustoOpItem,
    v_cab_valorDescontoCustoOpGera,
    v_cab_valorDescontoCustoOpTota,
    v_cab_valorAcrescimoCustoOpIte,
    v_cab_valorAcrescimoCustoOpGer,
    v_cab_valorAcrescimoCustoOpTot,
    v_cab_valorCustoOperacao,
    v_cab_valorCMV,
    v_cab_quantidadeExtemporanea,
    v_cab_valorAcrescimoExtempSubt,
    v_cab_valorAcrescimoExtempItem,
    v_cab_valorAcrescimoExtempGera,
    v_cab_valorAcrescimoExtempTota,
    v_est_grupoFiscal,
    v_pessEst_regimeTributario,
    v_munEndEst_uf,
    v_pess_indicadorInscricaoEstad,
    v_endPess_enderecoPessoa,
    v_munEndPess_uf,
    v_munEndEntr_uf
  FROM MODOCUMENTOSFISCAIS cab
  JOIN PAESTABELECIMENTOS est
  ON est.estabelecimento = cab.estabelecimento
  JOIN CAPESSOAS pessEst
  ON pessEst.pessoa = est.pessoaEstabelecimento
  JOIN CAPESSOAS pess
  ON pess.pessoa = cab.pessoa
  JOIN CAENDERECOSPESSOA endEntr
  ON endEntr.enderecoPessoa = cab.enderecoEntregaPessoa
  JOIN SIMUNICIPIOS munEndEntr
  ON munEndEntr.municipio = endEntr.municipio
  WHERE cab.idDocumentoFiscal = p_item_idDocumentoFiscal;
  v_ini_cab_valorFreteItem := v_cab_valorFreteItem;
  v_ini_cab_valorFreteGeral := v_cab_valorFreteGeral;
  SELECT
    diminuiDescontoPrUnit,
    somaAcrescimosPrUnit,
    somaFreteSeguroPrUnit
  INTO
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit
  FROM PAMODELOSDOCUMENTO
  WHERE modeloDocumento = p_item_modeloDocumento;
  SELECT
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho,
    prod.controleEstoque,
    prod.tipoProduto,
    prod.origemMercadoria,
    prod.idNcm,
    prod.listaServicos,
    prod.precoPautaTabelado,
    CASE
      WHEN EXISTS (
        SELECT 1
        FROM CAPRODUTOXCOMPOSICOESPREC comp
        WHERE comp.produto = gradProd.produto
        AND comp.ativo = 1)
      THEN 1
      ELSE 0
    END
  INTO
    v_gradProd_produto,
    v_gradProd_cor,
    v_gradProd_tamanho,
    v_prod_controleEstoque,
    v_prod_tipoProduto,
    v_prod_origemMercadoria,
    v_prod_idNcm,
    v_prod_listaServicos,
    v_prod_precoPautaTabelado,
    v_prod_composicaoPreco
  FROM CAGRADESPRODUTO gradProd
  JOIN CAPRODUTOS prod
  ON prod.produto = gradProd.produto
  WHERE gradProd.gradeProduto = p_item_gradeProduto;
  v_inserindoItem                := 1;
  v_cab_promocaoExiste           := 0;
  v_item_cancelado               := 0;
  v_ini_gradeProduto             := 0;
  v_ini_personalizacao           := 0;
  v_ini_operacaoFiscal           := 0;
  v_ini_quantidade               := 0;
  v_ini_valorFreteTotal          := 0;
  v_ini_valorProdutoServicoBruto := 0;
  v_ini_valorProdutoServico      := 0;
  v_ini_valorDescontoItem        := 0;
  v_ini_valorAcrescimoItem       := 0;
  v_ini_valorBasePagamento       := 0;
  v_ini_valorFreteTotal          := 0;
  v_ini_valorSeguroTotal         := 0;
  v_ini_valorDescontoTotal       := 0;
  v_ini_valorOutrasDespesasTotal := 0;
  v_ini_valorAdicFreteMarTotal   := 0;
  v_ini_valorDespesasAduanTotal  := 0;
  v_item_quantidadeDevolvidaRet  := 0;
  v_item_precoUnitario           := p_item_precoUnitario;
  v_item_valorProdutoServicoBrut := ROUND (p_item_Quantidade * CASE WHEN v_modDoc_diminuiDescontoPrUnit = 1 OR v_modDoc_somaAcrescimosPrUnit = 1 OR v_modDoc_somaFreteSeguroPrUnit = 1 OR v_prod_composicaoPreco = 1 THEN p_item_precoUnitarioBruto ELSE p_item_precoUnitario END, 2);
  v_item_valorProdutoServico     := ROUND (p_item_Quantidade * p_item_precoUnitario, 2);
  v_item_valorDescontoGeral      := p_item_valorDescontoGeral;
  v_item_valorDescontoPagamento  := p_item_valorDescontoPagamento;
  v_item_valorOutrasDespPagament := p_item_valorOutrasDespPagament;
  v_item_valorJurosPagamento     := p_item_valorJurosPagamento;
  v_item_movimentaEstoque        := p_item_movimentaEstoque;
  v_item_movimentaEstoqueFiscal  := p_item_movimentaEstoqueFiscal;
  v_item_geraFinanceiro          := p_item_geraFinanceiro;
  v_item_cfop                    := p_item_cfop;
  v_item_indicadorISSQN          := p_item_indicadorISSQN;
  v_item_aliquotaISSQN           := p_item_aliquotaISSQN;
  v_item_retidoISSQN             := p_item_retidoISSQN;
  v_item_tributadoForaMunicipio  := p_item_tributadoForaMunicipio;
  v_item_incentivoFiscal         := p_item_incentivoFiscal;
  v_item_listaServicos           := p_item_listaServicos;
  v_item_cnae                    := p_item_cnae;
  v_item_idServicoMunicipio      := p_item_idServicoMunicipio;
  v_item_numeroProcessoAdministr := p_item_numeroProcessoAdministr;
  v_item_retencaoIRRF            := p_item_retencaoIRRF;
  v_item_retencaoINSS            := p_item_retencaoINSS;
  v_item_retencaoPIS             := p_item_retencaoPIS;
  v_item_retencaoCOFINS          := p_item_retencaoCOFINS;
  v_item_retencaoCSLL            := p_item_retencaoCSLL;
  v_item_retencaoOutros          := p_item_retencaoOutros;
  v_item_aliquotaII              := p_item_aliquotaII;
  v_item_aliquotaIOF             := p_item_aliquotaIOF;
  v_item_codigoEnquadramentoIPI  := p_item_codigoEnquadramentoIPI;
  v_item_stIPI                   := p_item_stIPI;
  v_item_aliquotaIPI             := p_item_aliquotaIPI;
  v_item_valorAliquotaIPI        := p_item_valorAliquotaIPI;
  v_item_stPIS                   := p_item_stPIS;
  v_item_aliquotaPIS             := p_item_aliquotaPIS;
  v_item_valorAliquotaPIS        := p_item_valorAliquotaPIS;
  v_item_aliquotaPISST           := p_item_aliquotaPISST;
  v_item_valorAliquotaPISST      := p_item_valorAliquotaPISST;
  v_item_stCOFINS                := p_item_stCOFINS;
  v_item_aliquotaCOFINS          := p_item_aliquotaCOFINS;
  v_item_valorAliquotaCOFINS     := p_item_valorAliquotaCOFINS;
  v_item_aliquotaCOFINSST        := p_item_aliquotaCOFINSST;
  v_item_valorAliquotaCOFINSST   := p_item_valorAliquotaCOFINSST;
  v_item_stSimplesNacional       := p_item_stSimplesNacional;
  v_item_creditoSimplesNacional  := p_item_creditoSimplesNacional;
  v_item_stICMS                  := p_item_stICMS;
  v_item_modalBaseCalcICMS       := p_item_modalBaseCalcICMS;
  v_item_reducaoBaseICMS         := p_item_reducaoBaseICMS;
  v_item_aliquotaICMS            := p_item_aliquotaICMS;
  v_item_diferimentoICMS         := p_item_diferimentoICMS;
  v_item_motivoDesoneracaoICMS   := p_item_motivoDesoneracaoICMS;
  v_item_idBeneficio             := p_item_idBeneficio;
  v_item_modalBaseCalcICMSST     := p_item_modalBaseCalcICMSST;
  v_item_margemValorAdicionadoST := p_item_margemValorAdicionadoST;
  v_item_reducaoBaseST           := p_item_reducaoBaseST;
  v_item_aliquotaICMSST          := p_item_aliquotaICMSST;
  v_item_aliquotaSTSuportConsFin := p_item_aliquotaSTSuportConsFin;
  v_item_reducaoBaseICMSEfetivo  := p_item_reducaoBaseICMSEfetivo;
  v_item_aliquotaICMSEfetivo     := p_item_aliquotaICMSEfetivo;
  v_item_stICMSEscrituracao      := p_item_stICMSEscrituracao;
  v_item_reducaoBaseICMSEscritur := p_item_reducaoBaseICMSEscritur;
  v_item_aliquotaICMSEscrituraca := p_item_aliquotaICMSEscrituraca;
  v_item_diferimentoICMSEscritur := p_item_diferimentoICMSEscritur;
  v_item_margemValorAdicSTEscrit := p_item_margemValorAdicSTEscrit;
  v_item_reducaoBaseSTEscriturac := p_item_reducaoBaseSTEscriturac;
  v_item_aliquotaICMSSTEscritura := p_item_aliquotaICMSSTEscritura;
  v_item_somarICMSST             := p_item_somarICMSST;
  v_item_aliquotaICMSUFDestinat  := p_item_aliquotaICMSUFDestinat;
  v_item_aliquotaICMSInterestad  := p_item_aliquotaICMSInterestad;
  v_item_partilhaICMSInterestad  := p_item_partilhaICMSInterestad;
  v_item_aliquotaFCP             := p_item_aliquotaFCP;
  v_item_aliquotaFCPST           := p_item_aliquotaFCPST;
  v_item_aliquotaFCPSTAnteriorm  := p_item_aliquotaFCPSTAnteriorm;
  v_item_aliquotaFCPUFDestinat   := p_item_aliquotaFCPUFDestinat;
  v_item_aliquotaEstImpFederais  := p_item_aliquotaEstImpFederais;
  v_item_aliquotaEstImpEstaduais := p_item_aliquotaEstImpEstaduais;
  v_item_aliquotaEstImpMunicipai := p_item_aliquotaEstImpMunicipai;
  v_item_baseISSQN               := p_item_baseISSQN;
  v_item_valorISSQN              := p_item_valorISSQN;
  v_item_baseRetIRRF             := p_item_baseRetIRRF;
  v_item_valorRetIRRF            := p_item_valorRetIRRF;
  v_item_baseRetINSS             := p_item_baseRetINSS;
  v_item_valorRetINSS            := p_item_valorRetINSS;
  v_item_baseRetPIS              := p_item_baseRetPIS;
  v_item_valorRetPIS             := p_item_valorRetPIS;
  v_item_baseRetCOFINS           := p_item_baseRetCOFINS;
  v_item_valorRetCOFINS          := p_item_valorRetCOFINS;
  v_item_baseRetCSLL             := p_item_baseRetCSLL;
  v_item_valorRetCSLL            := p_item_valorRetCSLL;
  v_item_baseRetOutros           := p_item_baseRetOutros;
  v_item_valorRetOutros          := p_item_valorRetOutros;
  v_item_baseII                  := p_item_baseII;
  v_item_valorII                 := p_item_valorII;
  v_item_baseIOF                 := p_item_baseIOF;
  v_item_valorIOF                := p_item_valorIOF;
  v_item_baseIPI                 := p_item_baseIPI;
  v_item_valorIPI                := p_item_valorIPI;
  v_item_basePIS                 := p_item_basePIS;
  v_item_valorPIS                := p_item_valorPIS;
  v_item_basePISST               := p_item_basePISST;
  v_item_valorPISST              := p_item_valorPISST;
  v_item_baseCOFINS              := p_item_baseCOFINS;
  v_item_valorCOFINS             := p_item_valorCOFINS;
  v_item_baseCOFINSST            := p_item_baseCOFINSST;
  v_item_valorCOFINSST           := p_item_valorCOFINSST;
  v_item_baseCreditoSimplesNac   := p_item_baseCreditoSimplesNac;
  v_item_valorCreditoSimplesNac  := p_item_valorCreditoSimplesNac;
  v_item_baseICMS                := p_item_baseICMS;
  v_item_valorICMSOperacao       := p_item_valorICMSOperacao;
  v_item_valorICMSDiferido       := p_item_valorICMSDiferido;
  v_item_valorICMS               := p_item_valorICMS;
  v_item_valorICMSDesoneracao    := p_item_valorICMSDesoneracao;
  v_item_baseICMSST              := p_item_baseICMSST;
  v_item_valorICMSST             := p_item_valorICMSST;
  v_item_baseICMSSTAnteriormente := p_item_baseICMSSTAnteriormente;
  v_item_valorICMSSTAnteriorment := p_item_valorICMSSTAnteriorment;
  v_item_valorICMSProprioSubstit := p_item_valorICMSProprioSubstit;
  v_item_baseICMSEfetivo         := p_item_baseICMSEfetivo;
  v_item_valorICMSEfetivo        := p_item_valorICMSEfetivo;
  v_item_baseICMSEscrituracao    := p_item_baseICMSEscrituracao;
  v_item_valorICMSEscrituracao   := p_item_valorICMSEscrituracao;
  v_item_valorICMSDesonEscritura := p_item_valorICMSDesonEscritura;
  v_item_baseICMSSTEscrituracao  := p_item_baseICMSSTEscrituracao;
  v_item_valorICMSSTEscrituracao := p_item_valorICMSSTEscrituracao;
  v_item_baseICMSUFDestinatario  := p_item_baseICMSUFDestinatario;
  v_item_valorICMSUFDestinatario := p_item_valorICMSUFDestinatario;
  v_item_baseICMSUFRemetente     := p_item_baseICMSUFRemetente;
  v_item_valorICMSUFRemetente    := p_item_valorICMSUFRemetente;
  v_item_baseFCP                 := p_item_baseFCP;
  v_item_valorFCP                := p_item_valorFCP;
  v_item_baseFCPST               := p_item_baseFCPST;
  v_item_valorFCPST              := p_item_valorFCPST;
  v_item_baseFCPSTAnteriormente  := p_item_baseFCPSTAnteriormente;
  v_item_valorFCPSTAnteriormente := p_item_valorFCPSTAnteriormente;
  v_item_baseFCPUFDestinatario   := p_item_baseFCPUFDestinatario;
  v_item_valorFCPUFDestinatario  := p_item_valorFCPUFDestinatario;
  v_item_baseEstimadaImpostos    := p_item_baseEstimadaImpostos;
  v_item_valorEstImpFederais     := p_item_valorEstImpFederais;
  v_item_valorEstImpEstaduais    := p_item_valorEstImpEstaduais;
  v_item_valorEstImpMunicipais   := p_item_valorEstImpMunicipais;
  IF p_manterFinanceiro_Retotalizar = 0 THEN
    SELECT COALESCE (MAX(1), 0)
    INTO v_cab_promocaoExiste
    FROM MODOCFISCALXPROMOCOES
    WHERE idDocumentoFiscal = p_item_idDocumentoFiscal;
  END IF;
  IF p_item_idItemDocFiscal > 0 THEN
    FOR a IN (
      SELECT
        a.sequencia,
        a.cancelado,
        a.gradeProduto,
        a.personalizacao,
        a.usarPrecoAVista,
        a.controleQuantidade,
        a.loteMultiplo,
        a.quantidade,
        a.quantidadeConvertida,
        a.quantidadeDevolvidaRetornada,
        a.pesoLiquido,
        a.pesoBruto,
        a.valorProdutoServicoBruto,
        a.valorProdutoServico,
        a.valorDescontoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.quantidadeExtemporanea,
        a.valorAcrescimoExtempSubtotal,
        a.valorAcrescimoExtempItem,
        a.valorDescontoCustoOpItem,
        a.valorAcrescimoCustoOpItem,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorAcrescimoExtempGeral,
        a.valorDescontoCustoOpGeral,
        a.valorAcrescimoCustoOpGeral,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.valorFreteTotal,
        a.valorSeguroTotal,
        a.valorDescontoTotal,
        a.valorOutrasDespesasTotal,
        a.valorAdicFreteMarinhaMerTotal,
        a.valorDespesasAduaneirasTotal,
        a.valorAcrescimoExtempTotal,
        a.valorDescontoCustoOpTotal,
        a.valorAcrescimoCustoOpTotal,
        a.operacaoFiscal,
        a.movimentaEstoque,
        a.movimentaEstoqueFiscal,
        a.geraFinanceiro,
        a.cfop,
        a.indicadorISSQN,
        a.aliquotaISSQN,
        a.retidoISSQN,
        a.tributadoForaMunicipio,
        a.incentivoFiscal,
        a.listaServicos,
        a.cnae,
        a.idServicoMunicipio,
        a.numeroProcessoAdministrativo,
        a.retencaoIRRF,
        a.retencaoINSS,
        a.retencaoPIS,
        a.retencaoCOFINS,
        a.retencaoCSLL,
        a.retencaoOutros,
        a.aliquotaII,
        a.aliquotaIOF,
        a.codigoEnquadramentoIPI,
        a.stIPI,
        a.aliquotaIPI,
        a.valorAliquotaIPI,
        a.stPIS,
        a.aliquotaPIS,
        a.valorAliquotaPIS,
        a.aliquotaPISST,
        a.valorAliquotaPISST,
        a.stCOFINS,
        a.aliquotaCOFINS,
        a.valorAliquotaCOFINS,
        a.aliquotaCOFINSST,
        a.valorAliquotaCOFINSST,
        a.stSimplesNacional,
        a.creditoSimplesNacional,
        a.stICMS,
        a.modalidadeBaseCalcICMS,
        a.reducaoBaseICMS,
        a.aliquotaICMS,
        a.diferimentoICMS,
        a.motivoDesoneracaoICMS,
        a.idBeneficio,
        a.modalidadeBaseCalcICMSST,
        a.margemValorAdicionadoST,
        a.reducaoBaseST,
        a.aliquotaICMSST,
        a.aliquotaSTSuportConsFinal,
        a.reducaoBaseICMSEfetivo,
        a.aliquotaICMSEfetivo,
        a.stICMSEscrituracao,
        a.reducaoBaseICMSEscrituracao,
        a.aliquotaICMSEscrituracao,
        a.diferimentoICMSEscrituracao,
        a.margemValorAdicSTEscrituracao,
        a.reducaoBaseSTEscrituracao,
        a.aliquotaICMSSTEscrituracao,
        a.somarICMSST,
        a.aliquotaICMSUFDestinatario,
        a.aliquotaICMSInterestadual,
        a.partilhaICMSInterestadual,
        a.aliquotaFCP,
        a.aliquotaFCPST,
        a.aliquotaFCPSTAnteriormente,
        a.aliquotaFCPUFDestinatario,
        a.aliquotaEstimadaImpFederais,
        a.aliquotaEstimadaImpEstaduais,
        a.aliquotaEstimadaImpMunicipais,
        a.baseISSQN,
        a.valorISSQN,
        a.baseRetIRRF,
        a.valorRetIRRF,
        a.baseRetINSS,
        a.valorRetINSS,
        a.baseRetPIS,
        a.valorRetPIS,
        a.baseRetCOFINS,
        a.valorRetCOFINS,
        a.baseRetCSLL,
        a.valorRetCSLL,
        a.baseRetOutros,
        a.valorRetOutros,
        a.baseII,
        a.valorII,
        a.baseIOF,
        a.valorIOF,
        a.baseIPI,
        a.valorIPI,
        a.basePIS,
        a.valorPIS,
        a.basePISST,
        a.valorPISST,
        a.baseCOFINS,
        a.valorCOFINS,
        a.baseCOFINSST,
        a.valorCOFINSST,
        a.baseCreditoSimplesNacional,
        a.valorCreditoSimplesNacional,
        a.baseICMS,
        a.valorICMSOperacao,
        a.valorICMSDiferido,
        a.valorICMS,
        a.valorICMSDesoneracao,
        a.baseICMSST,
        a.valorICMSST,
        a.baseICMSSTAnteriormente,
        a.valorICMSSTAnteriormente,
        a.valorICMSProprioSubstituto,
        a.baseICMSEfetivo,
        a.valorICMSEfetivo,
        a.baseICMSEscrituracao,
        a.valorICMSEscrituracao,
        a.valorICMSDesonEscrituracao,
        a.baseICMSSTEscrituracao,
        a.valorICMSSTEscrituracao,
        a.baseICMSUFDestinatario,
        a.valorICMSUFDestinatario,
        a.baseICMSUFRemetente,
        a.valorICMSUFRemetente,
        a.baseFCP,
        a.valorFCP,
        a.baseFCPST,
        a.valorFCPST,
        a.baseFCPSTAnteriormente,
        a.valorFCPSTAnteriormente,
        a.baseFCPUFDestinatario,
        a.valorFCPUFDestinatario,
        a.baseEstimadaImpostos,
        a.valorEstimadoImpFederais,
        a.valorEstimadoImpEstaduais,
        a.valorEstimadoImpMunicipais,
        a.valorBasePagamento,
        a.valorLiquidoItem,
        a.valorCustoOperacao,
        a.valorCMV,
        prod.tipoProduto
      FROM MODOCFISCALXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      WHERE a.idItemDocFiscal = p_item_idItemDocFiscal)
    LOOP
      v_inserindoItem := 0;
      v_item_sequencia := a.sequencia;
      v_item_cancelado := a.cancelado;
      v_ini_gradeProduto := a.gradeProduto;
      v_ini_personalizacao := a.personalizacao;
      v_ini_operacaoFiscal := a.operacaoFiscal;
      v_ini_quantidade := a.quantidade;
      v_ini_valorProdutoServicoBruto := a.valorProdutoServicoBruto;
      v_ini_valorProdutoServico := a.valorProdutoServico;
      v_ini_valorDescontoItem := a.valorDescontoItem;
      v_ini_valorAcrescimoItem := a.valorAcrescimoItem;
      v_ini_valorBasePagamento := a.valorBasePagamento;
      v_ini_valorFreteTotal := a.valorFreteTotal;
      v_ini_valorSeguroTotal := a.valorSeguroTotal;
      v_ini_valorDescontoTotal := a.valorDescontoTotal;
      v_ini_valorOutrasDespesasTotal := a.valorOutrasDespesasTotal;
      v_ini_valorAdicFreteMarTotal := a.valorAdicFreteMarinhaMerTotal;
      v_ini_valorDespesasAduanTotal := a.valorDespesasAduaneirasTotal;
      v_item_quantidadeDevolvidaRet := a.quantidadeDevolvidaRetornada;
      IF p_buscarAliquotas_CalcularImp ='T'
      THEN
        v_item_movimentaEstoque        := a.movimentaEstoque;
        v_item_movimentaEstoqueFiscal  := a.movimentaEstoqueFiscal;
        v_item_geraFinanceiro          := a.geraFinanceiro;
        v_item_cfop                    := a.cfop;
        v_item_indicadorISSQN          := a.indicadorISSQN;
        v_item_aliquotaISSQN           := a.aliquotaISSQN;
        v_item_retidoISSQN             := a.retidoISSQN;
        v_item_tributadoForaMunicipio  := a.tributadoForaMunicipio;
        v_item_incentivoFiscal         := a.incentivoFiscal;
        v_item_listaServicos           := a.listaServicos;
        v_item_cnae                    := a.cnae;
        v_item_idServicoMunicipio      := a.idServicoMunicipio;
        v_item_numeroProcessoAdministr := a.numeroProcessoAdministrativo;
        v_item_retencaoIRRF            := a.retencaoIRRF;
        v_item_retencaoINSS            := a.retencaoINSS;
        v_item_retencaoPIS             := a.retencaoPIS;
        v_item_retencaoCOFINS          := a.retencaoCOFINS;
        v_item_retencaoCSLL            := a.retencaoCSLL;
        v_item_retencaoOutros          := a.retencaoOutros;
        v_item_aliquotaII              := a.aliquotaII;
        v_item_aliquotaIOF             := a.aliquotaIOF;
        v_item_codigoEnquadramentoIPI  := a.codigoEnquadramentoIPI;
        v_item_stIPI                   := a.stIPI;
        v_item_aliquotaIPI             := a.aliquotaIPI;
        v_item_valorAliquotaIPI        := a.valorAliquotaIPI;
        v_item_stPIS                   := a.stPIS;
        v_item_aliquotaPIS             := a.aliquotaPIS;
        v_item_valorAliquotaPIS        := a.valorAliquotaPIS;
        v_item_aliquotaPISST           := a.aliquotaPISST;
        v_item_valorAliquotaPISST      := a.valorAliquotaPISST;
        v_item_stCOFINS                := a.stCOFINS;
        v_item_aliquotaCOFINS          := a.aliquotaCOFINS;
        v_item_valorAliquotaCOFINS     := a.valorAliquotaCOFINS;
        v_item_aliquotaCOFINSST        := a.aliquotaCOFINSST;
        v_item_valorAliquotaCOFINSST   := a.valorAliquotaCOFINSST;
        v_item_stSimplesNacional       := a.stSimplesNacional;
        v_item_creditoSimplesNacional  := a.creditoSimplesNacional;
        v_item_stICMS                  := a.stICMS;
        v_item_modalBaseCalcICMS       := a.modalidadeBaseCalcICMS;
        v_item_reducaoBaseICMS         := a.reducaoBaseICMS;
        v_item_aliquotaICMS            := a.aliquotaICMS;
        v_item_diferimentoICMS         := a.diferimentoICMS;
        v_item_motivoDesoneracaoICMS   := a.motivoDesoneracaoICMS;
        v_item_idBeneficio             := a.idBeneficio;
        v_item_modalBaseCalcICMSST     := a.modalidadeBaseCalcICMSST;
        v_item_margemValorAdicionadoST := a.margemValorAdicionadoST;
        v_item_reducaoBaseST           := a.reducaoBaseST;
        v_item_aliquotaICMSST          := a.aliquotaICMSST;
        v_item_aliquotaSTSuportConsFin := a.aliquotaSTSuportConsFinal;
        v_item_reducaoBaseICMSEfetivo  := a.reducaoBaseICMSEfetivo;
        v_item_aliquotaICMSEfetivo     := a.aliquotaICMSEfetivo;
        v_item_stICMSEscrituracao      := a.stICMSEscrituracao;
        v_item_reducaoBaseICMSEscritur := a.reducaoBaseICMSEscrituracao;
        v_item_aliquotaICMSEscrituraca := a.aliquotaICMSEscrituracao;
        v_item_diferimentoICMSEscritur := a.diferimentoICMSEscrituracao;
        v_item_margemValorAdicSTEscrit := a.margemValorAdicSTEscrituracao;
        v_item_reducaoBaseSTEscriturac := a.reducaoBaseSTEscrituracao;
        v_item_aliquotaICMSSTEscritura := a.aliquotaICMSSTEscrituracao;
        v_item_somarICMSST             := a.somarICMSST;
        v_item_aliquotaICMSUFDestinat  := a.aliquotaICMSUFDestinatario;
        v_item_aliquotaICMSInterestad  := a.aliquotaICMSInterestadual;
        v_item_partilhaICMSInterestad  := a.partilhaICMSInterestadual;
        v_item_aliquotaFCP             := a.aliquotaFCP;
        v_item_aliquotaFCPST           := a.aliquotaFCPST;
        v_item_aliquotaFCPSTAnteriorm  := a.aliquotaFCPSTAnteriormente;
        v_item_aliquotaFCPUFDestinat   := a.aliquotaFCPUFDestinatario;
        v_item_aliquotaEstImpFederais  := a.aliquotaEstimadaImpFederais;
        v_item_aliquotaEstImpEstaduais := a.aliquotaEstimadaImpEstaduais;
        v_item_aliquotaEstImpMunicipai := a.aliquotaEstimadaImpMunicipais;
        v_item_baseISSQN               := a.baseISSQN;
        v_item_valorISSQN              := a.valorISSQN;
        v_item_baseRetIRRF             := a.baseRetIRRF;
        v_item_valorRetIRRF            := a.valorRetIRRF;
        v_item_baseRetINSS             := a.baseRetINSS;
        v_item_valorRetINSS            := a.valorRetINSS;
        v_item_baseRetPIS              := a.baseRetPIS;
        v_item_valorRetPIS             := a.valorRetPIS;
        v_item_baseRetCOFINS           := a.baseRetCOFINS;
        v_item_valorRetCOFINS          := a.valorRetCOFINS;
        v_item_baseRetCSLL             := a.baseRetCSLL;
        v_item_valorRetCSLL            := a.valorRetCSLL;
        v_item_baseRetOutros           := a.baseRetOutros;
        v_item_valorRetOutros          := a.valorRetOutros;
        v_item_baseII                  := a.baseII;
        v_item_valorII                 := a.valorII;
        v_item_baseIOF                 := a.baseIOF;
        v_item_valorIOF                := a.valorIOF;
        v_item_baseIPI                 := a.baseIPI;
        v_item_valorIPI                := a.valorIPI;
        v_item_basePIS                 := a.basePIS;
        v_item_valorPIS                := a.valorPIS;
        v_item_basePISST               := a.basePISST;
        v_item_valorPISST              := a.valorPISST;
        v_item_baseCOFINS              := a.baseCOFINS;
        v_item_valorCOFINS             := a.valorCOFINS;
        v_item_baseCOFINSST            := a.baseCOFINSST;
        v_item_valorCOFINSST           := a.valorCOFINSST;
        v_item_baseCreditoSimplesNac   := a.baseCreditoSimplesNacional;
        v_item_valorCreditoSimplesNac  := a.valorCreditoSimplesNacional;
        v_item_baseICMS                := a.baseICMS;
        v_item_valorICMSOperacao       := a.valorICMSOperacao;
        v_item_valorICMSDiferido       := a.valorICMSDiferido;
        v_item_valorICMS               := a.valorICMS;
        v_item_valorICMSDesoneracao    := a.valorICMSDesoneracao;
        v_item_baseICMSST              := a.baseICMSST;
        v_item_valorICMSST             := a.valorICMSST;
        v_item_baseICMSSTAnteriormente := a.baseICMSSTAnteriormente;
        v_item_valorICMSSTAnteriorment := a.valorICMSSTAnteriormente;
        v_item_valorICMSProprioSubstit := a.valorICMSProprioSubstituto;
        v_item_baseICMSEfetivo         := a.baseICMSEfetivo;
        v_item_valorICMSEfetivo        := a.valorICMSEfetivo;
        v_item_baseICMSEscrituracao    := a.baseICMSEscrituracao;
        v_item_valorICMSEscrituracao   := a.valorICMSEscrituracao;
        v_item_valorICMSDesonEscritura := a.valorICMSDesonEscrituracao;
        v_item_baseICMSSTEscrituracao  := a.baseICMSSTEscrituracao;
        v_item_valorICMSSTEscrituracao := a.valorICMSSTEscrituracao;
        v_item_baseICMSUFDestinatario  := a.baseICMSUFDestinatario;
        v_item_valorICMSUFDestinatario := a.valorICMSUFDestinatario;
        v_item_baseICMSUFRemetente     := a.baseICMSUFRemetente;
        v_item_valorICMSUFRemetente    := a.valorICMSUFRemetente;
        v_item_baseFCP                 := a.baseFCP;
        v_item_valorFCP                := a.valorFCP;
        v_item_baseFCPST               := a.baseFCPST;
        v_item_valorFCPST              := a.valorFCPST;
        v_item_baseFCPSTAnteriormente  := a.baseFCPSTAnteriormente;
        v_item_valorFCPSTAnteriormente := a.valorFCPSTAnteriormente;
        v_item_baseFCPUFDestinatario   := a.baseFCPUFDestinatario;
        v_item_valorFCPUFDestinatario  := a.valorFCPUFDestinatario;
        v_item_baseEstimadaImpostos    := a.baseEstimadaImpostos;
        v_item_valorEstImpFederais     := a.valorEstimadoImpFederais;
        v_item_valorEstImpEstaduais    := a.valorEstimadoImpEstaduais;
        v_item_valorEstImpMunicipais   := a.valorEstimadoImpMunicipais;
      END IF;
      IF p_manterFinanceiro_Retotalizar = 0
        AND (v_cab_valorFreteGeral <> 0
          OR v_cab_valorSeguroGeral <> 0
          OR v_cab_valorDescontoGeral <> 0
          OR v_cab_valorOutrasDespesasGeral <> 0
          OR v_cab_valorAdicFreteMarGeral <> 0
          OR v_cab_valorDespesasAduanGeral <> 0)
        AND (a.valorProdutoServicoBruto <> v_item_valorProdutoServicoBrut
          OR a.valorProdutoServico <> v_item_valorProdutoServico
          OR a.valorDescontoItem <> p_item_valorDescontoItem
          OR a.valorAcrescimoItem <> p_item_valorAcrescimoItem)
        OR a.valorFreteGeral <> p_item_valorFreteGeral
        OR a.valorSeguroGeral <> p_item_valorSeguroGeral
        OR a.valorDescontoGeral <> v_item_valorDescontoGeral
        OR a.valorOutrasDespesasGeral <> p_item_valorOutrasDespesasGer
        OR a.valorAdicFreteMarinhaMerGeral <> p_item_valorAdicFreteMarGeral
        OR a.valorDespesasAduaneirasGeral <> p_item_valorDespesasAduanGeral
      THEN
        r_calcularImpostos := 1;
      END IF;
      IF p_manterFinanceiro_Retotalizar < 2
        AND a.cancelado = 0
      THEN
        IF p_config_378_calcularVolumes = 1 THEN
          v_cab_quantidadeVolume := v_cab_quantidadeVolume - TRUNC(CASE WHEN a.controleQuantidade = 1 AND a.loteMultiplo <> 0 THEN a.quantidade / a.loteMultiplo ELSE a.quantidadeConvertida END,0);
        END IF;
        v_cab_quantidade := v_cab_quantidade - a.quantidadeConvertida;
        v_cab_pesoLiquido := v_cab_pesoLiquido - a.pesoLiquido;
        v_cab_pesoBruto := v_cab_pesoBruto - a.pesoBruto;
        IF a.tipoProduto = '09' THEN
          v_cab_valorServicosBruto := v_cab_valorServicosBruto - a.valorProdutoServicoBruto;
          v_cab_valorServicos := v_cab_valorServicos - a.valorProdutoServico;
          v_cab_valorDescontoServicos := v_cab_valorDescontoServicos - a.valorDescontoItem;
          v_cab_valorAcrescimoServicos := v_cab_valorAcrescimoServicos - a.valorAcrescimoItem;
        ELSE 
          v_cab_valorProdutosBruto := v_cab_valorProdutosBruto - a.valorProdutoServicoBruto;
          v_cab_valorProdutos := v_cab_valorProdutos - a.valorProdutoServico;
          v_cab_valorDescontoProdutos := v_cab_valorDescontoProdutos - a.valorDescontoItem;
          v_cab_valorAcrescimoProdutos := v_cab_valorAcrescimoProdutos - a.valorAcrescimoItem;
        END IF;
        v_cab_valorFreteItem := v_cab_valorFreteItem - a.valorFreteItem;
        v_cab_valorSeguroItem := v_cab_valorSeguroItem - a.valorSeguroItem;
        v_cab_valorAdicFreteMarItem := v_cab_valorAdicFreteMarItem - a.valorAdicFreteMarinhaMerItem;
        v_cab_valorDespesasAduanItem := v_cab_valorDespesasAduanItem - a.valorDespesasAduaneirasItem;
        v_cab_valorFreteGeral := v_cab_valorFreteGeral - a.valorFreteGeral;
        v_cab_valorSeguroGeral := v_cab_valorSeguroGeral - a.valorSeguroGeral;
        v_cab_valorDescontoGeral := v_cab_valorDescontoGeral - a.valorDescontoGeral;
        v_cab_valorOutrasDespesasGeral := v_cab_valorOutrasDespesasGeral - a.valorOutrasDespesasGeral;
        v_cab_valorAdicFreteMarGeral := v_cab_valorAdicFreteMarGeral - a.valorAdicFreteMarinhaMerGeral;
        v_cab_valorDespesasAduanGeral := v_cab_valorDespesasAduanGeral - a.valorDespesasAduaneirasGeral;
        v_cab_valorBasePagamento := v_cab_valorBasePagamento - a.valorBasePagamento;
        IF a.usarPrecoAVista = 1
          AND a.geraFinanceiro = 1
        THEN
          v_cab_valorAVistaMinimo := v_cab_valorAVistaMinimo - a.valorProdutoServico + a.valorDescontoTotal - a.valorOutrasDespesasTotal;
        END IF;
        v_cab_valorDescontoPagamento := v_cab_valorDescontoPagamento - a.valorDescontoPagamento;
        v_cab_valorOutrasDespPagamento := v_cab_valorOutrasDespPagamento - a.valorOutrasDespesasPagamento;
        v_cab_valorJurosPagamento := v_cab_valorJurosPagamento - a.valorJurosPagamento;
        v_cab_valorFreteTotal := v_cab_valorFreteTotal - a.valorFreteTotal;
        v_cab_valorSeguroTotal := v_cab_valorSeguroTotal - a.valorSeguroTotal;
        v_cab_valorDescontoTotal := v_cab_valorDescontoTotal - a.valorDescontoTotal;
        v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal - a.valorOutrasDespesasTotal;
        v_cab_valorAdicFreteMarTotal := v_cab_valorAdicFreteMarTotal - a.valorAdicFreteMarinhaMerTotal;
        v_cab_valorDespesasAduanTotal := v_cab_valorDespesasAduanTotal - a.valorDespesasAduaneirasTotal;
        v_cab_valorLiquidoItem := v_cab_valorLiquidoItem - a.valorLiquidoItem;
        v_cab_valorDescontoCustoOpItem := v_cab_valorDescontoCustoOpItem - a.valorDescontoCustoOpItem;
        v_cab_valorDescontoCustoOpGera := v_cab_valorDescontoCustoOpGera - a.valorDescontoCustoOpGeral;
        v_cab_valorDescontoCustoOpTota := v_cab_valorDescontoCustoOpTota - a.valorDescontoCustoOpTotal;
        v_cab_valorAcrescimoCustoOpIte := v_cab_valorAcrescimoCustoOpIte - a.valorAcrescimoCustoOpItem;
        v_cab_valorAcrescimoCustoOpGer := v_cab_valorAcrescimoCustoOpGer - a.valorAcrescimoCustoOpGeral;
        v_cab_valorAcrescimoCustoOpTot := v_cab_valorAcrescimoCustoOpTot - a.valorAcrescimoCustoOpTotal;
        v_cab_valorCustoOperacao := v_cab_valorCustoOperacao - a.valorCustoOperacao;
        v_cab_valorCMV := v_cab_valorCMV - a.valorCMV;
        v_cab_quantidadeExtemporanea := v_cab_quantidadeExtemporanea - a.quantidadeExtemporanea;
        v_cab_valorAcrescimoExtempSubt := v_cab_valorAcrescimoExtempSubt - a.valorAcrescimoExtempSubtotal;
        v_cab_valorAcrescimoExtempItem := v_cab_valorAcrescimoExtempItem - a.valorAcrescimoExtempItem;
        v_cab_valorAcrescimoExtempGera := v_cab_valorAcrescimoExtempGera - a.valorAcrescimoExtempGeral;
        v_cab_valorAcrescimoExtempTota := v_cab_valorAcrescimoExtempTota - a.valorAcrescimoExtempTotal;
      END IF;
    END LOOP;
  END IF;
  ADD_CALCULA_TOTAIS_ITEM (
    v_cab_tipoPagamentoFrete,
    p_item_quantidade,
    p_item_quantidadeConvertida,
    p_item_precoUnitarioBruto,
    p_item_acrescimoUnitarioCompos,
    v_item_precoUnitario,
    p_item_valorDescontoItem,
    p_item_valorAcrescimoItem,
    p_item_valorFreteItem,
    p_item_valorSeguroItem,
    p_item_valorAdicFreteMarItem,
    p_item_valorDespesasAduanItem,
    p_item_valorFreteGeral,
    p_item_valorSeguroGeral,
    v_item_valorDescontoGeral,
    p_item_valorOutrasDespesasGer,
    p_item_valorAdicFreteMarGeral,
    p_item_valorDespesasAduanGeral,
    v_item_valorDescontoPagamento,
    v_item_valorOutrasDespPagament,
    v_item_valorJurosPagamento,
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit,
    v_prod_composicaoPreco,
    v_item_precoUnitario,
    v_item_precoUnitarioConvertido,
    v_item_valorProdutoServico,
    v_item_valorFreteTotal,
    v_item_valorSeguroTotal,
    v_item_valorDescontoTotal,
    v_item_valorOutrasDespesasTot,
    v_item_valorAdicFreteMarTotal,
    v_item_valorDespesasAduanTotal);
  v_item_valorAcrescimoExtempSub := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
    p_item_quantidade,
    v_item_precoUnitario,
    p_item_quantidadeExtemporanea,
    p_item_acrescimoUnitarioExtemp);
  v_item_valorAcrescimoExtempTot := FUNC_ADD_CALC_EXTEMP_TOTAL(
    v_item_valorAcrescimoExtempSub,
    p_item_valorAcrescimoExtempIte,
    p_item_valorAcrescimoExtempGer);
  IF v_inserindoItem = 1
    AND v_prod_controleEstoque = 3
  THEN
    FOR a IN (
      SELECT
        kit.gradeProdutoFilho,
        ROUND (p_item_quantidade * kit.quantidade, unMed.casasDecimaisUnidadeMedida) quantidade,
        gradProd.produto,
        gradProd.cor,
        gradProd.tamanho,
        prod.controleEstoque,
        prod.unidadeMedida,
        prod.controleQuantidadeVenda,
        prod.unidadeMedidaVenda,
        prod.conversorQuantidadeVenda,
        prod.loteMinimoVenda,
        prod.loteMultiploVenda,
        prod.pesoLiquido,
        prod.pesoBruto,
        prod.altura,
        prod.largura,
        prod.comprimento,
        prod.tipoProduto,
        prod.origemMercadoria,
        prod.idNcm,
        prod.listaServicos,
        unMed.casasDecimaisUnidadeMedida,
        locEst.indicadorPropriedadePosseItem
      FROM CAGRADEPRODUTOXKITSCOMBOS kit
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = kit.gradeProdutoFilho
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN SIUNIDADESMEDIDA unMed
      ON unMed.unidadeMedida = prod.unidadeMedida
      JOIN PALOCAISESTOQUE locEst
      ON locEst.localEstoque = p_item_localEstoque
      WHERE kit.gradeProduto = p_item_gradeProduto
      AND kit.ativo = 1
      AND kit.gradeProduto <> kit.gradeProdutoFilho
      AND kit.quantidade > 0
      AND ROUND (p_item_quantidade * kit.quantidade, unMed.casasDecimaisUnidadeMedida) > 0)
    LOOP
      v_combo_operacaoFiscal := FUNC_ADD_BUSCA_OPERACAO_FISCAL (
        p_item_modeloDocumento,
        v_cab_entradaSaida,
        v_cab_pessoa,
        v_cab_vendaConsumidor,
        v_cab_indicadorConsumidorFinal,
        v_est_grupoFiscal,
        v_pessEst_regimeTributario,
        v_munEndEst_uf,
        v_pess_indicadorInscricaoEstad,
        v_munEndPess_uf,
        a.produto);
      IF v_cab_entradaSaida = CASE WHEN v_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END
      THEN
        ADD_ITEM_PROD_REGRA_FORN_BUSCA (
          v_cab_pessoa,
          a.produto,
          a.unidadeMedida,
          a.casasDecimaisUnidadeMedida,
          /* Retornos */
          v_auxNumber,
          v_combo_controleQuantidade,
          v_combo_unidadeMedidaConversao,
          v_combo_conversorQuantidade,
          v_combo_loteMinimo,
          v_combo_loteMultiplo);
        IF v_auxNumber = 0
          AND v_cab_pessoa <> 0
        THEN
          ADD_ITEM_PROD_REGRA_FORN_BUSCA (
            0,
            a.produto,
            a.unidadeMedida,
            a.casasDecimaisUnidadeMedida,
            /* Retornos */
            v_auxNumber,
            v_combo_controleQuantidade,
            v_combo_unidadeMedidaConversao,
            v_combo_conversorQuantidade,
            v_combo_loteMinimo,
            v_combo_loteMultiplo);
        END IF;
        IF v_auxNumber = 0 THEN
          v_combo_controleQuantidade      := 1;
          v_combo_unidadeMedidaConversao  := a.unidadeMedida;
          v_combo_conversorQuantidade     := 1;
          v_combo_loteMinimo              := 0;
          v_combo_loteMultiplo            := 0;
        END IF;
      ELSE
        v_combo_controleQuantidade      := CASE WHEN a.controleQuantidadeVenda < 1 THEN 1 ELSE a.controleQuantidadeVenda END;
        v_combo_unidadeMedidaConversao  :=
          CASE
            WHEN a.controleQuantidadeVenda IN (2,3) 
            THEN 'PC'
            WHEN a.controleQuantidadeVenda IN (4,5) AND a.unidadeMedidaVenda <> ' '
            THEN a.unidadeMedidaVenda
            ELSE a.unidadeMedida
          END;
        v_combo_conversorQuantidade := CASE WHEN a.controleQuantidadeVenda IN (4,5) AND a.conversorQuantidadeVenda <> 0 THEN a.conversorQuantidadeVenda ELSE 0 END;
        v_combo_loteMinimo          := ROUND (a.loteMinimoVenda, a.casasDecimaisUnidadeMedida);
        v_combo_loteMultiplo        := ROUND (a.loteMultiploVenda, a.casasDecimaisUnidadeMedida);
      END IF;
      IF v_combo_controleQuantidade = 2 THEN
        v_combo_altura               := a.altura;
        v_combo_largura              := a.largura;
        v_combo_comprimento          := 0;
        v_combo_pecas                := CASE WHEN v_combo_altura = 0 OR v_combo_largura = 0 THEN 0 ELSE ROUND ((a.quantidade / ((v_combo_altura / 100) * (v_combo_largura / 100))), 6) END;
        v_combo_quantidadeConvertida := v_combo_pecas;
        v_combo_conversorQuantidade  := CASE WHEN v_combo_quantidadeConvertida = 0 THEN 0 ELSE ROUND (a.quantidade / v_combo_quantidadeConvertida, 6) END;
      ELSIF v_combo_controleQuantidade = 3 THEN
        v_combo_altura               := a.altura;
        v_combo_largura              := a.largura;
        v_combo_comprimento          := a.comprimento;
        v_combo_pecas                := CASE WHEN v_combo_altura = 0 OR v_combo_comprimento = 0 OR v_combo_comprimento = 0 THEN 0 ELSE ROUND (a.quantidade / ((v_combo_altura / 100) * (v_combo_largura / 100) * v_combo_comprimento), 6) END;
        v_combo_quantidadeConvertida := v_combo_pecas;
        v_combo_conversorQuantidade  := CASE WHEN v_combo_quantidadeConvertida = 0 THEN 0 ELSE ROUND (a.quantidade / v_combo_quantidadeConvertida, 6) END;
      ELSIF v_combo_controleQuantidade = 4 THEN
        v_combo_altura               := 0;
        v_combo_largura              := 0;
        v_combo_comprimento          := 0;
        v_combo_pecas                := CASE WHEN v_combo_conversorQuantidade = 0 THEN 0 ELSE ROUND (a.quantidade / v_combo_conversorQuantidade, 6) END;
        v_combo_quantidadeConvertida := v_combo_pecas;
      ELSIF v_combo_controleQuantidade = 5 THEN
        v_combo_altura               := 0;
        v_combo_largura              := 0;
        v_combo_comprimento          := 0;
        v_combo_pecas                := ROUND (a.quantidade * v_combo_conversorQuantidade, 6);
        v_combo_quantidadeConvertida := v_combo_pecas;
      ELSE
        v_combo_conversorQuantidade  := 1;
        v_combo_altura               := 0;
        v_combo_largura              := 0;
        v_combo_comprimento          := 0;
        v_combo_pecas                := 0;
        v_combo_quantidadeConvertida := a.quantidade;
      END IF;
      v_combo_pesoLiquido := ROUND ((a.quantidade * a.pesoLiquido), 3);
      v_combo_pesoBruto   := ROUND ((a.quantidade * a.pesoBruto), 3);
      ADD_BUSCA_PRECO (
        p_config_64_casasDecSaidas,
        p_config_65_casasDecEntrada,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        v_cab_entradaSaida,
        v_cab_devolucaoAnulacaoRetorno,
        v_cab_estabelecimento,
        NULL, -- p_cab_dataPrecoInicial
        TRUNC (SYSDATE), -- p_cab_dataPrecoFinal
        v_cab_pessoa,
        v_cab_projeto,
        v_modDoc_capituloNatFiscal,
        v_modDoc_tipoPreco,
        v_modDoc_tabelaPreco,
        v_modDoc_fatorMultipPreco,
        v_modDoc_tipoPrecoB,
        v_modDoc_tabelaPrecoB,
        v_modDoc_fatorMultipPrecoB,
        v_munEndEst_uf,
        v_munEndPess_uf,
        p_item_vendedor,
        0, -- p_item_idFormulaTinta
        0, -- p_item_personalizacao
        p_item_localEstoque,
        p_item_pessoaParticipante,
        a.quantidade,
        a.produto,
        a.cor,
        a.tamanho,
        a.controleEstoque,
        a.indicadorPropriedadePosseItem,
        0, -- p_manterPreco
        v_combo_precoSugestaoAPrazo,
        v_combo_precoSugestaoAVista,
        v_combo_tipoPreco,
        v_combo_tabelaPreco,
        v_combo_tipoPreco,
        v_combo_tabelaPreco,
        v_combo_precoSugestaoAPrazo,
        v_combo_precoSugestaoAVista,
        v_combo_precoDesconto,
        v_combo_precoMinimo,
        v_auxNumber, -- r_informarPrecoManualmente
        v_auxNumber, -- r_precoAPrazo
        v_auxNumber, -- r_precoAVista
        v_auxNumber, -- r_promocao
        v_auxNumber, -- r_precoPromocaoAPrazo
        v_auxNumber, -- r_precoPromocaoAVista
        v_auxNumber, -- r_precoIndexadoAPrazo
        v_auxNumber); -- r_precoIndexadoAVista
      v_combo_precoUnitario := CASE WHEN p_item_usarPrecoAVista = 1 THEN v_combo_precoSugestaoAVista ELSE v_combo_precoSugestaoAPrazo END;
      ADD_DOC_FISC_ITEM_GRAVA (
        ' ', -- p_sessaoClient
        p_usuarioLogado,
        p_perfilUsuarioLogado,
        p_estabelecimentoAtivo,
        p_person_190_modeloFrete,
        p_config_64_casasDecSaidas,
        p_config_65_casasDecEntrada,
        p_config_198_obs_add_referenc,
        p_config_199_obs_add_caractA,
        p_config_200_obs_add_caractB,
        p_config_201_obs_add_caractC,
        p_config_202_obs_add_caractD,
        p_config_203_obs_add_caractE,
        p_config_209_filtrarGrupoEcon,
        p_config_227_manterPessoaOrcam,
        p_config_230_etapaPedComprParc,
        p_config_362_calcCustoPorGrade,
        p_config_378_calcularVolumes,
        p_config_413_obs_add_marca,
        p_config_418_obs_efetarEnter,
        p_manterFinanceiro_Retotalizar,
        'S', -- p_buscarAliquotas_CalcularImp
        p_buscarGeraFinanceiroEstoque,
        p_tipoDocumentoReferenciado,
        p_idItemReferenciado,
        CASE
          WHEN p_quantidadeReferenciada = 0
          OR p_item_quantidade = 0
          THEN 0
          ELSE ROUND(a.quantidade * p_quantidadeReferenciada / p_item_quantidade, 7)
        END, -- p_quantidadeReferenciada
        ' ', -- p_tempComp_nomeTempComposicao,
        0, -- p_tempComp_sequencia
        r_calcularImpostos,
        0, -- p_item_idItemDocFiscal
        p_item_idDocumentoFiscal,
        p_item_pedidoCompraFornecedor,
        p_item_sequenciaPedidoCompraFo,
        p_item_modeloDocumento,
        p_item_estabelecimentoOriginal,
        p_item_vendedor,
        a.gradeProdutoFilho,
        0, -- p_item_idFormulaTinta
        0, -- p_item_personalizacao
        0, -- p_item_idLoteEstoque
        0, -- p_item_idEnderecoEstoque
        0, -- p_item_idNumeroSerie
        p_item_localEstoque,
        p_item_pessoaParticipante,
        v_combo_controleQuantidade,
        v_combo_unidadeMedidaConversao,
        v_combo_conversorQuantidade,
        v_combo_loteMinimo,
        v_combo_loteMultiplo,
        v_combo_altura,
        v_combo_largura,
        v_combo_comprimento,
        v_combo_pecas,
        a.quantidade,
        v_combo_quantidadeConvertida,
        v_combo_pesoLiquido,
        v_combo_pesoBruto,
        v_combo_tipoPreco,
        v_combo_tabelaPreco,
        v_combo_precoSugestaoAPrazo,
        v_combo_precoSugestaoAVista,
        v_combo_precoDesconto,
        v_combo_precoMinimo,
        p_item_usarPrecoAVista,
        v_combo_precoUnitario, -- p_item_precoUnitarioBruto
        0, -- p_item_acrescimoUnitarioCompos
        v_combo_precoUnitario,
        p_item_percDescontoItem,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoItem
        p_item_percAcrescimoItem,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorFreteItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorFreteItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorSeguroItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorSeguroItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAdicFreteMarItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAdicFreteMarItem
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDespesasAduanItem
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDespesasAduanItem
        CASE
          WHEN p_item_quantidade = 0
          THEN 0
          ELSE ROUND(p_item_quantidadeExtemporanea * a.quantidade / p_item_quantidade, 2)
        END, -- p_item_quantidadeExtemporanea
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_acrescimoUnitarioExtemp
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_acrescimoUnitarioExtemp
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoExtempIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpIte
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpIte
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpIt
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpIt
        p_item_observacoesDigitadas,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorFreteGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorFreteGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorSeguroGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorSeguroGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorOutrasDespesasGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorOutrasDespesasGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAdicFreteMarGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAdicFreteMarGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDespesasAduanGeral
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDespesasAduanGeral
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoExtempGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoExtempGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoCustoOpGer
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoCustoOpGer
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorAcrescimoCustoOpGe
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorAcrescimoCustoOpGe
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorDescontoPagamento
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorDescontoPagamento
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorOutrasDespPagament
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorOutrasDespPagament
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorJurosPagamento
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorJurosPagamento
        p_item_percentualDevolucao,
        CASE
          WHEN ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2) = 0
          THEN 0
          ELSE ROUND(p_item_valorIPIDevolucao
            * ROUND (a.quantidade * v_combo_precoUnitario, 2)
            / ROUND (p_item_quantidade * p_item_precoUnitarioBruto, 2), 2)
        END, -- p_item_valorIPIDevolucao,
        v_combo_operacaoFiscal,
        p_item_movimentaEstoque,
        p_item_movimentaEstoqueFiscal,
        p_item_geraFinanceiro,
        0, -- p_item_cfop
        ' ', -- p_item_indicadorISSQN
        0, -- p_item_aliquotaISSQN
        0, -- p_item_retidoISSQN
        0, -- p_item_tributadoForaMunicipio
        0, -- p_item_incentivoFiscal
        0, -- p_item_listaServicos
        0, -- p_item_cnae
        0, -- p_item_idServicoMunicipio
        ' ', -- p_item_numeroProcessoAdministr
        0, -- p_item_retencaoIRRF
        0, -- p_item_retencaoINSS
        0, -- p_item_retencaoPIS
        0, -- p_item_retencaoCOFINS
        0, -- p_item_retencaoCSLL
        0, -- p_item_retencaoOutros
        0, -- p_item_aliquotaII
        0, -- p_item_aliquotaIOF
        0, -- p_item_codigoEnquadramentoIPI
        0, -- p_item_stIPI
        0, -- p_item_aliquotaIPI
        0, -- p_item_valorAliquotaIPI
        ' ', -- p_item_stPIS
        0, -- p_item_aliquotaPIS
        0, -- p_item_valorAliquotaPIS
        0, -- p_item_aliquotaPISST
        0, -- p_item_valorAliquotaPISST
        ' ', -- p_item_stCOFINS
        0, -- p_item_aliquotaCOFINS
        0, -- p_item_valorAliquotaCOFINS
        0, -- p_item_aliquotaCOFINSST
        0, -- p_item_valorAliquotaCOFINSST
        '   ', -- p_item_stSimplesNacional
        0, -- p_item_creditoSimplesNacional
        '  ', -- p_item_stICMS
        0, -- p_item_modalBaseCalcICMS
        0, -- p_item_reducaoBaseICMS
        0, -- p_item_aliquotaICMS
        0, -- p_item_diferimentoICMS
        ' ', -- p_item_motivoDesoneracaoICMS
        0, -- p_item_idBeneficio
        ' ', -- p_item_modalBaseCalcICMSST
        0, -- p_item_margemValorAdicionadoST
        0, -- p_item_reducaoBaseST
        0, -- p_item_aliquotaICMSST
        0, -- p_item_aliquotaSTSuportConsFin
        0, -- p_item_reducaoBaseICMSEfetivo
        0, -- p_item_aliquotaICMSEfetivo
        '  ', -- p_item_stICMSEscrituracao
        0, -- p_item_reducaoBaseICMSEscritur
        0, -- p_item_aliquotaICMSEscrituraca
        0, -- p_item_diferimentoICMSEscritur
        0, -- p_item_margemValorAdicSTEscrit
        0, -- p_item_reducaoBaseSTEscriturac
        0, -- p_item_aliquotaICMSSTEscritura
        0, -- p_item_somarICMSST
        0, -- p_item_aliquotaICMSUFDestinat
        0, -- p_item_aliquotaICMSInterestad
        0, -- p_item_partilhaICMSInterestad
        0, -- p_item_aliquotaFCP
        0, -- p_item_aliquotaFCPST
        0, -- p_item_aliquotaFCPSTAnteriorm
        0, -- p_item_aliquotaFCPUFDestinat
        0, -- p_item_aliquotaEstImpFederais
        0, -- p_item_aliquotaEstImpEstaduais
        0, -- p_item_aliquotaEstImpMunicipai
        0, -- p_item_baseISSQN
        0, -- p_item_valorISSQN
        0, -- p_item_baseRetIRRF
        0, -- p_item_valorRetIRRF
        0, -- p_item_baseRetINSS
        0, -- p_item_valorRetINSS
        0, -- p_item_baseRetPIS
        0, -- p_item_valorRetPIS
        0, -- p_item_baseRetCOFINS
        0, -- p_item_valorRetCOFINS
        0, -- p_item_baseRetCSLL
        0, -- p_item_valorRetCSLL
        0, -- p_item_baseRetOutros
        0, -- p_item_valorRetOutros
        0, -- p_item_baseII
        0, -- p_item_valorII
        0, -- p_item_baseIOF
        0, -- p_item_valorIOF
        0, -- p_item_baseIPI
        0, -- p_item_valorIPI
        0, -- p_item_basePIS
        0, -- p_item_valorPIS
        0, -- p_item_basePISST
        0, -- p_item_valorPISST
        0, -- p_item_baseCOFINS
        0, -- p_item_valorCOFINS
        0, -- p_item_baseCOFINSST
        0, -- p_item_valorCOFINSST
        0, -- p_item_baseCreditoSimplesNac
        0, -- p_item_valorCreditoSimplesNac
        0, -- p_item_baseICMS
        0, -- p_item_valorICMSOperacao
        0, -- p_item_valorICMSDiferido
        0, -- p_item_valorICMS
        0, -- p_item_valorICMSDesoneracao
        0, -- p_item_baseICMSST
        0, -- p_item_valorICMSST
        0, -- p_item_baseICMSSTAnteriormente
        0, -- p_item_valorICMSSTAnteriorment
        0, -- p_item_valorICMSProprioSubstit
        0, -- p_item_baseICMSEfetivo
        0, -- p_item_valorICMSEfetivo
        0, -- p_item_baseICMSEscrituracao
        0, -- p_item_valorICMSEscrituracao
        0, -- p_item_valorICMSDesonEscritura
        0, -- p_item_baseICMSSTEscrituracao
        0, -- p_item_valorICMSSTEscrituracao
        0, -- p_item_baseICMSUFDestinatario
        0, -- p_item_valorICMSUFDestinatario
        0, -- p_item_baseICMSUFRemetente
        0, -- p_item_valorICMSUFRemetente
        0, -- p_item_baseFCP
        0, -- p_item_valorFCP
        0, -- p_item_baseFCPST
        0, -- p_item_valorFCPST
        0, -- p_item_baseFCPSTAnteriormente
        0, -- p_item_valorFCPSTAnteriormente
        0, -- p_item_baseFCPUFDestinatario
        0, -- p_item_valorFCPUFDestinatario
        0, -- p_item_baseEstimadaImpostos
        0, -- p_item_valorEstImpFederais
        0, -- p_item_valorEstImpEstaduais
        0, -- p_item_valorEstImpMunicipais
        p_nivel + 1, -- p_nivel,
        r_buffer_idItemDocFiscal,
        /* Retornos */
        r_calcularImpostos,
        v_auxNumber, -- r_item_idItemDocFiscal
        r_buffer_idItemDocFiscal,
        v_combo_valorTotal);
      r_valorInserido := r_valorInserido + v_combo_valorTotal;
    END LOOP;
    IF p_nivel = 0
    AND r_valorInserido > 0
    AND r_valorInserido <> v_item_valorProdutoServico
      - CASE
          WHEN v_modDoc_diminuiDescontoPrUnit = 1
          THEN p_item_valorDescontoItem
          ELSE 0
        END
      + CASE
          WHEN v_modDoc_somaAcrescimosPrUnit = 1
          THEN p_item_valorAcrescimoItem
          ELSE 0
        END
    THEN
      v_soma_valorProdutos          := 0;
      v_soma_valorDescontoProdutos  := 0;
      v_soma_valorAcrescimoProdutos := 0;
      v_soma_valorServicos          := 0;
      v_soma_valorDescontoServicos  := 0;
      v_soma_valorAcrescimoServicos := 0;
      v_ajuste_residuoDesconto      := 0;
      v_ajuste_residuoAcrescimo     := 0;
      v_ajuste_valorOriginal        := v_item_valorProdutoServico -
        CASE
          WHEN v_modDoc_diminuiDescontoPrUnit = 1
          THEN 0
          ELSE p_item_valorDescontoItem
        END +
        CASE
          WHEN v_modDoc_somaAcrescimosPrUnit = 1
          THEN 0
          ELSE p_item_valorAcrescimoItem
        END;
      WHILE r_buffer_idItemDocFiscal IS NOT NULL AND LENGTH(RTRIM(r_buffer_idItemDocFiscal)) >= 14
      LOOP
        v_ajuste_idItemDocFiscal := TO_NUMBER(SUBSTR(r_buffer_idItemDocFiscal,1,14));
        r_buffer_idItemDocFiscal := RTRIM(SUBSTR(r_buffer_idItemDocFiscal,16,32000));
