    UPDATE MOPREDOCUMXITENS SET
      precoUnitario                 = v_precoUnitario,
      precoUnitarioConvertido       = v_precoUnitarioConvertido,
      valorProdutoServico           = v_valorProdutoServico,
      valorFreteGeral               = v_valorFreteGeral,
      valorSeguroGeral              = v_valorSeguroGeral,
      valorDescontoGeral            = v_valorDescontoGeral,
      valorOutrasDespesasGeral      = v_valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral = v_valorAdicFreteMarinMerGeral,
      valorDespesasAduaneirasGeral  = v_valorDespesasAduaneirasGeral,
      valorBasePagamento            = v_valorBasePagamento,
      valorDescontoPagamento        = v_valorDescontoPagamento,
      valorOutrasDespesasPagamento  = v_valorOutrasDespesasPagamento,
      valorJurosPagamento           = v_valorJurosPagamento,
      valorFreteTotal               = v_valorFreteTotal,
      valorSeguroTotal              = v_valorSeguroTotal,
      valorDescontoTotal            = v_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
      valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
      valorImpostosSomaPagamento    = v_valorImpSomaPagamento,
      valorImpostosDiminuiPagamento = v_valorImpDiminuiPagamento,
      valorLiquidoItem              = v_valorLiquidoItem,
      valorDescontoCustoOpGeral     = v_valorDescontoCustoOpGeral,
      valorDescontoCustoOpTotal     = v_valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpGeral    = v_valorAcrescimoCustoOpGeral,
      valorAcrescimoCustoOpTotal    = v_valorAcrescimoCustoOpTotal,
      precoCustoOperacao            = v_precoCustoOperacao,
      valorCustoOperacao            = v_valorCustoOperacao,
      precoCMV                      = v_precoCMV,
      valorCMV                      = v_valorCMV,
      valorAcrescimoExtempSubtotal  = v_valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempGeral     = v_valorAcrescimoExtempGeral,
      valorAcrescimoExtempTotal     = v_valorAcrescimoExtempTotal
    WHERE idItemPreDocumento        = p_item_idItemPreDocumento;
    IF item.servico = 1 THEN
      r_cab_valorServicos          := r_cab_valorServicos + v_valorProdutoServico;
    ELSE
      r_cab_valorProdutos          := r_cab_valorProdutos + v_valorProdutoServico;
    END IF;
    r_cab_valorBasePagamento       := r_cab_valorBasePagamento + v_valorBasePagamento;
    IF item.usarPrecoAVista = 1 AND item.geraFinanceiro = 1 THEN
      r_cab_valorAVistaMinimo      := r_cab_valorAVistaMinimo + v_valorProdutoServico + v_valorDescontoPagamento - v_valorOutrasDespesasPagamento - v_valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
    END IF;
    r_cab_valorFreteTotal          := r_cab_valorFreteTotal + v_valorFreteTotal;
    r_cab_valorSeguroTotal         := r_cab_valorSeguroTotal + v_valorSeguroTotal;
    r_cab_valorDescontoTotal       := r_cab_valorDescontoTotal + v_valorDescontoTotal;
    r_cab_valorOutrasDespesasTotal := r_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
    r_cab_valorAdicFreteMarinTotal := r_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
    r_cab_valorDespesasAduanTotal  := r_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
    r_cab_valorDescCustoOpTotal    := r_cab_valorDescCustoOpTotal + v_valorDescontoCustoOpTotal;
    r_cab_valorImpSomaPagamento    := r_cab_valorImpSomaPagamento + v_valorImpSomaPagamento;
    r_cab_valorImpDiminuiPagamento := r_cab_valorImpDiminuiPagamento + v_valorImpDiminuiPagamento;
    r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem + v_valorLiquidoItem;
    r_cab_valorAcrescCustoOpTotal  := r_cab_valorAcrescCustoOpTotal + v_valorAcrescimoCustoOpTotal;
    r_cab_valorCustoOperacao       := r_cab_valorCustoOperacao + v_valorCustoOperacao;
    r_cab_valorCMV                 := r_cab_valorCMV + v_valorCMV;
    r_cab_valorAcrescExtempTotal   := r_cab_valorAcrescExtempTotal + v_valorAcrescimoExtempTotal;
  END LOOP;
END ADD_PRE_DOC_CALC_IMP_RESIDUO;

/

create or replace PROCEDURE ADD_PRE_DOC_CALC_IMP_RATEIO (
    p_cab_preDocumento             IN NUMBER,
    p_troca_tipoPagamentoFrete     IN NUMBER,
    p_a_cab_tipoPagamentoFrete     IN CHAR,
    p_cab_origemDocumento          IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_devolucaoAnulacaoRetorno IN NUMBER,
    p_cab_atualizaCustoMedio       IN NUMBER,
    p_cab_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_valorImpSomaPagamento    OUT NUMBER,
    r_cab_valorImpDiminuiPagamento OUT NUMBER,
    r_cab_valorLiquidoItem         OUT NUMBER,
    r_cab_valorDescCustoOpTotal    OUT NUMBER,
    r_cab_valorAcrescCustoOpTotal  OUT NUMBER,
    r_cab_valorCustoOperacao       OUT NUMBER,
    r_cab_valorCMV                 OUT NUMBER,
    r_cab_valorAcrescExtempTotal   OUT NUMBER,
    r_calcularImpostosItem         OUT NUMBER)
IS
    v_auxNumber                    NUMBER;
    v_valorDescontoPromocaoGeral   NUMBER;
    v_valorDescontoPromocaoPagamen NUMBER;
    v_rateioDescontofiltrarSemProm NUMBER;
    v_rateioDescontofiltrarAPrazo  NUMBER;
    v_rateioFretePorControleEntr   NUMBER;
    v_valorBaseFreteSemFinSemEntr  NUMBER;
    v_valorBaseFreteComFinSemEntr  NUMBER;
    v_valorBaseFreteSemFinComEntr  NUMBER;
    v_valorBaseFreteComFinComEntr  NUMBER;
    v_valorBaseRateio              NUMBER;
    v_valorBaseRateioComEntrega    NUMBER;
    v_valorBaseRateioFinanceiro    NUMBER;
    v_valorBaseRateioOutrasDespGer NUMBER;
    v_valorBaseRateioOutrasDespFin NUMBER;
    v_valorBaseRateioDescontoGeral NUMBER;
    v_valorBaseRateioPagamento     NUMBER;
    v_valorBaseRateioPagamFinanc   NUMBER;
    v_valorBaseRateioPagamDesconto NUMBER;
    v_valorBaseRateioPagamFinDesc  NUMBER;
    v_saldoRatFreteGeral           NUMBER;
    v_saldoRatSeguroGeral          NUMBER;
    v_saldoRatDescontoGeral        NUMBER;
    v_saldoRatOutrasDespesasGeral  NUMBER;
    v_saldoRatAdicFreteMarinGeral  NUMBER;
    v_saldoRatDespesasAduanGeral   NUMBER;
    v_saldoRatDescontoPagamento    NUMBER;
    v_saldoRatOutrasDespPagamento  NUMBER;
    v_saldoRatJurosPagamento       NUMBER;
    v_saldoRatDescCustoOpGeral     NUMBER;
    v_saldoRatAcrescCustoOpGeral   NUMBER;
    v_saldoRatAcrescExtempGeral    NUMBER;
    v_residuoFreteGeral            NUMBER;
    v_residuoSeguroGeral           NUMBER;
    v_residuoDescontoGeral         NUMBER;
    v_residuoOutrasDespesasGeral   NUMBER;
    v_residuoAdicFreteMarinGeral   NUMBER;
    v_residuoDespesasAduanGeral    NUMBER;
    v_residuoDescontoPagamento     NUMBER;
    v_residuoOutrasDespPagamento   NUMBER;
    v_residuoJurosPagamento        NUMBER;
    v_residuoDescCustoOpGeral      NUMBER;
    v_residuoAcrescCustoOpGeral    NUMBER;
    v_residuoAcrescExtempGeral     NUMBER;
    v_idItemPreDocUltimoItem       NUMBER;
    v_idItemPreDocRateioFrete      NUMBER;
    v_precoUnitario                NUMBER;
    v_precoUnitarioConvertido      NUMBER;
    v_valorProdutoServico          NUMBER;
    v_valorFreteGeral              NUMBER;
    v_valorSeguroGeral             NUMBER;
    v_valorDescontoGeral           NUMBER;
    v_valorOutrasDespesasGeral     NUMBER;
    v_valorAdicFreteMarinMerGeral  NUMBER;
    v_valorDespesasAduaneirasGeral NUMBER;
    v_valorBasePagamento           NUMBER;
    v_valorDescontoPagamento       NUMBER;
    v_valorOutrasDespesasPagamento NUMBER;
    v_valorJurosPagamento          NUMBER;
    v_valorFreteTotal              NUMBER;
    v_valorSeguroTotal             NUMBER;
    v_valorDescontoTotal           NUMBER;
    v_valorOutrasDespesasTotal     NUMBER;
    v_valorAdicFreteMarinMerTotal  NUMBER;
    v_valorDespesasAduaneirasTotal NUMBER;
    v_valorImpSomaPagamento        NUMBER;
    v_valorImpDiminuiPagamento     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;
    CURSOR c_item IS
      SELECT
        a.idItemPreDocumento,
        a.modeloDocumento,
        a.servico,
        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.valorIRRF,
        a.valorINSS,
        a.valorRetPIS,
        a.valorRetCOFINS,
        a.valorRetCSLL,
        a.valorII,
        a.valorIOF,
        a.valorIPI,
        a.valorIPIDevolucao,
        a.valorPIS,
        a.valorPISST,
        a.valorCOFINS,
        a.valorCOFINSST,
        a.valorCreditoSimplesNacional,
        a.valorICMS,
        a.valorICMSST,
        a.valorImpostosSomaPagamento,
        a.valorImpostosDiminuiPagamento,
        a.valorLiquidoItem,
        a.valorDescontoCustoOpItem,
        a.valorDescontoCustoOpGeral,
        a.valorDescontoCustoOpTotal,
        a.valorAcrescimoCustoOpItem,
        a.valorAcrescimoCustoOpGeral,
        a.valorAcrescimoCustoOpTotal,
        a.precoCustoOperacao,
        a.valorCustoOperacao,
        a.precoCMV,
        a.valorCMV,
        a.quantidadeExtemporanea,
        a.acrescimoUnitarioExtemporaneo,
        a.valorAcrescimoExtempSubtotal,
        a.valorAcrescimoExtempItem,
        a.valorAcrescimoExtempGeral,
        a.valorAcrescimoExtempTotal,
        modDoc.diminuiDescontoPrUnit,
        modDoc.somaAcrescimosPrUnit,
        modDoc.somaFreteSeguroPrUnit,
        modDoc.geraFinanceiro modDoc_geraFinanceiro,
        CASE WHEN p_habilitaControleEntrega = 0 OR EXISTS(
          SELECT 1
          FROM MOPREDOCUMXORCAMENTOITEM docXorc
          JOIN MOORCAMENTOXITENS itemOrc
          ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento
          JOIN PACONTROLESENTREGA contr
          ON contr.controleEntrega = itemOrc.controleEntrega
          WHERE docXorc.idItemPreDocumento = a.idItemPreDocumento
          AND contr.habilitaFrete = 1) THEN 1 ELSE 0 END rateioFrete,
        CASE WHEN a.precoSugestaoAPrazo <> a.precoSugestaoAVista AND a.usarPrecoAVista = 1 THEN 1 ELSE 0 END aVista,
        CASE WHEN EXISTS(
          SELECT 1
          FROM MOPREDOCUMXPROMOCOES promo
          WHERE promo.idItemPreDocumento = a.idItemPreDocumento) THEN 1 ELSE 0 END promocao,
        COALESCE((
          SELECT SUM(promo.valorDesconto)
          FROM MOPREDOCUMXPROMOCOES promo
          WHERE promo.idItemPreDocumento = a.idItemPreDocumento
          AND promo.cabecalhoItemPagamento ='C'),0) valorDescontoPromocaoGeral,
        COALESCE((
          SELECT SUM(promo.valorDesconto)
          FROM MOPREDOCUMXPROMOCOES promo
          WHERE promo.idItemPreDocumento = a.idItemPreDocumento
          AND promo.cabecalhoItemPagamento ='P'),0) valorDescontoPromocaoPagamento
      FROM MOPREDOCUMXITENS a
      JOIN PAMODELOSDOCUMENTO modDoc
      ON modDoc.modeloDocumento = a.modeloDocumento
      WHERE a.preDocumento = p_cab_preDocumento
      AND a.cancelado = 0
      ORDER BY a.sequencia;
BEGIN
  r_cab_valorProdutos            := 0;
  r_cab_valorServicos            := 0;
  r_cab_valorBasePagamento       := 0;
  r_cab_valorAVistaMinimo        := 0;
  r_cab_valorFreteTotal          := 0;
  r_cab_valorSeguroTotal         := 0;
  r_cab_valorDescontoTotal       := 0;
  r_cab_valorOutrasDespesasTotal := 0;
  r_cab_valorAdicFreteMarinTotal := 0;
  r_cab_valorDespesasAduanTotal  := 0;
  r_cab_valorImpSomaPagamento    := 0;
  r_cab_valorImpDiminuiPagamento := 0;
  r_cab_valorLiquidoItem         := 0;
  r_cab_valorDescCustoOpTotal    := 0;
  r_cab_valorAcrescCustoOpTotal  := 0;
  r_cab_valorCustoOperacao       := 0;
  r_cab_valorCMV                 := 0;
  r_cab_valorAcrescExtempTotal   := 0;
  r_calcularImpostosItem         := 0;
  v_saldoRatFreteGeral           := p_cab_valorFreteGeral;
  v_saldoRatSeguroGeral          := p_cab_valorSeguroGeral;
  v_saldoRatDescontoGeral        := p_cab_valorDescontoGeral;
  v_saldoRatOutrasDespesasGeral  := p_cab_valorOutrasDespesasGeral;
  v_saldoRatAdicFreteMarinGeral  := p_cab_valorAdicFreteMarinGeral;
  v_saldoRatDespesasAduanGeral   := p_cab_valorDespesasAduanGeral;
  v_saldoRatDescontoPagamento    := p_cab_valorDescontoPagamento;
  v_saldoRatOutrasDespPagamento  := p_cab_valorOutrasDespPagamento;
  v_saldoRatJurosPagamento       := p_cab_valorJurosPagamento;
  v_saldoRatDescCustoOpGeral     := p_cab_valorDescCustoOpGeral;
  v_saldoRatAcrescCustoOpGeral   := p_cab_valorAcrescCustoOpGeral;
  v_saldoRatAcrescExtempGeral    := p_cab_valorAcrescExtempGeral;
  v_residuoFreteGeral            := 0;
  v_residuoSeguroGeral           := 0;
  v_residuoDescontoGeral         := 0;
  v_residuoOutrasDespesasGeral   := 0;
  v_residuoAdicFreteMarinGeral   := 0;
  v_residuoDespesasAduanGeral    := 0;
  v_residuoDescontoPagamento     := 0;
  v_residuoOutrasDespPagamento   := 0;
  v_residuoJurosPagamento        := 0;
  v_residuoDescCustoOpGeral      := 0;
  v_residuoAcrescCustoOpGeral    := 0;
  v_residuoAcrescExtempGeral     := 0;
  v_idItemPreDocUltimoItem       := 0;
  v_idItemPreDocRateioFrete      := 0;
  v_valorDescontoPromocaoGeral   := 0;
  v_valorDescontoPromocaoPagamen := 0;
  v_rateioDescontofiltrarSemProm := 0;
  v_rateioDescontofiltrarAPrazo  := 0;

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

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

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

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

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

  -- Efetua rateio
  FOR item IN c_item LOOP
    v_idItemPreDocUltimoItem       := item.idItemPreDocumento;
    v_precoUnitario                := item.precoUnitario;
    v_precoUnitarioConvertido      := item.precoUnitarioConvertido;
    v_valorProdutoServico          := item.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           := item.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              := item.valorFreteTotal;
    v_valorSeguroTotal             := item.valorSeguroTotal;
    v_valorDescontoTotal           := item.valorDescontoTotal;
    v_valorOutrasDespesasTotal     := item.valorOutrasDespesasTotal;
    v_valorAdicFreteMarinMerTotal  := item.valorAdicFreteMarinhaMerTotal;
    v_valorDespesasAduaneirasTotal := item.valorDespesasAduaneirasTotal;
    v_valorImpSomaPagamento        := item.valorImpostosSomaPagamento;
    v_valorImpDiminuiPagamento     := item.valorImpostosDiminuiPagamento;
    v_valorLiquidoItem             := item.valorLiquidoItem;
    v_valorDescontoCustoOpTotal    := item.valorDescontoCustoOpTotal;
    v_valorAcrescimoCustoOpTotal   := item.valorAcrescimoCustoOpTotal;
    v_precoCustoOperacao           := item.precoCustoOperacao;
    v_valorCustoOperacao           := item.valorCustoOperacao;
    v_precoCMV                     := item.precoCMV;
    v_valorCMV                     := item.valorCMV;
    v_valorAcrescimoExtempSubtotal := item.valorAcrescimoExtempSubtotal;
    v_valorAcrescimoExtempTotal    := item.valorAcrescimoExtempTotal;

    -- v_valorDescontoGeral
    IF v_valorBaseRateioDescontoGeral > 0
      AND (v_rateioDescontofiltrarAPrazo = 0
        OR item.aVista = 0)
      AND (v_rateioDescontofiltrarSemProm = 0
        OR item.promocao = 0
        AND p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral > 0)
    THEN
      v_valorDescontoGeral := v_valorDescontoGeral + (p_cab_valorDescontoGeral - CASE WHEN v_rateioDescontofiltrarSemProm = 1 THEN v_valorDescontoPromocaoGeral ELSE 0 END) * (CASE WHEN item.diminuiDescontoPrUnit = 1 OR item.somaAcrescimosPrUnit = 1 or item.somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico - item.valorDescontoItem + item.valorAcrescimoItem END) / v_valorBaseRateioDescontoGeral;
    END IF;
    IF p_cab_valorDescontoGeral           > 0
      AND v_valorDescontoPromocaoGeral    > 0
      AND item.valorDescontoPromocaoGeral > 0
      AND v_rateioDescontofiltrarSemProm  > 0
    THEN
      IF p_cab_valorDescontoGeral < v_valorDescontoPromocaoGeral THEN
        v_valorDescontoGeral := v_valorDescontoGeral + item.valorDescontoPromocaoGeral * p_cab_valorDescontoGeral / v_valorDescontoPromocaoGeral;
      ELSE
        v_valorDescontoGeral := v_valorDescontoGeral + item.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 item.rateioFrete = 1 AND item.geraFinanceiro = 1 THEN
      v_idItemPreDocRateioFrete := item.idItemPreDocumento;
      v_valorFreteGeral  := v_valorFreteGeral  + p_cab_valorFreteGeral  * (CASE WHEN item.diminuiDescontoPrUnit = 1 OR item.somaAcrescimosPrUnit = 1 or item.somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem) / v_valorBaseFreteComFinComEntr;
      v_valorSeguroGeral := v_valorSeguroGeral + p_cab_valorSeguroGeral * (CASE WHEN item.diminuiDescontoPrUnit = 1 OR item.somaAcrescimosPrUnit = 1 or item.somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem) / v_valorBaseFreteComFinComEntr;
    ELSIF v_valorBaseFreteSemFinComEntr > 0 AND v_valorBaseFreteComFinComEntr <= 0 AND v_rateioFretePorControleEntr = 1 AND item.rateioFrete = 1 AND item.modDoc_geraFinanceiro = 1 THEN
      v_idItemPreDocRateioFrete := item.idItemPreDocumento;
      v_valorFreteGeral  := v_valorFreteGeral  + p_cab_valorFreteGeral  * (CASE WHEN item.diminuiDescontoPrUnit = 1 OR item.somaAcrescimosPrUnit = 1 or item.somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem) / v_valorBaseFreteSemFinComEntr;
      v_valorSeguroGeral := v_valorSeguroGeral + p_cab_valorSeguroGeral * (CASE WHEN item.diminuiDescontoPrUnit = 1 OR item.somaAcrescimosPrUnit = 1 or item.somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem) / v_valorBaseFreteSemFinComEntr;
    ELSIF v_valorBaseRateioComEntrega > 0 AND v_valorBaseFreteSemFinComEntr <= 0 AND v_valorBaseFreteComFinComEntr <= 0 AND v_rateioFretePorControleEntr = 1 AND item.rateioFrete = 1 THEN
      v_idItemPreDocRateioFrete := item.idItemPreDocumento;
      v_valorFreteGeral  := v_valorFreteGeral  + p_cab_valorFreteGeral  * (CASE WHEN item.diminuiDescontoPrUnit = 1 OR item.somaAcrescimosPrUnit = 1 or item.somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem) / v_valorBaseRateioComEntrega;
      v_valorSeguroGeral := v_valorSeguroGeral + p_cab_valorSeguroGeral * (CASE WHEN item.diminuiDescontoPrUnit = 1 OR item.somaAcrescimosPrUnit = 1 or item.somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem) / v_valorBaseRateioComEntrega;
    ELSIF v_valorBaseFreteComFinSemEntr > 0 AND v_rateioFretePorControleEntr = 0 AND item.geraFinanceiro = 1 THEN
      v_idItemPreDocRateioFrete := item.idItemPreDocumento;
      v_valorFreteGeral  := v_valorFreteGeral  + p_cab_valorFreteGeral  * (CASE WHEN item.diminuiDescontoPrUnit = 1 OR item.somaAcrescimosPrUnit = 1 or item.somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem) / v_valorBaseFreteComFinSemEntr;
      v_valorSeguroGeral := v_valorSeguroGeral + p_cab_valorSeguroGeral * (CASE WHEN item.diminuiDescontoPrUnit = 1 OR item.somaAcrescimosPrUnit = 1 or item.somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem) / v_valorBaseFreteComFinSemEntr;
    ELSIF v_valorBaseFreteSemFinSemEntr > 0 AND v_valorBaseFreteComFinSemEntr <= 0 AND v_rateioFretePorControleEntr = 0 AND item.modDoc_geraFinanceiro = 1 THEN
      v_idItemPreDocRateioFrete := item.idItemPreDocumento;
      v_valorFreteGeral  := v_valorFreteGeral  + p_cab_valorFreteGeral  * (CASE WHEN item.diminuiDescontoPrUnit = 1 OR item.somaAcrescimosPrUnit = 1 or item.somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem) / v_valorBaseFreteSemFinSemEntr;
      v_valorSeguroGeral := v_valorSeguroGeral + p_cab_valorSeguroGeral * (CASE WHEN item.diminuiDescontoPrUnit = 1 OR item.somaAcrescimosPrUnit = 1 or item.somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem) / v_valorBaseFreteSemFinSemEntr;
    ELSIF v_valorBaseRateio > 0 AND (v_valorBaseRateioComEntrega <= 0 AND v_valorBaseFreteSemFinComEntr <= 0 AND v_valorBaseFreteComFinComEntr <= 0 AND v_rateioFretePorControleEntr = 1 OR v_valorBaseFreteSemFinSemEntr <= 0 AND v_valorBaseFreteComFinSemEntr <= 0 AND v_rateioFretePorControleEntr = 0) THEN
      v_idItemPreDocRateioFrete := item.idItemPreDocumento;
      v_valorFreteGeral  := v_valorFreteGeral  + p_cab_valorFreteGeral  * (CASE WHEN item.diminuiDescontoPrUnit = 1 OR item.somaAcrescimosPrUnit = 1 or item.somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem) / v_valorBaseRateio;
      v_valorSeguroGeral := v_valorSeguroGeral + p_cab_valorSeguroGeral * (CASE WHEN item.diminuiDescontoPrUnit = 1 OR item.somaAcrescimosPrUnit = 1 or item.somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.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 item.geraFinanceiro = 1 THEN 
      v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral  + p_cab_valorAdicFreteMarinGeral * (CASE WHEN item.diminuiDescontoPrUnit = 1 OR item.somaAcrescimosPrUnit = 1 or item.somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
      v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + p_cab_valorDespesasAduanGeral  * (CASE WHEN item.diminuiDescontoPrUnit = 1 OR item.somaAcrescimosPrUnit = 1 or item.somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
      v_valorDescontoCustoOpGeral    := v_valorDescontoCustoOpGeral    + p_cab_valorDescCustoOpGeral    * (CASE WHEN item.diminuiDescontoPrUnit = 1 OR item.somaAcrescimosPrUnit = 1 or item.somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
      v_valorAcrescimoCustoOpGeral   := v_valorAcrescimoCustoOpGeral   + p_cab_valorAcrescCustoOpGeral  * (CASE WHEN item.diminuiDescontoPrUnit = 1 OR item.somaAcrescimosPrUnit = 1 or item.somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
      v_valorAcrescimoExtempGeral    := v_valorAcrescimoExtempGeral    + p_cab_valorAcrescExtempGeral   * (CASE WHEN item.diminuiDescontoPrUnit = 1 OR item.somaAcrescimosPrUnit = 1 or item.somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
    ELSIF v_valorBaseRateio > 0 AND v_valorBaseRateioFinanceiro <= 0 THEN
      v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral  + p_cab_valorAdicFreteMarinGeral * (CASE WHEN item.diminuiDescontoPrUnit = 1 OR item.somaAcrescimosPrUnit = 1 or item.somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem) / v_valorBaseRateio;
      v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + p_cab_valorDespesasAduanGeral  * (CASE WHEN item.diminuiDescontoPrUnit = 1 OR item.somaAcrescimosPrUnit = 1 or item.somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem) / v_valorBaseRateio;
      v_valorDescontoCustoOpGeral    := v_valorDescontoCustoOpGeral    + p_cab_valorDescCustoOpGeral    * (CASE WHEN item.diminuiDescontoPrUnit = 1 OR item.somaAcrescimosPrUnit = 1 or item.somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem) / v_valorBaseRateio;
      v_valorAcrescimoCustoOpGeral   := v_valorAcrescimoCustoOpGeral   + p_cab_valorAcrescCustoOpGeral  * (CASE WHEN item.diminuiDescontoPrUnit = 1 OR item.somaAcrescimosPrUnit = 1 or item.somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem) / v_valorBaseRateio;
      v_valorAcrescimoExtempGeral    := v_valorAcrescimoExtempGeral    + p_cab_valorAcrescExtempGeral   * (CASE WHEN item.diminuiDescontoPrUnit = 1 OR item.somaAcrescimosPrUnit = 1 or item.somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.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 item.geraFinanceiro = 1 THEN
      v_valorOutrasDespesasGeral := v_valorOutrasDespesasGeral + p_cab_valorOutrasDespesasGeral * (CASE WHEN item.diminuiDescontoPrUnit = 1 OR item.somaAcrescimosPrUnit = 1 or item.somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico - item.valorDescontoItem + item.valorAcrescimoItem END) / v_valorBaseRateioOutrasDespFin;
    ELSIF v_valorBaseRateioOutrasDespGer > 0 AND v_valorBaseRateioOutrasDespFin <= 0 THEN
      v_valorOutrasDespesasGeral := v_valorOutrasDespesasGeral + p_cab_valorOutrasDespesasGeral * (CASE WHEN item.diminuiDescontoPrUnit = 1 OR item.somaAcrescimosPrUnit = 1 or item.somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico - item.valorDescontoItem + item.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 item.geraFinanceiro = 1
      AND (v_rateioDescontofiltrarAPrazo  = 0
        OR item.aVista = 0)
      AND (v_rateioDescontofiltrarSemProm = 0
        OR item.promocao = 0
        AND p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen > 0)
    THEN
      v_valorDescontoPagamento := v_valorDescontoPagamento + (p_cab_valorDescontoPagamento - CASE WHEN v_rateioDescontofiltrarSemProm = 1 THEN v_valorDescontoPromocaoPagamen ELSE 0 END) * (CASE WHEN item.diminuiDescontoPrUnit = 1 OR item.somaAcrescimosPrUnit = 1 or item.somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem) / v_valorBaseRateioPagamFinDesc;
    ELSIF p_cab_valorDescontoPagamento    > 0
      AND v_valorBaseRateioPagamDesconto  > 0
      AND v_valorBaseRateioPagamFinDesc  <= 0
      AND (v_rateioDescontofiltrarAPrazo  = 0
        OR item.aVista = 0)
      AND (v_rateioDescontofiltrarSemProm = 0
        OR item.promocao = 0
        AND p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen > 0)
    THEN
      v_valorDescontoPagamento := v_valorDescontoPagamento + (p_cab_valorDescontoPagamento - CASE WHEN v_rateioDescontofiltrarSemProm = 1 THEN v_valorDescontoPromocaoPagamen ELSE 0 END) * (CASE WHEN item.diminuiDescontoPrUnit = 1 OR item.somaAcrescimosPrUnit = 1 or item.somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem) / v_valorBaseRateioPagamDesconto;
    END IF;
    IF p_cab_valorDescontoPagamento           > 0
      AND v_valorDescontoPromocaoPagamen      > 0
      AND item.valorDescontoPromocaoPagamento > 0
      AND v_rateioDescontofiltrarSemProm      > 0
    THEN
      IF p_cab_valorDescontoPagamento < v_valorDescontoPromocaoPagamen THEN
        v_valorDescontoPagamento := v_valorDescontoPagamento + item.valorDescontoPromocaoPagamento * p_cab_valorDescontoPagamento / v_valorDescontoPromocaoPagamen;
      ELSE
        v_valorDescontoPagamento := v_valorDescontoPagamento + item.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 item.geraFinanceiro = 1 THEN
      v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + p_cab_valorOutrasDespPagamento * (CASE WHEN item.diminuiDescontoPrUnit = 1 OR item.somaAcrescimosPrUnit = 1 or item.somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem) / v_valorBaseRateioPagamFinanc;
      v_valorJurosPagamento          := v_valorJurosPagamento          + p_cab_valorJurosPagamento      * (CASE WHEN item.diminuiDescontoPrUnit = 1 OR item.somaAcrescimosPrUnit = 1 or item.somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem) / v_valorBaseRateioPagamFinanc;
    ELSIF v_valorBaseRateioPagamento > 0 AND v_valorBaseRateioPagamFinanc <= 0 THEN
      v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + p_cab_valorOutrasDespPagamento * (CASE WHEN item.diminuiDescontoPrUnit = 1 OR item.somaAcrescimosPrUnit = 1 or item.somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.valorAcrescimoItem) / v_valorBaseRateioPagamento;
      v_valorJurosPagamento          := v_valorJurosPagamento          + p_cab_valorJurosPagamento      * (CASE WHEN item.diminuiDescontoPrUnit = 1 OR item.somaAcrescimosPrUnit = 1 or item.somaFreteSeguroPrUnit = 1 THEN item.valorProdutoServicoBruto ELSE item.valorProdutoServico END - item.valorDescontoItem + item.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,
      item.diminuiDescontoPrUnit,
      item.somaAcrescimosPrUnit,
      item.somaFreteSeguroPrUnit,
      item.quantidade,
      item.quantidadeConvertida,
      item.precoUnitarioBruto,
      item.acrescimoUnitarioComposicao,
      item.precoUnitario,
      item.valorDescontoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      v_valorFreteGeral,
      v_valorSeguroGeral,
      v_valorDescontoGeral,
      v_valorOutrasDespesasGeral,
      v_valorAdicFreteMarinMerGeral,
      v_valorDespesasAduaneirasGeral,
      v_valorDescontoPagamento,
      v_valorOutrasDespesasPagamento,
      v_valorJurosPagamento,
      item.quantidadeExtemporanea,
      item.acrescimoUnitarioExtemporaneo,
      item.valorAcrescimoExtempItem,
      v_valorAcrescimoExtempGeral,
      /* Retornos */
      v_precoUnitario,
      v_precoUnitarioConvertido,
      v_valorProdutoServico,
      v_auxNumber,
      v_auxNumber,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal,
      v_valorAcrescimoExtempSubtotal,
      v_valorAcrescimoExtempTotal);
    IF p_cab_impostosEditados = 0 
        OR v_valorProdutoServico <> item.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 item.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 item.valorSeguroTotal END
        OR v_valorDescontoTotal <> item.valorDescontoTotal
        OR v_valorOutrasDespesasTotal <> item.valorOutrasDespesasTotal
        OR v_valorAdicFreteMarinMerTotal <> item.valorAdicFreteMarinhaMerTotal
        OR v_valorDespesasAduaneirasTotal <> item.valorDespesasAduaneirasTotal
        OR v_precoUnitario <> item.precoUnitario
        OR v_valorProdutoServico <> item.valorProdutoServico
    THEN
      r_calcularImpostosItem := 1;
    END IF;
    ADD_CALCULA_VALOR_LIQUIDO (
      p_cab_origemDocumento,
      0,
      p_cab_tipoPagamentoFrete,
      item.geraFinanceiro,
      v_valorProdutoServico,
      v_valorDescontoPagamento,
      v_valorOutrasDespesasPagamento,
      v_valorJurosPagamento,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      item.valorIRRF,
      item.valorINSS,
      item.valorRetPIS,
      item.valorRetCOFINS,
      item.valorRetCSLL,
      item.valorII,
      item.valorIOF,
      item.valorIPI,
      item.valorIPIDevolucao,
      item.valorICMSST,
      0,
      0,
      v_valorAcrescimoExtempTotal,
      item.modDoc_geraFinanceiro,
      /* Retornos */
      v_valorBasePagamento,
      v_valorImpSomaPagamento,
      v_valorImpDiminuiPagamento,
      v_valorLiquidoItem);
    ADD_CALCULA_CUSTO_CMV (
      p_cab_atualizaCustoMedio,
      0,
      item.modeloDocumento,
      item.quantidade,
      item.valorII,
      item.valorIOF,
      item.valorIPI,
      item.valorIPIDevolucao,
      item.valorPIS,
      item.valorPISST,
      item.valorCOFINS,
      item.valorCOFINSST,
      item.valorCreditoSimplesNacional,
      item.valorICMS,
      item.valorICMSST,
      0,
      v_valorLiquidoItem,
      item.valorDescontoCustoOpItem,
      v_valorDescontoCustoOpGeral,
      item.valorAcrescimoCustoOpItem,
      v_valorAcrescimoCustoOpGeral,
      v_valorAcrescimoExtempTotal,
      /* Retornos */
      v_valorDescontoCustoOpTotal,
      v_valorAcrescimoCustoOpTotal,
      v_precoCustoOperacao,
      v_valorCustoOperacao,
      v_precoCMV,
      v_valorCMV);

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

/

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

/

create or replace PROCEDURE ADD_PRE_DOC_CALC_IMP_CAB (
    p_config_64_casasDecSaidas     IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_330_redIcmsBasePisCof IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_cab_preDocumento             IN NUMBER,
    p_troca_tipoPagamentoFrete     IN NUMBER,
    p_a_cab_tipoPagamentoFrete     IN CHAR)
    /* Retornos */
IS
    v_cab_valorProdutos            NUMBER;
    v_cab_valorServicos            NUMBER;
    v_cab_valorBasePagamento       NUMBER;
    v_cab_valorAVistaMinimo        NUMBER;
    v_cab_valorFreteTotal          NUMBER;
    v_cab_valorSeguroTotal         NUMBER;
    v_cab_valorDescontoTotal       NUMBER;
    v_cab_valorOutrasDespesasTotal NUMBER;
    v_cab_valorAdicFreteMarinTotal NUMBER;
    v_cab_valorDespesasAduanTotal  NUMBER;
    v_cab_valorImpSomaPagamento    NUMBER;
    v_cab_valorImpDiminuiPagamento NUMBER;
    v_cab_valorLiquidoItem         NUMBER;
    v_cab_valorCustoOperacao       NUMBER;
    v_cab_valorCMV                 NUMBER;
    v_cab_valorDescCustoOpTotal    NUMBER;
    v_cab_valorAcrescCustoOpTotal  NUMBER;
    v_cab_valorAcrescExtempTotal   NUMBER;
    v_calcularImpostosItem         NUMBER;
    v_habilitaControleEntrega      NUMBER;
    CURSOR c_cab IS
      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;
BEGIN
  FOR cab IN c_cab LOOP
    v_cab_valorProdutos            := cab.valorProdutos;
    v_cab_valorServicos            := cab.valorServicos;
    v_cab_valorBasePagamento       := cab.valorBasePagamento;
    v_cab_valorAVistaMinimo        := cab.valorAVistaMinimo;
    v_cab_valorFreteTotal          := cab.valorFreteTotal;
    v_cab_valorSeguroTotal         := cab.valorSeguroTotal;
    v_cab_valorDescontoTotal       := cab.valorDescontoTotal;
    v_cab_valorOutrasDespesasTotal := cab.valorOutrasDespesasTotal;
    v_cab_valorAdicFreteMarinTotal := cab.valorAdicFreteMarinhaMerTotal;
    v_cab_valorDespesasAduanTotal  := cab.valorDespesasAduaneirasTotal;
    v_cab_valorImpSomaPagamento    := cab.valorImpostosSomaPagamento;
    v_cab_valorImpDiminuiPagamento := cab.valorImpostosDiminuiPagamento;
    v_cab_valorLiquidoItem         := cab.valorLiquidoItem;
    v_cab_valorDescCustoOpTotal    := cab.valorDescontoCustoOpTotal;
    v_cab_valorAcrescCustoOpTotal  := cab.valorAcrescimoCustoOpTotal;
    v_cab_valorCustoOperacao       := cab.valorCustoOperacao;
    v_cab_valorCMV                 := cab.valorCMV;
    v_cab_valorAcrescExtempTotal   := cab.valorAcrescimoExtempTotal;    
    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 (
      cab.preDocumento,
      p_troca_tipoPagamentoFrete,
      p_a_cab_tipoPagamentoFrete,
      cab.origemDocumento,
      cab.entradaSaida,
      cab.devolucaoAnulacaoRetorno,
      cab.atualizaCustoMedio,
      cab.tipoPagamentoFrete,
      cab.valorFreteGeral,
      cab.valorSeguroGeral,
      cab.valorDescontoGeral,
      cab.valorOutrasDespesasGeral,
      cab.valorAdicFreteMarinhaMerGeral,
      cab.valorDespesasAduaneirasGeral,
      cab.valorDescontoPagamento,
      cab.valorOutrasDespesasPagamento,
      cab.valorJurosPagamento,
      cab.impostosEditados,
      cab.valorDescontoCustoOpGeral,
      cab.valorAcrescimoCustoOpGeral,
      cab.valorAcrescimoExtempGeral,
      v_habilitaControleEntrega,
      /* Retornos */
      v_cab_valorProdutos,
      v_cab_valorServicos,
      v_cab_valorBasePagamento,
      v_cab_valorAVistaMinimo,
      v_cab_valorFreteTotal,
      v_cab_valorSeguroTotal,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespesasTotal,
      v_cab_valorAdicFreteMarinTotal,
      v_cab_valorDespesasAduanTotal,
      v_cab_valorImpSomaPagamento,
      v_cab_valorImpDiminuiPagamento,
      v_cab_valorLiquidoItem,
      v_cab_valorDescCustoOpTotal,
      v_cab_valorAcrescCustoOpTotal,
      v_cab_valorCustoOperacao,
      v_cab_valorCMV,
      v_cab_valorAcrescExtempTotal,
      v_calcularImpostosItem);
    IF v_calcularImpostosItem = 1 THEN
      ADD_PRE_DOC_CALC_IMP_ITENS(
        p_config_64_casasDecSaidas,
        p_config_209_filtrarGrupoEcon,
        p_config_330_redIcmsBasePisCof,
        p_config_362_calcCustoPorGrade,
        cab.preDocumento,
        cab.origemDocumento,
        cab.entradaSaida,
        cab.devolucaoAnulacaoRetorno,
        cab.atualizaCustoMedio,
        cab.estabelecimento,
        cab.dataEntradaSaida,
        cab.pessoa,
        cab.localDestinoOperacao,
        cab.indicadorConsumidorFinal,
        cab.tipoPagamentoFrete,
        cab.indicadorInscricaoEstadual,
        /* Retornos */
        v_cab_valorProdutos,
        v_cab_valorServicos,
        v_cab_valorBasePagamento,
        v_cab_valorAVistaMinimo,
        v_cab_valorFreteTotal,
        v_cab_valorSeguroTotal,
        v_cab_valorDescontoTotal,
        v_cab_valorOutrasDespesasTotal,
        v_cab_valorAdicFreteMarinTotal,
        v_cab_valorDespesasAduanTotal,
        v_cab_valorImpSomaPagamento,
        v_cab_valorImpDiminuiPagamento,
        v_cab_valorLiquidoItem,
        v_cab_valorDescCustoOpTotal,
        v_cab_valorAcrescCustoOpTotal,
        v_cab_valorCustoOperacao,
        v_cab_valorCMV,
        v_cab_valorAcrescExtempTotal);
    END IF;
    UPDATE MOPREDOCUMENTOS SET 
      valorProdutos                 = v_cab_valorProdutos,
      valorServicos                 = v_cab_valorServicos,
      valorBasePagamento            = v_cab_valorBasePagamento,
      valorAVistaMinimo             = v_cab_valorAVistaMinimo,
      valorFreteTotal               = v_cab_valorFreteTotal,
      valorSeguroTotal              = v_cab_valorSeguroTotal,
      valorDescontoTotal            = v_cab_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarinTotal,
      valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
      valorImpostosSomaPagamento    = v_cab_valorImpSomaPagamento,
      valorImpostosDiminuiPagamento = v_cab_valorImpDiminuiPagamento,
      valorLiquidoItem              = v_cab_valorLiquidoItem,
      valorDescontoCustoOpTotal     = v_cab_valorDescCustoOpTotal,
      valorAcrescimoCustoOpTotal    = v_cab_valorAcrescCustoOpTotal,
      valorCustoOperacao            = v_cab_valorCustoOperacao,
      valorCMV                      = v_cab_valorCMV,
      valorAcrescimoExtempTotal     = v_cab_valorAcrescExtempTotal
    WHERE preDocumento              = cab.preDocumento;
  END LOOP;
END ADD_PRE_DOC_CALC_IMP_CAB;

/

INSERT INTO SIMENUS (menu, descricao, ativo, ordenacao, tipoMenu, categoriaMenu, menuPrincipal, aplicacao, nomePublico, categoriaConfiguracao, categoriaPersonalCampo, categoriaMemoriaSistema, permiteReport, observacoes) values (875, 'Conferências Transferências', 1, 10002009, 'MO', 100001, 875, '%SYS_DIR%Versoes\%SYS_VER%\Movimentos.ecf', 'PesqConferenciasTransferencias', 0, 0, 0, 0, ' ');

COMMIT;

create or replace PROCEDURE ADD_CALCULA_IMPOSTOS_ITEM (
    p_config_64_casasDecSaidas     IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_330_redIcmsBasePisCof IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_devolucaoAnulacaoRetorno 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,
    p_personalizacao               IN NUMBER,
    p_quantidade                   IN NUMBER,
    p_precoPautaTabelado           IN NUMBER,
    p_valorProdutoServico          IN NUMBER,
    p_valorFreteTotal              IN NUMBER,
    p_valorSeguroTotal             IN NUMBER,
    p_valorDescontoTotal           IN NUMBER,
    p_valorOutrasDespesasTotal     IN NUMBER,
    p_valorAdicFreteMarinMerTotal  IN NUMBER,
    p_valorDespesasAduaneirasTotal IN NUMBER,
    p_cfop                         IN NUMBER,
    p_calcularISSQN                IN NUMBER,
    p_indicadorISSQN               IN CHAR,
    p_aliquotaISSQN                IN NUMBER,
    p_baseISSQN                    IN NUMBER,
    p_valorISSQN                   IN NUMBER,
    p_calcularIRRF                 IN NUMBER,
    p_aliquotaIRRF                 IN NUMBER,
    p_baseIRRF                     IN NUMBER,
    p_valorIRRF                    IN NUMBER,
    p_calcularINSS                 IN NUMBER,
    p_aliquotaINSS                 IN NUMBER,
    p_baseINSS                     IN NUMBER,
    p_valorINSS                    IN NUMBER,
    p_calcularRetencaoPIS          IN NUMBER,
    p_retencaoPIS                  IN NUMBER,
    p_baseRetPIS                   IN NUMBER,
    p_valorRetPIS                  IN NUMBER,
    p_calcularRetencaoCOFINS       IN NUMBER,
    p_retencaoCOFINS               IN NUMBER,
    p_baseRetCOFINS                IN NUMBER,
    p_valorRetCOFINS               IN NUMBER,
    p_calcularRetencaoCSLL         IN NUMBER,
    p_retencaoCSLL                 IN NUMBER,
    p_baseRetCSLL                  IN NUMBER,
    p_valorRetCSLL                 IN NUMBER,
    p_calcularII                   IN NUMBER,
    p_aliquotaII                   IN NUMBER,
    p_baseII                       IN NUMBER,
    p_valorII                      IN NUMBER,
    p_calcularIOF                  IN NUMBER,
    p_aliquotaIOF                  IN NUMBER,
    p_baseIOF                      IN NUMBER,
    p_valorIOF                     IN NUMBER,
    p_calcularIPI                  IN NUMBER,
    p_aliquotaIPI                  IN NUMBER,
    p_valorAliquotaIPI             IN NUMBER,
    p_baseIPI                      IN NUMBER,
    p_valorIPI                     IN NUMBER,
    p_valorIPIDevolucao            IN NUMBER,
    p_calcularPIS                  IN NUMBER,
    p_aliquotaPIS                  IN NUMBER,
    p_valorAliquotaPIS             IN NUMBER,
    p_basePIS                      IN NUMBER,
    p_valorPIS                     IN NUMBER,
    p_calcularPISST                IN NUMBER,
    p_aliquotaPISST                IN NUMBER,
    p_valorAliquotaPISST           IN NUMBER,
    p_basePISST                    IN NUMBER,
    p_valorPISST                   IN NUMBER,
    p_calcularCOFINS               IN NUMBER,
    p_aliquotaCOFINS               IN NUMBER,
    p_valorAliquotaCOFINS          IN NUMBER,
    p_baseCOFINS                   IN NUMBER,
    p_valorCOFINS                  IN NUMBER,
    p_calcularCOFINSST             IN NUMBER,
    p_aliquotaCOFINSST             IN NUMBER,
    p_valorAliquotaCOFINSST        IN NUMBER,
    p_baseCOFINSST                 IN NUMBER,
    p_valorCOFINSST                IN NUMBER,
    p_calcularSimplesNacional      IN NUMBER,
    p_stSimplesNacional            IN CHAR,
    p_creditoSimplesNacional       IN NUMBER,
    p_baseCreditoSimplesNacional   IN NUMBER,
    p_valorCreditoSimplesNacional  IN NUMBER,
    p_calcularICMS                 IN NUMBER,
    p_stICMS                       IN CHAR,
    p_modalidadeBaseCalcICMS       IN CHAR,
    p_reducaoBaseICMS              IN NUMBER,
    p_aliquotaICMS                 IN NUMBER,
    p_diferimentoICMS              IN NUMBER,
    p_baseICMS                     IN NUMBER,
    p_valorICMSOperacao            IN NUMBER,
    p_valorICMSDiferido            IN NUMBER,
    p_valorICMS                    IN NUMBER,
    p_valorICMSDesoneracao         IN NUMBER,
    p_calcularICMSST               IN NUMBER,
    p_modalidadeBaseCalcICMSST     IN CHAR,
    p_margemValorAdicionadoST      IN NUMBER,
    p_reducaoBaseST                IN NUMBER,
    p_aliquotaICMSST               IN NUMBER,
    p_baseICMSST                   IN NUMBER,
    p_valorICMSST                  IN NUMBER,
    p_calcularICMSSTAnterEfetivo   IN NUMBER,
    p_baseICMSSTAnteriormente      IN NUMBER,
    p_valorICMSSTAnteriormente     IN NUMBER,
    p_valorICMSProprioSubstituto   IN NUMBER,
    p_reducaoBaseICMSEfetivo       IN NUMBER,
    p_aliquotaICMSEfetivo          IN NUMBER,
    p_baseICMSEfetivo              IN NUMBER,
    p_valorICMSEfetivo             IN NUMBER,
    p_calcularICMSEscrituracao     IN NUMBER,
    p_stICMSEscrituracao           IN CHAR,
    p_reducaoBaseICMSEscrituracao  IN NUMBER,
    p_aliquotaICMSEscrituracao     IN NUMBER,
    p_baseICMSEscrituracao         IN NUMBER,
    p_valorICMSEscrituracao        IN NUMBER,
    p_valorICMSDesonEscrituracao   IN NUMBER,
    p_calcularICMSSTEscrituracao   IN NUMBER,
    p_margemValorAdicSTEscriturac  IN NUMBER,
    p_reducaoBaseSTEscrituracao    IN NUMBER,
    p_aliquotaICMSSTEscrituracao   IN NUMBER,
    p_baseICMSSTEscrituracao       IN NUMBER,
    p_valorICMSSTEscrituracao      IN NUMBER,
    p_calcularDIFAL                IN NUMBER,
    p_aliquotaICMSUFDestinatario   IN NUMBER,
    p_aliquotaICMSInterestadual    IN NUMBER,
    p_partilhaICMSInterestadual    IN NUMBER,
    p_baseICMSUFDestinatario       IN NUMBER,
    p_valorICMSUFDestinatario      IN NUMBER,
    p_baseICMSUFRemetente          IN NUMBER,
    p_valorICMSUFRemetente         IN NUMBER,
    p_calcularFCP                  IN NUMBER,
    p_aliquotaFCP                  IN NUMBER,
    p_baseFCP                      IN NUMBER,
    p_valorFCP                     IN NUMBER,
    p_aliquotaFCPST                IN NUMBER,
    p_baseFCPST                    IN NUMBER,
    p_valorFCPST                   IN NUMBER,
    p_aliquotaFCPSTAnteriormente   IN NUMBER,
    p_baseFCPSTAnteriormente       IN NUMBER,
    p_valorFCPSTAnteriormente      IN NUMBER,
    p_aliquotaFCPUFDestinatario    IN NUMBER,
    p_baseFCPUFDestinatario        IN NUMBER,
    p_valorFCPUFDestinatario       IN NUMBER,
    p_calcularImpostosEstimados    IN NUMBER,
    p_aliquotaEstImpFederais       IN NUMBER,
    p_aliquotaEstImpEstaduais      IN NUMBER,
    p_aliquotaEstImpMunicipais     IN NUMBER,
    p_baseEstimadaImpostos         IN NUMBER,
    p_valorEstimadoImpFederais     IN NUMBER,
    p_valorEstimadoImpEstaduais    IN NUMBER,
    p_valorEstimadoImpMunicipais   IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_gradProd_cor                 IN NUMBER,
    p_gradProd_tamanho             IN VARCHAR,
    p_prod_controleEstoque         IN NUMBER,
    p_prod_tipoProduto             IN CHAR,
    /* Retornos */
    r_baseISSQN                    OUT NUMBER,
    r_valorISSQN                   OUT NUMBER,
    r_baseIRRF                     OUT NUMBER,
    r_valorIRRF                    OUT NUMBER,
    r_baseINSS                     OUT NUMBER,
    r_valorINSS                    OUT NUMBER,
    r_baseRetPIS                   OUT NUMBER,
    r_valorRetPIS                  OUT NUMBER,
    r_baseRetCOFINS                OUT NUMBER,
    r_valorRetCOFINS               OUT NUMBER,
    r_baseRetCSLL                  OUT NUMBER,
    r_valorRetCSLL                 OUT NUMBER,
    r_baseII                       OUT NUMBER,
    r_valorII                      OUT NUMBER,
    r_baseIOF                      OUT NUMBER,
    r_valorIOF                     OUT NUMBER,
    r_baseIPI                      OUT NUMBER,
    r_valorIPI                     OUT NUMBER,
    r_basePIS                      OUT NUMBER,
    r_valorPIS                     OUT NUMBER,
    r_basePISST                    OUT NUMBER,
    r_valorPISST                   OUT NUMBER,
    r_baseCOFINS                   OUT NUMBER,
    r_valorCOFINS                  OUT NUMBER,
    r_baseCOFINSST                 OUT NUMBER,
    r_valorCOFINSST                OUT NUMBER,
    r_baseCreditoSimplesNacional   OUT NUMBER,
    r_valorCreditoSimplesNacional  OUT NUMBER,
    r_baseICMS                     OUT NUMBER,
    r_valorICMSOperacao            OUT NUMBER,
    r_valorICMSDiferido            OUT NUMBER,
    r_valorICMS                    OUT NUMBER,
    r_valorICMSDesoneracao         OUT NUMBER,
    r_baseICMSST                   OUT NUMBER,
    r_valorICMSST                  OUT NUMBER,
    r_baseICMSSTAnteriormente      OUT NUMBER,
    r_valorICMSSTAnteriormente     OUT NUMBER,
    r_valorICMSProprioSubstituto   OUT NUMBER,
    r_baseICMSEfetivo              OUT NUMBER,
    r_valorICMSEfetivo             OUT NUMBER,
    r_baseICMSEscrituracao         OUT NUMBER,
    r_valorICMSEscrituracao        OUT NUMBER,
    r_valorICMSDesonEscrituracao   OUT NUMBER,
    r_baseICMSSTEscrituracao       OUT NUMBER,
    r_valorICMSSTEscrituracao      OUT NUMBER,
    r_baseICMSUFDestinatario       OUT NUMBER,
    r_valorICMSUFDestinatario      OUT NUMBER,
    r_baseICMSUFRemetente          OUT NUMBER,
    r_valorICMSUFRemetente         OUT NUMBER,
    r_baseFCP                      OUT NUMBER,
    r_valorFCP                     OUT NUMBER,
    r_baseFCPST                    OUT NUMBER,
    r_valorFCPST                   OUT NUMBER,
    r_baseFCPSTAnteriormente       OUT NUMBER,
    r_valorFCPSTAnteriormente      OUT NUMBER,
    r_baseFCPUFDestinatario        OUT NUMBER,
    r_valorFCPUFDestinatario       OUT NUMBER,
    r_baseEstimadaImpostos         OUT NUMBER,
    r_valorEstimadoImpFederais     OUT NUMBER,
    r_valorEstimadoImpEstaduais    OUT NUMBER,
    r_valorEstimadoImpMunicipais    OUT NUMBER)
IS
    v_baseICMSSTAnteriormente      NUMBER;
    v_valorICMSSTAnteriormente     NUMBER;
    v_valorICMSProprioSubstituto   NUMBER;
    v_baseFCPSTAnteriormente       NUMBER;
    v_valorFCPSTAnteriormente      NUMBER;
BEGIN
  /* Inicia retornos com paramentros */
  r_baseISSQN                   := p_baseISSQN;
  r_valorISSQN                  := p_valorISSQN;
  r_baseIRRF                    := p_baseIRRF;
  r_valorIRRF                   := p_valorIRRF;
  r_baseINSS                    := p_baseINSS;
  r_valorINSS                   := p_valorINSS;
  r_baseRetPIS                  := p_baseRetPIS;
  r_valorRetPIS                 := p_valorRetPIS;
  r_baseRetCOFINS               := p_baseRetCOFINS;
  r_valorRetCOFINS              := p_valorRetCOFINS;
  r_baseRetCSLL                 := p_baseRetCSLL;
  r_valorRetCSLL                := p_valorRetCSLL;
  r_baseII                      := p_baseII;
  r_valorII                     := p_valorII;
  r_baseIOF                     := p_baseIOF;
  r_valorIOF                    := p_valorIOF;
  r_baseIPI                     := p_baseIPI;
  r_valorIPI                    := p_valorIPI;
  r_basePIS                     := p_basePIS;
  r_valorPIS                    := p_valorPIS;
  r_basePISST                   := p_basePISST;
  r_valorPISST                  := p_valorPISST;
  r_baseCOFINS                  := p_baseCOFINS;
  r_valorCOFINS                 := p_valorCOFINS;
  r_baseCOFINSST                := p_baseCOFINSST;
  r_valorCOFINSST               := p_valorCOFINSST;
  r_baseCreditoSimplesNacional  := p_baseCreditoSimplesNacional;
  r_valorCreditoSimplesNacional := p_valorCreditoSimplesNacional;
  r_baseICMS                    := p_baseICMS;
  r_valorICMSOperacao           := p_valorICMSOperacao;
  r_valorICMSDiferido           := p_valorICMSDiferido;
  r_valorICMS                   := p_valorICMS;
  r_valorICMSDesoneracao        := p_valorICMSDesoneracao;
  r_baseICMSST                  := p_baseICMSST;
  r_valorICMSST                 := p_valorICMSST;
  r_baseICMSSTAnteriormente     := p_baseICMSSTAnteriormente;
  r_valorICMSSTAnteriormente    := p_valorICMSSTAnteriormente;
  r_valorICMSProprioSubstituto  := p_valorICMSProprioSubstituto;
  r_baseICMSEfetivo             := p_baseICMSEfetivo;
  r_valorICMSEfetivo            := p_valorICMSEfetivo;
  r_baseICMSEscrituracao        := p_baseICMSEscrituracao;
  r_valorICMSEscrituracao       := p_valorICMSEscrituracao;
  r_valorICMSDesonEscrituracao  := p_valorICMSDesonEscrituracao;
  r_baseICMSSTEscrituracao      := p_baseICMSSTEscrituracao;
  r_valorICMSSTEscrituracao     := p_valorICMSSTEscrituracao;
  r_baseICMSUFDestinatario      := p_baseICMSUFDestinatario;
  r_valorICMSUFDestinatario     := p_valorICMSUFDestinatario;
  r_baseICMSUFRemetente         := p_baseICMSUFRemetente;
  r_valorICMSUFRemetente        := p_valorICMSUFRemetente;
  r_baseFCP                     := p_baseFCP;
  r_valorFCP                    := p_valorFCP;
  r_baseFCPST                   := p_baseFCPST;
  r_valorFCPST                  := p_valorFCPST;
  r_baseFCPSTAnteriormente      := p_baseFCPSTAnteriormente;
  r_valorFCPSTAnteriormente     := p_valorFCPSTAnteriormente;
  r_baseFCPUFDestinatario       := p_baseFCPUFDestinatario;
  r_valorFCPUFDestinatario      := p_valorFCPUFDestinatario;
  r_baseEstimadaImpostos        := p_baseEstimadaImpostos;
  r_valorEstimadoImpFederais    := p_valorEstimadoImpFederais;
  r_valorEstimadoImpEstaduais   := p_valorEstimadoImpEstaduais;
  r_valorEstimadoImpMunicipais  := p_valorEstimadoImpMunicipais;
  /* ISSQN */
  IF p_calcularISSQN = 1 THEN
    IF p_indicadorISSQN = '1' THEN
      r_baseISSQN := p_valorProdutoServico - p_valorDescontoTotal + p_valorOutrasDespesasTotal;
      r_valorISSQN := ROUND ((r_baseISSQN * p_aliquotaISSQN / 100), 2);
    ELSE
      r_baseISSQN := 0;
      r_valorISSQN := 0;
    END IF;
  END IF;
  /* IRRF */
  IF p_calcularIRRF = 1 THEN
    IF p_aliquotaIRRF > 0 THEN
      r_baseIRRF := p_valorProdutoServico - p_valorDescontoTotal + p_valorOutrasDespesasTotal;
      r_valorIRRF := ROUND ((r_baseIRRF * p_aliquotaIRRF / 100), 2);
    ELSE
      r_baseIRRF := 0;
      r_valorIRRF := 0;
    END IF;
  END IF;
  /* INSS */
  IF p_calcularINSS = 1 THEN
    IF p_aliquotaINSS > 0 THEN
      r_baseINSS := p_valorProdutoServico - p_valorDescontoTotal + p_valorOutrasDespesasTotal;
      r_valorINSS := ROUND ((r_baseINSS * p_aliquotaINSS / 100), 2);
    ELSE
      r_baseINSS := 0;
      r_valorINSS := 0;
    END IF;
  END IF;
  /* Retenção PIS */
  IF p_calcularRetencaoPIS = 1 THEN
    IF p_retencaoPIS > 0 THEN
      r_baseRetPIS := p_valorProdutoServico - p_valorDescontoTotal + p_valorOutrasDespesasTotal;
      r_valorRetPIS := ROUND ((r_baseRetPIS * p_retencaoPIS / 100), 2);
    ELSE
      r_baseRetPIS := 0;
      r_valorRetPIS := 0;
    END IF;
  END IF;
  /* Retenção COFINS */
  IF p_calcularRetencaoCOFINS = 1 THEN
    IF p_retencaoCOFINS > 0 THEN
      r_baseRetCOFINS := p_valorProdutoServico - p_valorDescontoTotal + p_valorOutrasDespesasTotal;
      r_valorRetCOFINS := ROUND ((r_baseRetCOFINS * p_retencaoCOFINS / 100), 2);
    ELSE
      r_baseRetCOFINS := 0;
      r_valorRetCOFINS := 0;
    END IF;
  END IF;
  /* Retenção CSLL */
  IF p_calcularRetencaoCSLL = 1 THEN
    IF p_retencaoCSLL > 0 THEN
      r_baseRetCSLL := p_valorProdutoServico - p_valorDescontoTotal + p_valorOutrasDespesasTotal;
      r_valorRetCSLL := ROUND ((r_baseRetCSLL * p_retencaoCSLL / 100), 2);
    ELSE
      r_baseRetCSLL := 0;
      r_valorRetCSLL := 0;
    END IF;
  END IF;
  /* II */
  IF p_calcularII = 1 THEN
    IF p_aliquotaII > 0 THEN
      r_baseII :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal;
      r_valorII := ROUND ((r_baseII * p_aliquotaII / 100), 2);
    ELSE
      r_baseII := 0;
      r_valorII := 0;
    END IF;
  END IF;
  /* IOF */
  IF p_calcularIOF = 1 THEN
    IF p_aliquotaIOF > 0 THEN
      r_baseIOF := 
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal;
      r_valorIOF := ROUND ((r_baseIOF * p_aliquotaIOF / 100), 2);
    ELSE
      r_baseIOF := 0;
      r_valorIOF := 0;
    END IF;
  END IF;
  /* IPI */
  IF p_calcularIPI = 1 THEN
    IF p_aliquotaIPI > 0 THEN
      r_baseIPI :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF;
      r_valorIPI := ROUND ((r_baseIPI * p_aliquotaIPI / 100), 2);
    ELSE
      r_baseIPI := 0;
      r_valorIPI := 0;
    END IF;
    IF p_valorAliquotaIPI > 0 THEN
      r_valorIPI := ROUND ((r_valorIPI + (p_quantidade * p_valorAliquotaIPI)), 2);
    END IF;
  END IF;
  /* Simples Nacional */
  IF p_calcularSimplesNacional = 1 THEN
    IF p_stSimplesNacional IN('101','102','201','202','900') AND p_creditoSimplesNacional > 0 THEN
      r_baseCreditoSimplesNacional :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        + CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END AND p_prod_tipoProduto IN ('07','08') OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END AND (p_cab_indicadorConsumidorFinal = '0' OR p_pess_indicadorInscricaoEstad = '9') THEN r_valorIPI + p_valorIPIDevolucao ELSE 0 END;
      r_valorCreditoSimplesNacional := ROUND ((r_baseCreditoSimplesNacional * p_creditoSimplesNacional / 100), 2);
    ELSE
      r_baseCreditoSimplesNacional := 0;
      r_valorCreditoSimplesNacional := 0;
    END IF;
  END IF;
  /* ICMS */
  IF p_calcularICMS = 1 THEN
      r_baseICMS := 0;
      r_valorICMSOperacao := 0;
      r_valorICMSDiferido := 0;
      r_valorICMS := 0;
      r_valorICMSDesoneracao := 0;
    IF p_aliquotaICMS > 0 AND (p_stSimplesNacional IS NULL OR p_stSimplesNacional = '   ') AND p_stICMS IN ('40','41','50') THEN
      r_valorICMSDesoneracao := ROUND (((
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        + CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END AND p_prod_tipoProduto IN ('07','08') OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END AND (p_cab_indicadorConsumidorFinal = '0' OR p_pess_indicadorInscricaoEstad = '9') THEN r_valorIPI + p_valorIPIDevolucao ELSE 0 END
      ) * p_aliquotaICMS / 100), 2);
    ELSIF p_aliquotaICMS > 0 AND (p_stSimplesNacional IS NULL OR p_stSimplesNacional = '   ') AND (p_stICMS IN ('00','10','20','51','70') OR p_stICMS = '90' AND p_aliquotaICMS > 0) OR p_stSimplesNacional = '900' AND p_aliquotaICMS > 0 THEN
      r_baseICMS :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        + CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END AND p_prod_tipoProduto IN ('07','08') OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END AND (p_cab_indicadorConsumidorFinal = '0' OR p_pess_indicadorInscricaoEstad = '9') THEN r_valorIPI + p_valorIPIDevolucao ELSE 0 END;
      IF p_precoPautaTabelado > 0 AND (p_modalidadeBaseCalcICMS = '1' OR p_modalidadeBaseCalcICMS = '2' AND r_baseICMS > p_quantidade * p_precoPautaTabelado) THEN
        r_baseICMS := ROUND ((p_quantidade * p_precoPautaTabelado), 2);
      END IF;
      r_valorICMS := ROUND ((r_baseICMS * p_aliquotaICMS / 100), 2);
      IF ((p_stSimplesNacional IS NULL OR p_stSimplesNacional = '   ') AND p_stICMS IN ('20','70','90') OR p_stSimplesNacional = '900') AND p_reducaoBaseICMS > 0 THEN
        r_valorICMSDesoneracao := ROUND ((r_baseICMS * p_aliquotaICMS / 100), 2);
        r_baseICMS := ROUND ((r_baseICMS * (1 - p_reducaoBaseICMS / 100)), 2);
        r_valorICMS := ROUND ((r_baseICMS * p_aliquotaICMS / 100), 2);
        r_valorICMSDesoneracao := r_valorICMSDesoneracao - r_valorICMS;
      ELSE
        IF (p_stSimplesNacional IS NULL OR p_stSimplesNacional = '   ') AND p_stICMS = '51' AND p_reducaoBaseICMS > 0 AND p_reducaoBaseICMS <> p_diferimentoICMS THEN
          r_baseICMS := ROUND ((r_baseICMS * (1 - p_reducaoBaseICMS / 100)), 2);
          r_valorICMS := ROUND ((r_baseICMS * p_aliquotaICMS / 100), 2);
        END IF;
        r_valorICMSDesoneracao := 0;
      END IF;
      IF (p_stSimplesNacional IS NULL OR p_stSimplesNacional = '   ') AND p_stICMS = '51' THEN
        r_valorICMSOperacao := r_valorICMS;
        r_valorICMSDiferido := ROUND ((r_valorICMSOperacao * p_diferimentoICMS / 100), 2);
        r_valorICMS := r_valorICMSOperacao - r_valorICMSDiferido;
        IF r_valorICMS < 0 THEN
          r_valorICMS := 0;
        END IF;
      ELSE
        r_valorICMSOperacao := 0;
        r_valorICMSDiferido := 0;
      END IF;
    END IF;
  END IF;
  /* ICMS ST */
  IF p_calcularICMSST = 1 THEN
    IF (p_stSimplesNacional IS NULL OR p_stSimplesNacional = '   ') AND (p_stICMS IN ('10','30','70') OR p_stICMS = '90' AND p_aliquotaICMSST > 0) OR p_stSimplesNacional IN ('201','202') OR p_stSimplesNacional = '900' AND p_aliquotaICMSST > 0 THEN
      r_baseICMSST :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        + r_valorIPI
        + p_valorIPIDevolucao;
      IF p_precoPautaTabelado > 0 AND (p_modalidadeBaseCalcICMSST = '5' OR p_modalidadeBaseCalcICMSST = '0' AND r_baseICMSST > p_quantidade * p_precoPautaTabelado) AND ((p_stSimplesNacional IS NULL OR p_stSimplesNacional = '   ') AND p_stICMS IN ('10','30','70','90') OR p_stSimplesNacional IN ('201','202','900')) THEN
        r_baseICMSST := ROUND ((p_quantidade * p_precoPautaTabelado), 2);
      END IF;
      IF p_modalidadeBaseCalcICMSST = '4' OR (p_stSimplesNacional IS NULL OR p_stSimplesNacional = '   ') AND p_stICMS = '60' OR p_stSimplesNacional = '500' THEN
        r_baseICMSST := ROUND ((r_baseICMSST * (1 + p_margemValorAdicionadoST / 100)), 2);
      END IF;
      r_baseICMSST := ROUND ((r_baseICMSST * (1 - p_reducaoBaseST / 100)), 2);
      r_valorICMSST := ROUND (((r_baseICMSST * p_aliquotaICMSST / 100) - r_valorICMS), 2);
      IF r_valorICMSST <= 0 THEN
        r_baseICMSST := 0;
        r_valorICMSST := 0;
      END IF;
    ELSE
      r_baseICMSST := 0;
      r_valorICMSST := 0;
    END IF;
  END IF;
  /* Busca dados apenas quando precisa. */
  v_baseICMSSTAnteriormente := 0;
  v_valorICMSSTAnteriormente := 0;
  v_valorICMSProprioSubstituto := 0;
  v_baseFCPSTAnteriormente := 0;
  v_valorFCPSTAnteriormente := 0;
  IF (p_calcularICMSSTAnterEfetivo = 1 OR p_calcularFCP = 1) 
      AND ((p_stSimplesNacional IS NULL OR p_stSimplesNacional = '   ') AND p_stICMS='60' OR p_stSimplesNacional='500') 
      AND p_cab_indicadorConsumidorFinal = '0' 
      AND (p_cab_entradaSaida = 'S'
      OR p_cfop IN (1201,1202,1203,1204,1208,1209,1410,1411,1503,1504,1505,1506,1553,1660,1661,1662,1918,1919)
      OR p_cfop IN (2201,2202,2203,2204,2208,2209,2410,2411,2503,2504,2505,2506,2553,2660,2661,2662,2918,2919)
      OR p_cfop IN (3201,3202,3211,3503,3553)) THEN
    ADD_BUSCA_ICMS_ST_ANTERIOR (
      p_config_64_casasDecSaidas,
      p_config_209_filtrarGrupoEcon,
      p_config_362_calcCustoPorGrade,
      p_cab_estabelecimento,
      p_cab_dataEntradaSaida,
      p_personalizacao,
      p_quantidade,
      p_calcularICMSSTAnterEfetivo,
      p_calcularFCP,
      p_gradProd_produto,
      p_gradProd_cor,
      p_gradProd_tamanho,
      p_prod_controleEstoque,
      v_baseICMSSTAnteriormente,
      v_valorICMSSTAnteriormente,
      v_valorICMSProprioSubstituto,
      v_baseFCPSTAnteriormente,
      v_valorFCPSTAnteriormente
    );
  END IF;
  /* ICMS ST Retido Anteriormente / Efetivo */
  IF p_calcularICMSSTAnterEfetivo = 1 THEN
    r_baseICMSSTAnteriormente := v_baseICMSSTAnteriormente;
    r_valorICMSSTAnteriormente := v_valorICMSSTAnteriormente;
    r_valorICMSProprioSubstituto := v_valorICMSProprioSubstituto;
    IF ((p_stSimplesNacional IS NULL OR p_stSimplesNacional = '   ') AND p_stICMS = '60' OR p_stSimplesNacional = '500') AND p_aliquotaICMSEfetivo <> 0 THEN
      r_baseICMSEfetivo :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        + CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END AND p_prod_tipoProduto IN ('07','08') OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END AND (p_cab_indicadorConsumidorFinal = '0' OR p_pess_indicadorInscricaoEstad = '9') THEN r_valorIPI + p_valorIPIDevolucao ELSE 0 END;
      r_baseICMSEfetivo := ROUND ((r_baseICMSEfetivo * (1 - p_reducaoBaseICMSEfetivo / 100)), 2);
      r_valorICMSEfetivo := ROUND ((r_baseICMSEfetivo * p_aliquotaICMSEfetivo / 100), 2);
    ELSE
      r_baseICMSEfetivo := 0;
      r_valorICMSEfetivo := 0;
    END IF;
  END IF;
  /* ICMS Escrituracao */
  IF p_calcularICMSEscrituracao = 1 THEN
    IF p_stICMSEscrituracao = p_stICMS
      AND p_aliquotaICMSEscrituracao = p_aliquotaICMS
      AND p_reducaoBaseICMSEscrituracao = p_reducaoBaseICMS
    THEN
      IF p_cab_nfFornecedor = 1 AND p_stICMSEscrituracao = '51' AND p_diferimentoICMS <> 0 AND p_diferimentoICMS <> p_reducaoBaseICMS THEN
        r_baseICMSEscrituracao := ROUND ((r_baseICMS * (1 - p_diferimentoICMS / 100)), 2);
      ELSE
        r_baseICMSEscrituracao := r_baseICMS;
      END IF;
      r_valorICMSEscrituracao := r_valorICMS;
      r_valorICMSDesonEscrituracao := r_valorICMS;
    ELSE
      r_baseICMSEscrituracao := 0;
      r_valorICMSEscrituracao := 0;
      r_valorICMSDesonEscrituracao := 0;
      IF p_aliquotaICMSEscrituracao > 0 AND p_stICMSEscrituracao IN ('40','41','50') THEN
        r_valorICMSDesonEscrituracao := ROUND (((
          p_valorProdutoServico
          + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
          - p_valorDescontoTotal
          + p_valorOutrasDespesasTotal
          + p_valorAdicFreteMarinMerTotal
          + p_valorDespesasAduaneirasTotal
          + r_valorII
          + r_valorIOF
          + CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END AND p_prod_tipoProduto IN ('07','08') OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END AND (p_cab_indicadorConsumidorFinal = '0' OR p_pess_indicadorInscricaoEstad = '9') THEN r_valorIPI + p_valorIPIDevolucao ELSE 0 END
        ) * p_aliquotaICMSEscrituracao / 100), 2);
      ELSIF p_aliquotaICMSEscrituracao > 0 AND (p_stICMSEscrituracao IN ('00','10','20','51','70') OR p_stICMSEscrituracao = '90' AND p_aliquotaICMSEscrituracao > 0) THEN
        r_baseICMSEscrituracao :=
          p_valorProdutoServico
          + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
          - p_valorDescontoTotal
          + p_valorOutrasDespesasTotal
          + p_valorAdicFreteMarinMerTotal
          + p_valorDespesasAduaneirasTotal
          + r_valorII
          + r_valorIOF
          + CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END AND p_prod_tipoProduto IN ('07','08') OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END AND (p_cab_indicadorConsumidorFinal = '0' OR p_pess_indicadorInscricaoEstad = '9') THEN r_valorIPI + p_valorIPIDevolucao ELSE 0 END;
        r_valorICMSEscrituracao := ROUND ((r_baseICMSEscrituracao * p_aliquotaICMSEscrituracao / 100), 2);
        IF p_stICMSEscrituracao IN ('20','70','90') AND p_reducaoBaseICMSEscrituracao > 0 THEN
          r_valorICMSDesonEscrituracao := ROUND ((r_baseICMSEscrituracao * p_aliquotaICMSEscrituracao / 100), 2);
          r_baseICMSEscrituracao := ROUND ((r_baseICMSEscrituracao * (1 - p_reducaoBaseICMSEscrituracao / 100)), 2);
          r_valorICMSEscrituracao := ROUND ((r_baseICMSEscrituracao * p_aliquotaICMSEscrituracao / 100), 2);
          r_valorICMSDesonEscrituracao := r_valorICMSDesonEscrituracao - r_valorICMSEscrituracao;
        ELSIF p_stICMSEscrituracao = '51' AND p_reducaoBaseICMSEscrituracao > 0 AND p_reducaoBaseICMSEscrituracao <> p_diferimentoICMS THEN
            r_baseICMSEscrituracao := ROUND ((r_baseICMSEscrituracao * (1 - p_reducaoBaseICMSEscrituracao / 100)), 2);
            r_valorICMSEscrituracao := ROUND ((r_baseICMSEscrituracao * p_aliquotaICMSEscrituracao / 100), 2);
            r_valorICMSDesonEscrituracao := 0;
        ELSE
          r_valorICMSDesonEscrituracao := 0;
        END IF;
        IF p_stICMSEscrituracao = '51' THEN
          r_valorICMSEscrituracao := r_valorICMSEscrituracao - ROUND ((r_valorICMSEscrituracao * p_diferimentoICMS / 100), 2);
          IF p_cab_nfFornecedor = 1 THEN
            r_baseICMSEscrituracao := ROUND ((r_baseICMSEscrituracao * (1 - p_diferimentoICMS / 100)), 2);
          END IF;
          IF r_valorICMSEscrituracao < 0 THEN
            r_valorICMSEscrituracao := 0;
          END IF;
        END IF;
      END IF;
    END IF;
  END IF;
  /* ICMS ST Escrituracao */
  IF p_calcularICMSSTEscrituracao = 1 THEN
    IF p_stICMSEscrituracao = p_stICMS
      AND p_aliquotaICMSEscrituracao = p_aliquotaICMS
      AND p_reducaoBaseICMSEscrituracao = p_reducaoBaseICMS
      AND p_margemValorAdicSTEscriturac = p_margemValorAdicionadoST
      AND p_reducaoBaseSTEscrituracao = p_reducaoBaseST
      AND p_aliquotaICMSSTEscrituracao = p_aliquotaICMSST
    THEN
      r_baseICMSSTEscrituracao := r_baseICMSST;
      r_valorICMSSTEscrituracao := r_valorICMSST;
    ELSIF p_stICMSEscrituracao IN ('10','30','70') OR p_stICMSEscrituracao = '90' AND p_aliquotaICMSSTEscrituracao > 0 THEN
      r_baseICMSSTEscrituracao := ROUND ((ROUND (((
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        + CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END AND p_prod_tipoProduto IN ('07','08') OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END AND (p_cab_indicadorConsumidorFinal = '0' OR p_pess_indicadorInscricaoEstad = '9') THEN r_valorIPI + p_valorIPIDevolucao ELSE 0 END
      ) * (1 + p_margemValorAdicSTEscriturac / 100)), 2) * (1 - p_reducaoBaseSTEscrituracao / 100)), 2);
      r_valorICMSSTEscrituracao := ROUND (((r_baseICMSSTEscrituracao * p_aliquotaICMSSTEscrituracao / 100) - r_valorICMSEscrituracao), 2);
      IF r_valorICMSSTEscrituracao <= 0 THEN
        r_baseICMSSTEscrituracao := 0;
        r_valorICMSSTEscrituracao := 0;
      END IF;
    ELSE
      r_baseICMSSTEscrituracao := 0;
      r_valorICMSSTEscrituracao := 0;
    END IF;
  END IF;
  /* DIFAL */
  IF p_calcularDIFAL = 1 THEN
    IF p_cab_localDestinoOperacao = '2' AND (p_cab_entradaSaida = 'E' OR p_cab_indicadorConsumidorFinal = '1' OR p_pess_indicadorInscricaoEstad = '9') AND p_aliquotaICMSUFDestinatario <> 0 AND p_aliquotaICMSInterestadual <> 0 THEN
      IF (p_stSimplesNacional IS NULL OR p_stSimplesNacional = '   ') AND r_baseICMS = 0 OR p_stSimplesNacional IS NOT NULL AND p_stSimplesNacional <> '   ' AND r_baseCreditoSimplesNacional = 0 THEN
        r_baseICMSUFDestinatario :=
          p_valorProdutoServico
          + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
          - p_valorDescontoTotal
          + p_valorOutrasDespesasTotal
          + p_valorAdicFreteMarinMerTotal
          + p_valorDespesasAduaneirasTotal
          + r_valorII
          + r_valorIOF
          + CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END AND p_prod_tipoProduto IN ('07','08') OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END AND (p_cab_indicadorConsumidorFinal = '0' OR p_pess_indicadorInscricaoEstad = '9') THEN r_valorIPI + p_valorIPIDevolucao ELSE 0 END;
      ELSE
        r_baseICMSUFDestinatario := CASE WHEN (p_stSimplesNacional IS NULL OR p_stSimplesNacional = '   ') THEN r_baseICMS ELSE r_baseCreditoSimplesNacional END;
      END IF;
      r_baseICMSUFRemetente := r_baseICMSUFDestinatario;
      r_valorICMSUFDestinatario := ROUND ((r_baseICMSUFDestinatario * ((p_aliquotaICMSUFDestinatario - p_aliquotaICMSInterestadual) / 100) * (p_partilhaICMSInterestadual / 100)), 2);
      r_valorICMSUFRemetente := ROUND ((r_baseICMSUFRemetente * ((p_aliquotaICMSUFDestinatario - p_aliquotaICMSInterestadual) / 100) * (1 - p_partilhaICMSInterestadual / 100)), 2);
    ELSE
      r_baseICMSUFDestinatario := 0;
      r_valorICMSUFDestinatario := 0;
      r_baseICMSUFRemetente := 0;
      r_valorICMSUFRemetente := 0;
    END IF;
  END IF;
  /* Fundo de Combate a Pobreza */
  IF p_calcularFCP = 1 THEN
    IF r_baseCreditoSimplesNacional <> 0 AND p_aliquotaFCP <> 0 THEN
      r_baseFCP := r_baseCreditoSimplesNacional;
      r_valorFCP := ROUND ((r_baseFCP * p_aliquotaFCP / 100), 2);
    ELSIF (p_stSimplesNacional IS NULL OR p_stSimplesNacional = '   ') AND p_stICMS IN ('00','20','51','90') AND r_baseICMS <> 0 AND p_aliquotaFCP <> 0 THEN
      r_baseFCP := r_baseICMS;
      r_valorFCP := ROUND ((r_baseFCP * p_aliquotaFCP / 100), 2);
    ELSE
      r_baseFCP := 0;
      r_valorFCP := 0;
    END IF;
    /* Fundo de Combate a Pobreza ST */
    IF r_baseICMSST <> 0 AND p_aliquotaFCPST <> 0 THEN
      r_baseFCPST := r_baseICMSST;
      r_valorFCPST := ROUND ((r_baseFCPST * p_aliquotaFCPST / 100), 2);
    ELSE
      r_baseFCPST := 0;
      r_valorFCPST := 0;
    END IF;
    /* Fundo de Combate a Pobreza ICMS ST Retido Anteriormente */
    r_baseFCPSTAnteriormente := v_baseFCPSTAnteriormente;
    r_valorFCPSTAnteriormente := v_valorFCPSTAnteriormente;
    /* Fundo de Combate a Pobreza DIFAL */
    IF p_cab_localDestinoOperacao = '2' AND (p_cab_entradaSaida = 'E' OR p_cab_indicadorConsumidorFinal = '1' OR p_pess_indicadorInscricaoEstad = '9') AND r_baseICMSUFDestinatario <> 0 AND p_aliquotaFCPUFDestinatario <> 0 THEN
      r_baseFCPUFDestinatario := r_baseICMSUFDestinatario;
      r_valorFCPUFDestinatario := ROUND ((r_baseFCPUFDestinatario * p_aliquotaFCPUFDestinatario / 100), 2);
    ELSE
      r_baseFCPUFDestinatario := 0;
      r_valorFCPUFDestinatario := 0;
    END IF;
  END IF;
  /* PIS */
  IF p_calcularPIS = 1 THEN
    IF p_aliquotaPIS > 0 THEN
      r_basePIS :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        + r_valorIPI
        + p_valorIPIDevolucao
        - CASE WHEN p_config_330_redIcmsBasePisCof = 1 AND p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN r_valorICMS ELSE 0 END;
      r_valorPIS := ROUND ((r_basePIS * p_aliquotaPIS / 100), 2);
    ELSE
      r_basePIS := 0;
      r_valorPIS := 0;
    END IF;
    IF p_valorAliquotaPIS > 0 THEN
      r_valorPIS := ROUND ((r_valorPIS + (p_quantidade * p_valorAliquotaPIS)), 2);
    END IF;
  END IF;
  /* PIS ST */
  IF p_calcularPISST = 1 THEN
    IF p_aliquotaPISST > 0 THEN
      r_basePISST :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        + r_valorIPI
        + p_valorIPIDevolucao
        - CASE WHEN p_config_330_redIcmsBasePisCof = 1 AND p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN r_valorICMS ELSE 0 END;
      r_valorPISST := ROUND ((r_basePISST * p_aliquotaPISST / 100), 2);
    ELSE
      r_basePISST := 0;
      r_valorPISST := 0;
    END IF;
    IF p_valorAliquotaPISST > 0 THEN
      r_valorPISST := ROUND ((r_valorPISST + (p_quantidade * p_valorAliquotaPISST)), 2);
    END IF;
  END IF;
  /* COFINS */
  IF p_calcularCOFINS = 1 THEN
    IF p_aliquotaCOFINS > 0 THEN
      r_baseCOFINS :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        + r_valorIPI
        + p_valorIPIDevolucao
        - CASE WHEN p_config_330_redIcmsBasePisCof = 1 AND p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN r_valorICMS ELSE 0 END;
      r_valorCOFINS := ROUND ((r_baseCOFINS * p_aliquotaCOFINS / 100), 2);
    ELSE
      r_baseCOFINS := 0;
      r_valorCOFINS := 0;
    END IF;
    IF p_valorAliquotaCOFINS > 0 THEN
      r_valorCOFINS := ROUND ((r_valorCOFINS + (p_quantidade * p_valorAliquotaCOFINS)), 2);
    END IF;
  END IF;
  /* COFINS ST */
  IF p_calcularCOFINSST = 1 THEN
    IF p_aliquotaCOFINSST > 0 THEN
      r_baseCOFINSST :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + r_valorII
        + r_valorIOF
        + r_valorIPI
        + p_valorIPIDevolucao
        - CASE WHEN p_config_330_redIcmsBasePisCof = 1 AND p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END THEN r_valorICMS ELSE 0 END;
      r_valorCOFINSST := ROUND ((r_baseCOFINSST * p_aliquotaCOFINSST / 100), 2);
    ELSE
      r_baseCOFINSST := 0;
      r_valorCOFINSST := 0;
    END IF;
    IF p_valorAliquotaCOFINSST > 0 THEN
      r_valorCOFINSST := ROUND ((r_valorCOFINSST + (p_quantidade * p_valorAliquotaCOFINSST)), 2);
    END IF;
  END IF;
  /* Impostos Estimados */
  IF p_calcularImpostosEstimados = 1 THEN
    IF p_aliquotaEstImpFederais > 0 OR p_aliquotaEstImpEstaduais > 0 OR p_aliquotaEstImpMunicipais > 0 THEN
      r_baseEstimadaImpostos :=
        p_valorProdutoServico
        + CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal;
      r_valorEstimadoImpFederais := ROUND ((r_baseEstimadaImpostos * p_aliquotaEstImpFederais / 100), 2);
      r_valorEstimadoImpEstaduais := ROUND ((r_baseEstimadaImpostos * p_aliquotaEstImpEstaduais / 100), 2);
      r_valorEstimadoImpMunicipais := ROUND ((r_baseEstimadaImpostos * p_aliquotaEstImpMunicipais / 100), 2);
    ELSE
      r_baseEstimadaImpostos := 0;
      r_valorEstimadoImpFederais := 0;
      r_valorEstimadoImpEstaduais := 0;
      r_valorEstimadoImpMunicipais := 0;
    END IF;
  END IF;
END ADD_CALCULA_IMPOSTOS_ITEM;

/

create or replace PROCEDURE ADD_CALCULA_IMPOSTOS_ESCRIT (
    p_cab_entradaSaida             IN CHAR,
    p_cab_devolucaoAnulacaoRetorno IN NUMBER,
    p_cab_nfFornecedor             IN NUMBER,
    p_cab_indicadorConsumidorFinal IN CHAR,
    p_cab_tipoPagamentoFrete       IN CHAR,
    p_pess_indicadorInscricaoEstad IN CHAR,
    p_valorProdutoServico          IN NUMBER,
    p_valorFreteTotal              IN NUMBER,
    p_valorSeguroTotal             IN NUMBER,
    p_valorDescontoTotal           IN NUMBER,
    p_valorOutrasDespesasTotal     IN NUMBER,
    p_valorAdicFreteMarinMerTotal  IN NUMBER,
    p_valorDespesasAduaneirasTotal IN NUMBER,
    p_valorII                      IN NUMBER,
    p_valorIOF                     IN NUMBER,
    p_valorIPI                     IN NUMBER,
    p_valorIPIDevolucao            IN NUMBER,
    p_stICMS                       IN CHAR,
    p_reducaoBaseICMS              IN NUMBER,
    p_aliquotaICMS                 IN NUMBER,
    p_diferimentoICMS              IN NUMBER,
    p_baseICMS                     IN NUMBER,
    p_valorICMS                    IN NUMBER,
    p_valorICMSDesoneracao         IN NUMBER,
    p_margemValorAdicionadoST      IN NUMBER,
    p_reducaoBaseST                IN NUMBER,
    p_aliquotaICMSST               IN NUMBER,
    p_baseICMSST                   IN NUMBER,
    p_valorICMSST                  IN NUMBER,
    p_stICMSEscrituracao           IN CHAR,
    p_reducaoBaseICMSEscrituracao  IN NUMBER,
    p_aliquotaICMSEscrituracao     IN NUMBER,
    p_margemValorAdicSTEscriturac  IN NUMBER,
    p_reducaoBaseSTEscrituracao    IN NUMBER,
    p_aliquotaICMSSTEscrituracao   IN NUMBER,
    p_prod_tipoProduto             IN CHAR,
    /* Retornos */
    r_baseICMSEscrituracao         OUT NUMBER,
    r_valorICMSEscrituracao        OUT NUMBER,
    r_valorICMSDesonEscrituracao   OUT NUMBER,
    r_baseICMSSTEscrituracao       OUT NUMBER,
    r_valorICMSSTEscrituracao      OUT NUMBER)
IS      
BEGIN
  IF p_stICMSEscrituracao = p_stICMS
    AND p_aliquotaICMSEscrituracao = p_aliquotaICMS
    AND p_reducaoBaseICMSEscrituracao = p_reducaoBaseICMS
  THEN
    IF p_cab_nfFornecedor = 1 AND p_stICMSEscrituracao = '51' AND p_diferimentoICMS <> 0 AND p_diferimentoICMS <> p_reducaoBaseICMS THEN
      r_baseICMSEscrituracao := ROUND ((p_baseICMS * (1 - p_diferimentoICMS / 100)), 2);
    ELSE
      r_baseICMSEscrituracao := p_baseICMS;
    END IF;
    r_valorICMSEscrituracao := p_valorICMS;
    r_valorICMSDesonEscrituracao := p_valorICMS;
  ELSE
    r_baseICMSEscrituracao := 0;
    r_valorICMSEscrituracao := 0;
    r_valorICMSDesonEscrituracao := 0;
    IF p_aliquotaICMSEscrituracao > 0 AND p_stICMSEscrituracao IN ('40','41','50') THEN
      r_valorICMSDesonEscrituracao := ROUND (((
        p_valorProdutoServico
        + (CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END)
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + p_valorII
        + p_valorIOF
        + CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END AND p_prod_tipoProduto IN ('07','08') OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END AND (p_cab_indicadorConsumidorFinal = '0' OR p_pess_indicadorInscricaoEstad = '9') THEN p_valorIPI + p_valorIPIDevolucao ELSE 0 END
      ) * p_aliquotaICMSEscrituracao / 100), 2);
    ELSIF p_aliquotaICMSEscrituracao > 0 AND p_stICMSEscrituracao IN ('00','10','20','51','70','90') THEN
      r_baseICMSEscrituracao := (
        p_valorProdutoServico
        + (CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END)
        - p_valorDescontoTotal
        + p_valorOutrasDespesasTotal
        + p_valorAdicFreteMarinMerTotal
        + p_valorDespesasAduaneirasTotal
        + p_valorII
        + p_valorIOF
        + CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END AND p_prod_tipoProduto IN ('07','08') OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END AND (p_cab_indicadorConsumidorFinal = '0' OR p_pess_indicadorInscricaoEstad = '9') THEN p_valorIPI + p_valorIPIDevolucao ELSE 0 END
      );
      r_valorICMSEscrituracao := ROUND ((r_baseICMSEscrituracao * p_aliquotaICMSEscrituracao / 100), 2);
      IF p_stICMSEscrituracao IN ('20','70','90') AND p_reducaoBaseICMSEscrituracao > 0 THEN
        r_valorICMSDesonEscrituracao := ROUND ((r_baseICMSEscrituracao * p_aliquotaICMSEscrituracao / 100), 2);
        r_baseICMSEscrituracao := ROUND ((r_baseICMSEscrituracao * (1 - p_reducaoBaseICMSEscrituracao / 100)), 2);
        r_valorICMSEscrituracao := ROUND ((r_baseICMSEscrituracao * p_aliquotaICMSEscrituracao / 100), 2);
        r_valorICMSDesonEscrituracao := r_valorICMSDesonEscrituracao - r_valorICMSEscrituracao;
      ELSE
        IF p_stICMSEscrituracao = '51' AND p_reducaoBaseICMSEscrituracao > 0 AND p_reducaoBaseICMSEscrituracao <> p_diferimentoICMS THEN
          r_baseICMSEscrituracao := ROUND ((r_baseICMSEscrituracao * (1 - p_reducaoBaseICMSEscrituracao / 100)), 2);
          r_valorICMSEscrituracao := ROUND ((r_baseICMSEscrituracao * p_aliquotaICMSEscrituracao / 100), 2);
        END IF;
        r_valorICMSDesonEscrituracao := 0;
      END IF;
      IF p_stICMSEscrituracao = '51' THEN
        r_valorICMSEscrituracao := r_valorICMSEscrituracao - ROUND ((r_valorICMSEscrituracao * p_diferimentoICMS / 100), 2);
        IF p_cab_nfFornecedor = 1 THEN
          r_baseICMSEscrituracao := ROUND ((r_baseICMSEscrituracao * (1 - p_diferimentoICMS / 100)), 2);
        END IF;
        IF r_valorICMSEscrituracao <= 0 THEN
          r_baseICMSEscrituracao := 0;
          r_valorICMSEscrituracao := 0;
        END IF;
      END IF;
    END IF;
  END IF;
  IF p_stICMSEscrituracao = p_stICMS
    AND p_aliquotaICMSEscrituracao = p_aliquotaICMS
    AND p_reducaoBaseICMSEscrituracao = p_reducaoBaseICMS
    AND p_margemValorAdicSTEscriturac = p_margemValorAdicionadoST
    AND p_reducaoBaseSTEscrituracao = p_reducaoBaseST
    AND p_aliquotaICMSSTEscrituracao = p_aliquotaICMSST
  THEN
    r_baseICMSSTEscrituracao := p_baseICMSST;
    r_valorICMSSTEscrituracao := p_valorICMSST;
  ELSIF p_stICMSEscrituracao IN ('10','30','70') OR p_stICMSEscrituracao = '90' AND p_aliquotaICMSSTEscrituracao > 0 THEN
    r_baseICMSSTEscrituracao := ROUND ((ROUND (((
      p_valorProdutoServico
      + (CASE WHEN p_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE p_valorFreteTotal + p_valorSeguroTotal END)
      - p_valorDescontoTotal
      + p_valorOutrasDespesasTotal
      + p_valorAdicFreteMarinMerTotal
      + p_valorDespesasAduaneirasTotal
      + p_valorII
      + p_valorIOF
      + CASE WHEN p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'S' ELSE 'E' END AND p_prod_tipoProduto IN ('07','08') OR p_cab_entradaSaida = CASE WHEN p_cab_devolucaoAnulacaoRetorno = 1 THEN 'E' ELSE 'S' END AND (p_cab_indicadorConsumidorFinal = '0' OR p_pess_indicadorInscricaoEstad = '9') THEN p_valorIPI + p_valorIPIDevolucao ELSE 0 END
    ) * (1 + p_margemValorAdicSTEscriturac / 100)), 2) * (1 - p_reducaoBaseSTEscrituracao / 100)), 2);
    r_valorICMSSTEscrituracao := ROUND (((r_baseICMSSTEscrituracao * p_aliquotaICMSSTEscrituracao / 100) - r_valorICMSEscrituracao), 2);
    IF r_valorICMSSTEscrituracao <= 0 THEN
      r_baseICMSSTEscrituracao := 0;
      r_valorICMSSTEscrituracao := 0;
    END IF;
  ELSE
    r_baseICMSSTEscrituracao := 0;
    r_valorICMSSTEscrituracao := 0;
  END IF;
END ADD_CALCULA_IMPOSTOS_ESCRIT;

/

CREATE TABLE PACARTFINANCXESTABELECIM_2302 AS SELECT * FROM PACARTFINANCXESTABELECIM;

DROP TABLE PACARTFINANCXESTABELECIM;

-- PACARTFINANCXESTABELECIM
CREATE TABLE PACARTFINANCXESTABELECIM
  (
    id                         NUMERIC (14,0) DEFAULT 0 NOT NULL,
    carteiraFinanceira         NUMERIC (4,0) DEFAULT 0 NOT NULL,
    estabelecimento            NUMERIC (4,0) DEFAULT 0 NOT NULL,
    ativo                      NUMERIC (1,0) DEFAULT 0 NOT NULL,
    contaBancariaCaixa         NUMERIC (4,0) DEFAULT 0 NOT NULL,
    meioPagamentoBaixa         NUMERIC (2,0) DEFAULT 0 NOT NULL,
    diasParaCompensacao        NUMERIC (6,0) DEFAULT 0 NOT NULL,
    compensacaoAutomatica      NUMERIC (1,0) DEFAULT 0 NOT NULL,
    codigoTransmissao          VARCHAR (20) DEFAULT ' ' NOT NULL,
    carteira                   CHAR (4) DEFAULT '    ' NOT NULL,
    variacaoCarteira           VARCHAR (15) DEFAULT ' ' NOT NULL,
    especie                    CHAR (3) DEFAULT '   ' NOT NULL,
    moeda                      CHAR (3) DEFAULT '   ' NOT NULL,
    instrucaoA                 CHAR (3) DEFAULT '   ' NOT NULL,
    instrucaoB                 CHAR (3) DEFAULT '   ' NOT NULL,
    naoReceberApos             NUMERIC (6,0) DEFAULT 0 NOT NULL,
    protestarApos              NUMERIC (6,0) DEFAULT 0 NOT NULL,
    comando                    CHAR (3) DEFAULT '   ' NOT NULL,
    aceite                     CHAR (3) DEFAULT '   ' NOT NULL,
    boletoTextoA               VARCHAR (256) DEFAULT ' ' NOT NULL,
    boletoTextoB               VARCHAR (256) DEFAULT ' ' NOT NULL,
    boletoTextoC               VARCHAR (256) DEFAULT ' ' NOT NULL,
    boletoTextoD               VARCHAR (256) DEFAULT ' ' NOT NULL,
    boletoTextoE               VARCHAR (256) DEFAULT ' ' NOT NULL,
    carteiraFinanceiraProtesto NUMERIC (4,0) DEFAULT 0 NOT NULL,
    classificacaoPessoa        VARCHAR (3) DEFAULT ' ' NOT NULL,
    diretorioRemessa           VARCHAR (256) DEFAULT ' ' NOT NULL,
    basicAuthorizationBoleto   VARCHAR (600) DEFAULT ' ' NOT NULL,
    applicationKeyBoleto       VARCHAR (256) DEFAULT ' ' NOT NULL,
    basicAuthorizationPix      VARCHAR (600) DEFAULT ' ' NOT NULL,
    applicationKeyPix          VARCHAR (256) DEFAULT ' ' NOT NULL,
    tipoChavePix               NUMERIC (3,0) DEFAULT 0 NOT NULL,
    chavePix                   VARCHAR (600) DEFAULT ' ' NOT NULL,
    segundosExpiracao          NUMERIC (14,0) DEFAULT 0 NOT NULL,
    observacoes                VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PACARTFINANCXESTABELECIM ADD CONSTRAINT PACARTFINANCXESTABELECIM_PK1 PRIMARY KEY (id);
CREATE UNIQUE INDEX PACARTFINANCXESTABELECIM_K2 ON PACARTFINANCXESTABELECIM (carteiraFinanceira, estabelecimento);

INSERT INTO PACARTFINANCXESTABELECIM (id, carteiraFinanceira, estabelecimento, ativo, contaBancariaCaixa, meioPagamentoBaixa, diasParaCompensacao, compensacaoAutomatica, codigoTransmissao, carteira, variacaoCarteira, especie, moeda, instrucaoA, instrucaoB, naoReceberApos, protestarApos, comando, aceite, boletoTextoA, boletoTextoB, boletoTextoC, boletoTextoD, boletoTextoE, carteiraFinanceiraProtesto, classificacaoPessoa, diretorioRemessa, basicAuthorizationBoleto, applicationKeyBoleto, basicAuthorizationPix, applicationKeyPix, tipoChavePix, chavePix, segundosExpiracao, observacoes) VALUES (0, 0, 0, 1, 0, 0, 0, 0, ' ', '    ', ' ', '   ', '   ', '   ', '   ', 0, 0, '   ', '   ', ' ', ' ', ' ', ' ', ' ', 0, ' ', ' ', ' ', ' ', ' ', ' ', 0, ' ', 0, ' ');
INSERT INTO PACARTFINANCXESTABELECIM (id, carteiraFinanceira, estabelecimento, ativo, contaBancariaCaixa, meioPagamentoBaixa, diasParaCompensacao, compensacaoAutomatica, codigoTransmissao, carteira, variacaoCarteira, especie, moeda, instrucaoA, instrucaoB, naoReceberApos, protestarApos, comando, aceite, boletoTextoA, boletoTextoB, boletoTextoC, boletoTextoD, boletoTextoE, carteiraFinanceiraProtesto, classificacaoPessoa, diretorioRemessa, basicAuthorizationBoleto, applicationKeyBoleto, basicAuthorizationPix, applicationKeyPix, tipoChavePix, chavePix, segundosExpiracao, observacoes) SELECT id, carteiraFinanceira, estabelecimento, ativo, contaBancariaCaixa, meioPagamentoBaixa, diasParaCompensacao, compensacaoAutomatica, codigoTransmissao, carteira, variacaoCarteira, especie, moeda, instrucaoA, instrucaoB, naoReceberApos, protestarApos, comando, aceite, boletoTextoA, boletoTextoB, boletoTextoC, boletoTextoD, boletoTextoE, carteiraFinanceiraProtesto, classificacaoPessoa, diretorioRemessa, ' ', ' ', basicAuthorization, applicationKey, tipoChavePix, chavePix, segundosExpiracao, observacoes FROM PACARTFINANCXESTABELECIM_2302 WHERE id > 0;

COMMIT;

ALTER TABLE PACARTFINANCXESTABELECIM ADD CONSTRAINT PACARTFINANCXESTABELECIM_FK1 FOREIGN KEY (carteiraFinanceira) REFERENCES PACARTEIRASFINANCEIRAS (carteiraFinanceira);
ALTER TABLE PACARTFINANCXESTABELECIM ADD CONSTRAINT PACARTFINANCXESTABELECIM_FK2 FOREIGN KEY (estabelecimento) REFERENCES PAESTABELECIMENTOS (estabelecimento);
ALTER TABLE PACARTFINANCXESTABELECIM ADD CONSTRAINT PACARTFINANCXESTABELECIM_FK3 FOREIGN KEY (contaBancariaCaixa) REFERENCES PACONTASBANCARIASCAIXAS (contaBancariaCaixa);
ALTER TABLE PACARTFINANCXESTABELECIM ADD CONSTRAINT PACARTFINANCXESTABELECIM_FK4 FOREIGN KEY (meioPagamentoBaixa) REFERENCES SIMEIOSPAGAMENTO (meioPagamento);
ALTER TABLE PACARTFINANCXESTABELECIM ADD CONSTRAINT PACARTFINANCXESTABELECIM_FK5 FOREIGN KEY (carteiraFinanceiraProtesto) REFERENCES PACARTEIRASFINANCEIRAS (carteiraFinanceira);
ALTER TABLE PACARTFINANCXESTABELECIM ADD CONSTRAINT PACARTFINANCXESTABELECIM_FK6 FOREIGN KEY (classificacaoPessoa) REFERENCES PACLASSIFICACOESPESSOA (classificacaoPessoa);
ALTER TABLE PACARTFINANCXESTABELECIM ADD CONSTRAINT PACARTFINANCXESTABELECIM_FK7 FOREIGN KEY (tipoChavePix) REFERENCES SITIPOSCHAVEPIX (tipoChavePix);

ALTER TABLE MOFINANCEIROXPIX MODIFY (locationPix VARCHAR2(256));

CREATE TABLE MOFINANCEIROXBOLETO_2302 AS SELECT * FROM MOFINANCEIROXBOLETO;

DROP TABLE MOFINANCEIROXBOLETO;

-- MOFINANCEIROXBOLETO
CREATE TABLE MOFINANCEIROXBOLETO
  (
    idFinanceiro           NUMERIC (14,0) DEFAULT 0 NOT NULL,
    banco                  CHAR (3) DEFAULT '   ' NOT NULL,
    nossoNumero            VARCHAR (25) DEFAULT ' ' NOT NULL,
    linhaDigitavelBoleto   VARCHAR (47) DEFAULT ' ' NOT NULL,
    codigoBarrasBoleto     VARCHAR (44) DEFAULT ' ' NOT NULL,
    contratoCobrancaBoleto VARCHAR (20) DEFAULT ' ' NOT NULL,
    boletoImpresso         NUMERIC (1,0) DEFAULT 0 NOT NULL,
    remessaEnviada         NUMERIC (1,0) DEFAULT 0 NOT NULL,
    retornoProcessado      NUMERIC (1,0) DEFAULT 0 NOT NULL    
  );
ALTER TABLE MOFINANCEIROXBOLETO ADD CONSTRAINT MOFINANCEIROXBOLETO_PK1 PRIMARY KEY (idFinanceiro);

INSERT INTO MOFINANCEIROXBOLETO (idFinanceiro, banco, nossoNumero, linhaDigitavelBoleto, codigoBarrasBoleto, contratoCobrancaBoleto, boletoImpresso, remessaEnviada, retornoProcessado) VALUES (0, '   ', ' ', ' ', ' ', ' ', 0, 0, 0);

UPDATE MOFINANCEIROXBOLETO_2302 SET codigoDigitavelBarras = COALESCE((
CASE WHEN SUBSTR (codigoDigitavelBarras,1,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,1,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,2,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,2,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,3,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,3,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,4,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,4,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,5,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,5,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,6,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,6,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,7,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,7,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,8,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,8,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,9,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,9,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,10,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,10,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,11,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,11,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,12,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,12,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,13,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,13,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,14,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,14,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,15,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,15,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,16,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,16,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,17,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,17,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,18,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,18,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,19,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,19,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,20,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,20,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,21,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,21,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,22,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,22,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,23,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,23,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,24,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,24,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,25,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,25,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,26,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,26,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,27,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,27,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,28,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,28,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,29,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,29,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,30,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,30,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,31,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,31,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,32,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,32,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,33,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,33,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,34,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,34,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,35,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,35,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,36,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,36,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,37,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,37,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,38,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,38,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,39,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,39,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,40,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,40,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,41,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,41,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,42,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,42,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,43,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,43,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,44,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,44,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,45,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,45,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,46,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,46,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,47,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,47,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,48,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,48,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,49,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,49,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,50,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,50,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,51,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,51,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,52,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,52,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,53,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,53,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,54,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,54,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,55,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,55,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,56,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,56,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,57,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,57,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,58,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,58,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,59,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,59,1) ELSE '' END
|| CASE WHEN SUBSTR (codigoDigitavelBarras,60,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN SUBSTR (codigoDigitavelBarras,60,1) ELSE '' END
),' ') WHERE idFinanceiro > 0;
INSERT INTO MOFINANCEIROXBOLETO (idFinanceiro, banco, nossoNumero, linhaDigitavelBoleto, codigoBarrasBoleto, contratoCobrancaBoleto, boletoImpresso, remessaEnviada, retornoProcessado) SELECT idFinanceiro, banco, nossoNumero, CASE WHEN LENGTH(RTRIM(codigoDigitavelBarras)) = 44 THEN
SUBSTR(codigoDigitavelBarras,1,4)
|| SUBSTR (codigoDigitavelBarras,20,5)
|| TO_CHAR (TRUNC (
    (TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,1,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,1,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,2,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,3,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,3,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,4,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,20,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,20,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,21,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,22,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,22,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,23,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,24,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,24,1))*2,2,'0'),2,1))
    ) / 10,0) * 10 + CASE WHEN (TRUNC (
    (TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,1,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,1,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,2,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,3,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,3,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,4,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,20,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,20,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,21,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,22,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,22,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,23,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,24,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,24,1))*2,2,'0'),2,1))
    ) / 10,0) =
    (TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,1,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,1,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,2,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,3,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,3,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,4,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,20,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,20,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,21,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,22,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,22,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,23,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,24,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,24,1))*2,2,'0'),2,1))
    ) / 10) THEN 0 ELSE 10 END
    - (TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,1,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,1,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,2,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,3,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,3,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,4,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,20,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,20,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,21,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,22,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,22,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,23,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,24,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,24,1))*2,2,'0'),2,1))
    ))
|| SUBSTR(codigoDigitavelBarras,25,10)
|| TO_CHAR (TRUNC (
    (TO_NUMBER (SUBSTR (codigoDigitavelBarras,25,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,26,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,26,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,27,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,28,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,28,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,29,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,30,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,30,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,31,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,32,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,32,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,33,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,34,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,34,1))*2,2,'0'),2,1))
    ) / 10,0) * 10 + CASE WHEN (TRUNC (
    (TO_NUMBER (SUBSTR (codigoDigitavelBarras,25,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,26,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,26,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,27,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,28,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,28,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,29,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,30,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,30,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,31,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,32,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,32,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,33,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,34,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,34,1))*2,2,'0'),2,1))
    ) / 10,0) =
    (TO_NUMBER (SUBSTR (codigoDigitavelBarras,25,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,26,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,26,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,27,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,28,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,28,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,29,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,30,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,30,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,31,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,32,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,32,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,33,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,34,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,34,1))*2,2,'0'),2,1))
    ) / 10) THEN 0 ELSE 10 END
    - (TO_NUMBER (SUBSTR (codigoDigitavelBarras,25,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,26,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,26,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,27,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,28,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,28,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,29,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,30,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,30,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,31,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,32,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,32,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,33,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,34,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,34,1))*2,2,'0'),2,1))
    ))
|| SUBSTR(codigoDigitavelBarras,35,10)
|| TO_CHAR (TRUNC (
    (TO_NUMBER (SUBSTR (codigoDigitavelBarras,35,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,36,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,36,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,37,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,38,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,38,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,39,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,40,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,40,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,41,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,42,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,42,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,43,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,44,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,44,1))*2,2,'0'),2,1))
    ) / 10,0) * 10 + CASE WHEN (TRUNC (
    (TO_NUMBER (SUBSTR (codigoDigitavelBarras,35,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,36,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,36,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,37,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,38,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,38,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,39,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,40,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,40,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,41,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,42,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,42,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,43,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,44,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,44,1))*2,2,'0'),2,1))
    ) / 10,0) =
    (TO_NUMBER (SUBSTR (codigoDigitavelBarras,35,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,36,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,36,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,37,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,38,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,38,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,39,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,40,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,40,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,41,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,42,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,42,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,43,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,44,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,44,1))*2,2,'0'),2,1))
    ) / 10) THEN 0 ELSE 10 END
    - (TO_NUMBER (SUBSTR (codigoDigitavelBarras,35,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,36,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,36,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,37,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,38,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,38,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,39,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,40,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,40,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,41,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,42,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,42,1))*2,2,'0'),2,1))
    +TO_NUMBER (SUBSTR (codigoDigitavelBarras,43,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,44,1))*2,2,'0'),1,1))
    +TO_NUMBER (SUBSTR (LPAD (TO_NUMBER (SUBSTR (codigoDigitavelBarras,44,1))*2,2,'0'),2,1))
    ))
|| SUBSTR(codigoDigitavelBarras,5,15)
ELSE COALESCE(TRIM(SUBSTR(codigoDigitavelBarras,1,47)),' ') END, COALESCE(TRIM(SUBSTR(codigoDigitavelBarras,1,44)),' '), ' ', boletoImpresso, remessaEnviada, retornoProcessado FROM MOFINANCEIROXBOLETO_2302 WHERE idFinanceiro > 0;

COMMIT;

ALTER TABLE MOFINANCEIROXBOLETO ADD CONSTRAINT MOFINANCEIROXBOLETO_FK1 FOREIGN KEY (idFinanceiro) REFERENCES MOFINANCEIROS (idFinanceiro);
ALTER TABLE MOFINANCEIROXBOLETO ADD CONSTRAINT MOFINANCEIROXBOLETO_FK2 FOREIGN KEY (banco) REFERENCES SIBANCOS (banco);

create or replace PROCEDURE ADD_MOFINANCEIROS_EXCLUICORREL (
  p_idFinanceiro                IN NUMBER)
IS
  CURSOR c_mot IS
    SELECT idMotivoBloqueioDocumento
    FROM MOMOTBLOQXFINANCEIROS
    WHERE idFinanceiro = p_idFinanceiro;
BEGIN
  FOR a IN c_mot
  LOOP
    ADD_MOMOTIVOSBLOQUEIOS_EXCLUI (a.idMotivoBloqueioDocumento);
  END LOOP;
  -- Desvincula Financeiro
  UPDATE MOARQUIVOSCONCILIACOES    a SET a.situacaoConciliacao = 'I' WHERE a.situacaoConciliacao = 'F' AND EXISTS (SELECT 1 FROM MOCONCILIACOESCARTOES b WHERE b.idArquivoConciliacao = a.idArquivoConciliacao AND b.idFinanceiro = p_idFinanceiro);
  UPDATE MOARQUIVOCOBRANCAXFINANC    SET idFinanceiro = 0, idBaixaFinanceiro = 0 WHERE idFinanceiro = p_idFinanceiro;
  UPDATE MOCONCILIACOESCARTOES       SET idFinanceiro = 0, idBaixaFinanceiro = 0 WHERE idFinanceiro = p_idFinanceiro;
  UPDATE MOSPCREGISTROS              SET idFinanceiro = 0 WHERE idFinanceiro = p_idFinanceiro;
  UPDATE MOPREVFINANCXFINANCEIRO     SET idFinanceiro = 0 WHERE idFinanceiro = p_idFinanceiro;
  UPDATE MOTRANSACOESTEF             SET idFinanceiro = 0 WHERE idFinanceiro = p_idFinanceiro;
  UPDATE MOORCAMENTOXPAGAMENTOS      SET idFinanceiroAdiantamento = 0 WHERE idFinanceiroAdiantamento = p_idFinanceiro;
  UPDATE MODOCUMENTOSTROCA           SET idFinanceiroAdiantamento = 0 WHERE idFinanceiroAdiantamento = p_idFinanceiro;
  -- Exclui correlatos
  DELETE MOPREDOCUMXRESGATEPONTOS  a WHERE EXISTS(SELECT 1 FROM MOPONTUACOES b WHERE b.idPontuacao = a.idPontuacao AND b.idFinanceiro = p_idFinanceiro);
  DELETE MODOCFISCALXRESGATEPONTOS a WHERE EXISTS(SELECT 1 FROM MOPONTUACOES b WHERE b.idPontuacao = a.idPontuacao AND b.idFinanceiro = p_idFinanceiro);
  DELETE MOPONTUACOES                WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXBOLETO         WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXCARTAO         WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXCARTPROPRIO    WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXCHEQUE         WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXPIX            WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXRATEIO         WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXCOMISSOES      WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXDOCUMENTOS     WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXARQUIVOS       WHERE idFinanceiro = p_idFinanceiro;
  DELETE MONEGDIVIDAXFINANCEIROS     WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOREPARCXFINANCEIROS        WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOHISTORICOCOBRANCA         WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOEVENTOS                   WHERE idFinanceiro = p_idFinanceiro;
  -- Exclui correlatos com outra perna correlata que já deve ter sido excluída anteriormente
  DELETE MOFINANCEIROXCORRELATO      WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOFINANCEIROXCORRELATO      WHERE idFinanceiroCorrelato = p_idFinanceiro;
  DELETE MOFINANCEIROXBAIXAS         WHERE idFinanceiro = p_idFinanceiro;
  DELETE MOBAIXAXNOVOFINANCEIRO      WHERE idNovoFinanceiro = p_idFinanceiro;
  -- Exclui financeiro principal
  DELETE MOFINANCEIROS               WHERE idFinanceiro = p_idFinanceiro;
END ADD_MOFINANCEIROS_EXCLUICORREL;

/

create or replace PROCEDURE ADD_MOFINANCEIROS_EXCLUI_LOOP (
  p_idFinanceiro                 IN NUMBER,
  p_idsFinanceirosDesconsiderar  IN CLOB,
  p_idsBaixasDesconsiderar       IN CLOB,
  r_idsFinanceirosDesconsiderar  OUT CLOB,
  r_idsBaixasDesconsiderar       OUT CLOB)
IS
  v_auxNumber NUMBER;
  CURSOR c_financExcluir IS
    SELECT idFinanceiroCorrelato idFinanceiro
    FROM MOFINANCEIROXCORRELATO
    WHERE idFinanceiro = p_idFinanceiro
    UNION ALL
    SELECT idFinanceiro
    FROM MOFINANCEIROXCORRELATO
    WHERE idFinanceiroCorrelato = p_idFinanceiro
    UNION ALL
    SELECT a.idNovoFinanceiro idFinanceiro
    FROM MOBAIXAXNOVOFINANCEIRO a
    JOIN MOFINANCEIROXBAIXAS b ON b.idBaixaFinanceiro = a.idBaixaFinanceiro
    WHERE b.idFinanceiro = p_idFinanceiro
    UNION ALL
    SELECT a.idFinanceiro
    FROM MOFINANCEIROXBAIXAS a
    WHERE a.idFinanceiro = p_idFinanceiro
    AND a.baixaAutomatica = 1
    UNION ALL
    SELECT a.idFinanceiro
    FROM MOFINANCEIROXBAIXAS a
    JOIN MOBAIXAXNOVOFINANCEIRO b ON b.idBaixaFinanceiro = a.idBaixaFinanceiro
    WHERE b.idNovoFinanceiro = p_idFinanceiro
    AND a.baixaAutomatica = 1
    UNION ALL
    SELECT a.idFinanceiro
    FROM MOFINANCEIROXBAIXAS a
    JOIN MOBAIXAXBAIXAFINANCEIRO b ON b.idBaixaFinanceiro = a.idBaixaFinanceiro
    JOIN MOFINANCEIROXBAIXAS c ON c.idBaixaFinanceiro = b.idBaixaFinanceiroCorrel
    WHERE c.idFinanceiro = p_idFinanceiro
    AND a.baixaAutomatica = 1
    UNION ALL
    SELECT a.idFinanceiro
    FROM MOFINANCEIROXBAIXAS a
    JOIN MOBAIXAXBAIXAFINANCEIRO b ON b.idBaixaFinanceiroCorrel = a.idBaixaFinanceiro
    JOIN MOFINANCEIROXBAIXAS c ON c.idBaixaFinanceiro = b.idBaixaFinanceiro
    WHERE c.idFinanceiro = p_idFinanceiro
    AND a.baixaAutomatica = 1;
  CURSOR c_baixas IS
    SELECT a.*
    FROM MOFINANCEIROXBAIXAS a
    WHERE a.idFinanceiro = p_idFinanceiro
    UNION ALL
    SELECT a.*
    FROM MOFINANCEIROXBAIXAS a
    JOIN MOBAIXAXNOVOFINANCEIRO b ON b.idBaixaFinanceiro = a.idBaixaFinanceiro
    WHERE b.idNovoFinanceiro = p_idFinanceiro
    UNION ALL
    SELECT a.*
    FROM MOFINANCEIROXBAIXAS a
    JOIN MOBAIXAXBAIXAFINANCEIRO b ON b.idBaixaFinanceiro = a.idBaixaFinanceiro
    JOIN MOFINANCEIROXBAIXAS c ON c.idBaixaFinanceiro = b.idBaixaFinanceiroCorrel
    WHERE c.idFinanceiro = p_idFinanceiro
    UNION ALL
    SELECT a.*
    FROM MOFINANCEIROXBAIXAS a
    JOIN MOBAIXAXBAIXAFINANCEIRO b ON b.idBaixaFinanceiroCorrel = a.idBaixaFinanceiro
    JOIN MOFINANCEIROXBAIXAS c ON c.idBaixaFinanceiro = b.idBaixaFinanceiro
    WHERE c.idFinanceiro = p_idFinanceiro;
BEGIN
  r_idsFinanceirosDesconsiderar := p_idsFinanceirosDesconsiderar;
  r_idsBaixasDesconsiderar      := p_idsBaixasDesconsiderar;  
  -- Somente se não processou o financeiro ainda
  IF r_idsFinanceirosDesconsiderar IS NULL OR r_idsFinanceirosDesconsiderar = ' ' OR INSTR(',' || r_idsFinanceirosDesconsiderar || ',', ',' || LPAD(p_idFinanceiro,14,'0') || ',') = 0 THEN
    IF r_idsFinanceirosDesconsiderar IS NULL OR r_idsFinanceirosDesconsiderar = ' ' THEN
      r_idsFinanceirosDesconsiderar := LPAD(p_idFinanceiro,14,'0');
    ELSE
      r_idsFinanceirosDesconsiderar := r_idsFinanceirosDesconsiderar || ',' || LPAD(p_idFinanceiro,14,'0');
    END IF;
    FOR a IN c_financExcluir
    LOOP
      IF r_idsFinanceirosDesconsiderar IS NULL OR r_idsFinanceirosDesconsiderar = ' ' OR INSTR(',' || r_idsFinanceirosDesconsiderar || ',', ',' || LPAD(a.idFinanceiro,14,'0') || ',') = 0 THEN
        ADD_MOFINANCEIROS_EXCLUI_LOOP (a.idFinanceiro, r_idsFinanceirosDesconsiderar , r_idsBaixasDesconsiderar, r_idsFinanceirosDesconsiderar , r_idsBaixasDesconsiderar);
      END IF;
    END LOOP;
    FOR a IN c_baixas
    LOOP
      -- Somente se não processou a baixa ainda
      IF r_idsBaixasDesconsiderar IS NULL OR r_idsBaixasDesconsiderar = ' ' OR INSTR(',' || r_idsBaixasDesconsiderar || ',', ',' || LPAD(a.idBaixaFinanceiro,14,'0') || ',') = 0 THEN
        IF r_idsBaixasDesconsiderar IS NULL OR r_idsBaixasDesconsiderar = ' ' THEN
          r_idsBaixasDesconsiderar := LPAD(a.idBaixaFinanceiro,14,'0');
        ELSE
          r_idsBaixasDesconsiderar := r_idsBaixasDesconsiderar || ',' || LPAD(a.idBaixaFinanceiro,14,'0');
        END IF;
        -- Se não excluiu Financeiro, volta Saldo
        IF r_idsFinanceirosDesconsiderar IS NULL OR r_idsFinanceirosDesconsiderar = ' ' OR INSTR(',' || r_idsFinanceirosDesconsiderar || ',', ',' || LPAD(a.idFinanceiro,14,'0') || ',') = 0 THEN
          ADD_MOFINANCEIROS_AJUSTA_SALDO (
            0, -- p_config_349_prazoValidadePont
            1, -- p_excluindo
            a.idBaixaFinanceiro,
            a.idFinanceiro,
            a.data,
            a.cotacao,
            a.valorBrutoIndexado,
            a.valorBruto,
            a.valorTarifaCartao,
            v_auxNumber, -- r_financ_saldo
            v_auxNumber, -- r_financ_saldoIndexado
            v_auxNumber); -- r_financ_efetivado
        END IF;
        ADD_MOFINANCEIROXBAIXAS_CORREL (a.idBaixaFinanceiro);
      END IF;
    END LOOP;
    ADD_MOFINANCEIROS_EXCLUICORREL (p_idFinanceiro);
  END IF;
END ADD_MOFINANCEIROS_EXCLUI_LOOP;

/

create or replace PROCEDURE ADD_MOFINANCEIROS_EXCLUI (
  p_idFinanceiro                 IN NUMBER)
IS
  v_auxCLOB                      CLOB;
BEGIN
  v_auxCLOB := NULL;
  ADD_MOFINANCEIROS_EXCLUI_LOOP (p_idFinanceiro, v_auxCLOB , v_auxCLOB, v_auxCLOB , v_auxCLOB);
END ADD_MOFINANCEIROS_EXCLUI;

/

create or replace PROCEDURE ADD_MOFINANCEIROXBAIXAS_EXCLUI (
  p_idBaixaFinanceiro            IN NUMBER)
IS
  v_idsFinanceirosDesconsiderar  CLOB;
  v_idsBaixasDesconsiderar       CLOB;
  v_auxNumber                    NUMBER;
  CURSOR c_financExcluir IS
    SELECT a.idNovoFinanceiro idFinanceiro
    FROM MOBAIXAXNOVOFINANCEIRO a
    WHERE a.idBaixaFinanceiro = p_idBaixaFinanceiro
    UNION ALL
    SELECT a.idFinanceiro
    FROM MOFINANCEIROXBAIXAS a
    WHERE a.idBaixaFinanceiro = p_idBaixaFinanceiro
    AND a.baixaAutomatica = 1;
  CURSOR c_baixas IS
    SELECT a.*
    FROM MOFINANCEIROXBAIXAS a
    WHERE a.idBaixaFinanceiro = p_idBaixaFinanceiro
    UNION ALL
    SELECT a.*
    FROM MOFINANCEIROXBAIXAS a
    JOIN MOBAIXAXBAIXAFINANCEIRO b
    ON b.idBaixaFinanceiro = a.idBaixaFinanceiro
    WHERE b.idBaixaFinanceiroCorrel = p_idBaixaFinanceiro
    UNION ALL
    SELECT a.*
    FROM MOFINANCEIROXBAIXAS a
    JOIN MOBAIXAXBAIXAFINANCEIRO b
    ON b.idBaixaFinanceiroCorrel = a.idBaixaFinanceiro
    WHERE b.idBaixaFinanceiro = p_idBaixaFinanceiro;
BEGIN
  v_idsFinanceirosDesconsiderar := ' ';
  v_idsBaixasDesconsiderar      := ' '; 
  FOR a IN c_financExcluir
  LOOP
    IF v_idsFinanceirosDesconsiderar IS NULL OR v_idsFinanceirosDesconsiderar = ' ' OR INSTR(',' || v_idsFinanceirosDesconsiderar || ',', ',' || LPAD(a.idFinanceiro,14,'0') || ',') = 0 THEN
      ADD_MOFINANCEIROS_EXCLUI_LOOP (a.idFinanceiro, v_idsFinanceirosDesconsiderar , v_idsBaixasDesconsiderar, v_idsFinanceirosDesconsiderar , v_idsBaixasDesconsiderar);
    END IF;
  END LOOP;
  FOR a IN c_baixas
  LOOP
    -- Somente se não processou a baixa ainda
    IF v_idsBaixasDesconsiderar IS NULL OR v_idsBaixasDesconsiderar = ' ' OR INSTR(',' || v_idsBaixasDesconsiderar || ',', ',' || LPAD(a.idBaixaFinanceiro,14,'0') || ',') = 0 THEN
      IF v_idsBaixasDesconsiderar IS NULL OR v_idsBaixasDesconsiderar = ' ' THEN
        v_idsBaixasDesconsiderar := LPAD(a.idBaixaFinanceiro,14,'0');
      ELSE
        v_idsBaixasDesconsiderar := v_idsBaixasDesconsiderar || ',' || LPAD(a.idBaixaFinanceiro,14,'0');
      END IF;
      -- Se não excluiu Financeiro, volta Saldo
      IF v_idsFinanceirosDesconsiderar IS NULL OR v_idsFinanceirosDesconsiderar = ' ' OR INSTR(',' || v_idsFinanceirosDesconsiderar || ',', ',' || LPAD(a.idFinanceiro,14,'0') || ',') = 0 THEN
        ADD_MOFINANCEIROS_AJUSTA_SALDO (
          0, -- p_config_349_prazoValidadePont
          1, -- p_excluindo
          a.idBaixaFinanceiro,
          a.idFinanceiro,
          a.data,
          a.cotacao,
          a.valorBrutoIndexado,
          a.valorBruto,
          a.valorTarifaCartao,
          v_auxNumber, -- r_financ_saldo
          v_auxNumber, -- r_financ_saldoIndexado
          v_auxNumber); -- r_financ_efetivado
      END IF;
      ADD_MOFINANCEIROXBAIXAS_CORREL (a.idBaixaFinanceiro);
    END IF;
  END LOOP;
END ADD_MOFINANCEIROXBAIXAS_EXCLUI;

/

create or replace PROCEDURE ADD_MODOCUMENTOSTROCA_EXCLUI (
  p_documentoTroca IN NUMBER)
IS
  s_idFinanceiroAdiantamento NUMBER;
  CURSOR c_itens IS
    SELECT idItemDocTroca
    FROM MODOCTROCAXITENS
    WHERE documentoTroca = p_documentoTroca;
BEGIN
  SELECT idFinanceiroAdiantamento
  INTO s_idFinanceiroAdiantamento
  FROM MODOCUMENTOSTROCA
  WHERE documentoTroca = p_documentoTroca;
  FOR a IN c_itens
  LOOP
    ADD_MODOCTROCAXITENS_EXCLUI (a.idItemDocTroca);
  END LOOP;
  DELETE MODOCUMENTOSTROCA WHERE documentoTroca = p_documentoTroca;
  IF s_idFinanceiroAdiantamento > 0 THEN
    ADD_MOFINANCEIROS_EXCLUI (s_idFinanceiroAdiantamento);
  END IF;
END ADD_MODOCUMENTOSTROCA_EXCLUI;

/

create or replace PROCEDURE ADD_MOPREDOCUMXPAGAMENTOS_ECOR (
  p_idPagamentoPreDocumento IN NUMBER)
IS
  CURSOR c_mot IS
    SELECT idMotivoBloqueioDocumento
    FROM MOMOTBLOQXPREDOCUMPAGAM
    WHERE idPagamentoPreDocumento = p_idPagamentoPreDocumento;
  CURSOR c_fin IS
    SELECT idFinanceiro
    FROM MOFINANCEIROS
    WHERE idPagamentoPreDocumento = p_idPagamentoPreDocumento;
BEGIN
  FOR a IN c_mot
  LOOP
    ADD_MOMOTIVOSBLOQUEIOS_EXCLUI (a.idMotivoBloqueioDocumento);
  END LOOP;
  FOR a IN c_fin
  LOOP
    ADD_MOFINANCEIROS_EXCLUI (a.idFinanceiro);
  END LOOP;
  DELETE MOPREDOCUMXPROMOCOES WHERE idPagamentoPreDocumento = p_idPagamentoPreDocumento;
  UPDATE MOTRANSACOESTEF SET idPagamentoPreDocumento = 0 WHERE idPagamentoPreDocumento = p_idPagamentoPreDocumento;
END ADD_MOPREDOCUMXPAGAMENTOS_ECOR;

/

create or replace PROCEDURE ADD_MODOCFISCALXPAGAMENTOS_E_C (
  p_idPagamentoDocFiscal IN NUMBER)
IS
  CURSOR c_mot IS
    SELECT idMotivoBloqueioDocumento
    FROM MOMOTBLOQXDOCFISCALPAGAM
    WHERE idPagamentoDocFiscal = p_idPagamentoDocFiscal;
  CURSOR c_fin IS
    SELECT idFinanceiro
    FROM MOFINANCEIROS
    WHERE idPagamentoDocFiscal = p_idPagamentoDocFiscal;
BEGIN
  FOR a IN c_mot
  LOOP
    ADD_MOMOTIVOSBLOQUEIOS_EXCLUI (a.idMotivoBloqueioDocumento);
  END LOOP;
  FOR a IN c_fin
  LOOP
    ADD_MOFINANCEIROS_EXCLUI (a.idFinanceiro);
  END LOOP;
  DELETE MODOCFISCALXPROMOCOES WHERE idPagamentoDocFiscal = p_idPagamentoDocFiscal;
  UPDATE MOTRANSACOESTEF SET idPagamentoDocFiscal = 0 WHERE idPagamentoDocFiscal = p_idPagamentoDocFiscal;
END ADD_MODOCFISCALXPAGAMENTOS_E_C;

/

DROP TABLE TEMPCNAB;

-- TEMPCNAB
CREATE GLOBAL TEMPORARY TABLE TEMPCNAB
  (
    uniqueMachineID                VARCHAR (18) DEFAULT ' ' NOT NULL,
    idSessao                       NUMERIC (14,0) DEFAULT 0 NOT NULL,
    ordenacao                      NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idFinanceiro                   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idBaixaFinanceiro              NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idRegistroSpc                  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    dataRegistroSPC                DATE,
    selecionado                    NUMERIC (1,0) DEFAULT 0 NOT NULL,
    estabelecimento                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    contratoCompra                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    documento                      VARCHAR (60) DEFAULT ' ' NOT NULL,
    fatura                         VARCHAR (60) DEFAULT ' ' NOT NULL,
    parcelaAtual                   NUMERIC (3,0) DEFAULT 0 NOT NULL,
    dataEmissao                    DATE,
    vencimento                     DATE,
    naoCobrarJurosMultaAte         DATE,
    saldo                          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    tarifaDescontoAteVencimento    NUMERIC (15,8) DEFAULT 0 NOT NULL,
    tarifaMensalDescontoAntecipado NUMERIC (15,8) DEFAULT 0 NOT NULL,
    tarifaMensalJuroDeMora         NUMERIC (15,8) DEFAULT 0 NOT NULL,
    tarifaMulta                    NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorFixoMulta                 NUMERIC (15,2) DEFAULT 0 NOT NULL,
    nossoNumero                    VARCHAR (25) DEFAULT ' ' NOT NULL,
    linhaDigitavelBoleto           VARCHAR (47) DEFAULT ' ' NOT NULL,
    pessoa                         NUMERIC (14,0) DEFAULT 0 NOT NULL,
    nomeRazaoSocial                VARCHAR (60) DEFAULT ' ' NOT NULL,
    indicadorPessoa                CHAR (1) DEFAULT ' ' NOT NULL,
    nascimentoFundacao             DATE,
    cnpjCpfIdEstrangeiro           VARCHAR (20) DEFAULT ' ' NOT NULL,
    enderecoCep                    NUMERIC (8,0) DEFAULT 0 NOT NULL,
    enderecoLogradouro             VARCHAR (60) DEFAULT ' ' NOT NULL,
    enderecoNumero                 VARCHAR (60) DEFAULT ' ' NOT NULL,
    enderecoComplemento            VARCHAR (60) DEFAULT ' ' NOT NULL,
    enderecoBairroDistrito         VARCHAR (60) DEFAULT ' ' NOT NULL,
    enderecoMunicipio              NUMERIC (7,0) DEFAULT 0 NOT NULL,
    enderecoPais                   CHAR (4) DEFAULT ' ' NOT NULL,
    enderecoObservacoes            VARCHAR (4000) DEFAULT ' ' NOT NULL,
    enderecoDescricaoMunicipio     VARCHAR (60) DEFAULT ' ' NOT NULL,
    enderecoUf                     CHAR (2) DEFAULT '  ' NOT NULL,
    enderecoDescricaoPais          VARCHAR (60) DEFAULT ' ' NOT NULL,
    foneA                          VARCHAR (14) DEFAULT ' ' NOT NULL,
    foneB                          VARCHAR (14) DEFAULT ' ' NOT NULL,
    email                          VARCHAR (60) DEFAULT ' ' NOT NULL,
    rg                             VARCHAR (20) DEFAULT ' ' NOT NULL,
    mae                            VARCHAR (60) DEFAULT ' ' NOT NULL,
    pai                            VARCHAR (60) DEFAULT ' ' NOT NULL,
    descricaoOcupacao              VARCHAR (256) DEFAULT ' ' NOT NULL,
    empregoRazaoSocial             VARCHAR (60) DEFAULT ' ' NOT NULL,
    empregoFone                    VARCHAR (14) DEFAULT ' ' NOT NULL,
    empregoCep                     NUMERIC (8,0) DEFAULT 0 NOT NULL,
    empregoLogradouro              VARCHAR (60) DEFAULT ' ' NOT NULL,
    empregoNumero                  VARCHAR (60) DEFAULT ' ' NOT NULL,
    empregoComplemento             VARCHAR (60) DEFAULT ' ' NOT NULL,
    empregoBairroDistrito          VARCHAR (60) DEFAULT ' ' NOT NULL,
    empregoMunicipio               NUMERIC (7,0) DEFAULT 0 NOT NULL,
    empregoPais                    CHAR (4) DEFAULT ' ' NOT NULL,
    empregoObservacoes             VARCHAR (4000) DEFAULT ' ' NOT NULL,
    empregoDescricaoMunicipio      VARCHAR (60) DEFAULT ' ' NOT NULL,
    empregoUf                      CHAR (2) DEFAULT '  ' NOT NULL,
    empregoDescricaoPais           VARCHAR (60) DEFAULT ' ' NOT NULL,
    conjugeNome                    VARCHAR (60) DEFAULT ' ' NOT NULL,
    conjugeCpf                     VARCHAR (20) DEFAULT ' ' NOT NULL,
    entidadeSPC                    NUMERIC (3,0) DEFAULT 0 NOT NULL,
    codigoCDL                      VARCHAR (256) DEFAULT ' ' NOT NULL,
    codigoAssociado                VARCHAR (256) DEFAULT ' ' NOT NULL,
    codigoFilial                   VARCHAR (256) DEFAULT ' ' NOT NULL,
    senha                          VARCHAR (256) DEFAULT ' ' NOT NULL,
    mensagemErro                   VARCHAR (256) DEFAULT ' ' NOT NULL
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPCNAB_PK1 ON TEMPCNAB (uniqueMachineID, idSessao, ordenacao);

DROP TABLE TEMPPARCELAS;

-- TEMPPARCELAS
CREATE GLOBAL TEMPORARY TABLE TEMPPARCELAS
  (
    uniqueMachineID                VARCHAR (18) DEFAULT ' ' NOT NULL,
    contadorSessao                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    origem                         CHAR (1) DEFAULT ' ' NOT NULL,
    idCabecalho                    NUMERIC (14,0) DEFAULT 0 NOT NULL,
    pagamentoTroco                 CHAR (1) DEFAULT ' ' NOT NULL,
    sequencia                      NUMERIC (3,0) DEFAULT 0 NOT NULL,
    parcela                        NUMERIC (3,0) DEFAULT 0 NOT NULL,
    prazoPadrao                    NUMERIC (6,0) DEFAULT 0 NOT NULL,
    prazo                          NUMERIC (6,0) DEFAULT 0 NOT NULL,
    vencimento                     DATE,
    baixaAutomatica                NUMERIC (1,0) DEFAULT 0 NOT NULL,
    percentualRateioOriginal       NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valor                          NUMERIC (15,2) DEFAULT 0 NOT NULL,
    complementoFinanceiro          VARCHAR (500) DEFAULT ' ' NOT NULL,
    idPrevisaoFinanceira           NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idFinanceiro                   NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idTransacaoTef                 NUMERIC (14,0) DEFAULT 0 NOT NULL,
    chequeCompensacao              CHAR (3) DEFAULT '   ' NOT NULL,
    chequeBanco                    CHAR (3) DEFAULT '   ' NOT NULL,
    chequeAgenciaBanco             VARCHAR (6) DEFAULT ' ' NOT NULL,
    chequeC1                       NUMERIC (1,0) DEFAULT 0 NOT NULL,
    chequeContaBanco               VARCHAR (12) DEFAULT ' ' NOT NULL,
    chequeC2                       NUMERIC (1,0) DEFAULT 0 NOT NULL,
    cheque                         NUMERIC (6,0) DEFAULT 0 NOT NULL,
    chequeC3                       NUMERIC (1,0) DEFAULT 0 NOT NULL,
    chequeBomPara                  DATE,
    chequeIndicadorPessoa          CHAR (1) DEFAULT ' ' NOT NULL,
    chequeTitular                  VARCHAR (60) DEFAULT ' ' NOT NULL,
    chequeIndicadorDocumentoPessoa CHAR (1) DEFAULT ' ' NOT NULL,
    chequeCnpjCpfIdEstrangeiro     VARCHAR (20) DEFAULT ' ' NOT NULL,
    chequeFone                     VARCHAR (14) DEFAULT ' ' NOT NULL,
    chequeDesde                    DATE,
    chequeAutenticacao             VARCHAR (256) DEFAULT ' ' NOT NULL,
    chequeIndicadorFone            NUMERIC (3,0) DEFAULT 0 NOT NULL,
    chequeOperacaoTelefonia        NUMERIC (3,0) DEFAULT 0 NOT NULL,
    chequeObservacaoFone           VARCHAR (4000) DEFAULT ' ' NOT NULL,
    linhaDigitavelBoleto           VARCHAR (47) DEFAULT ' ' NOT NULL
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPPARCELAS_PK1 ON TEMPPARCELAS (uniqueMachineID, contadorSessao, origem, idCabecalho, pagamentoTroco, sequencia, parcela);

create or replace PROCEDURE ADD_TEMPPARCELAS_GRAVA (
    p_uniqueMachineID              IN VARCHAR2,
    p_contadorSessaoTempParcelas   IN NUMBER,
    p_origem                       IN CHAR,
    p_idCabecalho                  IN NUMBER,
    p_pagamentoTroco               IN CHAR,
    p_sequencia                    IN NUMBER,
    p_parcela                      IN NUMBER,
    p_prazoPadrao                  IN NUMBER,
    p_prazo                        IN NUMBER,
    p_vencimento                   IN DATE,
    p_baixaAutomatica              IN NUMBER,
    p_percentualRateioOriginal     IN NUMBER,
    p_valor                        IN NUMBER,
    p_complementoFinanceiro        IN VARCHAR,
    p_idPrevisaoFinanceira         IN NUMBER,
    p_idFinanceiro                 IN NUMBER,
    p_idTransacaoTef               IN NUMBER,
    p_chequeCompensacao            IN VARCHAR,
    p_chequeBanco                  IN VARCHAR,
    p_chequeAgenciaBanco           IN VARCHAR,
    p_chequeC1                     IN CHAR,
    p_chequeContaBanco             IN VARCHAR,
    p_chequeC2                     IN CHAR,
    p_cheque                       IN NUMBER,
    p_chequeC3                     IN CHAR,
    p_chequeBomPara                IN DATE,
    p_chequeIndicadorPessoa        IN CHAR,
    p_chequeTitular                IN VARCHAR,
    p_chequeIndicadorDocumentoPess IN CHAR,
    p_chequeCnpjCpfIdEstrangeiro   IN VARCHAR,
    p_chequeFone                   IN VARCHAR,
    p_chequeDesde                  IN DATE,
    p_chequeAutenticacao           IN VARCHAR,
    p_chequeIndicadorFone          IN NUMBER,
    p_chequeOperacaoTelefonia      IN NUMBER,
    p_chequeObservacaoFone         IN VARCHAR,
    p_linhaDigitavelBoleto         IN VARCHAR2)
IS
BEGIN
  MERGE INTO TEMPPARCELAS a USING (
    SELECT
      p_uniqueMachineID              uniqueMachineID,
      p_contadorSessaoTempParcelas   contadorSessao,
      p_origem                       origem,
      p_idCabecalho                  idCabecalho,
      p_pagamentoTroco               pagamentoTroco,
      p_sequencia                    sequencia,
      p_parcela                      parcela,
      p_prazoPadrao                  prazoPadrao,
      p_prazo                        prazo,
      p_vencimento                   vencimento,
      p_baixaAutomatica              baixaAutomatica,
      p_percentualRateioOriginal     percentualRateioOriginal,
      p_valor                        valor,
      p_complementoFinanceiro        complementoFinanceiro,
      p_idPrevisaoFinanceira         idPrevisaoFinanceira,
      p_idFinanceiro                 idFinanceiro,
      p_idTransacaoTef               idTransacaoTef,
      p_chequeCompensacao            chequeCompensacao,
      p_chequeBanco                  chequeBanco,
      p_chequeAgenciaBanco           chequeAgenciaBanco,
      p_chequeC1                     chequeC1,
      p_chequeContaBanco             chequeContaBanco,
      p_chequeC2                     chequeC2,
      p_cheque                       cheque,
      p_chequeC3                     chequeC3,
      p_chequeBomPara                chequeBomPara,
      p_chequeIndicadorPessoa        chequeIndicadorPessoa,
      p_chequeTitular                chequeTitular,
      p_chequeIndicadorDocumentoPess chequeIndicadorDocumentoPessoa,
      p_chequeCnpjCpfIdEstrangeiro   chequeCnpjCpfIdEstrangeiro,
      p_chequeFone                   chequeFone,
      p_chequeDesde                  chequeDesde,
      p_chequeAutenticacao           chequeAutenticacao,
      p_chequeIndicadorFone          chequeIndicadorFone,
      p_chequeOperacaoTelefonia      chequeOperacaoTelefonia,
      p_chequeObservacaoFone         chequeObservacaoFone,
      p_linhaDigitavelBoleto         linhaDigitavelBoleto
    FROM DUAL) b
  ON (  a.uniqueMachineID  = b.uniqueMachineID
    AND a.contadorSessao   = b.contadorSessao
    AND a.origem           = b.origem
    AND a.idCabecalho      = b.idCabecalho
    AND a.pagamentoTroco   = b.pagamentoTroco
    AND a.sequencia        = b.sequencia
    AND a.parcela          = b.parcela)
  WHEN MATCHED THEN UPDATE SET
    a.prazoPadrao                    = b.prazoPadrao,
    a.prazo                          = b.prazo,
    a.vencimento                     = b.vencimento,
    a.baixaAutomatica                = b.baixaAutomatica,
    a.percentualRateioOriginal       = b.percentualRateioOriginal,
    a.valor                          = b.valor,
    a.complementoFinanceiro          = b.complementoFinanceiro,
    a.idPrevisaoFinanceira           = b.idPrevisaoFinanceira,
    a.idFinanceiro                   = b.idFinanceiro,
    a.idTransacaoTef                 = b.idTransacaoTef,
    a.chequeCompensacao              = b.chequeCompensacao,
    a.chequeBanco                    = b.chequeBanco,
    a.chequeAgenciaBanco             = b.chequeAgenciaBanco,
    a.chequeC1                       = b.chequeC1,
    a.chequeContaBanco               = b.chequeContaBanco,
    a.chequeC2                       = b.chequeC2,
    a.cheque                         = b.cheque,
    a.chequeC3                       = b.chequeC3,
    a.chequeBomPara                  = b.chequeBomPara,
    a.chequeIndicadorPessoa          = b.chequeIndicadorPessoa,
    a.chequeTitular                  = b.chequeTitular,
    a.chequeIndicadorDocumentoPessoa = b.chequeIndicadorDocumentoPessoa,
    a.chequeCnpjCpfIdEstrangeiro     = b.chequeCnpjCpfIdEstrangeiro,
    a.chequeFone                     = b.chequeFone,
    a.chequeDesde                    = b.chequeDesde,
    a.chequeAutenticacao             = b.chequeAutenticacao,
    a.chequeIndicadorFone            = b.chequeIndicadorFone,
    a.chequeOperacaoTelefonia        = b.chequeOperacaoTelefonia,
    a.chequeObservacaoFone           = b.chequeObservacaoFone,
    a.linhaDigitavelBoleto           = b.linhaDigitavelBoleto
  WHEN NOT MATCHED THEN INSERT (
    uniqueMachineID,
    contadorSessao,
    origem,
    idCabecalho,
    pagamentoTroco,
    sequencia,
    parcela,
    prazoPadrao,
    prazo,
    vencimento,
    baixaAutomatica,
    percentualRateioOriginal,
    valor,
    complementoFinanceiro,
    idPrevisaoFinanceira,
    idFinanceiro,
    idTransacaoTef,
    chequeCompensacao,
    chequeBanco,
    chequeAgenciaBanco,
    chequeC1,
    chequeContaBanco,
    chequeC2,
    cheque,
    chequeC3,
    chequeBomPara,
    chequeIndicadorPessoa,
    chequeTitular,
    chequeIndicadorDocumentoPessoa,
    chequeCnpjCpfIdEstrangeiro,
    chequeFone,
    chequeDesde,
    chequeAutenticacao,
    chequeIndicadorFone,
    chequeOperacaoTelefonia,
    chequeObservacaoFone,
    linhaDigitavelBoleto)
  VALUES (
    b.uniqueMachineID,
    b.contadorSessao,
    b.origem,
    b.idCabecalho,
    b.pagamentoTroco,
    b.sequencia,
    b.parcela,
    b.prazoPadrao,
    b.prazo,
    b.vencimento,
    b.baixaAutomatica,
    b.percentualRateioOriginal,
    b.valor,
    b.complementoFinanceiro,
    b.idPrevisaoFinanceira,
    b.idFinanceiro,
    b.idTransacaoTef,
    b.chequeCompensacao,
    b.chequeBanco,
    b.chequeAgenciaBanco,
    b.chequeC1,
    b.chequeContaBanco,
    b.chequeC2,
    b.cheque,
    b.chequeC3,
    b.chequeBomPara,
    b.chequeIndicadorPessoa,
    b.chequeTitular,
    b.chequeIndicadorDocumentoPessoa,
    b.chequeCnpjCpfIdEstrangeiro,
    b.chequeFone,
    b.chequeDesde,
    b.chequeAutenticacao,
    b.chequeIndicadorFone,
    b.chequeOperacaoTelefonia,
    b.chequeObservacaoFone,
    b.linhaDigitavelBoleto);
END ADD_TEMPPARCELAS_GRAVA;

/

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

/

INSERT INTO SIVERSOESSISTEMA (idVersaoSistema, versaoAplicativo, dataLiberacaoVersao, possuiConversaoTabelas, atualizada, dataAtualizacaoVersao, observacoes) VALUES (2023002010, '2023.2.10', TO_DATE('04/04/2023','DD/MM/YYYY'), 1, 1, sysdate, ' ');

COMMIT;

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

/*
*/