              SELECT
                atualizaCustoMedio,
                atualizaUltimaCompra
              INTO
                v_ativ_atualizaCustoMedio,
                v_ativ_atualizaUltimaCompra
              FROM PAMODELOSDOCUMENTO
              WHERE modeloDocumento = p_item_modeloDocumento;
              ADD_ORCAMENTO_ITEM_REAL_FIC_GR (
                p_sys_estabelecimentoAtivo,
                p_config_354_estabProximoId,
                0, -- p_idFichaProdutoRealOrcamento
                v_ativ_idAtividadeRealOrcament, -- p_idAtividadeRealOrcamento
                v_ativ_ordenacaoFichaProdutoPr, -- p_ordenacao
                v_ativ_atualizaCustoMedio, -- p_atualizaCustoMedio
                v_ativ_atualizaUltimaCompra, -- p_atualizaUltimaCompra
                'E', -- p_entradaSaida,
                p_item_localEstoque, -- p_localEstoque
                v_ativ_idFichaProdutoPrevOrcam, -- p_idFichaProdutoPrevOrcamento
                p_item_gradeProduto,
                p_item_personalizacao,
                p_item_idLoteEstoque,
                p_item_quantidade,
                1, -- p_zerarSaldo,
                0, -- p_precoCustoOperacao
                0, -- p_totalCustoOperacao
                0, -- p_precoCMV
                0, -- p_valorCMV
                v_observacoes,
                v_auxNumber); -- r_idFichaProdutoRealOrcamento
              UPDATE MOORCAMENTOXITENS
              SET quantidadeSaldo = 0
              WHERE idItemOrcamento = r_item_idItemOrcamento;
            END IF;
          END IF;
          FOR b IN (
            SELECT
              b.ordenacao,
              b.gradeProduto,
              b.quantidade,
              b.localEstoque,
              b.observacoes
            FROM CAGRADEPRODUTOXFICHAPROD b
            WHERE b.gradeProdutoXFichaAtividade = a.gradeProdutoXFichaAtividade
            AND b.id > 0
            AND b.ativo = 1
            ORDER BY b.ordenacao)
          LOOP
            v_ativ_ordenacaoFichaProdutoPr := v_ativ_ordenacaoFichaProdutoPr + 1;
            ADD_ORCAMENTO_ITEM_PREV_FIC_GR (
              p_sys_estabelecimentoAtivo,
              p_config_354_estabProximoId,
              0, -- p_idFichaProdutoPrevOrcamento IN NUMBER,
              v_ativ_idAtividadePrevOrcamen, -- p_idAtividadePrevOrcamento
              v_ativ_ordenacaoFichaProdutoPr, -- p_ordenacao,
              'S', -- entradaSaida,
              CASE WHEN b.localEstoque = 0 THEN p_item_localEstoque ELSE b.localEstoque END, -- p_localEstoque
              b.gradeProduto,
              0, -- personalizacao,
              0, -- b.idLoteEstoque,
              b.quantidade,
              CASE WHEN a.tipoApontamento = 'N' THEN 0 ELSE b.quantidade END, -- p_quantidadeSaldo
              b.observacoes,
              v_ativ_idFichaProdutoPrevOrcam); -- r_idFichaProdutoPrevOrcamento
            IF a.tipoApontamento = 'N' THEN
              ADD_ORCAMENTO_ITEM_REAL_FIC_GR (
                p_sys_estabelecimentoAtivo,
                p_config_354_estabProximoId,
                0, -- p_idFichaProdutoRealOrcamento
                v_ativ_idAtividadeRealOrcament, -- p_idAtividadeRealOrcamento
                v_ativ_ordenacaoFichaProdutoPr, -- p_ordenacao
                0, -- p_atualizaCustoMedio
                0, -- p_atualizaUltimaCompra
                'S', -- p_entradaSaida,
                CASE WHEN b.localEstoque = 0 THEN p_item_localEstoque ELSE b.localEstoque END, -- p_localEstoque
                v_ativ_idFichaProdutoPrevOrcam, -- p_idFichaProdutoPrevOrcamento
                b.gradeProduto,
                0, -- personalizacao,
                0, -- b.idLoteEstoque,
                b.quantidade,
                1, -- p_zerarSaldo,
                0, -- p_precoCustoOperacao
                0, -- p_totalCustoOperacao
                0, -- p_precoCMV
                0, -- p_valorCMV
                b.observacoes,
                v_auxNumber); -- r_idFichaProdutoRealOrcamento
            END IF;
          END LOOP;
        END LOOP;
      END IF;
      -- Se inseriu Atividades Previstas
      IF v_ativ_sequencia > 0 THEN
        SELECT
          COUNT (1) numeroAtividades,
          SUM (
            CASE
              WHEN prev.faturarAtividade = 'P'
              THEN prev.quantidade
              ELSE COALESCE ((
                SELECT realiz.quantidade
                FROM MOORCAMENTOXATIVIDADEREAL realiz
                WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
                AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
            END) quantidade,
          MIN (prev.precoUnitario) precoUnitarioMenor,
          MAX (prev.precoUnitario) precoUnitarioMaior,
          SUM (ROUND (
            CASE
              WHEN prev.faturarAtividade = 'P'
              THEN prev.quantidade
              ELSE COALESCE ((
                SELECT realiz.quantidade
                FROM MOORCAMENTOXATIVIDADEREAL realiz
                WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
                AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
            END * prev.precoUnitario, 2)) valorTotalItem
        INTO
          v_ativ_numero,
          v_ativ_quantidade,
          v_ativ_precoUnitarioMenor,
          v_ativ_precoUnitario,
          v_ativ_valorTotalItem
        FROM MOORCAMENTOXATIVIDADEPREV prev
        WHERE prev.idItemOrcamento = r_item_idItemOrcamento
        AND prev.statusAtividadeServico <> 'C'
        AND prev.faturarAtividade IN ('P','R');
        IF v_ativ_numero > 0 THEN
          v_ativ_geraFinanceiro := 1;
          IF v_ativ_numero > 1
            AND v_ativ_precoUnitarioMenor <> v_ativ_precoUnitario
            AND v_ativ_quantidade <> 0
          THEN
            v_ativ_precoUnitario := ROUND (v_ativ_valorTotalItem / v_ativ_quantidade, TO_NUMBER (p_config_64_casasDecSaidas));
          END IF;
        ELSE
          SELECT
            COUNT (1) numeroAtividades,
            SUM (COALESCE ((
              SELECT realiz.quantidade
              FROM MOORCAMENTOXATIVIDADEREAL realiz
              WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
              AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)) quantidade,
            MIN (prev.precoUnitario) precoUnitarioMenor,
            MAX (prev.precoUnitario) precoUnitarioMaior,
            SUM (ROUND (COALESCE ((
              SELECT realiz.quantidade
              FROM MOORCAMENTOXATIVIDADEREAL realiz
              WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
              AND realiz.statusAtividadeServico <> 'C'), prev.quantidade) * prev.precoUnitario, 2)) valorTotalItem
          INTO
            v_ativ_numero,
            v_ativ_quantidade,
            v_ativ_precoUnitarioMenor,
            v_ativ_precoUnitario,
            v_ativ_valorTotalItem
          FROM MOORCAMENTOXATIVIDADEPREV prev
          JOIN PAATIVIDADESSERVICO ativ
          ON ativ.atividadeServico = prev.atividadeServico
          JOIN CAGRADESPRODUTO gradProd
          ON gradProd.gradeProduto = ativ.gradeProduto
          JOIN CAPRODUTOS prod
          ON prod.produto = gradProd.produto
          WHERE prev.idItemOrcamento = r_item_idItemOrcamento
          AND prev.statusAtividadeServico <> 'C'
          AND ativ.gradeProduto > 0
          AND prod.unidadeMedida = v_prod_unidadeMedida;
          IF v_ativ_numero > 0 THEN
            v_ativ_geraFinanceiro := 0;
            IF v_ativ_numero > 1
              AND v_ativ_precoUnitarioMenor <> v_ativ_precoUnitario
              AND v_ativ_quantidade <> 0
            THEN
              v_ativ_precoUnitario := ROUND (v_ativ_valorTotalItem / v_ativ_quantidade, TO_NUMBER (p_config_64_casasDecSaidas));
            END IF;
          END IF;
        END IF;
        IF v_ativ_numero > 0
          AND (v_ativ_quantidade <> p_item_quantidade
            OR v_ativ_precoUnitario <> v_item_precoUnitario
            OR v_ativ_geraFinanceiro <> v_item_geraFinanceiro)
        THEN
          ADD_ORCAMENTO_ITEM_GRAVA (
            ' ', -- p_sessaoClient
            p_sys_usuarioLogado,
            p_sys_perfilUsuarioLogado,
            p_sys_estabelecimentoAtivo,
            p_person_190_modeloFrete,
            p_config_64_casasDecSaidas,
            p_config_65_casasDecEntrada,
            p_config_198_obs_add_referenc,
            p_config_199_obs_add_caractA,
            p_config_200_obs_add_caractB,
            p_config_201_obs_add_caractC,
            p_config_202_obs_add_caractD,
            p_config_203_obs_add_caractE,
            p_config_209_filtrarGrupoEcon,
            p_config_354_estabProximoId,
            p_config_362_calcCustoPorGrade,
            p_config_378_calcularVolumes,
            p_config_413_obs_add_marca,
            p_config_418_obs_efetarEnter,
            p_config_430_sugerirUsuLogTec,
            0, -- p_manterFinanceiro_Retotalizar,
            'T', -- p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
            0, -- p_buscarGeraFinanceiroEstoque,
            ' ', -- p_tipoDocumentoReferenciado, 
            0, -- p_idItemReferenciado,
            0, -- p_quantidadeReferenciada
            ' ', -- p_tempComp_nomeTempComposicao,
            0, -- p_tempComp_sequencia
            ' ', -- p_mensagemAviso,
            r_calcularImpostos,
            r_item_idItemOrcamento,
            p_item_orcamento,
            p_item_pedidoCompraFornecedor,
            p_item_sequenciaPedidoCompraFo,
            p_item_ambiente,
            p_item_ambienteObservacoes,
            p_item_vinculoItemDocumento,
            p_item_atividadeServico,
            p_item_statusAtividadeServico,
            p_item_controleEntrega,
            p_item_dataEntrega,
            p_item_modeloDocumento,
            p_item_estabelecimentoOriginal,
            p_item_vendedor,
            p_item_gradeProduto,
            p_item_idFormulaTinta,
            p_item_personalizacao,
            p_item_idLoteEstoque,
            0, -- p_item_idNumeroSerie
            0, -- p_item_atividadeProjeto,
            p_item_localEstoque,
            p_item_pessoaParticipante,
            p_item_controleQuantidade,
            p_item_unidadeMedidaConversao,
            p_item_conversorQuantidade,
            p_item_loteMinimo,
            p_item_loteMultiplo,
            p_item_altura,
            p_item_largura,
            p_item_comprimento,
            ROUND (CASE p_item_controleQuantidade
              WHEN 2
              THEN CASE WHEN p_item_altura = 0 OR p_item_largura = 0 THEN 0 ELSE v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100)) END
              WHEN 3
              THEN CASE WHEN p_item_altura = 0 OR p_item_comprimento = 0 OR p_item_comprimento = 0 THEN 0 ELSE v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100) * p_item_comprimento) END
              WHEN 4
              THEN CASE WHEN p_item_conversorQuantidade = 0 THEN 0 ELSE v_ativ_quantidade / p_item_conversorQuantidade END
              ELSE 0
            END, 3), -- p_item_pecas
            v_ativ_quantidade,
            ROUND (CASE p_item_controleQuantidade
              WHEN 2
              THEN CASE WHEN p_item_altura = 0 OR p_item_largura = 0 THEN 0 ELSE v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100)) END
              WHEN 3
              THEN CASE WHEN p_item_altura = 0 OR p_item_comprimento = 0 OR p_item_comprimento = 0 THEN 0 ELSE v_ativ_quantidade / ((p_item_altura / 100) * (p_item_largura / 100) * p_item_comprimento) END
              WHEN 4
              THEN CASE WHEN p_item_conversorQuantidade = 0 THEN v_ativ_quantidade ELSE v_ativ_quantidade / p_item_conversorQuantidade END
              WHEN 5
              THEN CASE WHEN p_item_conversorQuantidade = 0 THEN v_ativ_quantidade ELSE v_ativ_quantidade * p_item_conversorQuantidade END
              ELSE v_ativ_quantidade
            END, 6), -- p_item_quantidadeConvertida
            ROUND ((v_ativ_quantidade * v_prod_pesoLiquido), 3), -- p_item_pesoLiquido
            ROUND ((v_ativ_quantidade * v_prod_pesoBruto), 3), -- p_item_pesoBruto
            p_item_tipoPreco,
            p_item_tabelaPreco,
            p_item_precoSugestaoAPrazo,
            p_item_precoSugestaoAVista,
            p_item_precoDesconto,
            p_item_precoMinimo,
            p_item_usarPrecoAVista,
            v_ativ_precoUnitario, -- p_item_precoUnitarioBruto
            p_item_acrescimoUnitarioCompos,
            v_ativ_precoUnitario, -- p_item_precoUnitario
            p_item_percDescontoItem,
            p_item_valorDescontoItem,
            p_item_percAcrescimoItem,
            p_item_valorAcrescimoItem,
            p_item_valorFreteItem,
            p_item_valorSeguroItem,
            p_item_valorAdicFreteMarItem,
            p_item_valorDespesasAduanItem,
            p_item_observacoesDigitadas,
            v_item_valorFreteGeral,
            p_item_valorSeguroGeral,
            v_item_valorDescontoGeral,
            p_item_valorOutrasDespesasGer,
            p_item_valorAdicFreteMarGeral,
            p_item_valorDespesasAduanGeral,
            v_item_valorDescontoPagamento,
            v_item_valorOutrasDespPagament,
            v_item_valorJurosPagamento,
            p_item_operacaoFiscal,
            v_item_movimentaEstoque,
            v_ativ_geraFinanceiro,
            0, -- p_item_cfop
            ' ', -- p_item_indicadorISSQN
            0, -- p_item_aliquotaISSQN
            0, -- p_item_retidoISSQN
            0, -- p_item_tributadoForaMunicipio
            0, -- p_item_incentivoFiscal
            0, -- p_item_listaServicos
            0, -- p_item_cnae
            0, -- p_item_idServicoMunicipio
            ' ', -- p_item_numeroProcessoAdministr
            0, -- p_item_retencaoIRRF
            0, -- p_item_retencaoINSS
            0, -- p_item_retencaoPIS
            0, -- p_item_retencaoCOFINS
            0, -- p_item_retencaoCSLL
            0, -- p_item_retencaoOutros
            0, -- p_item_aliquotaII
            0, -- p_item_aliquotaIOF
            0, -- p_item_codigoEnquadramentoIPI
            0, -- p_item_stIPI
            0, -- p_item_aliquotaIPI
            0, -- p_item_valorAliquotaIPI
            ' ', -- p_item_stPIS
            0, -- p_item_aliquotaPIS
            0, -- p_item_valorAliquotaPIS
            0, -- p_item_aliquotaPISST
            0, -- p_item_valorAliquotaPISST
            ' ', -- p_item_stCOFINS
            0, -- p_item_aliquotaCOFINS
            0, -- p_item_valorAliquotaCOFINS
            0, -- p_item_aliquotaCOFINSST
            0, -- p_item_valorAliquotaCOFINSST
            '   ', -- p_item_stSimplesNacional
            0, -- p_item_creditoSimplesNacional
            '  ', -- p_item_stICMS
            0, -- p_item_modalBaseCalcICMS
            0, -- p_item_reducaoBaseICMS
            0, -- p_item_aliquotaICMS
            0, -- p_item_diferimentoICMS
            ' ', -- p_item_motivoDesoneracaoICMS
            0, -- p_item_idBeneficio
            ' ', -- p_item_modalBaseCalcICMSST
            0, -- p_item_margemValorAdicionadoST
            0, -- p_item_reducaoBaseST
            0, -- p_item_aliquotaICMSST
            0, -- p_item_aliquotaSTSuportConsFin
            0, -- p_item_reducaoBaseICMSEfetivo
            0, -- p_item_aliquotaICMSEfetivo
            0, -- p_item_aliquotaICMSUFDestinat
            0, -- p_item_aliquotaICMSInterestad
            0, -- p_item_partilhaICMSInterestad
            0, -- p_item_aliquotaFCP
            0, -- p_item_aliquotaFCPST
            0, -- p_item_aliquotaFCPSTAnteriorm
            0, -- p_item_aliquotaFCPUFDestinat
            0, -- p_item_aliquotaEstImpFederais
            0, -- p_item_aliquotaEstImpEstaduais
            0, -- p_item_aliquotaEstImpMunicipai
            0, -- p_item_baseISSQN
            0, -- p_item_valorISSQN
            0, -- p_item_baseRetIRRF
            0, -- p_item_valorRetIRRF
            0, -- p_item_baseRetINSS
            0, -- p_item_valorRetINSS
            0, -- p_item_baseRetPIS
            0, -- p_item_valorRetPIS
            0, -- p_item_baseRetCOFINS
            0, -- p_item_valorRetCOFINS
            0, -- p_item_baseRetCSLL
            0, -- p_item_valorRetCSLL
            0, -- p_item_baseRetOutros
            0, -- p_item_valorRetOutros
            0, -- p_item_baseII
            0, -- p_item_valorII
            0, -- p_item_baseIOF
            0, -- p_item_valorIOF
            0, -- p_item_baseIPI
            0, -- p_item_valorIPI
            0, -- p_item_basePIS
            0, -- p_item_valorPIS
            0, -- p_item_basePISST
            0, -- p_item_valorPISST
            0, -- p_item_baseCOFINS
            0, -- p_item_valorCOFINS
            0, -- p_item_baseCOFINSST
            0, -- p_item_valorCOFINSST
            0, -- p_item_baseCreditoSimplesNac
            0, -- p_item_valorCreditoSimplesNac
            0, -- p_item_baseICMS
            0, -- p_item_valorICMSOperacao
            0, -- p_item_valorICMSDiferido
            0, -- p_item_valorICMS
            0, -- p_item_valorICMSDesoneracao
            0, -- p_item_baseICMSST
            0, -- p_item_valorICMSST
            0, -- p_item_baseICMSSTAnteriormente
            0, -- p_item_valorICMSSTAnteriorment
            0, -- p_item_valorICMSProprioSubstit
            0, -- p_item_baseICMSEfetivo
            0, -- p_item_valorICMSEfetivo
            0, -- p_item_baseICMSUFDestinatario
            0, -- p_item_valorICMSUFDestinatario
            0, -- p_item_baseICMSUFRemetente
            0, -- p_item_valorICMSUFRemetente
            0, -- p_item_baseFCP
            0, -- p_item_valorFCP
            0, -- p_item_baseFCPST
            0, -- p_item_valorFCPST
            0, -- p_item_baseFCPSTAnteriormente
            0, -- p_item_valorFCPSTAnteriormente
            0, -- p_item_baseFCPUFDestinatario
            0, -- p_item_valorFCPUFDestinatario
            0, -- p_item_baseEstimadaImpostos
            0, -- p_item_valorEstImpFederais
            0, -- p_item_valorEstImpEstaduais
            0, -- p_item_valorEstImpMunicipais
            ' ', -- p_idAtividadesPrevistasSelec
            0, -- p_nivel,
            ' ',
            v_auxVarchar, -- r_mensagemAviso
            r_calcularImpostos,
            v_auxNumber, -- idItemOrcamento
            v_auxVarchar, -- r_buffer_idItemOrcamento
            v_auxNumber); -- r_valorInserido
        END IF;
        ADD_ORCAMENTO_ITEM_STATUS_CALC (r_item_idItemOrcamento);
      END IF;
    END IF;
    ADD_RESERVA_ESTOQUE_ORC_ITEM (
      p_sys_estabelecimentoAtivo,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      r_item_idItemOrcamento,
      '',
      '',
      v_auxVarchar,
      v_auxVarchar);
  END IF;
END ADD_ORCAMENTO_ITEM_GRAVA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_PREV_RECALC (
  p_usuarioLogado                IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_198_obs_add_referenc  IN NUMBER,
  p_config_199_obs_add_caractA   IN NUMBER,
  p_config_200_obs_add_caractB   IN NUMBER,
  p_config_201_obs_add_caractC   IN NUMBER,
  p_config_202_obs_add_caractD   IN NUMBER,
  p_config_203_obs_add_caractE   IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     IN NUMBER,
  p_config_418_obs_efetarEnter   IN NUMBER,
  p_config_430_sugerirUsuLogTec  IN NUMBER,
  p_idItemOrcamento              IN NUMBER)
IS
  v_calcularImpostos        NUMBER;
  v_ativ_numero             NUMBER;
  v_ativ_quantidade         NUMBER;
  v_ativ_precoUnitarioMenor NUMBER;
  v_ativ_precoUnitario      NUMBER;
  v_ativ_valorTotalItem     NUMBER;
  v_ativ_geraFinanceiro     NUMBER;
  v_auxNumber               NUMBER;
  v_auxVarchar              VARCHAR2 (32000);
BEGIN
  v_calcularImpostos := 0;
  SELECT
    COUNT (1) numeroAtividades,
    SUM (
      CASE
        WHEN prev.faturarAtividade = 'P'
        THEN prev.quantidade
        ELSE COALESCE ((
          SELECT realiz.quantidade
          FROM MOORCAMENTOXATIVIDADEREAL realiz
          WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
          AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
      END) quantidade,
    MIN (prev.precoUnitario) precoUnitarioMenor,
    MAX (prev.precoUnitario) precoUnitarioMaior,
    SUM (ROUND (
      CASE
        WHEN prev.faturarAtividade = 'P'
        THEN prev.quantidade
        ELSE COALESCE ((
          SELECT realiz.quantidade
          FROM MOORCAMENTOXATIVIDADEREAL realiz
          WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
          AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)
      END * prev.precoUnitario, 2)) valorTotalItem
  INTO
    v_ativ_numero,
    v_ativ_quantidade,
    v_ativ_precoUnitarioMenor,
    v_ativ_precoUnitario,
    v_ativ_valorTotalItem
  FROM MOORCAMENTOXATIVIDADEPREV prev
  WHERE prev.idItemOrcamento = p_idItemOrcamento
  AND prev.statusAtividadeServico <> 'C'
  AND prev.faturarAtividade IN ('P','R');
  IF v_ativ_numero > 0 THEN
    v_ativ_geraFinanceiro := 1;
    IF v_ativ_numero > 1
      AND v_ativ_precoUnitarioMenor <> v_ativ_precoUnitario
      AND v_ativ_quantidade <> 0
    THEN
      v_ativ_precoUnitario := ROUND (v_ativ_valorTotalItem / v_ativ_quantidade, TO_NUMBER (p_config_64_casasDecSaidas));
    END IF;
  ELSE
    SELECT
      COUNT (1) numeroAtividades,
      SUM (COALESCE ((
        SELECT realiz.quantidade
        FROM MOORCAMENTOXATIVIDADEREAL realiz
        WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
        AND realiz.statusAtividadeServico <> 'C'), prev.quantidade)) quantidade,
        MIN (prev.precoUnitario) precoUnitarioMenor,
        MAX (prev.precoUnitario) precoUnitarioMaior,
        SUM (ROUND (COALESCE ((
          SELECT realiz.quantidade
          FROM MOORCAMENTOXATIVIDADEREAL realiz
          WHERE realiz.idAtividadePrevOrcamento = prev.idAtividadePrevOrcamento
          AND realiz.statusAtividadeServico <> 'C'), prev.quantidade) * prev.precoUnitario, 2)) valorTotalItem
    INTO
      v_ativ_numero,
      v_ativ_quantidade,
      v_ativ_precoUnitarioMenor,
      v_ativ_precoUnitario,
      v_ativ_valorTotalItem
    FROM MOORCAMENTOXATIVIDADEPREV prev
    JOIN MOORCAMENTOXITENS item
    ON item.idItemOrcamento = p_idItemOrcamento
    JOIN CAGRADESPRODUTO gradProd
    ON gradProd.gradeProduto = item.gradeProduto
    JOIN CAPRODUTOS prod
    ON prod.produto = gradProd.produto
    JOIN PAATIVIDADESSERVICO ativ
    ON ativ.atividadeServico = prev.atividadeServico
    JOIN CAGRADESPRODUTO gradProdAtiv
    ON gradProdAtiv.gradeProduto = ativ.gradeProduto
    JOIN CAPRODUTOS prodAtiv
    ON prodAtiv.produto = gradProdAtiv.produto
    WHERE prev.idItemOrcamento = p_idItemOrcamento
    AND prev.statusAtividadeServico <> 'C'
    AND ativ.gradeProduto > 0
    AND prodAtiv.unidadeMedida = prod.unidadeMedida;
    IF v_ativ_numero > 0 THEN
      v_ativ_geraFinanceiro := 0;
      IF v_ativ_numero > 1
        AND v_ativ_precoUnitarioMenor <> v_ativ_precoUnitario
        AND v_ativ_quantidade <> 0
      THEN
        v_ativ_precoUnitario := ROUND (v_ativ_valorTotalItem / v_ativ_quantidade, TO_NUMBER (p_config_64_casasDecSaidas));
      END IF;
    END IF;
  END IF;
  IF v_ativ_numero > 0 THEN
    FOR a IN (
      SELECT
        a.orcamento,
        a.pedidoCompraFornecedor,
        a.sequenciaPedidoCompraFornec,
        a.ambiente,
        a.ambienteObservacoes,
        a.vinculoItemDocumento,
        a.atividadeServico,
        a.statusAtividadeServico,
        a.controleEntrega,
        a.dataEntrega,
        a.modeloDocumento,
        a.estabelecimentoOriginal,
        a.vendedor,
        a.gradeProduto,
        a.idFormulaTinta,
        a.personalizacao,
        a.idLoteEstoque,
        a.localEstoque,
        a.pessoaParticipante,
        a.controleQuantidade,
        a.unidadeMedidaConversao,
        a.conversorQuantidade,
        a.loteMinimo,
        a.loteMultiplo,
        a.altura,
        a.largura,
        a.comprimento,
        a.quantidade,
        a.precoUnitario,
        a.tipoPreco,
        a.tabelaPreco,
        a.precoSugestaoAPrazo,
        a.precoSugestaoAVista,
        a.precoDesconto,
        a.precoMinimo,
        a.usarPrecoAVista,
        a.acrescimoUnitarioComposicao,
        a.percDescontoItem,
        a.valorDescontoItem,
        a.percAcrescimoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.observacoesDigitadas,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.operacaoFiscal,
        a.movimentaEstoque,
        a.geraFinanceiro,
        prod.pesoLiquido prod_pesoLiquido,
        prod.pesoBruto prod_pesoBruto,
        unMedConv.casasDecimaisUnidadeMedida unMedConv_casasDecimais
      FROM MOORCAMENTOXITENS a
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN SIUNIDADESMEDIDA unMedConv
      ON unMedConv.unidadeMedida = a.unidadeMedidaConversao
      WHERE a.idItemOrcamento = p_idItemOrcamento)
    LOOP   
      IF v_ativ_quantidade <> a.quantidade
        OR v_ativ_precoUnitario <> a.precoUnitario
        OR v_ativ_geraFinanceiro <> a.geraFinanceiro
      THEN
        ADD_ORCAMENTO_ITEM_GRAVA (
          ' ', -- p_sessaoClient
          p_usuarioLogado,
          p_perfilUsuarioLogado,
          p_estabelecimentoAtivo,
          p_person_190_modeloFrete,
          p_config_64_casasDecSaidas,
          p_config_65_casasDecEntrada,
          p_config_198_obs_add_referenc,
          p_config_199_obs_add_caractA,
          p_config_200_obs_add_caractB,
          p_config_201_obs_add_caractC,
          p_config_202_obs_add_caractD,
          p_config_203_obs_add_caractE,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          p_config_378_calcularVolumes,
          p_config_413_obs_add_marca,
          p_config_418_obs_efetarEnter,
          p_config_430_sugerirUsuLogTec,
          0, -- p_manterFinanceiro_Retotalizar,
          'T', -- p_buscarAliquotas_CalcularImp  IN CHAR, -- N = Não, S = Sim, T = Troca Produto / Operação Fiscal, I = Calcular Impostos
          0, -- p_buscarGeraFinanceiroEstoque,
          ' ', -- p_tipoDocumentoReferenciado, 
          0, -- p_idItemReferenciado,
          0, -- p_quantidadeReferenciada
          ' ', -- p_tempComp_nomeTempComposicao,
          0, -- p_tempComp_sequencia
          ' ', -- p_mensagemAviso,
          0, -- p_calcularImpostos
          p_idItemOrcamento,
          a.orcamento,
          a.pedidoCompraFornecedor,
          a.sequenciaPedidoCompraFornec,
          a.ambiente,
          a.ambienteObservacoes,
          a.vinculoItemDocumento,
          a.atividadeServico,
          a.statusAtividadeServico,
          a.controleEntrega,
          a.dataEntrega,
          a.modeloDocumento,
          a.estabelecimentoOriginal,
          a.vendedor,
          a.gradeProduto,
          a.idFormulaTinta,
          a.personalizacao,
          a.idLoteEstoque,
          0, -- p_item_idNumeroSerie
          0, -- p_item_atividadeProjeto,
          a.localEstoque,
          a.pessoaParticipante,
          a.controleQuantidade,
          a.unidadeMedidaConversao,
          a.conversorQuantidade,
          a.loteMinimo,
          a.loteMultiplo,
          a.altura,
          a.largura,
          a.comprimento,
          CASE a.controleQuantidade
            WHEN 2
            THEN ROUND (CASE WHEN a.altura = 0 OR a.largura = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / ((a.altura / 100) * (a.largura / 100))), 3) END, 6)
            WHEN 3
            THEN ROUND (CASE WHEN a.altura = 0 OR a.comprimento = 0 OR a.comprimento = 0 THEN 0 ELSE ROUND (v_ativ_quantidade / ((a.altura / 100) * (a.largura / 100) * a.comprimento), 3) END, 6)
            WHEN 4
            THEN ROUND (CASE WHEN a.conversorQuantidade = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / a.conversorQuantidade), 3) END, 6)
            ELSE 0
          END, -- p_item_pecas
          v_ativ_quantidade,
          CASE a.controleQuantidade
            WHEN 2
            THEN ROUND (CASE WHEN a.altura = 0 OR a.largura = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / ((a.altura / 100) * (a.largura / 100))), 3) END, a.unMedConv_casasDecimais)
            WHEN 3
            THEN ROUND (CASE WHEN a.altura = 0 OR a.comprimento = 0 OR a.comprimento = 0 THEN 0 ELSE ROUND (v_ativ_quantidade / ((a.altura / 100) * (a.largura / 100) * a.comprimento), 3) END, a.unMedConv_casasDecimais)
            WHEN 4
            THEN ROUND (CASE WHEN a.conversorQuantidade = 0 THEN 0 ELSE ROUND ((v_ativ_quantidade / a.conversorQuantidade), 3) END, a.unMedConv_casasDecimais)
            ELSE v_ativ_quantidade
          END, -- p_item_quantidadeConvertida
          ROUND ((v_ativ_quantidade * a.prod_pesoLiquido), 3), -- p_item_pesoLiquido
          ROUND ((v_ativ_quantidade * a.prod_pesoBruto), 3), -- p_item_pesoBruto
          a.tipoPreco,
          a.tabelaPreco,
          a.precoSugestaoAPrazo,
          a.precoSugestaoAVista,
          a.precoDesconto,
          a.precoMinimo,
          a.usarPrecoAVista,
          v_ativ_precoUnitario, -- p_item_precoUnitarioBruto
          a.acrescimoUnitarioComposicao,
          v_ativ_precoUnitario, -- p_item_precoUnitario
          a.percDescontoItem,
          a.valorDescontoItem,
          a.percAcrescimoItem,
          a.valorAcrescimoItem,
          a.valorFreteItem,
          a.valorSeguroItem,
          a.valorAdicFreteMarinhaMerItem,
          a.valorDespesasAduaneirasItem,
          a.observacoesDigitadas,
          a.valorFreteGeral,
          a.valorSeguroGeral,
          a.valorDescontoGeral,
          a.valorOutrasDespesasGeral,
          a.valorAdicFreteMarinhaMerGeral,
          a.valorDespesasAduaneirasGeral,
          a.valorDescontoPagamento,
          a.valorOutrasDespesasPagamento,
          a.valorJurosPagamento,
          a.operacaoFiscal,
          a.movimentaEstoque,
          v_ativ_geraFinanceiro,
          0, -- p_item_cfop
          ' ', -- p_item_indicadorISSQN
          0, -- p_item_aliquotaISSQN
          0, -- p_item_retidoISSQN
          0, -- p_item_tributadoForaMunicipio
          0, -- p_item_incentivoFiscal
          0, -- p_item_listaServicos
          0, -- p_item_cnae
          0, -- p_item_idServicoMunicipio
          ' ', -- p_item_numeroProcessoAdministr
          0, -- p_item_retencaoIRRF
          0, -- p_item_retencaoINSS
          0, -- p_item_retencaoPIS
          0, -- p_item_retencaoCOFINS
          0, -- p_item_retencaoCSLL
          0, -- p_item_retencaoOutros
          0, -- p_item_aliquotaII
          0, -- p_item_aliquotaIOF
          0, -- p_item_codigoEnquadramentoIPI
          0, -- p_item_stIPI
          0, -- p_item_aliquotaIPI
          0, -- p_item_valorAliquotaIPI
          ' ', -- p_item_stPIS
          0, -- p_item_aliquotaPIS
          0, -- p_item_valorAliquotaPIS
          0, -- p_item_aliquotaPISST
          0, -- p_item_valorAliquotaPISST
          ' ', -- p_item_stCOFINS
          0, -- p_item_aliquotaCOFINS
          0, -- p_item_valorAliquotaCOFINS
          0, -- p_item_aliquotaCOFINSST
          0, -- p_item_valorAliquotaCOFINSST
          '   ', -- p_item_stSimplesNacional
          0, -- p_item_creditoSimplesNacional
          '  ', -- p_item_stICMS
          0, -- p_item_modalBaseCalcICMS
          0, -- p_item_reducaoBaseICMS
          0, -- p_item_aliquotaICMS
          0, -- p_item_diferimentoICMS
          ' ', -- p_item_motivoDesoneracaoICMS
          0, -- p_item_idBeneficio
          ' ', -- p_item_modalBaseCalcICMSST
          0, -- p_item_margemValorAdicionadoST
          0, -- p_item_reducaoBaseST
          0, -- p_item_aliquotaICMSST
          0, -- p_item_aliquotaSTSuportConsFin
          0, -- p_item_reducaoBaseICMSEfetivo
          0, -- p_item_aliquotaICMSEfetivo
          0, -- p_item_aliquotaICMSUFDestinat
          0, -- p_item_aliquotaICMSInterestad
          0, -- p_item_partilhaICMSInterestad
          0, -- p_item_aliquotaFCP
          0, -- p_item_aliquotaFCPST
          0, -- p_item_aliquotaFCPSTAnteriorm
          0, -- p_item_aliquotaFCPUFDestinat
          0, -- p_item_aliquotaEstImpFederais
          0, -- p_item_aliquotaEstImpEstaduais
          0, -- p_item_aliquotaEstImpMunicipai
          0, -- p_item_baseISSQN
          0, -- p_item_valorISSQN
          0, -- p_item_baseRetIRRF
          0, -- p_item_valorRetIRRF
          0, -- p_item_baseRetINSS
          0, -- p_item_valorRetINSS
          0, -- p_item_baseRetPIS
          0, -- p_item_valorRetPIS
          0, -- p_item_baseRetCOFINS
          0, -- p_item_valorRetCOFINS
          0, -- p_item_baseRetCSLL
          0, -- p_item_valorRetCSLL
          0, -- p_item_baseRetOutros
          0, -- p_item_valorRetOutros
          0, -- p_item_baseII
          0, -- p_item_valorII
          0, -- p_item_baseIOF
          0, -- p_item_valorIOF
          0, -- p_item_baseIPI
          0, -- p_item_valorIPI
          0, -- p_item_basePIS
          0, -- p_item_valorPIS
          0, -- p_item_basePISST
          0, -- p_item_valorPISST
          0, -- p_item_baseCOFINS
          0, -- p_item_valorCOFINS
          0, -- p_item_baseCOFINSST
          0, -- p_item_valorCOFINSST
          0, -- p_item_baseCreditoSimplesNac
          0, -- p_item_valorCreditoSimplesNac
          0, -- p_item_baseICMS
          0, -- p_item_valorICMSOperacao
          0, -- p_item_valorICMSDiferido
          0, -- p_item_valorICMS
          0, -- p_item_valorICMSDesoneracao
          0, -- p_item_baseICMSST
          0, -- p_item_valorICMSST
          0, -- p_item_baseICMSSTAnteriormente
          0, -- p_item_valorICMSSTAnteriorment
          0, -- p_item_valorICMSProprioSubstit
          0, -- p_item_baseICMSEfetivo
          0, -- p_item_valorICMSEfetivo
          0, -- p_item_baseICMSUFDestinatario
          0, -- p_item_valorICMSUFDestinatario
          0, -- p_item_baseICMSUFRemetente
          0, -- p_item_valorICMSUFRemetente
          0, -- p_item_baseFCP
          0, -- p_item_valorFCP
          0, -- p_item_baseFCPST
          0, -- p_item_valorFCPST
          0, -- p_item_baseFCPSTAnteriormente
          0, -- p_item_valorFCPSTAnteriormente
          0, -- p_item_baseFCPUFDestinatario
          0, -- p_item_valorFCPUFDestinatario
          0, -- p_item_baseEstimadaImpostos
          0, -- p_item_valorEstImpFederais
          0, -- p_item_valorEstImpEstaduais
          0, -- p_item_valorEstImpMunicipais
          ' ', -- p_idAtividadesPrevistasSelec
          0, -- p_nivel,
          ' ',
          v_auxVarchar, -- r_mensagemAviso
          v_calcularImpostos,
          v_auxNumber, -- idItemOrcamento
          v_auxVarchar, -- r_buffer_idItemOrcamento
          v_auxNumber); -- r_valorInserido
        IF v_calcularImpostos = 1 THEN
          ADD_ORCAMENTO_CALC_IMP_CAB (
            p_config_64_casasDecSaidas,
            p_config_209_filtrarGrupoEcon,
            p_config_362_calcCustoPorGrade,
            a.orcamento,
            ' ', -- p_troca_tipoPagamentoFrete,
            ' '); --p_a_cab_tipoPagamentoFrete
        END IF;
      END IF;
    END LOOP;
  END IF;
END ADD_ORCAMENTO_ITEM_PREV_RECALC;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_PREV_PEND (
  p_idAtividadePrevOrcamento IN NUMBER,
  p_idItemOrcamento          IN NUMBER,
  p_tecnico                  IN NUMBER)    
IS
BEGIN
UPDATE MOORCAMENTOXATIVIDADEPREV prev
SET prev.tecnico = CASE WHEN prev.tecnico = 0 THEN p_tecnico ELSE prev.tecnico END,
  prev.statusAtividadeServico = 'P',
  prev.dataInicio = CASE WHEN prev.dataInicio IS NULL THEN SYSDATE ELSE prev.dataInicio END,
  prev.dataTermino = CASE WHEN prev.dataTermino IS NULL THEN SYSDATE ELSE prev.dataTermino END
WHERE prev.idItemOrcamento = p_idItemOrcamento
AND prev.statusAtividadeServico = 'A'
AND prev.idAtividadePrevOrcamento <> p_idAtividadePrevOrcamento
AND (p_idAtividadePrevOrcamento = 0
  OR NOT EXISTS (
    SELECT 1
    FROM MOORCAMENTOXATIVIDADEPREV prev2
    WHERE prev2.idAtividadePrevOrcamento = p_idAtividadePrevOrcamento
    AND prev2.statusAtividadeServico IN ('A','I','P')))
AND prev.sequencia =
  ( SELECT MIN (prev2.sequencia)
    FROM MOORCAMENTOXATIVIDADEPREV prev2
    WHERE prev2.idItemOrcamento = prev.idItemOrcamento
    AND prev2.statusAtividadeServico IN ('A','I','P'));
END ADD_ORCAMENTO_ITEM_PREV_PEND;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_PREV_ST_CAL (
  p_idAtividadePrevOrcamento IN NUMBER)
IS
BEGIN
  UPDATE MOORCAMENTOXATIVIDADEPREV a
  SET a.statusAtividadeServico =
    CASE
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEREAL real
        WHERE real.idAtividadePrevOrcamento = a.idAtividadePrevOrcamento
        AND real.statusAtividadeServico IN ('A','P','I'))
      THEN 'I'
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEREAL real
        WHERE real.idAtividadePrevOrcamento = a.idAtividadePrevOrcamento
        AND real.statusAtividadeServico = 'C')
      THEN 'C'
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEREAL real
        WHERE real.idAtividadePrevOrcamento = a.idAtividadePrevOrcamento
        AND real.statusAtividadeServico = 'E')
      THEN 'E'
      ELSE 'P'
    END
  WHERE a.idAtividadePrevOrcamento = p_idAtividadePrevOrcamento
  AND a.statusAtividadeServico <>
    CASE
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEREAL real
        WHERE real.idAtividadePrevOrcamento = a.idAtividadePrevOrcamento
        AND real.statusAtividadeServico IN ('A','P','I'))
      THEN 'I'
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEREAL real
        WHERE real.idAtividadePrevOrcamento = a.idAtividadePrevOrcamento
        AND real.statusAtividadeServico = 'C')
      THEN 'C'
      WHEN EXISTS (
        SELECT 1
        FROM MOORCAMENTOXATIVIDADEREAL real
        WHERE real.idAtividadePrevOrcamento = a.idAtividadePrevOrcamento
        AND real.statusAtividadeServico = 'E')
      THEN 'E'
      ELSE 'P'
    END;
END ADD_ORCAMENTO_ITEM_PREV_ST_CAL;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_ATIV_GRAVA (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_perfilUsuarioLogado      IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_person_251_modeloDocPerdido  IN NUMBER,
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_198_obs_add_referenc  IN NUMBER,
  p_config_199_obs_add_caractA   IN NUMBER,
  p_config_200_obs_add_caractB   IN NUMBER,
  p_config_201_obs_add_caractC   IN NUMBER,
  p_config_202_obs_add_caractD   IN NUMBER,
  p_config_203_obs_add_caractE   IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     IN NUMBER,
  p_config_418_obs_efetarEnter   IN NUMBER,
  p_config_430_sugerirUsuLogTec  IN NUMBER,
  p_servico_producao             IN CHAR,
  p_previsto_realizado           IN CHAR,
  p_prev_idAtividadePrevOrcament IN NUMBER,
  p_prev_idItemOrcamento         IN NUMBER,
  p_prev_sequencia               IN NUMBER,
  p_prev_atividadeServico        IN NUMBER,
  p_prev_descricao               IN VARCHAR2,
  p_prev_tecnico                 IN NUMBER,
  p_prev_faturarAtividade        IN CHAR,
  p_prev_checklist               IN NUMBER,
  p_prev_tipoApontamento         IN CHAR,
  p_prev_editaQuantidades        IN NUMBER,
  p_prev_etapaAtividade          IN NUMBER,
  p_prev_statusAtividadeServico  IN CHAR,
  p_prev_dataInicio              IN DATE,
  p_prev_dataTermino             IN DATE,
  p_prev_quantidade              IN NUMBER,
  p_prev_precoUnitario           IN NUMBER,
  p_prev_observacoes             IN VARCHAR2,
  p_real_idAtividadeRealOrcament IN NUMBER,
  p_real_sequencia               IN NUMBER,
  p_real_atividadeServico        IN NUMBER,
  p_real_descricao               IN VARCHAR2,
  p_real_tecnico                 IN NUMBER,
  p_real_statusAtividadeServico  IN CHAR,
  p_real_dataInicio              IN DATE,
  p_real_dataTermino             IN DATE,
  p_real_modeloDocumento         IN NUMBER,
  p_real_motivoEstoque           IN NUMBER,
  p_real_quantidade              IN NUMBER,
  p_real_observacoes             IN VARCHAR2,
  p_encProd_quantidadeFabricar   IN NUMBER,
  p_encProd_quantidadeFabricada  IN NUMBER,
  p_encProd_motivoEstoqueFabric  IN NUMBER,
  p_encProd_quantidadePerdida    IN NUMBER,
  p_encProd_motivoEstoquePerdido IN NUMBER,
  p_encProd_apontamentoParcial   IN NUMBER,
  /* Retornos */
  r_prev_idAtividadePrevOrcament OUT NUMBER,
  r_real_idAtividadeRealOrcament OUT NUMBER,
  r_registrosRealizado           OUT NUMBER)
IS
  v_cab_estabelecimento         NUMBER;
  v_cab_dataEmissao             DATE;
  v_cab_dataEntrega             DATE;
  v_item_modeloDocumento        NUMBER;
  i_prev_faturarAtividade       CHAR (1);
  i_prev_checklist              NUMBER;
  i_prev_statusAtividadeServico CHAR (1);
  i_prev_quantidade             NUMBER;
  i_prev_precoUnitario          NUMBER;
  i_real_statusAtividadeServico CHAR (1);
  i_real_quantidade             NUMBER;
  v_real_sequencia              NUMBER;
  v_real_modeloDocumento        NUMBER;
  v_real_motivoEstoque          NUMBER;
  v_real_proporcao              NUMBER;
  v_real_quantidadeEntrada      NUMBER;
  v_real_zerarSaldo             NUMBER;
  v_atualizarStatusPrevisto     NUMBER;
  v_bufferIdReservaEstoque      VARCHAR2 (32000);
  v_bufferIdEstoque             VARCHAR2 (32000);
BEGIN
  SELECT
    COALESCE (MAX (cab.estabelecimento), 0),
    MAX (cab.dataEmissao),
    MAX (cab.dataEntrega),
    COALESCE (MAX (item.modeloDocumento), 0)
  INTO
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_dataEntrega,
    v_item_modeloDocumento
  FROM MOORCAMENTOXITENS item
  JOIN MOORCAMENTOS cab
  ON cab.orcamento = item.orcamento
  WHERE item.idItemOrcamento = p_prev_idItemOrcamento;
  r_prev_idAtividadePrevOrcament := p_prev_idAtividadePrevOrcament;
  r_real_idAtividadeRealOrcament := p_real_idAtividadeRealOrcament;
  i_prev_faturarAtividade := 'N';
  i_prev_checklist := 0;
  i_prev_statusAtividadeServico := 'P';
  i_prev_quantidade := 0;
  i_prev_precoUnitario := 0;
  IF p_prev_idAtividadePrevOrcament > 0 THEN
    SELECT
      COALESCE (MAX (faturarAtividade), 'N'),
      COALESCE (MAX (checklist), 0),
      COALESCE (MAX (statusAtividadeServico), 'P'),
      COALESCE (MAX (quantidade), 0),
      COALESCE (MAX (precoUnitario), 0)
    INTO
      i_prev_faturarAtividade,
      i_prev_checklist,
      i_prev_statusAtividadeServico,
      i_prev_quantidade,
      i_prev_precoUnitario
    FROM MOORCAMENTOXATIVIDADEPREV
    WHERE idAtividadePrevOrcamento = p_prev_idAtividadePrevOrcament;
  END IF;
  IF p_previsto_realizado = 'R' THEN
    r_registrosRealizado := CASE WHEN p_real_idAtividadeRealOrcament = 0 THEN 0 ELSE 1 END;
  ELSIF r_prev_idAtividadePrevOrcament = 0 THEN
    r_registrosRealizado := 0;
  ELSE
    SELECT COALESCE (SUM (1), 0)
    INTO r_registrosRealizado
    FROM MOORCAMENTOXATIVIDADEREAL real
    WHERE real.idAtividadePrevOrcamento = r_prev_idAtividadePrevOrcament;
  END IF;
  i_real_statusAtividadeServico := 'P';
  i_real_quantidade := 0;
  IF p_real_idAtividadeRealOrcament > 0 THEN
    SELECT
      COALESCE (MAX (statusAtividadeServico), i_prev_statusAtividadeServico),
      COALESCE (MAX (quantidade), i_prev_quantidade)
    INTO
      i_real_statusAtividadeServico,
      i_real_quantidade
    FROM MOORCAMENTOXATIVIDADEREAL
    WHERE idAtividadeRealOrcamento = p_real_idAtividadeRealOrcament;
  END IF;
  v_atualizarStatusPrevisto :=
    CASE
      WHEN p_previsto_realizado = 'R'
        AND p_real_statusAtividadeServico <> i_real_statusAtividadeServico
      THEN 1
      ELSE 0
    END;
  v_bufferIdReservaEstoque  := '';
  v_bufferIdEstoque         := '';
  ADD_ORCAMENTO_ITEM_PREV_GRAVA (
    p_sys_estabelecimentoAtivo,
    p_config_354_estabProximoId,
    p_prev_idAtividadePrevOrcament,
    p_prev_idItemOrcamento,
    p_prev_sequencia,
    p_prev_atividadeServico,
    p_prev_descricao,
    p_prev_tecnico,
    p_prev_faturarAtividade,
    p_prev_checklist,
    p_prev_tipoApontamento,
    p_prev_editaQuantidades,
    p_prev_etapaAtividade,
    p_prev_statusAtividadeServico,
    p_prev_dataInicio,
    p_prev_dataTermino,
    p_prev_quantidade,
    p_prev_precoUnitario,
    p_prev_observacoes,
    r_prev_idAtividadePrevOrcament);
  IF p_prev_checklist <> i_prev_checklist THEN
    ADD_ORCAMENTO_ITEM_TAREF_GERA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      r_prev_idAtividadePrevOrcament,
      p_prev_checklist);
  END IF;
  IF r_registrosRealizado < 2
    AND (p_previsto_realizado = 'R'
      OR p_real_idAtividadeRealOrcament > 0
      OR p_prev_statusAtividadeServico IN ('C','E','I'))
  THEN
    v_real_sequencia := p_real_sequencia;
    IF p_encProd_quantidadeFabricar = 0 THEN
      v_real_modeloDocumento   := p_real_modeloDocumento;
      v_real_motivoEstoque     := p_real_motivoEstoque;
      v_real_proporcao         := 1;
      v_real_quantidadeEntrada := 0;
      v_real_zerarSaldo        := 1;
    ELSIF p_encProd_quantidadeFabricada > 0
      OR p_encProd_quantidadePerdida = 0
    THEN
      v_real_modeloDocumento := p_real_modeloDocumento;
      v_real_motivoEstoque   := p_encProd_motivoEstoqueFabric;
      v_real_proporcao :=
        CASE
          WHEN p_encProd_quantidadePerdida > 0
            OR p_encProd_apontamentoParcial = 1
          THEN p_encProd_quantidadeFabricada / p_encProd_quantidadeFabricar
          ELSE 1
        END;
      v_real_quantidadeEntrada := p_encProd_quantidadeFabricada;
      v_real_zerarSaldo :=
        CASE
          WHEN p_encProd_quantidadePerdida > 0
            OR p_encProd_apontamentoParcial = 1
          THEN 0
          ELSE 1
        END;
    ELSE
      v_real_modeloDocumento := p_person_251_modeloDocPerdido;
      v_real_motivoEstoque   := p_encProd_motivoEstoquePerdido;
      v_real_proporcao :=
        CASE
          WHEN p_encProd_apontamentoParcial = 1
          THEN p_encProd_quantidadePerdida / p_encProd_quantidadeFabricar
          ELSE 1
        END;
      v_real_quantidadeEntrada := p_encProd_quantidadePerdida;
      v_real_zerarSaldo :=
        CASE
          WHEN p_encProd_apontamentoParcial = 1
          THEN 0
          ELSE 1
        END;
    END IF;
    IF p_real_idAtividadeRealOrcament = 0 THEN
      r_registrosRealizado := r_registrosRealizado + 1;
    END IF;
    ADD_ORCAMENTO_ITEM_REAL_GRAVA (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      p_real_idAtividadeRealOrcament,
      r_prev_idAtividadePrevOrcament,
      v_real_sequencia,
      p_real_atividadeServico,
      p_real_descricao,
      p_real_tecnico,
      p_real_statusAtividadeServico,
      p_real_dataInicio,
      p_real_dataTermino,
      v_real_modeloDocumento,
      v_real_motivoEstoque,
      p_real_quantidade,
      p_real_observacoes,
      r_real_idAtividadeRealOrcament);
    IF p_servico_producao = 'P'
      AND p_real_statusAtividadeServico = 'E'
      AND (p_real_idAtividadeRealOrcament = 0
        OR i_real_statusAtividadeServico <> 'E')
    THEN
      ADD_ORCAMENTO_ITEM_REAL_FIC_GE (
        p_sys_estabelecimentoAtivo,
        p_config_209_filtrarGrupoEcon,
        p_config_354_estabProximoId,
        p_config_362_calcCustoPorGrade,
        v_cab_estabelecimento,
        v_cab_dataEmissao,
        v_cab_dataEntrega,
        v_item_modeloDocumento,
        r_prev_idAtividadePrevOrcament,
        p_prev_dataInicio,
        p_prev_dataTermino,
        r_real_idAtividadeRealOrcament,
        p_real_dataTermino,
        v_real_modeloDocumento,
        v_real_motivoEstoque,
        v_real_proporcao,
        v_real_quantidadeEntrada,
        v_real_zerarSaldo,
        v_bufferIdReservaEstoque,
        v_bufferIdEstoque,
        v_bufferIdReservaEstoque,
        v_bufferIdEstoque);
      IF p_encProd_quantidadeFabricar > 0
        AND p_encProd_quantidadeFabricada > 0
        AND p_encProd_quantidadePerdida > 0
      THEN
        v_real_modeloDocumento := p_person_251_modeloDocPerdido;
        v_real_motivoEstoque   := p_encProd_motivoEstoquePerdido;
        v_real_proporcao :=
          CASE
            WHEN p_encProd_apontamentoParcial = 1
            THEN p_encProd_quantidadePerdida / p_encProd_quantidadeFabricar
            ELSE 1
          END;
        v_real_quantidadeEntrada := p_encProd_quantidadePerdida;
        v_real_zerarSaldo :=
          CASE
            WHEN p_encProd_apontamentoParcial = 1
            THEN 0
            ELSE 1
          END;
        r_registrosRealizado := r_registrosRealizado + 1;
        SELECT COALESCE (MAX (sequencia), 0) + 1
        INTO v_real_sequencia
        FROM MOORCAMENTOXATIVIDADEREAL real
        WHERE real.idAtividadePrevOrcamento = r_prev_idAtividadePrevOrcament;
        ADD_ORCAMENTO_ITEM_REAL_GRAVA (
          p_sys_estabelecimentoAtivo,
          p_config_354_estabProximoId,
          0,
          r_prev_idAtividadePrevOrcament,
          v_real_sequencia,
          p_real_atividadeServico,
          p_real_descricao,
          p_real_tecnico,
          p_real_statusAtividadeServico,
          p_real_dataInicio,
          p_real_dataTermino,
          v_real_modeloDocumento,
          v_real_motivoEstoque,
          p_real_quantidade,
          p_real_observacoes,
          r_real_idAtividadeRealOrcament);
        ADD_ORCAMENTO_ITEM_REAL_FIC_GE (
          p_sys_estabelecimentoAtivo,
          p_config_209_filtrarGrupoEcon,
          p_config_354_estabProximoId,
          p_config_362_calcCustoPorGrade,
          v_cab_estabelecimento,
          v_cab_dataEmissao,
          v_cab_dataEntrega,
          v_item_modeloDocumento,
          r_prev_idAtividadePrevOrcament,
          p_prev_dataInicio,
          p_prev_dataTermino,
          r_real_idAtividadeRealOrcament,
          p_real_dataTermino,
          v_real_modeloDocumento,
          v_real_motivoEstoque,
          v_real_proporcao,
          v_real_quantidadeEntrada,
          v_real_zerarSaldo,
          v_bufferIdReservaEstoque,
          v_bufferIdEstoque,
          v_bufferIdReservaEstoque,
          v_bufferIdEstoque);
        r_real_idAtividadeRealOrcament := 0;
        v_atualizarStatusPrevisto := 1;
      END IF;
    END IF;
    IF p_encProd_apontamentoParcial = 1 THEN
      r_registrosRealizado := r_registrosRealizado + 1;
      SELECT COALESCE (MAX (sequencia), 0) + 1
      INTO v_real_sequencia
      FROM MOORCAMENTOXATIVIDADEREAL real
      WHERE real.idAtividadePrevOrcamento = r_prev_idAtividadePrevOrcament;
      ADD_ORCAMENTO_ITEM_REAL_GRAVA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        0,
        r_prev_idAtividadePrevOrcament,
        v_real_sequencia,
        p_real_atividadeServico,
        ' ', -- p_real_descricao,
        p_real_tecnico,
        'P', -- p_real_statusAtividadeServico,
        p_real_dataTermino, -- p_real_dataTermino,
        NULL, -- p_real_dataTermino,
        p_real_modeloDocumento,
        p_real_motivoEstoque,
        0, -- p_real_quantidade,
        ' ', -- p_real_observacoes,
        r_real_idAtividadeRealOrcament);
        r_real_idAtividadeRealOrcament := 0;
      v_atualizarStatusPrevisto := 1;
    END IF;
  END IF;
  IF v_atualizarStatusPrevisto = 1 THEN
    ADD_ORCAMENTO_ITEM_PREV_ST_CAL (
      r_prev_idAtividadePrevOrcament);
  END IF;
  ADD_ORCAMENTO_ITEM_PREV_PEND (
    r_prev_idAtividadePrevOrcament,
    p_prev_idItemOrcamento,
    p_prev_tecnico);
  ADD_ORCAMENTO_ITEM_STATUS_CALC (
    p_prev_idItemOrcamento);
  IF p_servico_producao = 'P'
    AND p_previsto_realizado = 'P'
    AND r_real_idAtividadeRealOrcament > 0
    AND p_prev_statusAtividadeServico IN ('A','P','I')
  THEN
    ADD_ORCAMENTO_ITEM_PREV_REABRE (
      p_sys_estabelecimentoAtivo,
      p_config_354_estabProximoId,
      v_cab_estabelecimento,
      v_cab_dataEmissao,
      v_cab_dataEntrega,
      v_item_modeloDocumento,
      r_prev_idAtividadePrevOrcament,
      p_prev_dataInicio,
      p_prev_dataTermino,
      '', -- p_bufferIdReservaEstoque
      '', -- p_bufferIdEstoque
      v_bufferIdReservaEstoque, -- r_bufferIdReservaEstoque
      v_bufferIdEstoque); -- r_bufferIdEstoque
  END IF;
  IF i_prev_faturarAtividade <> p_prev_faturarAtividade
    OR i_prev_precoUnitario <> p_prev_precoUnitario
    OR i_prev_statusAtividadeServico = 'C'
    AND p_prev_statusAtividadeServico <> 'C'
    OR i_prev_statusAtividadeServico <> 'C'
    AND p_prev_statusAtividadeServico = 'C'
    OR p_prev_faturarAtividade = 'R'
    AND r_registrosRealizado < 2
    AND (p_previsto_realizado='R'
      AND (i_real_statusAtividadeServico = 'C'
        AND p_real_statusAtividadeServico <> 'C'
        OR i_real_statusAtividadeServico <> 'C'
        AND p_real_statusAtividadeServico = 'C')
      OR i_real_quantidade <> p_real_quantidade)
    OR p_prev_faturarAtividade <> 'R'
    AND i_prev_quantidade <> p_prev_quantidade
  THEN
    ADD_ORCAMENTO_ITEM_PREV_RECALC (
      p_sys_usuarioLogado,
      p_sys_perfilUsuarioLogado,
      p_sys_estabelecimentoAtivo,
      p_person_190_modeloFrete,
      p_config_64_casasDecSaidas,
      p_config_65_casasDecEntrada,
      p_config_198_obs_add_referenc,
      p_config_199_obs_add_caractA,
      p_config_200_obs_add_caractB,
      p_config_201_obs_add_caractC,
      p_config_202_obs_add_caractD,
      p_config_203_obs_add_caractE,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_config_378_calcularVolumes,
      p_config_413_obs_add_marca,
      p_config_418_obs_efetarEnter,
      p_config_430_sugerirUsuLogTec,
      p_prev_idItemOrcamento);
  END IF;
END ADD_ORCAMENTO_ITEM_ATIV_GRAVA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_ATIV_EXCLUI (
  p_sys_usuarioLogado            IN NUMBER,
  p_sys_perfilUsuarioLogado      IN NUMBER,
  p_sys_estabelecimentoAtivo     IN NUMBER,
  p_person_190_modeloFrete       IN CHAR,
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_65_casasDecEntrada    IN CHAR,
  p_config_198_obs_add_referenc  IN NUMBER,
  p_config_199_obs_add_caractA   IN NUMBER,
  p_config_200_obs_add_caractB   IN NUMBER,
  p_config_201_obs_add_caractC   IN NUMBER,
  p_config_202_obs_add_caractD   IN NUMBER,
  p_config_203_obs_add_caractE   IN NUMBER,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_354_estabProximoId    IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_config_378_calcularVolumes   IN NUMBER,
  p_config_413_obs_add_marca     IN NUMBER,
  p_config_418_obs_efetarEnter   IN NUMBER,
  p_config_430_sugerirUsuLogTec  IN NUMBER,
  p_previsto_realizado           IN CHAR,
  p_prev_idAtividadePrevOrcament IN NUMBER,
  p_real_idAtividadeRealOrcament IN NUMBER)
IS
  v_bufferIdReservaEstoque VARCHAR2 (32000);
  v_bufferIdEstoque        VARCHAR2 (32000);
BEGIN
  v_bufferIdReservaEstoque  := '';
  v_bufferIdEstoque         := '';
  FOR a IN (
    SELECT
      idAtividadePrevOrcamento,
      idItemOrcamento,
      tecnico,
      faturarAtividade
    FROM MOORCAMENTOXATIVIDADEPREV
    WHERE idAtividadePrevOrcamento = p_prev_idAtividadePrevOrcament)
  LOOP
  IF p_previsto_realizado = 'P' THEN
    ADD_ORCAMENTO_ITEM_PREV_EXCLUI (
      a.idAtividadePrevOrcamento,
      v_bufferIdReservaEstoque,
      v_bufferIdEstoque,
      v_bufferIdReservaEstoque,
      v_bufferIdEstoque);
  ELSE
    ADD_ORCAMENTO_ITEM_REAL_EXCLUI (
      p_real_idAtividadeRealOrcament,
      v_bufferIdEstoque,
      v_bufferIdEstoque);
    ADD_ORCAMENTO_ITEM_PREV_ST_CAL (
      a.idAtividadePrevOrcamento);
  END IF;
  ADD_ORCAMENTO_ITEM_PREV_PEND (
    a.idAtividadePrevOrcamento,
    a.idItemOrcamento,
    a.tecnico);
  ADD_ORCAMENTO_ITEM_STATUS_CALC (
    a.idItemOrcamento);
  IF a.faturarAtividade <> 'N' THEN
    ADD_ORCAMENTO_ITEM_PREV_RECALC (
      p_sys_usuarioLogado,
      p_sys_perfilUsuarioLogado,
      p_sys_estabelecimentoAtivo,
      p_person_190_modeloFrete,
      p_config_64_casasDecSaidas,
      p_config_65_casasDecEntrada,
      p_config_198_obs_add_referenc,
      p_config_199_obs_add_caractA,
      p_config_200_obs_add_caractB,
      p_config_201_obs_add_caractC,
      p_config_202_obs_add_caractD,
      p_config_203_obs_add_caractE,
      p_config_209_filtrarGrupoEcon,
      p_config_354_estabProximoId,
      p_config_362_calcCustoPorGrade,
      p_config_378_calcularVolumes,
      p_config_413_obs_add_marca,
      p_config_418_obs_efetarEnter,
      p_config_430_sugerirUsuLogTec,
      a.idItemOrcamento);
    END IF;
  END LOOP;
END ADD_ORCAMENTO_ITEM_ATIV_EXCLUI;

/

create or replace PROCEDURE ADD_TEMPQUESTIONARIO_EFETIVA (
  p_sessaoClient                IN VARCHAR,
  p_sys_estabelecimentoAtivo    IN NUMBER,
  p_config_354_estabProximoId   IN NUMBER,
  p_contadorSessao              IN NUMERIC,
  p_DocFisc_PreDoc_Orcam_Tarefa IN CHAR,
  p_idPai                       IN NUMBER)
IS
  v_idSalvar  NUMBER;
  v_ordenacao NUMBER;
BEGIN
  FOR a IN (
    SELECT
      contador,
      idSalvar
    FROM TEMPQUESTIONARIO
    WHERE sessaoClient = p_sessaoClient
    AND contadorSessao = p_contadorSessao
    AND excluido = 1
    AND idSalvar > 0)
  LOOP
    IF p_DocFisc_PreDoc_Orcam_Tarefa = 'D' THEN
      DELETE MODOCFISCALXPERSPROJETO b
      WHERE b.idPersonProjetoDocFiscal = a.idSalvar;
    ELSIF p_DocFisc_PreDoc_Orcam_Tarefa = 'P' THEN
      DELETE MOPREDOCUMXPERSPROJETO b
      WHERE b.idPersonProjetoPreDocumento = a.idSalvar;
    ELSIF p_DocFisc_PreDoc_Orcam_Tarefa = 'O' THEN
      DELETE MOORCAMENTOXPERSPROJETO b
      WHERE b.idPersonProjetoOrcamento = a.idSalvar;
    ELSIF p_DocFisc_PreDoc_Orcam_Tarefa = 'T' THEN
      DELETE MOORCAMENTOXTAREFAS b
      WHERE b.idTarefaOrcamento = a.idSalvar;
    END IF;
  END LOOP;
  FOR a IN (
    SELECT
      a.contador,
      a.idSalvar,
      a.idQuestionario,
      CASE
        WHEN a.tabelaSistema <> ' '
        THEN
          CASE
            WHEN tabSist.nomeCampoIdSeDiferenteCodigo <> ' '
              OR tabSist.tipoCampoCodigo = 'N'
            THEN CASE WHEN a.conteudoId = 0 THEN ' ' ELSE TRIM (TO_CHAR (a.conteudoId)) END
            ELSE a.conteudoCodigo
          END
        WHEN a.tipoCampo = 'D'
        THEN CASE WHEN COALESCE (TO_CHAR (a.conteudoData, 'DD/MM/YYYY'), '00/00/0000') = '00/00/0000' THEN ' ' ELSE COALESCE (TO_CHAR (a.conteudoData, 'DD/MM/YYYY'), '00/00/0000') END
        WHEN a.tipoCampo = 'H'
        THEN CASE WHEN COALESCE (conteudoHora, '000000') = '000000' THEN ' ' ELSE COALESCE (SUBSTR (a.conteudoHora, 1, 2) || ':' || SUBSTR (a.conteudoHora, 3, 2) || ':' || SUBSTR (a.conteudoHora, 5, 2), '00:00:00') END 
        WHEN a.tipoCampo = 'L'
        THEN
          CASE
            WHEN a.conteudoLogico = '1'
            THEN 'S'
            ELSE ' '
          END
        WHEN a.tipoCampo = 'N'
        THEN CASE WHEN a.conteudoNumerico = 0 THEN ' ' ELSE REPLACE (TRIM (TO_CHAR (a.conteudoNumerico, 'FM99999999999999999990D99999999999999999990')), '.', ',') END
        WHEN a.exibirCampo = 'P'
        THEN a.conteudoCombo
        ELSE a.conteudoEdit
      END conteudo,
      a.observacoes
    FROM TEMPQUESTIONARIO a
    JOIN SITABELASSISTEMA tabSist
    ON tabSist.tabelaSistema = a.tabelaSistema
    WHERE a.sessaoClient = p_sessaoClient
    AND a.contadorSessao = p_contadorSessao
    AND a.excluido = 0
    ORDER BY
      a.ordenacao,
      a.subOrdenacao)
  LOOP
    v_idSalvar  := a.idSalvar;
    IF p_DocFisc_PreDoc_Orcam_Tarefa = 'D' THEN
      ADD_DOC_FISC_CAB_PROJ_GRAVA (
        p_sys_estabelecimentoAtivo,
        v_idSalvar, -- p_idPersonProjetoDocFiscal
        p_idPai, -- p_idDocumentoFiscal
        a.idQuestionario, -- p_personalizacaoProjeto
        a.conteudo,
        /* Retornos */
        v_idSalvar); -- r_idTarefaOrcamento
    ELSIF p_DocFisc_PreDoc_Orcam_Tarefa = 'P' THEN
      ADD_PRE_DOC_CAB_PROJ_GRAVA (
        p_sys_estabelecimentoAtivo,
        v_idSalvar, -- p_idPersonProjetoPreDocumento
        p_idPai, -- p_preDocumento
        a.idQuestionario, -- p_personalizacaoProjeto
        a.conteudo,
        /* Retornos */
        v_idSalvar); -- r_idTarefaOrcamento
    ELSIF p_DocFisc_PreDoc_Orcam_Tarefa = 'O' THEN
      ADD_ORCAMENTO_CAB_PROJ_GRAVA (
        p_sys_estabelecimentoAtivo,
        v_idSalvar, -- p_idPersonProjetoOrcamento
        p_idPai, -- p_orcamento
        a.idQuestionario, -- p_personalizacaoProjeto
        a.conteudo,
        /* Retornos */
        v_idSalvar); -- r_idTarefaOrcamento
    ELSIF p_DocFisc_PreDoc_Orcam_Tarefa = 'T' THEN
      v_ordenacao := 0;
      IF v_idSalvar > 0 THEN
        SELECT COALESCE (MAX (ordenacao), 0)
        INTO v_ordenacao
        FROM MOORCAMENTOXTAREFAS
        WHERE idTarefaOrcamento = v_idSalvar;
      END IF;
      IF v_ordenacao <= 0 THEN
        SELECT COALESCE (MAX (ordenacao), 0) + 1
        INTO v_ordenacao
        FROM MOORCAMENTOXTAREFAS
        WHERE idAtividadePrevOrcamento = p_idPai
        AND idCheckListXTarefas = a.idQuestionario;
      END IF;
      ADD_ORCAMENTO_ITEM_TAREF_GRAVA (
        p_sys_estabelecimentoAtivo,
        p_config_354_estabProximoId,
        v_idSalvar, -- p_idTarefaOrcamento
        p_idPai, -- p_idAtividadePrevOrcamento
        a.idQuestionario, -- p_idCheckListXTarefas
        v_ordenacao,
        a.conteudo,
        a.observacoes,
        /* Retornos */
        v_idSalvar); -- r_idTarefaOrcamento
    END IF;
  END LOOP;
  DELETE TEMPQUESTIONARIO b
  WHERE b.sessaoClient = p_sessaoClient
  AND b.contadorSessao = p_contadorSessao;
END ADD_TEMPQUESTIONARIO_EFETIVA;

/

DROP PROCEDURE ADD_ORCAMENTO_CALC_IMP_CAB;
DROP PROCEDURE ADD_ORCAMENTO_CALC_IMP_ITENS;
DROP PROCEDURE ADD_ORCAMENTO_CALC_IMP_RATEIO;
DROP PROCEDURE ADD_ORCAMENTO_CALC_IMP_RESIDUO;
DROP PROCEDURE ADD_PRE_DOC_CALC_IMP_CAB;
DROP PROCEDURE ADD_PRE_DOC_CALC_IMP_ITENS;
DROP PROCEDURE ADD_PRE_DOC_CALC_IMP_RATEIO;
DROP PROCEDURE ADD_PRE_DOC_CALC_IMP_RESIDUO;
DROP PROCEDURE ADD_DOC_FISC_CALC_IMP_CAB;
DROP PROCEDURE ADD_DOC_FISC_CALC_IMP_ITENS;
DROP PROCEDURE ADD_DOC_FISC_CALC_IMP_RATEIO;
DROP PROCEDURE ADD_DOC_FISC_CALC_IMP_RESIDUO;

create or replace PROCEDURE ADD_CALCULA_IMPOSTOS_ITEM (
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_209_filtrarGrupoEcon  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_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_residuoISSQN                 IN NUMBER,
  p_valorISSQN                   IN NUMBER,
  p_calcularRetencaoIRRF         IN NUMBER,
  p_retencaoIRRF                 IN NUMBER,
  p_baseRetIRRF                  IN NUMBER,
  p_residuoRetIRRF               IN NUMBER,
  p_valorRetIRRF                 IN NUMBER,
  p_calcularRetencaoINSS         IN NUMBER,
  p_retencaoINSS                 IN NUMBER,
  p_baseRetINSS                  IN NUMBER,
  p_residuoRetINSS               IN NUMBER,
  p_valorRetINSS                 IN NUMBER,
  p_calcularRetencaoPIS          IN NUMBER,
  p_retencaoPIS                  IN NUMBER,
  p_baseRetPIS                   IN NUMBER,
  p_residuoRetPIS                IN NUMBER,
  p_valorRetPIS                  IN NUMBER,
  p_calcularRetencaoCOFINS       IN NUMBER,
  p_retencaoCOFINS               IN NUMBER,
  p_baseRetCOFINS                IN NUMBER,
  p_residuoRetCOFINS             IN NUMBER,
  p_valorRetCOFINS               IN NUMBER,
  p_calcularRetencaoCSLL         IN NUMBER,
  p_retencaoCSLL                 IN NUMBER,
  p_baseRetCSLL                  IN NUMBER,
  p_residuoRetCSLL               IN NUMBER,
  p_valorRetCSLL                 IN NUMBER,
  p_calcularRetencaoOutros       IN NUMBER,
  p_retencaoOutros               IN NUMBER,
  p_baseRetOutros                IN NUMBER,
  p_residuoRetOutros             IN NUMBER,
  p_valorRetOutros               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_diferimentoICMSEscrituracao  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,
  p_prod_precoPautaTabelado      IN NUMBER,
  /* Retornos */
  r_baseISSQN                    OUT NUMBER,
  r_residuoISSQN                 OUT NUMBER,
  r_valorISSQN                   OUT NUMBER,
  r_baseRetIRRF                  OUT NUMBER,
  r_residuoRetIRRF               OUT NUMBER,
  r_valorRetIRRF                 OUT NUMBER,
  r_baseRetINSS                  OUT NUMBER,
  r_residuoRetINSS               OUT NUMBER,
  r_valorRetINSS                 OUT NUMBER,
  r_baseRetPIS                   OUT NUMBER,
  r_residuoRetPIS                OUT NUMBER,
  r_valorRetPIS                  OUT NUMBER,
  r_baseRetCOFINS                OUT NUMBER,
  r_residuoRetCOFINS             OUT NUMBER,
  r_valorRetCOFINS               OUT NUMBER,
  r_baseRetCSLL                  OUT NUMBER,
  r_residuoRetCSLL               OUT NUMBER,
  r_valorRetCSLL                 OUT NUMBER,
  r_baseRetOutros                OUT NUMBER,
  r_residuoRetOutros             OUT NUMBER,
  r_valorRetOutros               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
  r_baseISSQN                   := p_baseISSQN;
  r_residuoISSQN                := p_residuoISSQN;
  r_valorISSQN                  := p_valorISSQN;
  r_baseRetIRRF                 := p_baseRetIRRF;
  r_residuoRetIRRF              := p_residuoRetIRRF;
  r_valorRetIRRF                := p_valorRetIRRF;
  r_baseRetINSS                 := p_baseRetINSS;
  r_residuoRetINSS              := p_residuoRetINSS;
  r_valorRetINSS                := p_valorRetINSS;
  r_baseRetPIS                  := p_baseRetPIS;
  r_residuoRetPIS               := p_residuoRetPIS;
  r_valorRetPIS                 := p_valorRetPIS;
  r_baseRetCOFINS               := p_baseRetCOFINS;
  r_residuoRetCOFINS            := p_residuoRetCOFINS;
  r_valorRetCOFINS              := p_valorRetCOFINS;
  r_baseRetCSLL                 := p_baseRetCSLL;
  r_residuoRetCSLL              := p_residuoRetCSLL;
  r_valorRetCSLL                := p_valorRetCSLL;
  r_baseRetOutros               := p_baseRetOutros;
  r_residuoRetOutros            := p_residuoRetOutros;
  r_valorRetOutros              := p_valorRetOutros;
  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' AND p_aliquotaISSQN > 0 THEN
      r_baseISSQN := p_valorProdutoServico - p_valorDescontoTotal + p_valorOutrasDespesasTotal;
      r_valorISSQN := ROUND ((r_baseISSQN * p_aliquotaISSQN / 100) + r_residuoISSQN, 2);
      r_residuoISSQN := (r_baseISSQN * p_aliquotaISSQN / 100) + r_residuoISSQN - ROUND ((r_baseISSQN * p_aliquotaISSQN / 100) + r_residuoISSQN, 2);
    ELSE
      r_baseISSQN := 0;
      r_valorISSQN := 0;
    END IF;
  END IF;
  /* IRRF */
  IF p_calcularRetencaoIRRF = 1 THEN
    IF p_retencaoIRRF > 0 THEN
      r_baseRetIRRF := p_valorProdutoServico - p_valorDescontoTotal + p_valorOutrasDespesasTotal;
      r_valorRetIRRF := ROUND ((r_baseRetIRRF * p_retencaoIRRF / 100) + r_residuoRetIRRF, 2);
      r_residuoRetIRRF := (r_baseRetIRRF * p_retencaoIRRF / 100) + r_residuoRetIRRF - ROUND ((r_baseRetIRRF * p_retencaoIRRF / 100) + r_residuoRetIRRF, 2);
    ELSE
      r_baseRetIRRF := 0;
      r_valorRetIRRF := 0;
    END IF;
  END IF;
  /* INSS */
  IF p_calcularRetencaoINSS = 1 THEN
    IF p_retencaoINSS > 0 THEN
      r_baseRetINSS := p_valorProdutoServico - p_valorDescontoTotal + p_valorOutrasDespesasTotal;
      r_valorRetINSS := ROUND ((r_baseRetINSS * p_retencaoINSS / 100) + r_residuoRetINSS, 2);
      r_residuoRetINSS := (r_baseRetINSS * p_retencaoINSS / 100) + r_residuoRetINSS - ROUND ((r_baseRetINSS * p_retencaoINSS / 100) + r_residuoRetINSS, 2);
    ELSE
      r_baseRetINSS := 0;
      r_valorRetINSS := 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) + r_residuoRetPIS, 2);
      r_residuoRetPIS := (r_baseRetPIS * p_retencaoPIS / 100) + r_residuoRetPIS - ROUND ((r_baseRetPIS * p_retencaoPIS / 100) + r_residuoRetPIS, 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) + r_residuoRetCOFINS , 2);
      r_residuoRetCOFINS := (r_baseRetCOFINS * p_retencaoCOFINS / 100) + r_residuoRetCOFINS - ROUND ((r_baseRetCOFINS * p_retencaoCOFINS / 100) + r_residuoRetCOFINS, 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) + r_residuoRetCSLL, 2);
      r_residuoRetCSLL := (r_baseRetCSLL * p_retencaoCSLL / 100) + r_residuoRetCSLL - ROUND ((r_baseRetCSLL * p_retencaoCSLL / 100) + r_residuoRetCSLL, 2);
    ELSE
      r_baseRetCSLL := 0;
      r_valorRetCSLL := 0;
    END IF;
  END IF;
  /* Retenção Outros */
  IF p_calcularRetencaoOutros = 1 THEN
    IF p_retencaoOutros > 0 THEN
      r_baseRetOutros := p_valorProdutoServico - p_valorDescontoTotal + p_valorOutrasDespesasTotal;
      r_valorRetOutros := ROUND ((r_baseRetOutros * p_retencaoOutros / 100) + r_residuoRetOutros, 2);
      r_residuoRetOutros := (r_baseRetOutros * p_retencaoOutros / 100) + r_residuoRetOutros - ROUND ((r_baseRetOutros * p_retencaoOutros / 100) + r_residuoRetOutros, 2);
    ELSE
      r_baseRetOutros := 0;
      r_valorRetOutros := 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','90')
        OR p_stSimplesNacional = '900')
    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_prod_precoPautaTabelado > 0 AND (p_modalidadeBaseCalcICMS = '1' OR p_modalidadeBaseCalcICMS = '2' AND r_baseICMS > p_quantidade * p_prod_precoPautaTabelado) THEN
        r_baseICMS := ROUND ((p_quantidade * p_prod_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
          IF p_cfop IN (5124, 6124) THEN
            r_baseICMS := 0;
          END IF;
          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
        + 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_prod_precoPautaTabelado > 0
        AND (p_modalidadeBaseCalcICMSST = '5'
          OR p_modalidadeBaseCalcICMSST = '0'
          AND r_baseICMSST > p_quantidade * p_prod_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_prod_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_diferimentoICMSEscrituracao <> 0
        AND p_diferimentoICMSEscrituracao <> p_reducaoBaseICMSEscrituracao
      THEN
        r_baseICMSEscrituracao := ROUND ((r_baseICMS * (1 - p_diferimentoICMSEscrituracao / 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','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
          + 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_diferimentoICMSEscrituracao
        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_diferimentoICMSEscrituracao / 100), 2);
          IF p_cab_nfFornecedor = 1 THEN
            r_baseICMSEscrituracao := ROUND ((r_baseICMSEscrituracao * (1 - p_diferimentoICMSEscrituracao / 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'
        AND p_pess_indicadorInscricaoEstad = '9')
      AND NOT(p_stICMS IN('40','41'))
      AND (p_stSimplesNacional IS NOT NULL
        OR NOT(p_stSimplesNacional IN('103','300','400')))
      AND NOT(p_cfop IN(6552,6922,6929))
      AND p_aliquotaICMSInterestadual <> 0
      AND p_partilhaICMSInterestadual <> 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;
      IF p_cab_devolucaoAnulacaoRetorno = 1 THEN
        r_valorICMSUFDestinatario := ROUND ((r_baseICMSUFDestinatario * ((p_aliquotaICMSUFDestinatario - p_aliquotaICMSInterestadual) / 100) * (1 - p_partilhaICMSInterestadual / 100)), 2);
        r_valorICMSUFRemetente    := ROUND ((r_baseICMSUFRemetente    * ((p_aliquotaICMSUFDestinatario - p_aliquotaICMSInterestadual) / 100) * (p_partilhaICMSInterestadual / 100)), 2);
      ELSE
        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);
      END IF;
    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_valorICMS;
      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_valorICMS;
      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_valorICMS;
      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_valorICMS;
      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_ORCAMENTO_CALCULA_IMPOSTOS (
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_orcamento                IN NUMBER,
  p_troca_tipoPagamentoFrete     IN NUMBER,
  p_a_cab_tipoPagamentoFrete     IN CHAR)
IS
  v_cab_valorProdutos            NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarinTotal NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_calcularImpostosItem         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_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_idItemOrcamentoUltimoItem    NUMBER;
  v_idItemOrcamentoRateioFrete   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_baseISSQN                    NUMBER;
  v_residuoISSQN                 NUMBER;
  v_valorISSQN                   NUMBER;
  v_baseRetIRRF                  NUMBER;
  v_residuoRetIRRF               NUMBER;
  v_valorRetIRRF                 NUMBER;
  v_baseRetINSS                  NUMBER;
  v_residuoRetINSS               NUMBER;
  v_valorRetINSS                 NUMBER;
  v_baseRetPIS                   NUMBER;
  v_residuoRetPIS                NUMBER;
  v_valorRetPIS                  NUMBER;
  v_baseRetCOFINS                NUMBER;
  v_residuoRetCOFINS             NUMBER;
  v_valorRetCOFINS               NUMBER;
  v_baseRetCSLL                  NUMBER;
  v_residuoRetCSLL               NUMBER;
  v_valorRetCSLL                 NUMBER;
  v_baseRetOutros                NUMBER;
  v_residuoRetOutros             NUMBER;
  v_valorRetOutros               NUMBER;
  v_baseII                       NUMBER;
  v_valorII                      NUMBER;
  v_baseIOF                      NUMBER;
  v_valorIOF                     NUMBER;
  v_baseIPI                      NUMBER;
  v_valorIPI                     NUMBER;
  v_basePIS                      NUMBER;
  v_valorPIS                     NUMBER;
  v_basePISST                    NUMBER;
  v_valorPISST                   NUMBER;
  v_baseCOFINS                   NUMBER;
  v_valorCOFINS                  NUMBER;
  v_baseCOFINSST                 NUMBER;
  v_valorCOFINSST                NUMBER;
  v_baseCreditoSimplesNacional   NUMBER;
  v_valorCreditoSimplesNacional  NUMBER;
  v_baseICMS                     NUMBER;
  v_valorICMSOperacao            NUMBER;
  v_valorICMSDiferido            NUMBER;
  v_valorICMS                    NUMBER;
  v_valorICMSDesoneracao         NUMBER;
  v_baseICMSST                   NUMBER;
  v_valorICMSST                  NUMBER;
  v_baseICMSSTAnteriormente      NUMBER;
  v_valorICMSSTAnteriormente     NUMBER;
  v_valorICMSProprioSubstituto   NUMBER;
  v_baseICMSEfetivo              NUMBER;
  v_valorICMSEfetivo             NUMBER;
  v_baseICMSUFDestinatario       NUMBER;
  v_valorICMSUFDestinatario      NUMBER;
  v_baseICMSUFRemetente          NUMBER;
  v_valorICMSUFRemetente         NUMBER;
  v_baseFCP                      NUMBER;
  v_valorFCP                     NUMBER;
  v_baseFCPST                    NUMBER;
  v_valorFCPST                   NUMBER;
  v_baseFCPSTAnteriormente       NUMBER;
  v_valorFCPSTAnteriormente      NUMBER;
  v_baseFCPUFDestinatario        NUMBER;
  v_valorFCPUFDestinatario       NUMBER;
  v_baseEstimadaImpostos         NUMBER;
  v_valorEstimadoImpFederais     NUMBER;
  v_valorEstimadoImpEstaduais    NUMBER;
  v_valorEstimadoImpMunicipais   NUMBER;
  v_valorLiquidoItem             NUMBER;
  v_auxNumber                    NUMBER;
BEGIN
  FOR a IN (
    SELECT
      a.orcamento,
      a.origemDocumento,
      a.modeloDocumento,
      a.entradaSaida,
      a.atualizaCustoMedio,
      a.estabelecimento,
      a.dataEmissao,
      a.pessoa,
      a.localDestinoOperacao,
      a.indicadorConsumidorFinal,
      a.tipoPagamentoFrete,
      a.valorProdutos,
      a.valorServicos,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorDescontoGeral,
      a.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral,
      a.valorBasePagamento,
      a.valorAVistaMinimo,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      a.valorFreteTotal,
      a.valorSeguroTotal,
      a.valorDescontoTotal,
      a.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.impostosEditados,
      a.valorLiquidoItem,
      pess.indicadorInscricaoEstadual,
      COALESCE ((
        SELECT MIN (munEndEst.uf)
        FROM PAESTABELECIMENTOS est
        JOIN CAENDERECOSPESSOA endEst
        ON endEst.pessoa = est.pessoaEstabelecimento
        JOIN SIMUNICIPIOS munEndEst
        ON munEndEst.municipio = endEst.municipio
        WHERE est.estabelecimento = a.estabelecimento
        AND endEst.ativo = 1
        AND endEst.principal = 1
        ),'  ') munEndEst_uf
    FROM MOORCAMENTOS a
    JOIN CAPESSOAS pess
    ON pess.pessoa = a.pessoa
    WHERE a.orcamento = p_cab_orcamento)
  LOOP
    v_cab_valorProdutos            := a.valorProdutos;
    v_cab_valorServicos            := a.valorServicos;
    v_cab_valorBasePagamento       := a.valorBasePagamento;
    v_cab_valorAVistaMinimo        := a.valorAVistaMinimo;
    v_cab_valorFreteTotal          := a.valorFreteTotal;
    v_cab_valorSeguroTotal         := a.valorSeguroTotal;
    v_cab_valorDescontoTotal       := a.valorDescontoTotal;
    v_cab_valorOutrasDespesasTotal := a.valorOutrasDespesasTotal;
    v_cab_valorAdicFreteMarinTotal := a.valorAdicFreteMarinhaMerTotal;
    v_cab_valorDespesasAduanTotal  := a.valorDespesasAduaneirasTotal;
    v_cab_valorLiquidoItem         := a.valorLiquidoItem;
    -- RATEIO DESCONTOS E ACRÉSCIMOS
    v_idItemOrcamentoUltimoItem    := 0;
    v_idItemOrcamentoRateioFrete   := 0;
    v_cab_valorProdutos            := 0;
    v_cab_valorServicos            := 0;
    v_cab_valorBasePagamento       := 0;
    v_cab_valorAVistaMinimo        := 0;
    v_cab_valorFreteTotal          := 0;
    v_cab_valorSeguroTotal         := 0;
    v_cab_valorDescontoTotal       := 0;
    v_cab_valorOutrasDespesasTotal := 0;
    v_cab_valorAdicFreteMarinTotal := 0;
    v_cab_valorDespesasAduanTotal  := 0;
    v_cab_valorLiquidoItem         := 0;
    v_calcularImpostosItem         := 0;
    v_saldoRatFreteGeral           := a.valorFreteGeral;
    v_saldoRatSeguroGeral          := a.valorSeguroGeral;
    v_saldoRatDescontoGeral        := a.valorDescontoGeral;
    v_saldoRatOutrasDespesasGeral  := a.valorOutrasDespesasGeral;
    v_saldoRatAdicFreteMarinGeral  := a.valorAdicFreteMarinhaMerGeral;
    v_saldoRatDespesasAduanGeral   := a.valorDespesasAduaneirasGeral;
    v_saldoRatDescontoPagamento    := a.valorDescontoPagamento;
    v_saldoRatOutrasDespPagamento  := a.valorOutrasDespesasPagamento;
    v_saldoRatJurosPagamento       := a.valorJurosPagamento;
    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_valorDescontoPromocaoGeral   := 0;
    v_valorDescontoPromocaoPagamen := 0;
    v_rateioDescontofiltrarSemProm := 0;
    v_rateioDescontofiltrarAPrazo  := 0;
  
    -- v_valorDescontoPromocaoGeral
    IF a.valorDescontoGeral > 0 THEN
      SELECT COALESCE (SUM (promo.valorDesconto),0)
      INTO v_valorDescontoPromocaoGeral
      FROM MOORCAMENTOXITENS b
      JOIN MOORCAMENTOXPROMOCOES promo ON promo.idItemOrcamento = b.idItemOrcamento
      WHERE b.orcamento = a.orcamento
      AND b.cancelado = 0
      AND promo.cabecalhoItemPagamento ='C';
    END IF;
  
    -- v_valorDescontoPromocaoPagamen
    IF a.valorDescontoPagamento > 0 THEN
      SELECT COALESCE (SUM (promo.valorDesconto),0)
      INTO v_valorDescontoPromocaoPagamen
      FROM MOORCAMENTOXITENS b
      JOIN MOORCAMENTOXPROMOCOES promo ON promo.idItemOrcamento = b.idItemOrcamento
      WHERE b.orcamento = a.orcamento
      AND b.cancelado = 0
      AND promo.cabecalhoItemPagamento ='P';
    END IF;
  
    -- v_rateioDescontofiltrarSemProm
    IF a.valorDescontoGeral > v_valorDescontoPromocaoGeral OR a.valorDescontoPagamento > v_valorDescontoPromocaoPagamen THEN
      SELECT
        CASE
          WHEN EXISTS(
            SELECT 1
            FROM MOORCAMENTOXITENS b
            JOIN PAMODELOSDOCUMENTO modDoc
            ON modDoc.modeloDocumento = b.modeloDocumento
            WHERE b.orcamento = a.orcamento
            AND b.cancelado = 0
            AND COALESCE ((
              SELECT SUM (promo.valorDesconto)
              FROM MOORCAMENTOXPROMOCOES promo
              WHERE promo.idItemOrcamento = b.idItemOrcamento
              AND promo.cabecalhoItemPagamento IN ('C','P')),0) > (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit  = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem))
          THEN 0
          WHEN COALESCE ((
            SELECT SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem)
            FROM MOORCAMENTOXITENS b
            JOIN PAMODELOSDOCUMENTO modDoc
            ON modDoc.modeloDocumento = b.modeloDocumento
            JOIN MOORCAMENTOXPROMOCOES promo
            ON promo.idItemOrcamento = b.idItemOrcamento
            WHERE b.orcamento = a.orcamento
            AND b.cancelado = 0),0) > (
              CASE
                WHEN a.valorDescontoGeral > v_valorDescontoPromocaoGeral
                THEN a.valorDescontoGeral - v_valorDescontoPromocaoGeral
                ELSE 0
              END +
              CASE
                WHEN a.valorDescontoPagamento > v_valorDescontoPromocaoPagamen
                THEN a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen
                ELSE 0
              END)
            AND EXISTS (
              SELECT 1
              FROM MOORCAMENTOXITENS b
              WHERE b.orcamento = a.orcamento
              AND b.cancelado = 0
              AND NOT EXISTS (
                SELECT 1
                FROM MOORCAMENTOXPROMOCOES promo
                WHERE promo.idItemOrcamento = b.idItemOrcamento))
          THEN 1
          ELSE 0
        END
      INTO v_rateioDescontofiltrarSemProm
      FROM DUAL;
    END IF;
  
    -- v_rateioDescontofiltrarAPrazo
    IF a.valorDescontoGeral > v_valorDescontoPromocaoGeral OR a.valorDescontoPagamento > v_valorDescontoPromocaoPagamen THEN
      SELECT
        CASE
          WHEN COALESCE ((
            SELECT SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem)
            FROM MOORCAMENTOXITENS b
            JOIN PAMODELOSDOCUMENTO modDoc
            ON modDoc.modeloDocumento = b.modeloDocumento
            WHERE b.orcamento = a.orcamento
            AND b.cancelado = 0
            AND b.precoSugestaoAPrazo <> b.precoSugestaoAVista
            AND b.usarPrecoAVista = 1
            AND (v_rateioDescontofiltrarSemProm = 0
              OR NOT EXISTS (
                SELECT 1
                FROM MOORCAMENTOXPROMOCOES promo
                WHERE promo.idItemOrcamento = b.idItemOrcamento))),0) > (
              CASE
                WHEN a.valorDescontoGeral > v_valorDescontoPromocaoGeral
                THEN a.valorDescontoGeral - v_valorDescontoPromocaoGeral
                ELSE 0
              END +
              CASE
                WHEN a.valorDescontoPagamento > v_valorDescontoPromocaoPagamen
                THEN a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen
                ELSE 0
              END)
            AND EXISTS (
              SELECT 1
              FROM MOORCAMENTOXITENS b
              WHERE b.orcamento = a.orcamento
              AND b.cancelado = 0
              AND (b.precoSugestaoAPrazo = b.precoSugestaoAVista
                OR b.usarPrecoAVista = 0)
              AND (v_rateioDescontofiltrarSemProm = 0
                OR NOT(EXISTS(
                  SELECT 1
                  FROM MOORCAMENTOXPROMOCOES promo
                  WHERE promo.idItemOrcamento = b.idItemOrcamento))))
          THEN 1
          ELSE 0
        END
      INTO v_rateioDescontofiltrarAPrazo
      FROM DUAL;
    END IF;
  
    -- Bases Rateio
    SELECT
      COALESCE (MAX (CASE WHEN modDoc.habilitaControleEntrega = 0 OR b.controleEntrega > 0 AND contr.habilitaFrete = 1 THEN 1 ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN modDoc.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN modDoc.geraFinanceiro = 1 AND (modDoc.habilitaControleEntrega = 0 OR b.controleEntrega > 0 AND contr.habilitaFrete = 1) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 AND (modDoc.habilitaControleEntrega = 0 OR b.controleEntrega > 0 AND contr.habilitaFrete = 1) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem),0),
      COALESCE (SUM (CASE WHEN modDoc.habilitaControleEntrega = 0 OR b.controleEntrega > 0 AND contr.habilitaFrete = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN (v_rateioDescontofiltrarAPrazo = 0 OR b.precoSugestaoAPrazo = b.precoSugestaoAVista OR b.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MOORCAMENTOXPROMOCOES promo WHERE promo.idItemOrcamento = b.idItemOrcamento))) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN (v_rateioDescontofiltrarAPrazo = 0 OR b.precoSugestaoAPrazo = b.precoSugestaoAVista OR b.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MOORCAMENTOXPROMOCOES promo WHERE promo.idItemOrcamento = b.idItemOrcamento))) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 AND (v_rateioDescontofiltrarAPrazo = 0 OR b.precoSugestaoAPrazo = b.precoSugestaoAVista OR b.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MOORCAMENTOXPROMOCOES promo WHERE promo.idItemOrcamento = b.idItemOrcamento))) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.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 MOORCAMENTOXITENS b
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = b.modeloDocumento
    JOIN PACONTROLESENTREGA contr
    ON contr.controleEntrega = b.controleEntrega
    WHERE b.orcamento = a.orcamento
    AND b.cancelado = 0;
  
    -- Efetua rateio
    FOR b IN (
      SELECT
        b.idItemOrcamento,
        b.geraFinanceiro,
        b.quantidade,
        b.quantidadeConvertida,
        b.usarPrecoAVista,
        b.precoUnitarioBruto,
        b.acrescimoUnitarioComposicao,
        b.precoUnitario,
        b.precoUnitarioConvertido,
        b.valorProdutoServicoBruto,
        b.valorProdutoServico,
        b.valorDescontoItem,
        b.valorAcrescimoItem,
        b.valorFreteItem,
        b.valorSeguroItem,
        b.valorAdicFreteMarinhaMerItem,
        b.valorDespesasAduaneirasItem,
        b.valorFreteGeral,
        b.valorSeguroGeral,
        b.valorDescontoGeral,
        b.valorOutrasDespesasGeral,
        b.valorAdicFreteMarinhaMerGeral,
        b.valorDespesasAduaneirasGeral,
        b.valorBasePagamento,
        b.valorDescontoPagamento,
        b.valorOutrasDespesasPagamento,
        b.valorJurosPagamento,
        b.valorFreteTotal,
        b.valorSeguroTotal,
        b.valorDescontoTotal,
        b.valorOutrasDespesasTotal,
        b.valorAdicFreteMarinhaMerTotal,
        b.valorDespesasAduaneirasTotal,
        b.retidoISSQN,
        b.valorISSQN,
        b.valorRetIRRF,
        b.valorRetINSS,
        b.valorRetPIS,
        b.valorRetCOFINS,
        b.valorRetCSLL,
        b.valorRetOutros,
        b.valorII,
        b.valorIOF,
        b.valorIPI,
        b.valorPIS,
        b.valorPISST,
        b.valorCOFINS,
        b.valorCOFINSST,
        b.valorCreditoSimplesNacional,
        b.valorICMS,
        b.valorICMSST,
        b.valorLiquidoItem,
        modDoc.geraFinanceiro modDoc_geraFinanceiro,
        modDoc.diminuiDescontoPrUnit,
        modDoc.somaAcrescimosPrUnit,
        modDoc.somaFreteSeguroPrUnit,
        prod.tipoProduto,
        CASE WHEN modDoc.habilitaControleEntrega = 0 OR contr.habilitaFrete = 1 THEN 1 ELSE 0 END rateioFrete,
        CASE WHEN b.precoSugestaoAPrazo <> b.precoSugestaoAVista AND b.usarPrecoAVista = 1 THEN 1 ELSE 0 END aVista,
        CASE WHEN EXISTS(SELECT 1 FROM MOORCAMENTOXPROMOCOES promo WHERE promo.idItemOrcamento = b.idItemOrcamento) THEN 1 ELSE 0 END promocao,
        COALESCE ((SELECT SUM (promo.valorDesconto) FROM MOORCAMENTOXPROMOCOES promo WHERE promo.idItemOrcamento = b.idItemOrcamento AND promo.cabecalhoItemPagamento ='C'),0) valorDescontoPromocaoGeral,
        COALESCE ((SELECT SUM (promo.valorDesconto) FROM MOORCAMENTOXPROMOCOES promo WHERE promo.idItemOrcamento = b.idItemOrcamento AND promo.cabecalhoItemPagamento ='P'),0) valorDescontoPromocaoPagamento,
        CASE WHEN EXISTS (SELECT 1 FROM CAPRODUTOXCOMPOSICOESPREC compPrec WHERE compPrec.produto = gradProd.produto AND compPrec.ativo = 1) THEN 1 ELSE 0 END composicaoPreco
      FROM MOORCAMENTOXITENS b
      JOIN PAMODELOSDOCUMENTO modDoc
      ON modDoc.modeloDocumento = b.modeloDocumento
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = b.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      JOIN PACONTROLESENTREGA contr
      ON contr.controleEntrega = b.controleEntrega
      WHERE b.orcamento = a.orcamento
      AND b.cancelado = 0
      ORDER BY b.sequencia)
    LOOP
      v_idItemOrcamentoUltimoItem    := b.idItemOrcamento;
      v_precoUnitario                := b.precoUnitario;
      v_precoUnitarioConvertido      := b.precoUnitarioConvertido;
      v_valorProdutoServico          := b.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           := b.valorBasePagamento;
      v_valorDescontoPagamento       := v_residuoDescontoPagamento;
      v_valorOutrasDespesasPagamento := v_residuoOutrasDespPagamento;
      v_valorJurosPagamento          := v_residuoJurosPagamento;
      v_valorFreteTotal              := b.valorFreteTotal;
      v_valorSeguroTotal             := b.valorSeguroTotal;
      v_valorDescontoTotal           := b.valorDescontoTotal;
      v_valorOutrasDespesasTotal     := b.valorOutrasDespesasTotal;
      v_valorAdicFreteMarinMerTotal  := b.valorAdicFreteMarinhaMerTotal;
      v_valorDespesasAduaneirasTotal := b.valorDespesasAduaneirasTotal;
      v_valorLiquidoItem             := b.valorLiquidoItem;
  
      -- v_valorDescontoGeral
      IF v_valorBaseRateioDescontoGeral > 0
        AND (v_rateioDescontofiltrarAPrazo = 0
          OR b.aVista = 0)
        AND (v_rateioDescontofiltrarSemProm = 0
          OR b.promocao = 0
          AND a.valorDescontoGeral - v_valorDescontoPromocaoGeral > 0)
      THEN
        v_valorDescontoGeral := v_valorDescontoGeral + (a.valorDescontoGeral - v_valorDescontoPromocaoGeral) * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END) / v_valorBaseRateioDescontoGeral;
      END IF;
      IF a.valorDescontoGeral        > 0
        AND v_valorDescontoPromocaoGeral > 0
        AND b.valorDescontoPromocaoGeral > 0
      THEN
        IF a.valorDescontoGeral < v_valorDescontoPromocaoGeral THEN
          v_valorDescontoGeral := v_valorDescontoGeral + b.valorDescontoPromocaoGeral * a.valorDescontoGeral / v_valorDescontoPromocaoGeral;
        ELSE
          v_valorDescontoGeral := v_valorDescontoGeral + b.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 THEN
        IF b.rateioFrete = 1 AND b.geraFinanceiro = 1 THEN
          v_idItemOrcamentoRateioFrete := b.idItemOrcamento;
          v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteComFinComEntr;
          v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteComFinComEntr;
        END IF;
      ELSIF v_valorBaseFreteSemFinComEntr > 0 AND v_rateioFretePorControleEntr = 1 THEN
        IF b.rateioFrete = 1 AND b.modDoc_geraFinanceiro = 1 THEN
          v_idItemOrcamentoRateioFrete := b.idItemOrcamento;
          v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteSemFinComEntr;
          v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteSemFinComEntr;
        END IF;
      ELSIF v_valorBaseRateioComEntrega > 0 AND v_rateioFretePorControleEntr = 1 THEN
        IF b.rateioFrete = 1 THEN
          v_idItemOrcamentoRateioFrete := b.idItemOrcamento;
          v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioComEntrega;
          v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioComEntrega;
        END IF;
      ELSIF v_valorBaseFreteComFinSemEntr > 0 AND v_rateioFretePorControleEntr = 0 THEN
        IF b.geraFinanceiro = 1 THEN
          v_idItemOrcamentoRateioFrete := b.idItemOrcamento;
          v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteComFinSemEntr;
          v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteComFinSemEntr;
        END IF;
      ELSIF v_valorBaseFreteSemFinSemEntr > 0 AND v_rateioFretePorControleEntr = 0 THEN
        IF b.modDoc_geraFinanceiro = 1 THEN
          v_idItemOrcamentoRateioFrete := b.idItemOrcamento;
          v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteSemFinSemEntr;
          v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteSemFinSemEntr;
        END IF;
      ELSIF v_valorBaseRateio > 0 THEN
        v_idItemOrcamentoRateioFrete := b.idItemOrcamento;
        v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
        v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.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
      IF v_valorBaseRateioFinanceiro > 0 AND b.geraFinanceiro = 1 THEN 
        v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral  + a.valorAdicFreteMarinhaMerGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
        v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + a.valorDespesasAduaneirasGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
      ELSIF v_valorBaseRateio > 0 AND v_valorBaseRateioFinanceiro <= 0 THEN
        v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral  + a.valorAdicFreteMarinhaMerGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
        v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + a.valorDespesasAduaneirasGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.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;
  
      -- v_valorOutrasDespesasGeral
      IF v_valorBaseRateioOutrasDespFin > 0 AND b.geraFinanceiro = 1 THEN
        v_valorOutrasDespesasGeral := v_valorOutrasDespesasGeral + a.valorOutrasDespesasGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END) / v_valorBaseRateioOutrasDespFin;
      ELSIF v_valorBaseRateioOutrasDespGer > 0 AND v_valorBaseRateioOutrasDespFin <= 0 THEN
        v_valorOutrasDespesasGeral := v_valorOutrasDespesasGeral + a.valorOutrasDespesasGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.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 a.valorDescontoPagamento       > 0
        AND v_valorBaseRateioPagamFinDesc   > 0
        AND b.geraFinanceiro = 1
        AND (v_rateioDescontofiltrarAPrazo  = 0
          OR b.aVista = 0)
        AND (v_rateioDescontofiltrarSemProm = 0
          OR b.promocao = 0
          AND a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen > 0)
      THEN
        v_valorDescontoPagamento := v_valorDescontoPagamento + (a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen) * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamFinDesc;
      ELSIF a.valorDescontoPagamento    > 0
        AND v_valorBaseRateioPagamDesconto  > 0
        AND v_valorBaseRateioPagamFinDesc  <= 0
        AND (v_rateioDescontofiltrarAPrazo  = 0
          OR b.aVista = 0)
        AND (v_rateioDescontofiltrarSemProm = 0
          OR b.promocao = 0
          AND a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen > 0)
      THEN
        v_valorDescontoPagamento := v_valorDescontoPagamento + (a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen) * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamDesconto;
      END IF;
      IF a.valorDescontoPagamento > 0
        AND v_valorDescontoPromocaoPagamen > 0
        AND b.valorDescontoPromocaoPagamento > 0
      THEN
        IF a.valorDescontoPagamento < v_valorDescontoPromocaoPagamen THEN
          v_valorDescontoPagamento := v_valorDescontoPagamento + b.valorDescontoPromocaoPagamento * a.valorDescontoPagamento / v_valorDescontoPromocaoPagamen;
        ELSE
          v_valorDescontoPagamento := v_valorDescontoPagamento + b.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 b.geraFinanceiro = 1 THEN
        v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + a.valorOutrasDespesasPagamento * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamFinanc;
        v_valorJurosPagamento          := v_valorJurosPagamento          + a.valorJurosPagamento      * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamFinanc;
      ELSIF v_valorBaseRateioPagamento > 0 AND v_valorBaseRateioPagamFinanc <= 0 THEN
        v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + a.valorOutrasDespesasPagamento * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamento;
        v_valorJurosPagamento          := v_valorJurosPagamento          + a.valorJurosPagamento      * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 OR b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.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 (
        a.tipoPagamentoFrete,
        b.quantidade,
        b.quantidadeConvertida,
        b.precoUnitarioBruto,
        b.acrescimoUnitarioComposicao,
        b.precoUnitario,
        b.valorDescontoItem,
        b.valorAcrescimoItem,
        b.valorFreteItem,
        b.valorSeguroItem,
        b.valorAdicFreteMarinhaMerItem,
        b.valorDespesasAduaneirasItem,
        v_valorFreteGeral,
        v_valorSeguroGeral,
        v_valorDescontoGeral,
        v_valorOutrasDespesasGeral,
        v_valorAdicFreteMarinMerGeral,
        v_valorDespesasAduaneirasGeral,
        v_valorDescontoPagamento,
        v_valorOutrasDespesasPagamento,
        v_valorJurosPagamento,
        b.diminuiDescontoPrUnit,
        b.somaAcrescimosPrUnit,
        b.somaFreteSeguroPrUnit,
        b.composicaoPreco,
        /* Retornos */
        v_precoUnitario,
        v_precoUnitarioConvertido,
        v_valorProdutoServico,
        v_valorFreteTotal,
        v_valorSeguroTotal,
        v_valorDescontoTotal,
        v_valorOutrasDespesasTotal,
        v_valorAdicFreteMarinMerTotal,
        v_valorDespesasAduaneirasTotal);
      IF a.impostosEditados = 0 
        OR v_valorProdutoServico <> b.valorProdutoServico
        OR CASE WHEN a.tipoPagamentoFrete   = 'V' THEN 0 ELSE v_valorFreteTotal END
        <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE a.tipoPagamentoFrete END = 'V' THEN 0 ELSE b.valorFreteTotal END
        OR CASE WHEN a.tipoPagamentoFrete   = 'V' THEN 0 ELSE v_valorSeguroTotal END
        <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE a.tipoPagamentoFrete END = 'V' THEN 0 ELSE b.valorSeguroTotal END
        OR v_valorDescontoTotal <> b.valorDescontoTotal
        OR v_valorOutrasDespesasTotal <> b.valorOutrasDespesasTotal
        OR v_valorAdicFreteMarinMerTotal <> b.valorAdicFreteMarinhaMerTotal
        OR v_valorDespesasAduaneirasTotal <> b.valorDespesasAduaneirasTotal
        OR v_precoUnitario <> b.precoUnitario
        OR v_valorProdutoServico <> b.valorProdutoServico
      THEN
        v_calcularImpostosItem := 1;
      END IF;
      v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
        a.origemDocumento,
        0, -- a.nfFornecedor
        a.tipoPagamentoFrete,
        b.geraFinanceiro,
        v_valorProdutoServico,
        v_valorDescontoPagamento,
        v_valorOutrasDespesasPagamento,
        v_valorJurosPagamento,
        v_valorFreteTotal,
        v_valorSeguroTotal,
        v_valorDescontoTotal,
        v_valorOutrasDespesasTotal,
        0, -- p_item_valorIPIDevolucao
        b.retidoISSQN,
        b.valorISSQN,
        b.valorRetIRRF,
        b.valorRetINSS,
        b.valorRetPIS,
        b.valorRetCOFINS,
        b.valorRetCSLL,
        b.valorRetOutros,
        b.valorII,
        b.valorIOF,
        b.valorIPI,
        b.valorICMSST,
        0, -- p_item_valorICMSSTEscrit
        0, -- p_item_somarICMSST
        0, -- p_item_valorAcrescExtempTotal
        b.modDoc_geraFinanceiro);
      v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
        0, -- a.nfFornecedor
        a.tipoPagamentoFrete,
        v_valorProdutoServico,
        v_valorFreteTotal,
        v_valorSeguroTotal,
        v_valorDescontoTotal,
        v_valorOutrasDespesasTotal,
        0, -- p_item_valorIPIDevolucao
        b.valorII,
        b.valorIOF,
        b.valorIPI,
        b.valorICMSST,
        0, -- p_item_valorICMSSTEscrit
        0 -- p_item_somarICMSST
        );
      -- Atualiza Item
      UPDATE MOORCAMENTOXITENS SET
        precoUnitario                 = v_precoUnitario,
        precoUnitarioConvertido       = v_precoUnitarioConvertido,
        valorProdutoServico           = v_valorProdutoServico,
        valorFreteGeral               = v_valorFreteGeral,
        valorSeguroGeral              = v_valorSeguroGeral,
        valorDescontoGeral            = v_valorDescontoGeral,
        valorOutrasDespesasGeral      = v_valorOutrasDespesasGeral,
        valorAdicFreteMarinhaMerGeral = v_valorAdicFreteMarinMerGeral,
        valorDespesasAduaneirasGeral  = v_valorDespesasAduaneirasGeral,
        valorBasePagamento            = v_valorBasePagamento,
        valorDescontoPagamento        = v_valorDescontoPagamento,
        valorOutrasDespesasPagamento  = v_valorOutrasDespesasPagamento,
        valorJurosPagamento           = v_valorJurosPagamento,
        valorFreteTotal               = v_valorFreteTotal,
        valorSeguroTotal              = v_valorSeguroTotal,
        valorDescontoTotal            = v_valorDescontoTotal,
        valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
        valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
        valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
        valorLiquidoItem              = v_valorLiquidoItem
      WHERE idItemOrcamento           = b.idItemOrcamento;
      -- Totaliza cabeçalho
      IF b.tipoProduto = '09' THEN
        v_cab_valorServicos            := v_cab_valorServicos + v_valorProdutoServico;
      ELSE
        v_cab_valorProdutos            := v_cab_valorProdutos + v_valorProdutoServico;
      END IF;
      v_cab_valorBasePagamento       := v_cab_valorBasePagamento + v_valorBasePagamento;
      IF b.usarPrecoAVista = 1
        AND b.geraFinanceiro = 1
      THEN
        v_cab_valorAVistaMinimo        := v_cab_valorAVistaMinimo + v_valorProdutoServico + v_valorDescontoPagamento - v_valorOutrasDespesasPagamento - v_valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
      END IF;
      v_cab_valorFreteTotal          := v_cab_valorFreteTotal + v_valorFreteTotal;
      v_cab_valorSeguroTotal         := v_cab_valorSeguroTotal + v_valorSeguroTotal;
      v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal + v_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
      v_cab_valorAdicFreteMarinTotal := v_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
      v_cab_valorDespesasAduanTotal  := v_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
      v_cab_valorLiquidoItem         := v_cab_valorLiquidoItem + v_valorLiquidoItem;
    END LOOP;
    -- Se sobrou resíduo atualiza último item
    IF v_idItemOrcamentoUltimoItem <> 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
      -- CALCULA RESÍDUOS
      FOR b IN (
        SELECT
          b.geraFinanceiro,
          b.quantidade,
          b.quantidadeConvertida,
          b.usarPrecoAVista,
          b.precoUnitarioBruto,
          b.acrescimoUnitarioComposicao,
          b.precoUnitario,
          b.precoUnitarioConvertido,
          b.valorProdutoServicoBruto,
          b.valorProdutoServico,
          b.valorDescontoItem,
          b.valorAcrescimoItem,
          b.valorFreteItem,
          b.valorSeguroItem,
          b.valorAdicFreteMarinhaMerItem,
          b.valorDespesasAduaneirasItem,
          b.valorFreteGeral,
          b.valorSeguroGeral,
          b.valorDescontoGeral,
          b.valorOutrasDespesasGeral,
          b.valorAdicFreteMarinhaMerGeral,
          b.valorDespesasAduaneirasGeral,
          b.valorBasePagamento,
          b.valorDescontoPagamento,
          b.valorOutrasDespesasPagamento,
          b.valorJurosPagamento,
          b.valorFreteTotal,
          b.valorSeguroTotal,
          b.valorDescontoTotal,
          b.valorOutrasDespesasTotal,
          b.valorAdicFreteMarinhaMerTotal,
          b.valorDespesasAduaneirasTotal,
          b.retidoISSQN,
          b.valorISSQN,
          b.valorRetIRRF,
          b.valorRetINSS,
          b.valorRetPIS,
          b.valorRetCOFINS,
          b.valorRetCSLL,
          b.valorRetOutros,
          b.valorII,
          b.valorIOF,
          b.valorIPI,
          b.valorPIS,
          b.valorPISST,
          b.valorCOFINS,
          b.valorCOFINSST,
          b.valorCreditoSimplesNacional,
          b.valorICMS,
          b.valorICMSST,
          b.valorLiquidoItem,
          modDoc.geraFinanceiro modDoc_geraFinanceiro,
          modDoc.diminuiDescontoPrUnit,
          modDoc.somaAcrescimosPrUnit,
          modDoc.somaFreteSeguroPrUnit,
          prod.tipoProduto,
          CASE
            WHEN EXISTS (
              SELECT 1
              FROM CAPRODUTOXCOMPOSICOESPREC compPrec
              WHERE compPrec.produto = gradProd.produto
              AND compPrec.ativo = 1)
            THEN 1
            ELSE 0
          END composicaoPreco
        FROM MOORCAMENTOXITENS b
        JOIN PAMODELOSDOCUMENTO modDoc
        ON modDoc.modeloDocumento = b.modeloDocumento
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = b.gradeProduto
        JOIN CAPRODUTOS prod
        ON prod.produto = gradProd.produto
        WHERE b.idItemOrcamento = CASE WHEN v_idItemOrcamentoRateioFrete = 0 THEN v_idItemOrcamentoUltimoItem ELSE v_idItemOrcamentoRateioFrete END)
      LOOP
        v_precoUnitario                := b.precoUnitario;
        v_precoUnitarioConvertido      := b.precoUnitarioConvertido;
        v_valorProdutoServico          := b.valorProdutoServico;
        v_valorFreteGeral              := b.valorFreteGeral;
        v_valorSeguroGeral             := b.valorSeguroGeral;
        v_valorDescontoGeral           := b.valorDescontoGeral;
        v_valorOutrasDespesasGeral     := b.valorOutrasDespesasGeral;
        v_valorAdicFreteMarinMerGeral  := b.valorAdicFreteMarinhaMerGeral;
        v_valorDespesasAduaneirasGeral := b.valorDespesasAduaneirasGeral;
        v_valorBasePagamento           := b.valorBasePagamento;
        v_valorDescontoPagamento       := b.valorDescontoPagamento;
        v_valorOutrasDespesasPagamento := b.valorOutrasDespesasPagamento;
        v_valorJurosPagamento          := b.valorJurosPagamento;
        v_valorFreteTotal              := b.valorFreteTotal;
        v_valorSeguroTotal             := b.valorSeguroTotal;
        v_valorDescontoTotal           := b.valorDescontoTotal;
        v_valorOutrasDespesasTotal     := b.valorOutrasDespesasTotal;
        v_valorAdicFreteMarinMerTotal  := b.valorAdicFreteMarinhaMerTotal;
        v_valorDespesasAduaneirasTotal := b.valorDespesasAduaneirasTotal;
        v_valorLiquidoItem             := b.valorLiquidoItem;
        IF b.tipoProduto = '09' THEN
          v_cab_valorServicos          := v_cab_valorServicos - v_valorProdutoServico;
        ELSE
          v_cab_valorProdutos          := v_cab_valorProdutos - v_valorProdutoServico;
        END IF;
        v_cab_valorBasePagamento       := v_cab_valorBasePagamento - v_valorBasePagamento;
        IF b.usarPrecoAVista = 1 AND b.geraFinanceiro = 1 THEN
          v_cab_valorAVistaMinimo      := v_cab_valorAVistaMinimo - v_valorProdutoServico - v_valorDescontoPagamento + v_valorOutrasDespesasPagamento + v_valorJurosPagamento + v_valorDescontoTotal - v_valorOutrasDespesasTotal;
        END IF;
        v_cab_valorFreteTotal          := v_cab_valorFreteTotal - v_valorFreteTotal;
        v_cab_valorSeguroTotal         := v_cab_valorSeguroTotal - v_valorSeguroTotal;
        v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal - v_valorDescontoTotal;
        v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal - v_valorOutrasDespesasTotal;
        v_cab_valorAdicFreteMarinTotal := v_cab_valorAdicFreteMarinTotal - v_valorAdicFreteMarinMerTotal;
        v_cab_valorDespesasAduanTotal  := v_cab_valorDespesasAduanTotal - v_valorDespesasAduaneirasTotal;
        v_cab_valorLiquidoItem         := v_cab_valorLiquidoItem - v_valorLiquidoItem;
        v_valorFreteGeral              := v_valorFreteGeral + v_saldoRatFreteGeral;
        v_valorSeguroGeral             := v_valorSeguroGeral + v_saldoRatSeguroGeral;
        v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral + v_saldoRatAdicFreteMarinGeral;
        v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + v_saldoRatDespesasAduanGeral;
        v_valorDescontoGeral           := v_valorDescontoGeral + v_saldoRatDescontoGeral;
        v_valorOutrasDespesasGeral     := v_valorDespesasAduaneirasGeral + v_saldoRatOutrasDespesasGeral;
        v_valorDescontoPagamento       := v_valorDescontoPagamento + v_saldoRatDescontoPagamento;
        v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + v_saldoRatOutrasDespPagamento;
        v_valorJurosPagamento          := v_valorJurosPagamento + v_saldoRatJurosPagamento;
        ADD_CALCULA_TOTAIS_ITEM (
          a.tipoPagamentoFrete,
          b.quantidade,
          b.quantidadeConvertida,
          b.precoUnitarioBruto,
          b.acrescimoUnitarioComposicao,
          b.precoUnitario,
          b.valorDescontoItem,
          b.valorAcrescimoItem,
          b.valorFreteItem,
          b.valorSeguroItem,
          b.valorAdicFreteMarinhaMerItem,
          b.valorDespesasAduaneirasItem,
          v_valorFreteGeral,
          v_valorSeguroGeral,
          v_valorDescontoGeral,
          v_valorOutrasDespesasGeral,
          v_valorAdicFreteMarinMerGeral,
          v_valorDespesasAduaneirasGeral,
          v_valorDescontoPagamento,
          v_valorOutrasDespesasPagamento,
          v_valorJurosPagamento,
          b.diminuiDescontoPrUnit,
          b.somaAcrescimosPrUnit,
          b.somaFreteSeguroPrUnit,
          b.composicaoPreco,
          /* Retornos */
          v_precoUnitario,
          v_precoUnitarioConvertido,
          v_valorProdutoServico,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          v_valorAdicFreteMarinMerTotal,
          v_valorDespesasAduaneirasTotal);
        IF a.impostosEditados = 0 
            OR v_valorProdutoServico <> b.valorProdutoServico
            OR CASE WHEN a.tipoPagamentoFrete = 'V' THEN 0 ELSE v_valorFreteTotal END
              <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE a.tipoPagamentoFrete END = 'V' THEN 0 ELSE b.valorFreteTotal END
            OR CASE WHEN a.tipoPagamentoFrete   = 'V' THEN 0 ELSE v_valorSeguroTotal END
              <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE a.tipoPagamentoFrete END = 'V' THEN 0 ELSE b.valorSeguroTotal END
            OR v_valorDescontoTotal <> b.valorDescontoTotal
            OR v_valorOutrasDespesasTotal <> b.valorOutrasDespesasTotal
            OR v_valorAdicFreteMarinMerTotal <> b.valorAdicFreteMarinhaMerTotal
            OR v_valorDespesasAduaneirasTotal <> b.valorDespesasAduaneirasTotal
            OR v_precoUnitario <> b.precoUnitario
            OR v_valorProdutoServico <> b.valorProdutoServico
        THEN
          v_calcularImpostosItem := 1;
        END IF;
        v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
          a.origemDocumento,
          0, -- v_cab_nfFornecedor
          a.tipoPagamentoFrete,
          b.geraFinanceiro,
          v_valorProdutoServico,
          v_valorDescontoPagamento,
          v_valorOutrasDespesasPagamento,
          v_valorJurosPagamento,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          0, -- p_item_valorIPIDevolucao
          b.retidoISSQN,
          b.valorISSQN,
          b.valorRetIRRF,
          b.valorRetINSS,
          b.valorRetPIS,
          b.valorRetCOFINS,
          b.valorRetCSLL,
          b.valorRetOutros,
          b.valorII,
          b.valorIOF,
          b.valorIPI,
          b.valorICMSST,
          0, -- p_item_valorICMSSTEscrit
          0, -- p_item_somarICMSST
          0, -- p_item_valorAcrescExtempTotal
          b.modDoc_geraFinanceiro);
        v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
          0, -- v_cab_nfFornecedor
          a.tipoPagamentoFrete,
          v_valorProdutoServico,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          0, -- p_item_valorIPIDevolucao
          b.valorII,
          b.valorIOF,
          b.valorIPI,
          b.valorICMSST,
          0, -- p_item_valorICMSSTEscrit
          0 -- p_item_somarICMSST
          );
        UPDATE MOORCAMENTOXITENS SET
          precoUnitario                 = v_precoUnitario,
          precoUnitarioConvertido       = v_precoUnitarioConvertido,
          valorProdutoServico           = v_valorProdutoServico,
          valorFreteGeral               = v_valorFreteGeral,
          valorSeguroGeral              = v_valorSeguroGeral,
          valorDescontoGeral            = v_valorDescontoGeral,
          valorOutrasDespesasGeral      = v_valorOutrasDespesasGeral,
          valorAdicFreteMarinhaMerGeral = v_valorAdicFreteMarinMerGeral,
          valorDespesasAduaneirasGeral  = v_valorDespesasAduaneirasGeral,
          valorBasePagamento            = v_valorBasePagamento,
          valorDescontoPagamento        = v_valorDescontoPagamento,
          valorOutrasDespesasPagamento  = v_valorOutrasDespesasPagamento,
          valorJurosPagamento           = v_valorJurosPagamento,
          valorFreteTotal               = v_valorFreteTotal,
          valorSeguroTotal              = v_valorSeguroTotal,
          valorDescontoTotal            = v_valorDescontoTotal,
          valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
          valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
          valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
          valorLiquidoItem              = v_valorLiquidoItem
        WHERE idItemOrcamento           = CASE WHEN v_idItemOrcamentoRateioFrete = 0 THEN v_idItemOrcamentoUltimoItem ELSE v_idItemOrcamentoRateioFrete END;
        IF b.tipoProduto = '09' THEN
          v_cab_valorServicos          := v_cab_valorServicos + v_valorProdutoServico;
        ELSE
          v_cab_valorProdutos          := v_cab_valorProdutos + v_valorProdutoServico;
        END IF;
        v_cab_valorBasePagamento       := v_cab_valorBasePagamento + v_valorBasePagamento;
        IF b.usarPrecoAVista = 1
          AND b.geraFinanceiro = 1
        THEN
          v_cab_valorAVistaMinimo      := v_cab_valorAVistaMinimo + v_valorProdutoServico + v_valorDescontoPagamento - v_valorOutrasDespesasPagamento - v_valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
        END IF;
        v_cab_valorFreteTotal          := v_cab_valorFreteTotal + v_valorFreteTotal;
        v_cab_valorSeguroTotal         := v_cab_valorSeguroTotal + v_valorSeguroTotal;
        v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal + v_valorDescontoTotal;
        v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
        v_cab_valorAdicFreteMarinTotal := v_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
        v_cab_valorDespesasAduanTotal  := v_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
        v_cab_valorLiquidoItem         := v_cab_valorLiquidoItem + v_valorLiquidoItem;
      END LOOP;
    END IF;
    -- CÁLCULO IMPOSTOS
    IF v_calcularImpostosItem = 1 THEN
      v_cab_valorProdutos            := 0;
      v_cab_valorServicos            := 0;
      v_cab_valorBasePagamento       := 0;
      v_cab_valorAVistaMinimo        := 0;
      v_cab_valorFreteTotal          := 0;
      v_cab_valorSeguroTotal         := 0;
      v_cab_valorDescontoTotal       := 0;
      v_cab_valorOutrasDespesasTotal := 0;
      v_cab_valorAdicFreteMarinTotal := 0;
      v_cab_valorDespesasAduanTotal  := 0;
      v_cab_valorLiquidoItem         := 0;
      v_residuoISSQN                 := 0;
      v_residuoRetIRRF               := 0;
      v_residuoRetINSS               := 0;
      v_residuoRetPIS                := 0;
      v_residuoRetCOFINS             := 0;
      v_residuoRetCSLL               := 0;
      v_residuoRetOutros             := 0;
      FOR b IN (
        SELECT
          b.idItemOrcamento,
          b.personalizacao,
          b.quantidade,
          b.quantidadeConvertida,
          b.usarPrecoAVista,
          b.precoUnitarioBruto,
          b.acrescimoUnitarioComposicao,
          b.precoUnitario,
          b.precoUnitarioConvertido,
          b.valorProdutoServico,
          b.valorDescontoItem,
          b.valorAcrescimoItem,
          b.valorFreteItem,
          b.valorSeguroItem,
          b.valorAdicFreteMarinhaMerItem,
          b.valorDespesasAduaneirasItem,
          b.valorFreteGeral,
          b.valorSeguroGeral,
          b.valorDescontoGeral,
          b.valorOutrasDespesasGeral,
          b.valorAdicFreteMarinhaMerGeral,
          b.valorDespesasAduaneirasGeral,
          b.valorBasePagamento,
          b.valorDescontoPagamento,
          b.valorOutrasDespesasPagamento,
          b.valorJurosPagamento,
          b.valorFreteTotal,
          b.valorSeguroTotal,
          b.valorDescontoTotal,
          b.valorOutrasDespesasTotal,
          b.valorAdicFreteMarinhaMerTotal,
          b.valorDespesasAduaneirasTotal,
          b.geraFinanceiro,
          b.cfop,
          b.indicadorISSQN,
          b.aliquotaISSQN,
          b.retidoISSQN,
          b.retencaoIRRF,
          b.retencaoINSS,
          b.retencaoPIS,
          b.retencaoCOFINS,
          b.retencaoCSLL,
          b.retencaoOutros,
          b.aliquotaII,
          b.aliquotaIOF,
          b.aliquotaIPI,
          b.valorAliquotaIPI,
          b.aliquotaPIS,
          b.valorAliquotaPIS,
          b.aliquotaPISST,
          b.valorAliquotaPISST,
          b.aliquotaCOFINS,
          b.valorAliquotaCOFINS,
          b.aliquotaCOFINSST,
          b.valorAliquotaCOFINSST,
          b.stSimplesNacional,
          b.creditoSimplesNacional,
          b.stICMS,
          b.modalidadeBaseCalcICMS,
          b.reducaoBaseICMS,
          b.aliquotaICMS,
          b.diferimentoICMS,
          b.modalidadeBaseCalcICMSST,
          b.margemValorAdicionadoST,
          b.reducaoBaseST,
          b.aliquotaICMSST,
          b.reducaoBaseICMSEfetivo,
          b.aliquotaICMSEfetivo,
          b.aliquotaICMSUFDestinatario,
          b.aliquotaICMSInterestadual,
          b.partilhaICMSInterestadual,
          b.aliquotaFCP,
          b.aliquotaFCPST,
          b.aliquotaFCPSTAnteriormente,
          b.aliquotaFCPUFDestinatario,
          b.aliquotaEstimadaImpFederais,
          b.aliquotaEstimadaImpEstaduais,
          b.aliquotaEstimadaImpMunicipais,
          b.baseISSQN,
          b.valorISSQN,
          b.baseRetIRRF,
          b.valorRetIRRF,
          b.baseRetINSS,
          b.valorRetINSS,
          b.baseRetOutros,
          b.valorRetOutros,
          b.baseRetPIS,
          b.valorRetPIS,
          b.baseRetCOFINS,
          b.valorRetCOFINS,
          b.baseRetCSLL,
          b.valorRetCSLL,
          b.baseII,
          b.valorII,
          b.baseIOF,
          b.valorIOF,
          b.baseIPI,
          b.valorIPI,
          b.basePIS,
          b.valorPIS,
          b.basePISST,
          b.valorPISST,
          b.baseCOFINS,
          b.valorCOFINS,
          b.baseCOFINSST,
          b.valorCOFINSST,
          b.baseCreditoSimplesNacional,
          b.valorCreditoSimplesNacional,
          b.baseICMS,
          b.valorICMSOperacao,
          b.valorICMSDiferido,
          b.valorICMS,
          b.valorICMSDesoneracao,
          b.baseICMSST,
          b.valorICMSST,
          b.baseICMSSTAnteriormente,
          b.valorICMSSTAnteriormente,
          b.valorICMSProprioSubstituto,
          b.baseICMSEfetivo,
          b.valorICMSEfetivo,
          b.baseICMSUFDestinatario,
          b.valorICMSUFDestinatario,
          b.baseICMSUFRemetente,
          b.valorICMSUFRemetente,
          b.baseFCP,
          b.valorFCP,
          b.baseFCPST,
          b.valorFCPST,
          b.baseFCPSTAnteriormente,
          b.valorFCPSTAnteriormente,
          b.baseFCPUFDestinatario,
          b.valorFCPUFDestinatario,
          b.baseEstimadaImpostos,
          b.valorEstimadoImpFederais,
          b.valorEstimadoImpEstaduais,
          b.valorEstimadoImpMunicipais,
          b.valorLiquidoItem,
          gradProd.produto,
          gradProd.cor,
          gradProd.tamanho,
          prod.controleEstoque,
          prod.tipoProduto,
          prod.precoPautaTabelado,
          modDoc.geraFinanceiro modDoc_geraFinanceiro,
          modDoc.diminuiDescontoPrUnit,
          modDoc.somaAcrescimosPrUnit,
          modDoc.somaFreteSeguroPrUnit,
          CASE
            WHEN EXISTS (
              SELECT 1
              FROM CAPRODUTOXCOMPOSICOESPREC compPrec
              WHERE compPrec.produto = gradProd.produto
              AND compPrec.ativo = 1)
            THEN 1
            ELSE 0
          END composicaoPreco
        FROM MOORCAMENTOXITENS b
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = b.gradeProduto
        JOIN CAPRODUTOS prod
        ON prod.produto = gradProd.produto
        JOIN PAMODELOSDOCUMENTO modDoc
        ON modDoc.modeloDocumento = b.modeloDocumento
        WHERE b.orcamento = a.orcamento
        AND b.cancelado = 0
        ORDER BY b.sequencia)
      LOOP
        v_precoUnitario                := b.precoUnitario;
        v_precoUnitarioConvertido      := b.precoUnitarioConvertido;
        v_valorProdutoServico          := b.valorProdutoServico;
        v_valorBasePagamento           := b.valorBasePagamento;
        v_valorFreteTotal              := b.valorFreteTotal;
        v_valorSeguroTotal             := b.valorSeguroTotal;
        v_valorDescontoTotal           := b.valorDescontoTotal;
        v_valorOutrasDespesasTotal     := b.valorOutrasDespesasTotal;
        v_valorAdicFreteMarinMerTotal  := b.valorAdicFreteMarinhaMerTotal;
        v_valorDespesasAduaneirasTotal := b.valorDespesasAduaneirasTotal;
        v_baseISSQN                    := b.baseISSQN;
        v_valorISSQN                   := b.valorISSQN;
        v_baseRetIRRF                  := b.baseRetIRRF;
        v_valorRetIRRF                 := b.valorRetIRRF;
        v_baseRetINSS                  := b.baseRetINSS;
        v_valorRetINSS                 := b.valorRetINSS;
        v_baseRetOutros                := b.baseRetOutros;
        v_valorRetOutros               := b.valorRetOutros;
        v_baseRetPIS                   := b.baseRetPIS;
        v_valorRetPIS                  := b.valorRetPIS;
        v_baseRetCOFINS                := b.baseRetCOFINS;
        v_valorRetCOFINS               := b.valorRetCOFINS;
        v_baseRetCSLL                  := b.baseRetCSLL;
        v_valorRetCSLL                 := b.valorRetCSLL;
        v_baseII                       := b.baseII;
        v_valorII                      := b.valorII;
        v_baseIOF                      := b.baseIOF;
        v_valorIOF                     := b.valorIOF;
        v_baseIPI                      := b.baseIPI;
        v_valorIPI                     := b.valorIPI;
        v_basePIS                      := b.basePIS;
        v_valorPIS                     := b.valorPIS;
        v_basePISST                    := b.basePISST;
        v_valorPISST                   := b.valorPISST;
        v_baseCOFINS                   := b.baseCOFINS;
        v_valorCOFINS                  := b.valorCOFINS;
        v_baseCOFINSST                 := b.baseCOFINSST;
        v_valorCOFINSST                := b.valorCOFINSST;
        v_baseCreditoSimplesNacional   := b.baseCreditoSimplesNacional;
        v_valorCreditoSimplesNacional  := b.valorCreditoSimplesNacional;
        v_baseICMS                     := b.baseICMS;
        v_valorICMSOperacao            := b.valorICMSOperacao;
        v_valorICMSDiferido            := b.valorICMSDiferido;
        v_valorICMS                    := b.valorICMS;
        v_valorICMSDesoneracao         := b.valorICMSDesoneracao;
        v_baseICMSST                   := b.baseICMSST;
        v_valorICMSST                  := b.valorICMSST;
        v_baseICMSSTAnteriormente      := b.baseICMSSTAnteriormente;
        v_valorICMSSTAnteriormente     := b.valorICMSSTAnteriormente;
        v_valorICMSProprioSubstituto   := b.valorICMSProprioSubstituto;
        v_baseICMSEfetivo              := b.baseICMSEfetivo;
        v_valorICMSEfetivo             := b.valorICMSEfetivo;
        v_baseICMSUFDestinatario       := b.baseICMSUFDestinatario;
        v_valorICMSUFDestinatario      := b.valorICMSUFDestinatario;
        v_baseICMSUFRemetente          := b.baseICMSUFRemetente;
        v_valorICMSUFRemetente         := b.valorICMSUFRemetente;
        v_baseFCP                      := b.baseFCP;
        v_valorFCP                     := b.valorFCP;
        v_baseFCPST                    := b.baseFCPST;
        v_valorFCPST                   := b.valorFCPST;
        v_baseFCPSTAnteriormente       := b.baseFCPSTAnteriormente;
        v_valorFCPSTAnteriormente      := b.valorFCPSTAnteriormente;
        v_baseFCPUFDestinatario        := b.baseFCPUFDestinatario;
        v_valorFCPUFDestinatario       := b.valorFCPUFDestinatario;
        v_baseEstimadaImpostos         := b.baseEstimadaImpostos;
        v_valorEstimadoImpFederais     := b.valorEstimadoImpFederais;
        v_valorEstimadoImpEstaduais    := b.valorEstimadoImpEstaduais;
        v_valorEstimadoImpMunicipais   := b.valorEstimadoImpMunicipais;
        v_valorLiquidoItem             := b.valorLiquidoItem;
        ADD_CALCULA_TOTAIS_ITEM (
          a.tipoPagamentoFrete,
          b.quantidade,
          b.quantidadeConvertida,
          b.precoUnitarioBruto,
          b.acrescimoUnitarioComposicao,
          b.precoUnitario,
          b.valorDescontoItem,
          b.valorAcrescimoItem,
          b.valorFreteItem,
          b.valorSeguroItem,
          b.valorAdicFreteMarinhaMerItem,
          b.valorDespesasAduaneirasItem,
          b.valorFreteGeral,
          b.valorSeguroGeral,
          b.valorDescontoGeral,
          b.valorOutrasDespesasGeral,
          b.valorAdicFreteMarinhaMerGeral,
          b.valorDespesasAduaneirasGeral,
          b.valorDescontoPagamento,
          b.valorOutrasDespesasPagamento,
          b.valorJurosPagamento,
          b.diminuiDescontoPrUnit,
          b.somaAcrescimosPrUnit,
          b.somaFreteSeguroPrUnit,
          b.composicaoPreco,
          /* Retornos */
          v_precoUnitario,
          v_precoUnitarioConvertido,
          v_valorProdutoServico,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          v_valorAdicFreteMarinMerTotal,
          v_valorDespesasAduaneirasTotal);
        ADD_CALCULA_IMPOSTOS_ITEM (
          p_config_64_casasDecSaidas,
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          a.entradaSaida,
          0,
          a.estabelecimento,
          0,
          a.dataEmissao,
          a.pessoa,
          a.localDestinoOperacao,
          a.indicadorConsumidorFinal,
          a.tipoPagamentoFrete,
          a.indicadorInscricaoEstadual,
          b.personalizacao,
          b.quantidade,
          v_valorProdutoServico,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          v_valorAdicFreteMarinMerTotal,
          v_valorDespesasAduaneirasTotal,
          b.cfop,
          1,
          b.indicadorISSQN,
          b.aliquotaISSQN,
          v_baseISSQN,
          v_residuoISSQN,
          v_valorISSQN,
          1,
          b.retencaoIRRF,
          v_baseRetIRRF,
          v_residuoRetIRRF,
          v_valorRetIRRF,
          1,
          b.retencaoINSS,
          v_baseRetINSS,
          v_residuoRetINSS,
          v_valorRetINSS,
          1,
          b.retencaoPIS,
          v_baseRetPIS,
          v_residuoRetPIS,
          v_valorRetPIS,
          1,
          b.retencaoCOFINS,
          v_baseRetCOFINS,
          v_residuoRetCOFINS,
          v_valorRetCOFINS,
          1,
          b.retencaoCSLL,
          v_baseRetCSLL,
          v_residuoRetCSLL,
          v_valorRetCSLL,
          1,
          b.retencaoOutros,
          v_baseRetOutros,
          v_residuoRetOutros,
          v_valorRetOutros,
          1,
          b.aliquotaII,
          v_baseII,
          v_valorII,
          1,
          b.aliquotaIOF,
          v_baseIOF,
          v_valorIOF,
          1,
          b.aliquotaIPI,
          b.valorAliquotaIPI,
          v_baseIPI,
          v_valorIPI,
          0,
          1,
          b.aliquotaPIS,
          b.valorAliquotaPIS,
          v_basePIS,
          v_valorPIS,
          1,
          b.aliquotaPISST,
          b.valorAliquotaPISST,
          v_basePISST,
          v_valorPISST,
          1,
          b.aliquotaCOFINS,
          b.valorAliquotaCOFINS,
          v_baseCOFINS,
          v_valorCOFINS,
          1,
          b.aliquotaCOFINSST,
          b.valorAliquotaCOFINSST,
          v_baseCOFINSST,
          v_valorCOFINSST,
          1,
          b.stSimplesNacional,
          b.creditoSimplesNacional,
          v_baseCreditoSimplesNacional,
          v_valorCreditoSimplesNacional,
          1,
          b.stICMS,
          b.modalidadeBaseCalcICMS,
          b.reducaoBaseICMS,
          b.aliquotaICMS,
          b.diferimentoICMS,
          v_baseICMS,
          v_valorICMSOperacao,
          v_valorICMSDiferido,
          v_valorICMS,
          v_valorICMSDesoneracao,
          1,
          b.modalidadeBaseCalcICMSST,
          b.margemValorAdicionadoST,
          b.reducaoBaseST,
          b.aliquotaICMSST,
          v_baseICMSST,
          v_valorICMSST,
          1,
          v_baseICMSSTAnteriormente,
          v_valorICMSSTAnteriormente,
          v_valorICMSProprioSubstituto,
          b.reducaoBaseICMSEfetivo,
          b.aliquotaICMSEfetivo,
          v_baseICMSEfetivo,
          v_valorICMSEfetivo,
          0,
          '  ',
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          1,
          b.aliquotaICMSUFDestinatario,
          b.aliquotaICMSInterestadual,
          b.partilhaICMSInterestadual,
          v_baseICMSUFDestinatario,
          v_valorICMSUFDestinatario,
          v_baseICMSUFRemetente,
          v_valorICMSUFRemetente,
          1,
          b.aliquotaFCP,
          v_baseFCP,
          v_valorFCP,
          b.aliquotaFCPST,
          v_baseFCPST,
          v_valorFCPST,
          b.aliquotaFCPSTAnteriormente,
          v_baseFCPSTAnteriormente,
          v_valorFCPSTAnteriormente,
          b.aliquotaFCPUFDestinatario,
          v_baseFCPUFDestinatario,
          v_valorFCPUFDestinatario,
          1,
          b.aliquotaEstimadaImpFederais,
          b.aliquotaEstimadaImpEstaduais,
          b.aliquotaEstimadaImpMunicipais,
          v_baseEstimadaImpostos,
          v_valorEstimadoImpFederais,
          v_valorEstimadoImpEstaduais,
          v_valorEstimadoImpMunicipais,
          b.produto,
          b.cor,
          b.tamanho,
          b.controleEstoque,
          b.tipoProduto,
          b.precoPautaTabelado,
          /* Retornos */
          v_baseISSQN,
          v_residuoISSQN,
          v_valorISSQN,
          v_baseRetIRRF,
          v_residuoRetIRRF,
          v_valorRetIRRF,
          v_baseRetINSS,
          v_residuoRetINSS,
          v_valorRetINSS,
          v_baseRetPIS,
          v_residuoRetPIS,
          v_valorRetPIS,
          v_baseRetCOFINS,
          v_residuoRetCOFINS,
          v_valorRetCOFINS,
          v_baseRetCSLL,
          v_residuoRetCSLL,
          v_valorRetCSLL,
          v_baseRetOutros,
          v_residuoRetOutros,
          v_valorRetOutros,
          v_baseII,
          v_valorII,
          v_baseIOF,
          v_valorIOF,
          v_baseIPI,
          v_valorIPI,
          v_basePIS,
          v_valorPIS,
          v_basePISST,
          v_valorPISST,
          v_baseCOFINS,
          v_valorCOFINS,
          v_baseCOFINSST,
          v_valorCOFINSST,
          v_baseCreditoSimplesNacional,
          v_valorCreditoSimplesNacional,
          v_baseICMS,
          v_valorICMSOperacao,
          v_valorICMSDiferido,
          v_valorICMS,
          v_valorICMSDesoneracao,
          v_baseICMSST,
          v_valorICMSST,
          v_baseICMSSTAnteriormente,
          v_valorICMSSTAnteriormente,
          v_valorICMSProprioSubstituto,
          v_baseICMSEfetivo,
          v_valorICMSEfetivo,
          v_auxNumber,
          v_auxNumber,
          v_auxNumber,
          v_auxNumber,
          v_auxNumber,
          v_baseICMSUFDestinatario,
          v_valorICMSUFDestinatario,
          v_baseICMSUFRemetente,
          v_valorICMSUFRemetente,
          v_baseFCP,
          v_valorFCP,
          v_baseFCPST,
          v_valorFCPST,
          v_baseFCPSTAnteriormente,
          v_valorFCPSTAnteriormente,
          v_baseFCPUFDestinatario,
          v_valorFCPUFDestinatario,
          v_baseEstimadaImpostos,
          v_valorEstimadoImpFederais,
          v_valorEstimadoImpEstaduais,
          v_valorEstimadoImpMunicipais);
        v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
          a.origemDocumento,
          0, -- a.nfFornecedor
          a.tipoPagamentoFrete,
          b.geraFinanceiro,
          v_valorProdutoServico,
          b.valorDescontoPagamento,
          b.valorOutrasDespesasPagamento,
          b.valorJurosPagamento,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          0, -- p_item_valorIPIDevolucao
          b.retidoISSQN,
          v_valorISSQN,
          v_valorRetIRRF,
          v_valorRetINSS,
          v_valorRetPIS,
          v_valorRetCOFINS,
          v_valorRetCSLL,
          v_valorRetOutros,
          v_valorII,
          v_valorIOF,
          v_valorIPI,
          v_valorICMSST,
          0, -- p_item_valorICMSSTEscrit
          0, -- p_item_somarICMSST
          0, -- p_item_valorAcrescExtempTotal
          b.modDoc_geraFinanceiro);
        v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
          0, -- a.nfFornecedor
          a.tipoPagamentoFrete,
          v_valorProdutoServico,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          0, -- p_item_valorIPIDevolucao
          v_valorII,
          v_valorIOF,
          v_valorIPI,
          v_valorICMSST,
          0, -- p_item_valorICMSSTEscrit
          0 -- p_item_somarICMSST
          );
        UPDATE MOORCAMENTOXITENS SET
          precoUnitario                 = v_precoUnitario,
          precoUnitarioConvertido       = v_precoUnitarioConvertido,
          valorProdutoServico           = v_valorProdutoServico,
          valorBasePagamento            = v_valorBasePagamento,
          valorFreteTotal               = v_valorFreteTotal,
          valorSeguroTotal              = v_valorSeguroTotal,
          valorDescontoTotal            = v_valorDescontoTotal,
          valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
          valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
          valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
          baseISSQN                     = v_baseISSQN,
          valorISSQN                    = v_valorISSQN,
          baseRetIRRF                   = v_baseRetIRRF,
          valorRetIRRF                  = v_valorRetIRRF,
          baseRetINSS                   = v_baseRetINSS,
          valorRetINSS                  = v_valorRetINSS,
          baseRetPIS                    = v_baseRetPIS,
          valorRetPIS                   = v_valorRetPIS,
          baseRetCOFINS                 = v_baseRetCOFINS,
          valorRetCOFINS                = v_valorRetCOFINS,
          baseRetCSLL                   = v_baseRetCSLL,
          valorRetCSLL                  = v_valorRetCSLL,
          baseRetOutros                 = v_baseRetOutros,
          valorRetOutros                = v_valorRetOutros,
          baseII                        = v_baseII,
          valorII                       = v_valorII,
          baseIOF                       = v_baseIOF,
          valorIOF                      = v_valorIOF,
          baseIPI                       = v_baseIPI,
          valorIPI                      = v_valorIPI,
          basePIS                       = v_basePIS,
          valorPIS                      = v_valorPIS,
          basePISST                     = v_basePISST,
          valorPISST                    = v_valorPISST,
          baseCOFINS                    = v_baseCOFINS,
          valorCOFINS                   = v_valorCOFINS,
          baseCOFINSST                  = v_baseCOFINSST,
          valorCOFINSST                 = v_valorCOFINSST,
          baseCreditoSimplesNacional    = v_baseCreditoSimplesNacional,
          valorCreditoSimplesNacional   = v_valorCreditoSimplesNacional,
          baseICMS                      = v_baseICMS,
          valorICMSOperacao             = v_valorICMSOperacao,
          valorICMSDiferido             = v_valorICMSDiferido,
          valorICMS                     = v_valorICMS,
          valorICMSDesoneracao          = v_valorICMSDesoneracao,
          baseICMSST                    = v_baseICMSST,
          valorICMSST                   = v_valorICMSST,
          baseICMSSTAnteriormente       = v_baseICMSSTAnteriormente,
          valorICMSSTAnteriormente      = v_valorICMSSTAnteriormente,
          valorICMSProprioSubstituto    = v_valorICMSProprioSubstituto,
          baseICMSEfetivo               = v_baseICMSEfetivo,
          valorICMSEfetivo              = v_valorICMSEfetivo,
          baseICMSUFDestinatario        = v_baseICMSUFDestinatario,
          valorICMSUFDestinatario       = v_valorICMSUFDestinatario,
          baseICMSUFRemetente           = v_baseICMSUFRemetente,
          valorICMSUFRemetente          = v_valorICMSUFRemetente,
          baseFCP                       = v_baseFCP,
          valorFCP                      = v_valorFCP,
          baseFCPST                     = v_baseFCPST,
          valorFCPST                    = v_valorFCPST,
          baseFCPSTAnteriormente        = v_baseFCPSTAnteriormente,
          valorFCPSTAnteriormente       = v_valorFCPSTAnteriormente,
          baseFCPUFDestinatario         = v_baseFCPUFDestinatario,
          valorFCPUFDestinatario        = v_valorFCPUFDestinatario,
          baseEstimadaImpostos          = v_baseEstimadaImpostos,
          valorEstimadoImpFederais      = v_valorEstimadoImpFederais,
          valorEstimadoImpEstaduais     = v_valorEstimadoImpEstaduais,
          valorEstimadoImpMunicipais    = v_valorEstimadoImpMunicipais,
          valorLiquidoItem              = v_valorLiquidoItem
        WHERE idItemOrcamento           = b.idItemOrcamento;
        IF b.tipoProduto = '09' THEN
          v_cab_valorServicos            := v_cab_valorServicos + v_valorProdutoServico;
        ELSE
          v_cab_valorProdutos            := v_cab_valorProdutos + v_valorProdutoServico;
        END IF;
        v_cab_valorBasePagamento       := v_cab_valorBasePagamento + v_valorBasePagamento;
        IF b.usarPrecoAVista = 1 AND b.geraFinanceiro = 1 THEN
          v_cab_valorAVistaMinimo        := v_cab_valorAVistaMinimo + v_valorProdutoServico + b.valorDescontoPagamento - b.valorOutrasDespesasPagamento - b.valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
        END IF;
        v_cab_valorFreteTotal          := v_cab_valorFreteTotal + v_valorFreteTotal;
        v_cab_valorSeguroTotal         := v_cab_valorSeguroTotal + v_valorSeguroTotal;
        v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal + v_valorDescontoTotal;
        v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
        v_cab_valorAdicFreteMarinTotal := v_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
        v_cab_valorDespesasAduanTotal  := v_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
        v_cab_valorLiquidoItem         := v_cab_valorLiquidoItem + v_valorLiquidoItem;
      END LOOP;
    END IF;
    UPDATE MOORCAMENTOS SET 
      valorProdutos                 = v_cab_valorProdutos,
      valorServicos                 = v_cab_valorServicos,
      valorBasePagamento            = v_cab_valorBasePagamento,
      valorAVistaMinimo             = v_cab_valorAVistaMinimo,
      valorFreteTotal               = v_cab_valorFreteTotal,
      valorSeguroTotal              = v_cab_valorSeguroTotal,
      valorDescontoTotal            = v_cab_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarinTotal,
      valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
      valorLiquidoItem              = v_cab_valorLiquidoItem
    WHERE orcamento                 = a.orcamento;
  END LOOP;
END ADD_ORCAMENTO_CALCULA_IMPOSTOS;

/

create or replace PROCEDURE ADD_PRE_DOC_CALCULA_IMPOSTOS (
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_preDocumento             IN NUMBER,
  p_troca_tipoPagamentoFrete     IN NUMBER,
  p_a_cab_tipoPagamentoFrete     IN CHAR)
IS
  v_cab_valorProdutos            NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarinTotal NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_valorDescCustoOpTotal    NUMBER;
  v_cab_valorAcrescCustoOpTotal  NUMBER;
  v_cab_valorAcrescExtempTotal   NUMBER;
  v_calcularImpostosItem         NUMBER;
  v_habilitaControleEntrega      NUMBER;
  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_valorDescontoCustoOpGeral    NUMBER;
  v_valorAcrescimoCustoOpGeral   NUMBER;
  v_valorAcrescimoExtempGeral    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_baseISSQN                    NUMBER;
  v_residuoISSQN                 NUMBER;
  v_valorISSQN                   NUMBER;
  v_baseRetIRRF                  NUMBER;
  v_residuoRetIRRF               NUMBER;
  v_valorRetIRRF                 NUMBER;
  v_baseRetINSS                  NUMBER;
  v_residuoRetINSS               NUMBER;
  v_valorRetINSS                 NUMBER;
  v_baseRetPIS                   NUMBER;
  v_residuoRetPIS                NUMBER;
  v_valorRetPIS                  NUMBER;
  v_baseRetCOFINS                NUMBER;
  v_residuoRetCOFINS             NUMBER;
  v_valorRetCOFINS               NUMBER;
  v_baseRetCSLL                  NUMBER;
  v_residuoRetCSLL               NUMBER;
  v_valorRetCSLL                 NUMBER;
  v_baseRetOutros                NUMBER;
  v_residuoRetOutros             NUMBER;
  v_valorRetOutros               NUMBER;
  v_baseII                       NUMBER;
  v_valorII                      NUMBER;
  v_baseIOF                      NUMBER;
  v_valorIOF                     NUMBER;
  v_baseIPI                      NUMBER;
  v_valorIPI                     NUMBER;
  v_basePIS                      NUMBER;
  v_valorPIS                     NUMBER;
  v_basePISST                    NUMBER;
  v_valorPISST                   NUMBER;
  v_baseCOFINS                   NUMBER;
  v_valorCOFINS                  NUMBER;
  v_baseCOFINSST                 NUMBER;
  v_valorCOFINSST                NUMBER;
  v_baseCreditoSimplesNacional   NUMBER;
  v_valorCreditoSimplesNacional  NUMBER;
  v_baseICMS                     NUMBER;
  v_valorICMSOperacao            NUMBER;
  v_valorICMSDiferido            NUMBER;
  v_valorICMS                    NUMBER;
  v_valorICMSDesoneracao         NUMBER;
  v_baseICMSST                   NUMBER;
  v_valorICMSST                  NUMBER;
  v_baseICMSSTAnteriormente      NUMBER;
  v_valorICMSSTAnteriormente     NUMBER;
  v_valorICMSProprioSubstituto   NUMBER;
  v_baseICMSEfetivo              NUMBER;
  v_valorICMSEfetivo             NUMBER;
  v_baseICMSUFDestinatario       NUMBER;
  v_valorICMSUFDestinatario      NUMBER;
  v_baseICMSUFRemetente          NUMBER;
  v_valorICMSUFRemetente         NUMBER;
  v_baseFCP                      NUMBER;
  v_valorFCP                     NUMBER;
  v_baseFCPST                    NUMBER;
  v_valorFCPST                   NUMBER;
  v_baseFCPSTAnteriormente       NUMBER;
  v_valorFCPSTAnteriormente      NUMBER;
  v_baseFCPUFDestinatario        NUMBER;
  v_valorFCPUFDestinatario       NUMBER;
  v_baseEstimadaImpostos         NUMBER;
  v_valorEstimadoImpFederais     NUMBER;
  v_valorEstimadoImpEstaduais    NUMBER;
  v_valorEstimadoImpMunicipais   NUMBER;
  v_valorLiquidoItem             NUMBER;
  v_valorDescontoCustoOpTotal    NUMBER;
  v_valorAcrescimoCustoOpTotal   NUMBER;
  v_precoCustoOperacao           NUMBER;
  v_valorCustoOperacao           NUMBER;
  v_precoCMV                     NUMBER;
  v_valorCMV                     NUMBER;
  v_valorAcrescimoExtempSubtotal NUMBER;
  v_valorAcrescimoExtempTotal    NUMBER;
  v_auxNumber                    NUMBER;
BEGIN
  FOR a IN (
    SELECT
      a.preDocumento,
      a.origemDocumento,
      a.entradaSaida,
      a.devolucaoAnulacaoRetorno,
      a.atualizaCustoMedio,
      a.estabelecimento,
      a.dataEntradaSaida,
      a.pessoa,
      a.localDestinoOperacao,
      a.indicadorConsumidorFinal,
      a.tipoPagamentoFrete,
      a.valorProdutos,
      a.valorServicos,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorDescontoGeral,
      a.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral,
      a.valorDescontoCustoOpGeral,
      a.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoExtempGeral,
      a.valorBasePagamento,
      a.valorAVistaMinimo,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      a.valorFreteTotal,
      a.valorSeguroTotal,
      a.valorDescontoTotal,
      a.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.impostosEditados,
      a.valorLiquidoItem,
      a.valorDescontoCustoOpTotal,
      a.valorAcrescimoCustoOpTotal,
      a.valorCustoOperacao,
      a.valorCMV,
      a.valorAcrescimoExtempTotal,
      pess.indicadorInscricaoEstadual,
      COALESCE ((
        SELECT MIN (munEndEst.uf)
        FROM PAESTABELECIMENTOS est
        JOIN CAENDERECOSPESSOA endEst
        ON endEst.pessoa = est.pessoaEstabelecimento
        JOIN SIMUNICIPIOS munEndEst
        ON munEndEst.municipio = endEst.municipio
        WHERE est.estabelecimento = a.estabelecimento
        AND endEst.ativo = 1
        AND endEst.principal = 1),'  ') munEndEst_uf
    FROM MOPREDOCUMENTOS a
    JOIN CAPESSOAS pess
    ON pess.pessoa = a.pessoa
    WHERE a.preDocumento = p_cab_preDocumento)
  LOOP
    v_cab_valorProdutos            := a.valorProdutos;
    v_cab_valorServicos            := a.valorServicos;
    v_cab_valorBasePagamento       := a.valorBasePagamento;
    v_cab_valorAVistaMinimo        := a.valorAVistaMinimo;
    v_cab_valorFreteTotal          := a.valorFreteTotal;
    v_cab_valorSeguroTotal         := a.valorSeguroTotal;
    v_cab_valorDescontoTotal       := a.valorDescontoTotal;
    v_cab_valorOutrasDespesasTotal := a.valorOutrasDespesasTotal;
    v_cab_valorAdicFreteMarinTotal := a.valorAdicFreteMarinhaMerTotal;
    v_cab_valorDespesasAduanTotal  := a.valorDespesasAduaneirasTotal;
    v_cab_valorLiquidoItem         := a.valorLiquidoItem;
    v_cab_valorDescCustoOpTotal    := a.valorDescontoCustoOpTotal;
    v_cab_valorAcrescCustoOpTotal  := a.valorAcrescimoCustoOpTotal;
    v_cab_valorCustoOperacao       := a.valorCustoOperacao;
    v_cab_valorCMV                 := a.valorCMV;
    v_cab_valorAcrescExtempTotal   := a.valorAcrescimoExtempTotal;    
    SELECT
      CASE
        WHEN EXISTS (
          SELECT 1
          FROM MOPREDOCUMXITENS a
          JOIN MOPREDOCUMXORCAMENTOITEM docXorc
          ON docXorc.idItemPreDocumento = a.idItemPreDocumento
          JOIN MOORCAMENTOXITENS itemOrc
          ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento
          JOIN PACONTROLESENTREGA contr
          ON contr.controleEntrega = itemOrc.controleEntrega
          WHERE a.preDocumento = p_cab_preDocumento
          AND itemOrc.controleEntrega <> 0
          AND contr.habilitaFrete = 1)
        THEN 1
        ELSE 0
      END
    INTO v_habilitaControleEntrega
    FROM DUAL;
    -- RATEIO DESCONTOS E ACRÉSCIMOS
    v_cab_valorProdutos            := 0;
    v_cab_valorServicos            := 0;
    v_cab_valorBasePagamento       := 0;
    v_cab_valorAVistaMinimo        := 0;
    v_cab_valorFreteTotal          := 0;
    v_cab_valorSeguroTotal         := 0;
    v_cab_valorDescontoTotal       := 0;
    v_cab_valorOutrasDespesasTotal := 0;
    v_cab_valorAdicFreteMarinTotal := 0;
    v_cab_valorDespesasAduanTotal  := 0;
    v_cab_valorLiquidoItem         := 0;
    v_cab_valorDescCustoOpTotal    := 0;
    v_cab_valorAcrescCustoOpTotal  := 0;
    v_cab_valorCustoOperacao       := 0;
    v_cab_valorCMV                 := 0;
    v_cab_valorAcrescExtempTotal   := 0;
    v_calcularImpostosItem         := 0;
    v_saldoRatFreteGeral           := a.valorFreteGeral;
    v_saldoRatSeguroGeral          := a.valorSeguroGeral;
    v_saldoRatDescontoGeral        := a.valorDescontoGeral;
    v_saldoRatOutrasDespesasGeral  := a.valorOutrasDespesasGeral;
    v_saldoRatAdicFreteMarinGeral  := a.valorAdicFreteMarinhaMerGeral;
    v_saldoRatDespesasAduanGeral   := a.valorDespesasAduaneirasGeral;
    v_saldoRatDescontoPagamento    := a.valorDescontoPagamento;
    v_saldoRatOutrasDespPagamento  := a.valorOutrasDespesasPagamento;
    v_saldoRatJurosPagamento       := a.valorJurosPagamento;
    v_saldoRatDescCustoOpGeral     := a.valorDescontoCustoOpGeral;
    v_saldoRatAcrescCustoOpGeral   := a.valorAcrescimoCustoOpGeral;
    v_saldoRatAcrescExtempGeral    := a.valorAcrescimoExtempGeral;
    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 a.valorDescontoGeral > 0 THEN
      SELECT COALESCE (SUM (promo.valorDesconto),0)
      INTO v_valorDescontoPromocaoGeral
      FROM MOPREDOCUMXITENS b
      JOIN MOPREDOCUMXPROMOCOES promo
      ON promo.idItemPreDocumento = b.idItemPreDocumento
      WHERE b.preDocumento = a.preDocumento
      AND b.cancelado = 0
      AND promo.cabecalhoItemPagamento ='C';
    END IF;
  
    -- v_valorDescontoPromocaoPagamen
    IF a.valorDescontoPagamento > 0 THEN
      SELECT COALESCE (SUM (promo.valorDesconto),0)
      INTO v_valorDescontoPromocaoPagamen
      FROM MOPREDOCUMXITENS b
      JOIN MOPREDOCUMXPROMOCOES promo
      ON promo.idItemPreDocumento = b.idItemPreDocumento
      WHERE b.preDocumento = a.preDocumento
      AND b.cancelado = 0
      AND promo.cabecalhoItemPagamento ='P';
    END IF;
  
    -- v_rateioDescontofiltrarSemProm
    IF a.valorDescontoGeral > v_valorDescontoPromocaoGeral OR a.valorDescontoPagamento > v_valorDescontoPromocaoPagamen THEN
      SELECT
        CASE
          WHEN EXISTS (
            SELECT 1
            FROM MOPREDOCUMXITENS b
            JOIN PAMODELOSDOCUMENTO modDoc
            ON modDoc.modeloDocumento = b.modeloDocumento
            WHERE b.preDocumento = a.preDocumento
            AND b.cancelado = 0
            AND COALESCE ((
              SELECT SUM (promo.valorDesconto)
              FROM MOPREDOCUMXPROMOCOES promo
              WHERE promo.idItemPreDocumento = b.idItemPreDocumento
              AND promo.cabecalhoItemPagamento IN ('C','P')),0) > ( CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit  = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END
              - b.valorDescontoItem + b.valorAcrescimoItem))
          THEN 0
          WHEN COALESCE ((
            SELECT SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem)
            FROM MOPREDOCUMXITENS b
            JOIN PAMODELOSDOCUMENTO modDoc
            ON modDoc.modeloDocumento = b.modeloDocumento
            JOIN MOPREDOCUMXPROMOCOES promo
            ON promo.idItemPreDocumento = b.idItemPreDocumento
            WHERE b.preDocumento = a.preDocumento
            AND b.cancelado = 0),0) > (
              CASE
                WHEN a.valorDescontoGeral > v_valorDescontoPromocaoGeral
                THEN a.valorDescontoGeral - v_valorDescontoPromocaoGeral
                ELSE 0
              END +
              CASE
                WHEN a.valorDescontoPagamento > v_valorDescontoPromocaoPagamen
                THEN a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen
                ELSE 0
              END)
            AND EXISTS (
              SELECT 1
              FROM MOPREDOCUMXITENS b
              WHERE b.preDocumento = a.preDocumento
              AND b.cancelado = 0
              AND NOT EXISTS (
                SELECT 1
                FROM MOPREDOCUMXPROMOCOES promo
                WHERE promo.idItemPreDocumento = b.idItemPreDocumento))
          THEN 1
          ELSE 0
        END
      INTO v_rateioDescontofiltrarSemProm
      FROM DUAL;
    END IF;
  
    -- v_rateioDescontofiltrarAPrazo
    IF a.valorDescontoGeral > v_valorDescontoPromocaoGeral OR a.valorDescontoPagamento > v_valorDescontoPromocaoPagamen THEN
      SELECT
        CASE
          WHEN COALESCE ((
            SELECT SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem)
            FROM MOPREDOCUMXITENS b
            JOIN PAMODELOSDOCUMENTO modDoc
            ON modDoc.modeloDocumento = b.modeloDocumento
            WHERE b.preDocumento = a.preDocumento
            AND b.cancelado = 0
            AND b.precoSugestaoAPrazo <> b.precoSugestaoAVista
            AND b.usarPrecoAVista = 1
            AND (v_rateioDescontofiltrarSemProm = 0
              OR NOT(EXISTS(
                SELECT 1
                FROM MOPREDOCUMXPROMOCOES promo
                WHERE promo.idItemPreDocumento = b.idItemPreDocumento)))),0) > (
              CASE
                WHEN a.valorDescontoGeral > v_valorDescontoPromocaoGeral
                THEN a.valorDescontoGeral - v_valorDescontoPromocaoGeral
                ELSE 0
              END +
              CASE
                WHEN a.valorDescontoPagamento > v_valorDescontoPromocaoPagamen
                THEN a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen
                ELSE 0
              END)
            AND EXISTS (
              SELECT 1
              FROM MOPREDOCUMXITENS b
              WHERE b.preDocumento = a.preDocumento
              AND b.cancelado = 0
              AND (b.precoSugestaoAPrazo = b.precoSugestaoAVista
                OR b.usarPrecoAVista = 0)
              AND (v_rateioDescontofiltrarSemProm = 0
                OR NOT(EXISTS(
                  SELECT 1
                  FROM MOPREDOCUMXPROMOCOES promo
                  WHERE promo.idItemPreDocumento = b.idItemPreDocumento))))
          THEN 1
          ELSE 0
        END
      INTO v_rateioDescontofiltrarAPrazo
      FROM DUAL;
    END IF;
  
    -- Bases Rateio
    SELECT
      MAX (COALESCE ((CASE WHEN v_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 = b.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 b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN modDoc.geraFinanceiro = 1 AND (v_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 = b.idItemPreDocumento AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1)) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 AND (v_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 = b.idItemPreDocumento AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1)) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem),0),
      COALESCE (SUM (CASE WHEN v_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 = b.idItemPreDocumento AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN (v_rateioDescontofiltrarAPrazo = 0 OR b.precoSugestaoAPrazo = b.precoSugestaoAVista OR b.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MOPREDOCUMXPROMOCOES promo WHERE promo.idItemPreDocumento = b.idItemPreDocumento))) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN (v_rateioDescontofiltrarAPrazo = 0 OR b.precoSugestaoAPrazo = b.precoSugestaoAVista OR b.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MOPREDOCUMXPROMOCOES promo WHERE promo.idItemPreDocumento = b.idItemPreDocumento))) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 AND (v_rateioDescontofiltrarAPrazo = 0 OR b.precoSugestaoAPrazo = b.precoSugestaoAVista OR b.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MOPREDOCUMXPROMOCOES promo WHERE promo.idItemPreDocumento = b.idItemPreDocumento))) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.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 b
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = b.modeloDocumento
    WHERE b.preDocumento = a.preDocumento
    AND b.cancelado = 0;
  
    -- Efetua rateio
    FOR b IN (
      SELECT
        b.idItemPreDocumento,
        b.modeloDocumento,
        b.geraFinanceiro,
        b.quantidade,
        b.quantidadeConvertida,
        b.usarPrecoAVista,
        b.precoUnitarioBruto,
        b.acrescimoUnitarioComposicao,
        b.precoUnitario,
        b.precoUnitarioConvertido,
        b.valorProdutoServicoBruto,
        b.valorProdutoServico,
        b.valorDescontoItem,
        b.valorAcrescimoItem,
        b.valorFreteItem,
        b.valorSeguroItem,
        b.valorAdicFreteMarinhaMerItem,
        b.valorDespesasAduaneirasItem,
        b.valorFreteGeral,
        b.valorSeguroGeral,
        b.valorDescontoGeral,
        b.valorOutrasDespesasGeral,
        b.valorAdicFreteMarinhaMerGeral,
        b.valorDespesasAduaneirasGeral,
        b.valorBasePagamento,
        b.valorDescontoPagamento,
        b.valorOutrasDespesasPagamento,
        b.valorJurosPagamento,
        b.valorFreteTotal,
        b.valorSeguroTotal,
        b.valorDescontoTotal,
        b.valorOutrasDespesasTotal,
        b.valorAdicFreteMarinhaMerTotal,
        b.valorDespesasAduaneirasTotal,
        b.valorIPIDevolucao,
        b.retidoISSQN,
        b.valorISSQN,
        b.valorRetIRRF,
        b.valorRetINSS,
        b.valorRetPIS,
        b.valorRetCOFINS,
        b.valorRetCSLL,
        b.valorRetOutros,
        b.valorII,
        b.valorIOF,
        b.valorIPI,
        b.valorPIS,
        b.valorPISST,
        b.valorCOFINS,
        b.valorCOFINSST,
        b.valorCreditoSimplesNacional,
        b.valorICMS,
        b.valorICMSST,
        b.valorLiquidoItem,
        b.valorDescontoCustoOpItem,
        b.valorDescontoCustoOpGeral,
        b.valorDescontoCustoOpTotal,
        b.valorAcrescimoCustoOpItem,
        b.valorAcrescimoCustoOpGeral,
        b.valorAcrescimoCustoOpTotal,
        b.precoCustoOperacao,
        b.valorCustoOperacao,
        b.precoCMV,
        b.valorCMV,
        b.quantidadeExtemporanea,
        b.acrescimoUnitarioExtemporaneo,
        b.valorAcrescimoExtempSubtotal,
        b.valorAcrescimoExtempItem,
        b.valorAcrescimoExtempGeral,
        b.valorAcrescimoExtempTotal,
        modDoc.diminuiDescontoPrUnit,
        modDoc.somaAcrescimosPrUnit,
        modDoc.somaFreteSeguroPrUnit,
        modDoc.geraFinanceiro modDoc_geraFinanceiro,
        prod.tipoProduto,
        CASE WHEN v_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 = b.idItemPreDocumento
          AND contr.habilitaFrete = 1) THEN 1 ELSE 0 END rateioFrete,
        CASE WHEN b.precoSugestaoAPrazo <> b.precoSugestaoAVista AND b.usarPrecoAVista = 1 THEN 1 ELSE 0 END aVista,
        CASE WHEN EXISTS(
          SELECT 1
          FROM MOPREDOCUMXPROMOCOES promo
          WHERE promo.idItemPreDocumento = b.idItemPreDocumento) THEN 1 ELSE 0 END promocao,
        COALESCE ((
          SELECT SUM (promo.valorDesconto)
          FROM MOPREDOCUMXPROMOCOES promo
          WHERE promo.idItemPreDocumento = b.idItemPreDocumento
          AND promo.cabecalhoItemPagamento ='C'),0) valorDescontoPromocaoGeral,
        COALESCE ((
          SELECT SUM (promo.valorDesconto)
          FROM MOPREDOCUMXPROMOCOES promo
          WHERE promo.idItemPreDocumento = b.idItemPreDocumento
          AND promo.cabecalhoItemPagamento ='P'),0) valorDescontoPromocaoPagamento,
        CASE
          WHEN EXISTS (
            SELECT 1
            FROM CAPRODUTOXCOMPOSICOESPREC compPrec
            WHERE compPrec.produto = gradProd.produto
            AND compPrec.ativo = 1)
          THEN 1
          ELSE 0
        END composicaoPreco
      FROM MOPREDOCUMXITENS b
      JOIN PAMODELOSDOCUMENTO modDoc
      ON modDoc.modeloDocumento = b.modeloDocumento
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = b.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      WHERE b.preDocumento = a.preDocumento
      AND b.cancelado = 0
      ORDER BY b.sequencia)
    LOOP
      v_idItemPreDocUltimoItem       := b.idItemPreDocumento;
      v_precoUnitario                := b.precoUnitario;
      v_precoUnitarioConvertido      := b.precoUnitarioConvertido;
      v_valorProdutoServico          := b.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           := b.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              := b.valorFreteTotal;
      v_valorSeguroTotal             := b.valorSeguroTotal;
      v_valorDescontoTotal           := b.valorDescontoTotal;
      v_valorOutrasDespesasTotal     := b.valorOutrasDespesasTotal;
      v_valorAdicFreteMarinMerTotal  := b.valorAdicFreteMarinhaMerTotal;
      v_valorDespesasAduaneirasTotal := b.valorDespesasAduaneirasTotal;
      v_valorLiquidoItem             := b.valorLiquidoItem;
      v_valorDescontoCustoOpTotal    := b.valorDescontoCustoOpTotal;
      v_valorAcrescimoCustoOpTotal   := b.valorAcrescimoCustoOpTotal;
      v_precoCustoOperacao           := b.precoCustoOperacao;
      v_valorCustoOperacao           := b.valorCustoOperacao;
      v_precoCMV                     := b.precoCMV;
      v_valorCMV                     := b.valorCMV;
      v_valorAcrescimoExtempSubtotal := b.valorAcrescimoExtempSubtotal;
      v_valorAcrescimoExtempTotal    := b.valorAcrescimoExtempTotal;
  
      -- v_valorDescontoGeral
      IF v_valorBaseRateioDescontoGeral > 0
        AND (v_rateioDescontofiltrarAPrazo = 0
          OR b.aVista = 0)
        AND (v_rateioDescontofiltrarSemProm = 0
          OR b.promocao = 0
          AND a.valorDescontoGeral - v_valorDescontoPromocaoGeral > 0)
      THEN
        v_valorDescontoGeral := v_valorDescontoGeral + (a.valorDescontoGeral - v_valorDescontoPromocaoGeral) * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END) / v_valorBaseRateioDescontoGeral;
      END IF;
      IF a.valorDescontoGeral           > 0
        AND v_valorDescontoPromocaoGeral    > 0
        AND b.valorDescontoPromocaoGeral > 0
      THEN
        IF a.valorDescontoGeral < v_valorDescontoPromocaoGeral THEN
          v_valorDescontoGeral := v_valorDescontoGeral + b.valorDescontoPromocaoGeral * a.valorDescontoGeral / v_valorDescontoPromocaoGeral;
        ELSE
          v_valorDescontoGeral := v_valorDescontoGeral + b.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 b.rateioFrete = 1 AND b.geraFinanceiro = 1 THEN
        v_idItemPreDocRateioFrete := b.idItemPreDocumento;
        v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteComFinComEntr;
        v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteComFinComEntr;
      ELSIF v_valorBaseFreteSemFinComEntr > 0 AND v_valorBaseFreteComFinComEntr <= 0 AND v_rateioFretePorControleEntr = 1 AND b.rateioFrete = 1 AND b.modDoc_geraFinanceiro = 1 THEN
        v_idItemPreDocRateioFrete := b.idItemPreDocumento;
        v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteSemFinComEntr;
        v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteSemFinComEntr;
      ELSIF v_valorBaseRateioComEntrega > 0 AND v_valorBaseFreteSemFinComEntr <= 0 AND v_valorBaseFreteComFinComEntr <= 0 AND v_rateioFretePorControleEntr = 1 AND b.rateioFrete = 1 THEN
        v_idItemPreDocRateioFrete := b.idItemPreDocumento;
        v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioComEntrega;
        v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioComEntrega;
      ELSIF v_valorBaseFreteComFinSemEntr > 0 AND v_rateioFretePorControleEntr = 0 AND b.geraFinanceiro = 1 THEN
        v_idItemPreDocRateioFrete := b.idItemPreDocumento;
        v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteComFinSemEntr;
        v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteComFinSemEntr;
      ELSIF v_valorBaseFreteSemFinSemEntr > 0 AND v_valorBaseFreteComFinSemEntr <= 0 AND v_rateioFretePorControleEntr = 0 AND b.modDoc_geraFinanceiro = 1 THEN
        v_idItemPreDocRateioFrete := b.idItemPreDocumento;
        v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteSemFinSemEntr;
        v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.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 := b.idItemPreDocumento;
        v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
        v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.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 b.geraFinanceiro = 1 THEN 
        v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral  + a.valorAdicFreteMarinhaMerGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
        v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + a.valorDespesasAduaneirasGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
        v_valorDescontoCustoOpGeral    := v_valorDescontoCustoOpGeral    + a.valorDescontoCustoOpGeral    * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
        v_valorAcrescimoCustoOpGeral   := v_valorAcrescimoCustoOpGeral   + a.valorAcrescimoCustoOpGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
        v_valorAcrescimoExtempGeral    := v_valorAcrescimoExtempGeral    + a.valorAcrescimoExtempGeral   * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
      ELSIF v_valorBaseRateio > 0 AND v_valorBaseRateioFinanceiro <= 0 THEN
        v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral  + a.valorAdicFreteMarinhaMerGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
        v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + a.valorDespesasAduaneirasGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
        v_valorDescontoCustoOpGeral    := v_valorDescontoCustoOpGeral    + a.valorDescontoCustoOpGeral    * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
        v_valorAcrescimoCustoOpGeral   := v_valorAcrescimoCustoOpGeral   + a.valorAcrescimoCustoOpGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
        v_valorAcrescimoExtempGeral    := v_valorAcrescimoExtempGeral    + a.valorAcrescimoExtempGeral   * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.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 b.geraFinanceiro = 1 THEN
        v_valorOutrasDespesasGeral := v_valorOutrasDespesasGeral + a.valorOutrasDespesasGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END) / v_valorBaseRateioOutrasDespFin;
      ELSIF v_valorBaseRateioOutrasDespGer > 0 AND v_valorBaseRateioOutrasDespFin <= 0 THEN
        v_valorOutrasDespesasGeral := v_valorOutrasDespesasGeral + a.valorOutrasDespesasGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.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 a.valorDescontoPagamento       > 0
        AND v_valorBaseRateioPagamFinDesc   > 0
        AND b.geraFinanceiro = 1
        AND (v_rateioDescontofiltrarAPrazo  = 0
          OR b.aVista = 0)
        AND (v_rateioDescontofiltrarSemProm = 0
          OR b.promocao = 0
          AND a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen > 0)
      THEN
        v_valorDescontoPagamento := v_valorDescontoPagamento + (a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen) * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamFinDesc;
      ELSIF a.valorDescontoPagamento    > 0
        AND v_valorBaseRateioPagamDesconto  > 0
        AND v_valorBaseRateioPagamFinDesc  <= 0
        AND (v_rateioDescontofiltrarAPrazo  = 0
          OR b.aVista = 0)
        AND (v_rateioDescontofiltrarSemProm = 0
          OR b.promocao = 0
          AND a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen > 0)
      THEN
        v_valorDescontoPagamento := v_valorDescontoPagamento + (a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen) * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamDesconto;
      END IF;
      IF a.valorDescontoPagamento           > 0
        AND v_valorDescontoPromocaoPagamen      > 0
        AND b.valorDescontoPromocaoPagamento > 0
      THEN
        IF a.valorDescontoPagamento < v_valorDescontoPromocaoPagamen THEN
          v_valorDescontoPagamento := v_valorDescontoPagamento + b.valorDescontoPromocaoPagamento * a.valorDescontoPagamento / v_valorDescontoPromocaoPagamen;
        ELSE
          v_valorDescontoPagamento := v_valorDescontoPagamento + b.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 b.geraFinanceiro = 1 THEN
        v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + a.valorOutrasDespesasPagamento * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamFinanc;
        v_valorJurosPagamento          := v_valorJurosPagamento          + a.valorJurosPagamento      * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamFinanc;
      ELSIF v_valorBaseRateioPagamento > 0 AND v_valorBaseRateioPagamFinanc <= 0 THEN
        v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + a.valorOutrasDespesasPagamento * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamento;
        v_valorJurosPagamento          := v_valorJurosPagamento          + a.valorJurosPagamento      * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.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 (
        a.tipoPagamentoFrete,
        b.quantidade,
        b.quantidadeConvertida,
        b.precoUnitarioBruto,
        b.acrescimoUnitarioComposicao,
        b.precoUnitario,
        b.valorDescontoItem,
        b.valorAcrescimoItem,
        b.valorFreteItem,
        b.valorSeguroItem,
        b.valorAdicFreteMarinhaMerItem,
        b.valorDespesasAduaneirasItem,
        v_valorFreteGeral,
        v_valorSeguroGeral,
        v_valorDescontoGeral,
        v_valorOutrasDespesasGeral,
        v_valorAdicFreteMarinMerGeral,
        v_valorDespesasAduaneirasGeral,
        v_valorDescontoPagamento,
        v_valorOutrasDespesasPagamento,
        v_valorJurosPagamento,
        b.diminuiDescontoPrUnit,
        b.somaAcrescimosPrUnit,
        b.somaFreteSeguroPrUnit,
        b.composicaoPreco,
        /* Retornos */
        v_precoUnitario,
        v_precoUnitarioConvertido,
        v_valorProdutoServico,
        v_valorFreteTotal,
        v_valorSeguroTotal,
        v_valorDescontoTotal,
        v_valorOutrasDespesasTotal,
        v_valorAdicFreteMarinMerTotal,
        v_valorDespesasAduaneirasTotal);
      v_valorAcrescimoExtempSubtotal := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
        b.quantidade,
        v_precoUnitario,
        b.quantidadeExtemporanea,
        b.acrescimoUnitarioExtemporaneo);
      v_valorAcrescimoExtempTotal := FUNC_ADD_CALC_EXTEMP_TOTAL(
        v_valorAcrescimoExtempSubtotal,
        b.valorAcrescimoExtempItem,
        v_valorAcrescimoExtempGeral);
      IF a.impostosEditados = 0 
          OR v_valorProdutoServico <> b.valorProdutoServico
          OR CASE WHEN a.tipoPagamentoFrete = 'V' THEN 0 ELSE v_valorFreteTotal END
          <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE a.tipoPagamentoFrete END = 'V' THEN 0 ELSE b.valorFreteTotal END
          OR CASE WHEN a.tipoPagamentoFrete = 'V' THEN 0 ELSE v_valorSeguroTotal END
          <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE a.tipoPagamentoFrete END = 'V' THEN 0 ELSE b.valorSeguroTotal END
          OR v_valorDescontoTotal <> b.valorDescontoTotal
          OR v_valorOutrasDespesasTotal <> b.valorOutrasDespesasTotal
          OR v_valorAdicFreteMarinMerTotal <> b.valorAdicFreteMarinhaMerTotal
          OR v_valorDespesasAduaneirasTotal <> b.valorDespesasAduaneirasTotal
          OR v_precoUnitario <> b.precoUnitario
          OR v_valorProdutoServico <> b.valorProdutoServico
      THEN
        v_calcularImpostosItem := 1;
      END IF;
      v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
        a.origemDocumento,
        0, -- a.nfFornecedor
        a.tipoPagamentoFrete,
        b.geraFinanceiro,
        v_valorProdutoServico,
        v_valorDescontoPagamento,
        v_valorOutrasDespesasPagamento,
        v_valorJurosPagamento,
        v_valorFreteTotal,
        v_valorSeguroTotal,
        v_valorDescontoTotal,
        v_valorOutrasDespesasTotal,
        b.valorIPIDevolucao,
        b.retidoISSQN,
        b.valorISSQN,
        b.valorRetIRRF,
        b.valorRetINSS,
        b.valorRetPIS,
        b.valorRetCOFINS,
        b.valorRetCSLL,
        b.valorRetOutros,
        b.valorII,
        b.valorIOF,
        b.valorIPI,
        b.valorICMSST,
        0, -- p_item_valorICMSSTEscrit
        0, -- p_item_somarICMSST
        v_valorAcrescimoExtempTotal,
        b.modDoc_geraFinanceiro);
      v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
        0, -- a.nfFornecedor
        a.tipoPagamentoFrete,
        v_valorProdutoServico,
        v_valorFreteTotal,
        v_valorSeguroTotal,
        v_valorDescontoTotal,
        v_valorOutrasDespesasTotal,
        b.valorIPIDevolucao,
        b.valorII,
        b.valorIOF,
        b.valorIPI,
        b.valorICMSST,
        0, -- p_item_valorICMSSTEscrit
        0 -- p_item_somarICMSST
        );
      ADD_CALCULA_CUSTO_CMV (
        a.atualizaCustoMedio,
        a.estabelecimento,
        0,
        b.modeloDocumento,
        b.quantidade,
        b.valorII,
        b.valorIOF,
        b.valorIPI,
        b.valorIPIDevolucao,
        b.valorPIS,
        b.valorPISST,
        b.valorCOFINS,
        b.valorCOFINSST,
        b.valorCreditoSimplesNacional,
        b.valorICMS,
        b.valorICMSST,
        0,
        v_valorLiquidoItem,
        b.valorDescontoCustoOpItem,
        v_valorDescontoCustoOpGeral,
        b.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,
        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        = b.idItemPreDocumento;
      IF b.tipoProduto = '09' THEN
        v_cab_valorServicos            := v_cab_valorServicos + v_valorProdutoServico;
      ELSE
        v_cab_valorProdutos            := v_cab_valorProdutos + v_valorProdutoServico;
      END IF;
      v_cab_valorBasePagamento       := v_cab_valorBasePagamento + v_valorBasePagamento;
      IF b.usarPrecoAVista = 1 AND b.geraFinanceiro = 1 THEN
        v_cab_valorAVistaMinimo        := v_cab_valorAVistaMinimo + v_valorProdutoServico + v_valorDescontoPagamento - v_valorOutrasDespesasPagamento - v_valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
      END IF;
      v_cab_valorFreteTotal          := v_cab_valorFreteTotal + v_valorFreteTotal;
      v_cab_valorSeguroTotal         := v_cab_valorSeguroTotal + v_valorSeguroTotal;
      v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal + v_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
      v_cab_valorAdicFreteMarinTotal := v_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
      v_cab_valorDespesasAduanTotal  := v_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
      v_cab_valorLiquidoItem         := v_cab_valorLiquidoItem + v_valorLiquidoItem;
      v_cab_valorDescCustoOpTotal    := v_cab_valorDescCustoOpTotal + v_valorDescontoCustoOpTotal;
      v_cab_valorAcrescCustoOpTotal  := v_cab_valorAcrescCustoOpTotal + v_valorAcrescimoCustoOpTotal;
      v_cab_valorCustoOperacao       := v_cab_valorCustoOperacao + v_valorCustoOperacao;
      v_cab_valorCMV                 := v_cab_valorCMV + v_valorCMV;
      v_cab_valorAcrescExtempTotal   := v_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
      -- CALCULA RESÍDUOS
      FOR b IN (
        SELECT
          b.modeloDocumento,
          b.geraFinanceiro,
          b.quantidade,
          b.quantidadeConvertida,
          b.usarPrecoAVista,
          b.precoUnitarioBruto,
          b.acrescimoUnitarioComposicao,
          b.precoUnitario,
          b.precoUnitarioConvertido,
          b.valorProdutoServicoBruto,
          b.valorProdutoServico,
          b.valorDescontoItem,
          b.valorAcrescimoItem,
          b.valorFreteItem,
          b.valorSeguroItem,
          b.valorAdicFreteMarinhaMerItem,
          b.valorDespesasAduaneirasItem,
          b.valorFreteGeral,
          b.valorSeguroGeral,
          b.valorDescontoGeral,
          b.valorOutrasDespesasGeral,
          b.valorAdicFreteMarinhaMerGeral,
          b.valorDespesasAduaneirasGeral,
          b.valorBasePagamento,
          b.valorDescontoPagamento,
          b.valorOutrasDespesasPagamento,
          b.valorJurosPagamento,
          b.valorFreteTotal,
          b.valorSeguroTotal,
          b.valorDescontoTotal,
          b.valorOutrasDespesasTotal,
          b.valorAdicFreteMarinhaMerTotal,
          b.valorDespesasAduaneirasTotal,
          b.valorIPIDevolucao,
          b.retidoISSQN,
          b.valorISSQN,
          b.valorRetIRRF,
          b.valorRetINSS,
          b.valorRetPIS,
          b.valorRetCOFINS,
          b.valorRetCSLL,
          b.valorRetOutros,
          b.valorII,
          b.valorIOF,
          b.valorIPI,
          b.valorPIS,
          b.valorPISST,
          b.valorCOFINS,
          b.valorCOFINSST,
          b.valorCreditoSimplesNacional,
          b.valorICMS,
          b.valorICMSST,
          b.valorLiquidoItem,
          b.valorDescontoCustoOpItem,
          b.valorDescontoCustoOpGeral,
          b.valorDescontoCustoOpTotal,
          b.valorAcrescimoCustoOpItem,
          b.valorAcrescimoCustoOpGeral,
          b.valorAcrescimoCustoOpTotal,
          b.precoCustoOperacao,
          b.valorCustoOperacao,
          b.precoCMV,
          b.valorCMV,
          b.quantidadeExtemporanea,
          b.acrescimoUnitarioExtemporaneo,
          b.valorAcrescimoExtempSubtotal,
          b.valorAcrescimoExtempItem,
          b.valorAcrescimoExtempGeral,
          b.valorAcrescimoExtempTotal,
          modDoc.geraFinanceiro modDoc_geraFinanceiro,
          modDoc.diminuiDescontoPrUnit,
          modDoc.somaAcrescimosPrUnit,
          modDoc.somaFreteSeguroPrUnit,
          prod.tipoProduto,
          CASE
            WHEN EXISTS (
              SELECT 1
              FROM CAPRODUTOXCOMPOSICOESPREC compPrec
              WHERE compPrec.produto = gradProd.produto
              AND compPrec.ativo = 1)
            THEN 1
            ELSE 0
          END composicaoPreco
        FROM MOPREDOCUMXITENS b
        JOIN PAMODELOSDOCUMENTO modDoc
        ON modDoc.modeloDocumento = b.modeloDocumento
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = b.gradeProduto
        JOIN CAPRODUTOS prod
        ON prod.produto = gradProd.produto
        WHERE b.idItemPreDocumento = CASE WHEN v_idItemPreDocRateioFrete = 0 THEN v_idItemPreDocUltimoItem ELSE v_idItemPreDocRateioFrete END
        ORDER BY b.sequencia)
      LOOP
        v_precoUnitario                := b.precoUnitario;
        v_precoUnitarioConvertido      := b.precoUnitarioConvertido;
        v_valorProdutoServico          := b.valorProdutoServico;
        v_valorFreteGeral              := b.valorFreteGeral;
        v_valorSeguroGeral             := b.valorSeguroGeral;
        v_valorDescontoGeral           := b.valorDescontoGeral;
        v_valorOutrasDespesasGeral     := b.valorOutrasDespesasGeral;
        v_valorAdicFreteMarinMerGeral  := b.valorAdicFreteMarinhaMerGeral;
        v_valorDespesasAduaneirasGeral := b.valorDespesasAduaneirasGeral;
        v_valorBasePagamento           := b.valorBasePagamento;
        v_valorDescontoPagamento       := b.valorDescontoPagamento;
        v_valorOutrasDespesasPagamento := b.valorOutrasDespesasPagamento;
        v_valorJurosPagamento          := b.valorJurosPagamento;
        v_valorFreteTotal              := b.valorFreteTotal;
        v_valorSeguroTotal             := b.valorSeguroTotal;
        v_valorDescontoTotal           := b.valorDescontoTotal;
        v_valorOutrasDespesasTotal     := b.valorOutrasDespesasTotal;
        v_valorAdicFreteMarinMerTotal  := b.valorAdicFreteMarinhaMerTotal;
        v_valorDespesasAduaneirasTotal := b.valorDespesasAduaneirasTotal;
        v_valorLiquidoItem             := b.valorLiquidoItem;
        v_valorDescontoCustoOpGeral    := b.valorDescontoCustoOpGeral;
        v_valorDescontoCustoOpTotal    := b.valorDescontoCustoOpTotal;
        v_valorAcrescimoCustoOpGeral   := b.valorAcrescimoCustoOpGeral;
        v_valorAcrescimoCustoOpTotal   := b.valorAcrescimoCustoOpTotal;
        v_precoCustoOperacao           := b.precoCustoOperacao;
        v_valorCustoOperacao           := b.valorCustoOperacao;
        v_precoCMV                     := b.precoCMV;
        v_valorCMV                     := b.valorCMV;
        v_valorAcrescimoExtempSubtotal := b.valorAcrescimoExtempSubtotal;
        v_valorAcrescimoExtempGeral    := b.valorAcrescimoExtempGeral;
        v_valorAcrescimoExtempTotal    := b.valorAcrescimoExtempTotal;
        IF b.tipoProduto = '09' THEN
          v_cab_valorServicos            := v_cab_valorServicos - v_valorProdutoServico;
        ELSE
          v_cab_valorProdutos            := v_cab_valorProdutos - v_valorProdutoServico;
        END IF;
        v_cab_valorBasePagamento       := v_cab_valorBasePagamento - v_valorBasePagamento;
        IF b.usarPrecoAVista = 1 AND b.geraFinanceiro = 1 THEN
          v_cab_valorAVistaMinimo        := v_cab_valorAVistaMinimo - v_valorProdutoServico - v_valorDescontoPagamento + v_valorOutrasDespesasPagamento + v_valorJurosPagamento + v_valorDescontoTotal - v_valorOutrasDespesasTotal;
        END IF;
        v_cab_valorFreteTotal          := v_cab_valorFreteTotal - v_valorFreteTotal;
        v_cab_valorSeguroTotal         := v_cab_valorSeguroTotal - v_valorSeguroTotal;
        v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal - v_valorDescontoTotal;
        v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal - v_valorOutrasDespesasTotal;
        v_cab_valorAdicFreteMarinTotal := v_cab_valorAdicFreteMarinTotal - v_valorAdicFreteMarinMerTotal;
        v_cab_valorDespesasAduanTotal  := v_cab_valorDespesasAduanTotal - v_valorDespesasAduaneirasTotal;
        v_cab_valorLiquidoItem         := v_cab_valorLiquidoItem - v_valorLiquidoItem;
        v_cab_valorDescCustoOpTotal    := v_cab_valorDescCustoOpTotal - v_valorDescontoCustoOpTotal;
        v_cab_valorAcrescCustoOpTotal  := v_cab_valorAcrescCustoOpTotal - v_valorAcrescimoCustoOpTotal;
        v_cab_valorCustoOperacao       := v_cab_valorCustoOperacao - v_valorCustoOperacao;
        v_cab_valorCMV                 := v_cab_valorCMV - v_valorCMV;
        v_cab_valorAcrescExtempTotal   := v_cab_valorAcrescExtempTotal - v_valorAcrescimoExtempTotal;
        v_valorFreteGeral              := v_valorFreteGeral + v_saldoRatFreteGeral;
        v_valorSeguroGeral             := v_valorSeguroGeral + v_saldoRatSeguroGeral;
        v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral + v_saldoRatAdicFreteMarinGeral;
        v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + v_saldoRatDespesasAduanGeral;
        v_valorDescontoGeral           := v_valorDescontoGeral + v_saldoRatDescontoGeral;
        v_valorOutrasDespesasGeral     := v_valorDespesasAduaneirasGeral + v_saldoRatOutrasDespesasGeral;
        v_valorDescontoPagamento       := v_valorDescontoPagamento + v_saldoRatDescontoPagamento;
        v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + v_saldoRatOutrasDespPagamento;
        v_valorJurosPagamento          := v_valorJurosPagamento + v_saldoRatJurosPagamento;
        v_valorDescontoCustoOpGeral    := v_valorDescontoCustoOpGeral + v_saldoRatDescCustoOpGeral;
        v_valorAcrescimoCustoOpGeral   := v_valorAcrescimoCustoOpGeral + v_saldoRatAcrescCustoOpGeral;
        v_valorAcrescimoExtempGeral    := v_valorAcrescimoExtempGeral + v_saldoRatAcrescExtempGeral;
        ADD_CALCULA_TOTAIS_ITEM (
          a.tipoPagamentoFrete,
          b.quantidade,
          b.quantidadeConvertida,
          b.precoUnitarioBruto,
          b.acrescimoUnitarioComposicao,
          b.precoUnitario,
          b.valorDescontoItem,
          b.valorAcrescimoItem,
          b.valorFreteItem,
          b.valorSeguroItem,
          b.valorAdicFreteMarinhaMerItem,
          b.valorDespesasAduaneirasItem,
          v_valorFreteGeral,
          v_valorSeguroGeral,
          v_valorDescontoGeral,
          v_valorOutrasDespesasGeral,
          v_valorAdicFreteMarinMerGeral,
          v_valorDespesasAduaneirasGeral,
          v_valorDescontoPagamento,
          v_valorOutrasDespesasPagamento,
          v_valorJurosPagamento,
          b.diminuiDescontoPrUnit,
          b.somaAcrescimosPrUnit,
          b.somaFreteSeguroPrUnit,
          b.composicaoPreco,
          /* Retornos */
          v_precoUnitario,
          v_precoUnitarioConvertido,
          v_valorProdutoServico,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          v_valorAdicFreteMarinMerTotal,
          v_valorDespesasAduaneirasTotal);
        v_valorAcrescimoExtempSubtotal := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
          b.quantidade,
          v_precoUnitario,
          b.quantidadeExtemporanea,
          b.acrescimoUnitarioExtemporaneo);
        v_valorAcrescimoExtempTotal := FUNC_ADD_CALC_EXTEMP_TOTAL (
          v_valorAcrescimoExtempSubtotal,
          b.valorAcrescimoExtempItem,
          v_valorAcrescimoExtempGeral);
        IF a.impostosEditados = 0 
            OR v_valorProdutoServico <> b.valorProdutoServico
            OR CASE WHEN a.tipoPagamentoFrete = 'V' THEN 0 ELSE v_valorFreteTotal END
            <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE a.tipoPagamentoFrete END = 'V' THEN 0 ELSE b.valorFreteTotal END
            OR CASE WHEN a.tipoPagamentoFrete = 'V' THEN 0 ELSE v_valorSeguroTotal END
            <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE a.tipoPagamentoFrete END = 'V' THEN 0 ELSE b.valorSeguroTotal END
            OR v_valorDescontoTotal <> b.valorDescontoTotal
            OR v_valorOutrasDespesasTotal <> b.valorOutrasDespesasTotal
            OR v_valorAdicFreteMarinMerTotal <> b.valorAdicFreteMarinhaMerTotal
            OR v_valorDespesasAduaneirasTotal <> b.valorDespesasAduaneirasTotal
            OR v_precoUnitario <> b.precoUnitario
            OR v_valorProdutoServico <> b.valorProdutoServico
        THEN
          v_calcularImpostosItem := 1;
        END IF;
        v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
          a.origemDocumento,
          0, -- v_cab_nfFornecedor
          a.tipoPagamentoFrete,
          b.geraFinanceiro,
          v_valorProdutoServico,
          v_valorDescontoPagamento,
          v_valorOutrasDespesasPagamento,
          v_valorJurosPagamento,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          b.valorIPIDevolucao,
          b.retidoISSQN,
          b.valorISSQN,
          b.valorRetIRRF,
          b.valorRetINSS,
          b.valorRetPIS,
          b.valorRetCOFINS,
          b.valorRetCSLL,
          b.valorRetOutros,
          b.valorII,
          b.valorIOF,
          b.valorIPI,
          b.valorICMSST,
          0, -- p_item_valorICMSSTEscrit
          0, -- p_item_somarICMSST
          v_valorAcrescimoExtempTotal,
          b.modDoc_geraFinanceiro);
        v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
          0, -- v_cab_nfFornecedor
          a.tipoPagamentoFrete,
          v_valorProdutoServico,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          b.valorIPIDevolucao,
          b.valorII,
          b.valorIOF,
          b.valorIPI,
          b.valorICMSST,
          0, -- p_item_valorICMSSTEscrit
          0 -- p_item_somarICMSST
          );
        ADD_CALCULA_CUSTO_CMV (
          a.atualizaCustoMedio,
          a.estabelecimento,
          0,
          b.modeloDocumento,
          b.quantidade,
          b.valorII,
          b.valorIOF,
          b.valorIPI,
          b.valorIPIDevolucao,
          b.valorPIS,
          b.valorPISST,
          b.valorCOFINS,
          b.valorCOFINSST,
          b.valorCreditoSimplesNacional,
          b.valorICMS,
          b.valorICMSST,
          0,
          v_valorLiquidoItem,
          b.valorDescontoCustoOpItem,
          v_valorDescontoCustoOpGeral,
          b.valorAcrescimoCustoOpItem,
          v_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,
          valorFreteGeral               = v_valorFreteGeral,
          valorSeguroGeral              = v_valorSeguroGeral,
          valorDescontoGeral            = v_valorDescontoGeral,
          valorOutrasDespesasGeral      = v_valorOutrasDespesasGeral,
          valorAdicFreteMarinhaMerGeral = v_valorAdicFreteMarinMerGeral,
          valorDespesasAduaneirasGeral  = v_valorDespesasAduaneirasGeral,
          valorBasePagamento            = v_valorBasePagamento,
          valorDescontoPagamento        = v_valorDescontoPagamento,
          valorOutrasDespesasPagamento  = v_valorOutrasDespesasPagamento,
          valorJurosPagamento           = v_valorJurosPagamento,
          valorFreteTotal               = v_valorFreteTotal,
          valorSeguroTotal              = v_valorSeguroTotal,
          valorDescontoTotal            = v_valorDescontoTotal,
          valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
          valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
          valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
          valorLiquidoItem              = v_valorLiquidoItem,
          valorDescontoCustoOpGeral     = v_valorDescontoCustoOpGeral,
          valorDescontoCustoOpTotal     = v_valorDescontoCustoOpTotal,
          valorAcrescimoCustoOpGeral    = v_valorAcrescimoCustoOpGeral,
          valorAcrescimoCustoOpTotal    = v_valorAcrescimoCustoOpTotal,
          precoCustoOperacao            = v_precoCustoOperacao,
          valorCustoOperacao            = v_valorCustoOperacao,
          precoCMV                      = v_precoCMV,
          valorCMV                      = v_valorCMV,
          valorAcrescimoExtempSubtotal  = v_valorAcrescimoExtempSubtotal,
          valorAcrescimoExtempGeral     = v_valorAcrescimoExtempGeral,
          valorAcrescimoExtempTotal     = v_valorAcrescimoExtempTotal
        WHERE idItemPreDocumento        = CASE WHEN v_idItemPreDocRateioFrete = 0 THEN v_idItemPreDocUltimoItem ELSE v_idItemPreDocRateioFrete END;
        IF b.tipoProduto = '09' THEN
          v_cab_valorServicos          := v_cab_valorServicos + v_valorProdutoServico;
        ELSE
          v_cab_valorProdutos          := v_cab_valorProdutos + v_valorProdutoServico;
        END IF;
        v_cab_valorBasePagamento       := v_cab_valorBasePagamento + v_valorBasePagamento;
        IF b.usarPrecoAVista = 1 AND b.geraFinanceiro = 1 THEN
          v_cab_valorAVistaMinimo      := v_cab_valorAVistaMinimo + v_valorProdutoServico + v_valorDescontoPagamento - v_valorOutrasDespesasPagamento - v_valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
        END IF;
        v_cab_valorFreteTotal          := v_cab_valorFreteTotal + v_valorFreteTotal;
        v_cab_valorSeguroTotal         := v_cab_valorSeguroTotal + v_valorSeguroTotal;
        v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal + v_valorDescontoTotal;
        v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
        v_cab_valorAdicFreteMarinTotal := v_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
        v_cab_valorDespesasAduanTotal  := v_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
        v_cab_valorDescCustoOpTotal    := v_cab_valorDescCustoOpTotal + v_valorDescontoCustoOpTotal;
        v_cab_valorLiquidoItem         := v_cab_valorLiquidoItem + v_valorLiquidoItem;
        v_cab_valorAcrescCustoOpTotal  := v_cab_valorAcrescCustoOpTotal + v_valorAcrescimoCustoOpTotal;
        v_cab_valorCustoOperacao       := v_cab_valorCustoOperacao + v_valorCustoOperacao;
        v_cab_valorCMV                 := v_cab_valorCMV + v_valorCMV;
        v_cab_valorAcrescExtempTotal   := v_cab_valorAcrescExtempTotal + v_valorAcrescimoExtempTotal;
      END LOOP;
    END IF;
    -- CÁLCULO IMPOSTOS
    IF v_calcularImpostosItem = 1 THEN
      v_cab_valorProdutos            := 0;
      v_cab_valorServicos            := 0;
      v_cab_valorBasePagamento       := 0;
      v_cab_valorAVistaMinimo        := 0;
      v_cab_valorFreteTotal          := 0;
      v_cab_valorSeguroTotal         := 0;
      v_cab_valorDescontoTotal       := 0;
      v_cab_valorOutrasDespesasTotal := 0;
      v_cab_valorAdicFreteMarinTotal := 0;
      v_cab_valorDespesasAduanTotal  := 0;
      v_cab_valorLiquidoItem         := 0;
      v_cab_valorDescCustoOpTotal    := 0;
      v_cab_valorAcrescCustoOpTotal  := 0;
      v_cab_valorCustoOperacao       := 0;
      v_cab_valorCMV                 := 0;
      v_cab_valorAcrescExtempTotal   := 0;  
      v_residuoISSQN                 := 0;
      v_residuoRetIRRF               := 0;
      v_residuoRetINSS               := 0;
      v_residuoRetPIS                := 0;
      v_residuoRetCOFINS             := 0;
      v_residuoRetCSLL               := 0;
      v_residuoRetOutros             := 0;
      FOR b IN (
        SELECT
          b.idItemPreDocumento,
          b.modeloDocumento,
          b.personalizacao,
          b.quantidade,
          b.quantidadeConvertida,
          b.usarPrecoAVista,
          b.precoUnitarioBruto,
          b.acrescimoUnitarioComposicao,
          b.precoUnitario,
          b.precoUnitarioConvertido,
          b.valorProdutoServico,
          b.valorDescontoItem,
          b.valorAcrescimoItem,
          b.valorFreteItem,
          b.valorSeguroItem,
          b.valorAdicFreteMarinhaMerItem,
          b.valorDespesasAduaneirasItem,
          b.quantidadeExtemporanea,
          b.acrescimoUnitarioExtemporaneo,
          b.valorAcrescimoExtempSubtotal,
          b.valorAcrescimoExtempItem,
          b.valorDescontoCustoOpItem,
          b.valorAcrescimoCustoOpItem,
          b.valorFreteGeral,
          b.valorSeguroGeral,
          b.valorDescontoGeral,
          b.valorOutrasDespesasGeral,
          b.valorAdicFreteMarinhaMerGeral,
          b.valorDespesasAduaneirasGeral,
          b.valorAcrescimoExtempGeral,
          b.valorDescontoCustoOpGeral,
          b.valorAcrescimoCustoOpGeral,
          b.valorBasePagamento,
          b.valorDescontoPagamento,
          b.valorOutrasDespesasPagamento,
          b.valorJurosPagamento,
          b.valorFreteTotal,
          b.valorSeguroTotal,
          b.valorDescontoTotal,
          b.valorOutrasDespesasTotal,
          b.valorAdicFreteMarinhaMerTotal,
          b.valorDespesasAduaneirasTotal,
          b.valorAcrescimoExtempTotal,
          b.valorDescontoCustoOpTotal,
          b.valorAcrescimoCustoOpTotal,
          b.valorIPIDevolucao,
          b.geraFinanceiro,
          b.cfop,
          b.indicadorISSQN,
          b.aliquotaISSQN,
          b.retidoISSQN,
          b.retencaoIRRF,
          b.retencaoINSS,
          b.retencaoPIS,
          b.retencaoCOFINS,
          b.retencaoCSLL,
          b.retencaoOutros,
          b.aliquotaII,
          b.aliquotaIOF,
          b.aliquotaIPI,
          b.valorAliquotaIPI,
          b.aliquotaPIS,
          b.valorAliquotaPIS,
          b.aliquotaPISST,
          b.valorAliquotaPISST,
          b.aliquotaCOFINS,
          b.valorAliquotaCOFINS,
          b.aliquotaCOFINSST,
          b.valorAliquotaCOFINSST,
          b.stSimplesNacional,
          b.creditoSimplesNacional,
          b.stICMS,
          b.modalidadeBaseCalcICMS,
          b.reducaoBaseICMS,
          b.aliquotaICMS,
          b.diferimentoICMS,
          b.modalidadeBaseCalcICMSST,
          b.margemValorAdicionadoST,
          b.reducaoBaseST,
          b.aliquotaICMSST,
          b.reducaoBaseICMSEfetivo,
          b.aliquotaICMSEfetivo,
          b.aliquotaICMSUFDestinatario,
          b.aliquotaICMSInterestadual,
          b.partilhaICMSInterestadual,
          b.aliquotaFCP,
          b.aliquotaFCPST,
          b.aliquotaFCPSTAnteriormente,
          b.aliquotaFCPUFDestinatario,
          b.aliquotaEstimadaImpFederais,
          b.aliquotaEstimadaImpEstaduais,
          b.aliquotaEstimadaImpMunicipais,
          b.baseISSQN,
          b.valorISSQN,
          b.baseRetIRRF,
          b.valorRetIRRF,
          b.baseRetINSS,
          b.valorRetINSS,
          b.baseRetOutros,
          b.valorRetOutros,
          b.baseRetPIS,
          b.valorRetPIS,
          b.baseRetCOFINS,
          b.valorRetCOFINS,
          b.baseRetCSLL,
          b.valorRetCSLL,
          b.baseII,
          b.valorII,
          b.baseIOF,
          b.valorIOF,
          b.baseIPI,
          b.valorIPI,
          b.basePIS,
          b.valorPIS,
          b.basePISST,
          b.valorPISST,
          b.baseCOFINS,
          b.valorCOFINS,
          b.baseCOFINSST,
          b.valorCOFINSST,
          b.baseCreditoSimplesNacional,
          b.valorCreditoSimplesNacional,
          b.baseICMS,
          b.valorICMSOperacao,
          b.valorICMSDiferido,
          b.valorICMS,
          b.valorICMSDesoneracao,
          b.baseICMSST,
          b.valorICMSST,
          b.baseICMSSTAnteriormente,
          b.valorICMSSTAnteriormente,
          b.valorICMSProprioSubstituto,
          b.baseICMSEfetivo,
          b.valorICMSEfetivo,
          b.baseICMSUFDestinatario,
          b.valorICMSUFDestinatario,
          b.baseICMSUFRemetente,
          b.valorICMSUFRemetente,
          b.baseFCP,
          b.valorFCP,
          b.baseFCPST,
          b.valorFCPST,
          b.baseFCPSTAnteriormente,
          b.valorFCPSTAnteriormente,
          b.baseFCPUFDestinatario,
          b.valorFCPUFDestinatario,
          b.baseEstimadaImpostos,
          b.valorEstimadoImpFederais,
          b.valorEstimadoImpEstaduais,
          b.valorEstimadoImpMunicipais,
          b.valorLiquidoItem,
          b.precoCustoOperacao,
          b.valorCustoOperacao,
          b.precoCMV,
          b.valorCMV,
          gradProd.produto,
          gradProd.cor,
          gradProd.tamanho,
          prod.controleEstoque,
          prod.tipoProduto,
          prod.precoPautaTabelado,
          modDoc.geraFinanceiro modDoc_geraFinanceiro,
          modDoc.diminuiDescontoPrUnit,
          modDoc.somaAcrescimosPrUnit,
          modDoc.somaFreteSeguroPrUnit,
          CASE
            WHEN EXISTS (
              SELECT 1
              FROM CAPRODUTOXCOMPOSICOESPREC compPrec
              WHERE compPrec.produto = gradProd.produto
              AND compPrec.ativo = 1)
            THEN 1
            ELSE 0
          END composicaoPreco
        FROM MOPREDOCUMXITENS b
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = b.gradeProduto
        JOIN CAPRODUTOS prod
        ON prod.produto = gradProd.produto
        JOIN PAMODELOSDOCUMENTO modDoc
        ON modDoc.modeloDocumento = b.modeloDocumento
        WHERE b.preDocumento = a.preDocumento
        AND b.cancelado = 0
        ORDER BY b.sequencia)
      LOOP
        v_precoUnitario                := b.precoUnitario;
        v_precoUnitarioConvertido      := b.precoUnitarioConvertido;
        v_valorProdutoServico          := b.valorProdutoServico;
        v_valorBasePagamento           := b.valorBasePagamento;
        v_valorFreteTotal              := b.valorFreteTotal;
        v_valorSeguroTotal             := b.valorSeguroTotal;
        v_valorDescontoTotal           := b.valorDescontoTotal;
        v_valorOutrasDespesasTotal     := b.valorOutrasDespesasTotal;
        v_valorAdicFreteMarinMerTotal  := b.valorAdicFreteMarinhaMerTotal;
        v_valorDespesasAduaneirasTotal := b.valorDespesasAduaneirasTotal;
        v_baseISSQN                    := b.baseISSQN;
        v_valorISSQN                   := b.valorISSQN;
        v_baseRetIRRF                  := b.baseRetIRRF;
        v_valorRetIRRF                 := b.valorRetIRRF;
        v_baseRetINSS                  := b.baseRetINSS;
        v_valorRetINSS                 := b.valorRetINSS;
        v_baseRetPIS                   := b.baseRetPIS;
        v_valorRetPIS                  := b.valorRetPIS;
        v_baseRetCOFINS                := b.baseRetCOFINS;
        v_valorRetCOFINS               := b.valorRetCOFINS;
        v_baseRetCSLL                  := b.baseRetCSLL;
        v_valorRetCSLL                 := b.valorRetCSLL;
        v_baseRetOutros                := b.baseRetOutros;
        v_valorRetOutros               := b.valorRetOutros;
        v_baseII                       := b.baseII;
        v_valorII                      := b.valorII;
        v_baseIOF                      := b.baseIOF;
        v_valorIOF                     := b.valorIOF;
        v_baseIPI                      := b.baseIPI;
        v_valorIPI                     := b.valorIPI;
        v_basePIS                      := b.basePIS;
        v_valorPIS                     := b.valorPIS;
        v_basePISST                    := b.basePISST;
        v_valorPISST                   := b.valorPISST;
        v_baseCOFINS                   := b.baseCOFINS;
        v_valorCOFINS                  := b.valorCOFINS;
        v_baseCOFINSST                 := b.baseCOFINSST;
        v_valorCOFINSST                := b.valorCOFINSST;
        v_baseCreditoSimplesNacional   := b.baseCreditoSimplesNacional;
        v_valorCreditoSimplesNacional  := b.valorCreditoSimplesNacional;
        v_baseICMS                     := b.baseICMS;
        v_valorICMSOperacao            := b.valorICMSOperacao;
        v_valorICMSDiferido            := b.valorICMSDiferido;
        v_valorICMS                    := b.valorICMS;
        v_valorICMSDesoneracao         := b.valorICMSDesoneracao;
        v_baseICMSST                   := b.baseICMSST;
        v_valorICMSST                  := b.valorICMSST;
        v_baseICMSSTAnteriormente      := b.baseICMSSTAnteriormente;
        v_valorICMSSTAnteriormente     := b.valorICMSSTAnteriormente;
        v_valorICMSProprioSubstituto   := b.valorICMSProprioSubstituto;
        v_baseICMSEfetivo              := b.baseICMSEfetivo;
        v_valorICMSEfetivo             := b.valorICMSEfetivo;
        v_baseICMSUFDestinatario       := b.baseICMSUFDestinatario;
        v_valorICMSUFDestinatario      := b.valorICMSUFDestinatario;
        v_baseICMSUFRemetente          := b.baseICMSUFRemetente;
        v_valorICMSUFRemetente         := b.valorICMSUFRemetente;
        v_baseFCP                      := b.baseFCP;
        v_valorFCP                     := b.valorFCP;
        v_baseFCPST                    := b.baseFCPST;
        v_valorFCPST                   := b.valorFCPST;
        v_baseFCPSTAnteriormente       := b.baseFCPSTAnteriormente;
        v_valorFCPSTAnteriormente      := b.valorFCPSTAnteriormente;
        v_baseFCPUFDestinatario        := b.baseFCPUFDestinatario;
        v_valorFCPUFDestinatario       := b.valorFCPUFDestinatario;
        v_baseEstimadaImpostos         := b.baseEstimadaImpostos;
        v_valorEstimadoImpFederais     := b.valorEstimadoImpFederais;
        v_valorEstimadoImpEstaduais    := b.valorEstimadoImpEstaduais;
        v_valorEstimadoImpMunicipais   := b.valorEstimadoImpMunicipais;
        v_valorLiquidoItem             := b.valorLiquidoItem;
        v_valorDescontoCustoOpTotal    := b.valorDescontoCustoOpTotal;
        v_valorAcrescimoCustoOpTotal   := b.valorAcrescimoCustoOpTotal;
        v_precoCustoOperacao           := b.precoCustoOperacao;
        v_valorCustoOperacao           := b.valorCustoOperacao;
        v_precoCMV                     := b.precoCMV;
        v_valorCMV                     := b.valorCMV;
        v_valorAcrescimoExtempSubtotal := b.valorAcrescimoExtempSubtotal;
        v_valorAcrescimoExtempTotal    := b.valorAcrescimoExtempTotal;
        ADD_CALCULA_TOTAIS_ITEM(
          a.tipoPagamentoFrete,
          b.quantidade,
          b.quantidadeConvertida,
          b.precoUnitarioBruto,
          b.acrescimoUnitarioComposicao,
          b.precoUnitario,
          b.valorDescontoItem,
          b.valorAcrescimoItem,
          b.valorFreteItem,
          b.valorSeguroItem,
          b.valorAdicFreteMarinhaMerItem,
          b.valorDespesasAduaneirasItem,
          b.valorFreteGeral,
          b.valorSeguroGeral,
          b.valorDescontoGeral,
          b.valorOutrasDespesasGeral,
          b.valorAdicFreteMarinhaMerGeral,
          b.valorDespesasAduaneirasGeral,
          b.valorDescontoPagamento,
          b.valorOutrasDespesasPagamento,
          b.valorJurosPagamento,
          b.diminuiDescontoPrUnit,
          b.somaAcrescimosPrUnit,
          b.somaFreteSeguroPrUnit,
          b.composicaoPreco,
          /* Retornos */
          v_precoUnitario,
          v_precoUnitarioConvertido,
          v_valorProdutoServico,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          v_valorAdicFreteMarinMerTotal,
          v_valorDespesasAduaneirasTotal);
        v_valorAcrescimoExtempSubtotal := FUNC_ADD_CALC_EXTEMP_SUBTOTAL(
          b.quantidade,
          v_precoUnitario,
          b.quantidadeExtemporanea,
          b.acrescimoUnitarioExtemporaneo);
        v_valorAcrescimoExtempTotal := FUNC_ADD_CALC_EXTEMP_TOTAL(
          v_valorAcrescimoExtempSubtotal,
          b.valorAcrescimoExtempItem,
          b.valorAcrescimoExtempGeral);
        ADD_CALCULA_IMPOSTOS_ITEM (
          p_config_64_casasDecSaidas,
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          a.entradaSaida,
          a.devolucaoAnulacaoRetorno,
          a.estabelecimento,
          0,
          a.dataEntradaSaida,
          a.pessoa,
          a.localDestinoOperacao,
          a.indicadorConsumidorFinal,
          a.tipoPagamentoFrete,
          a.indicadorInscricaoEstadual,
          b.personalizacao,
          b.quantidade,
          v_valorProdutoServico,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          v_valorAdicFreteMarinMerTotal,
          v_valorDespesasAduaneirasTotal,
          b.cfop,
          1,
          b.indicadorISSQN,
          b.aliquotaISSQN,
          v_baseISSQN,
          v_residuoISSQN,
          v_valorISSQN,
          1,
          b.retencaoIRRF,
          v_baseRetIRRF,
          v_residuoRetIRRF,
          v_valorRetIRRF,
          1,
          b.retencaoINSS,
          v_baseRetINSS,
          v_residuoRetINSS,
          v_valorRetINSS,
          1,
          b.retencaoPIS,
          v_baseRetPIS,
          v_residuoRetPIS,
          v_valorRetPIS,
          1,
          b.retencaoCOFINS,
          v_baseRetCOFINS,
          v_residuoRetCOFINS,
          v_valorRetCOFINS,
          1,
          b.retencaoCSLL,
          v_baseRetCSLL,
          v_residuoRetCSLL,
          v_valorRetCSLL,
          1,
          b.retencaoOutros,
          v_baseRetOutros,
          v_residuoRetOutros,
          v_valorRetOutros,
          1,
          b.aliquotaII,
          v_baseII,
          v_valorII,
          1,
          b.aliquotaIOF,
          v_baseIOF,
          v_valorIOF,
          1,
          b.aliquotaIPI,
          b.valorAliquotaIPI,
          v_baseIPI,
          v_valorIPI,
          b.valorIPIDevolucao,
          1,
          b.aliquotaPIS,
          b.valorAliquotaPIS,
          v_basePIS,
          v_valorPIS,
          1,
          b.aliquotaPISST,
          b.valorAliquotaPISST,
          v_basePISST,
          v_valorPISST,
          1,
          b.aliquotaCOFINS,
          b.valorAliquotaCOFINS,
          v_baseCOFINS,
          v_valorCOFINS,
          1,
          b.aliquotaCOFINSST,
          b.valorAliquotaCOFINSST,
          v_baseCOFINSST,
          v_valorCOFINSST,
          1,
          b.stSimplesNacional,
          b.creditoSimplesNacional,
          v_baseCreditoSimplesNacional,
          v_valorCreditoSimplesNacional,
          1,
          b.stICMS,
          b.modalidadeBaseCalcICMS,
          b.reducaoBaseICMS,
          b.aliquotaICMS,
          b.diferimentoICMS,
          v_baseICMS,
          v_valorICMSOperacao,
          v_valorICMSDiferido,
          v_valorICMS,
          v_valorICMSDesoneracao,
          1,
          b.modalidadeBaseCalcICMSST,
          b.margemValorAdicionadoST,
          b.reducaoBaseST,
          b.aliquotaICMSST,
          v_baseICMSST,
          v_valorICMSST,
          1,
          v_baseICMSSTAnteriormente,
          v_valorICMSSTAnteriormente,
          v_valorICMSProprioSubstituto,
          b.reducaoBaseICMSEfetivo,
          b.aliquotaICMSEfetivo,
          v_baseICMSEfetivo,
          v_valorICMSEfetivo,
          0,
          '  ',
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          1,
          b.aliquotaICMSUFDestinatario,
          b.aliquotaICMSInterestadual,
          b.partilhaICMSInterestadual,
          v_baseICMSUFDestinatario,
          v_valorICMSUFDestinatario,
          v_baseICMSUFRemetente,
          v_valorICMSUFRemetente,
          1,
          b.aliquotaFCP,
          v_baseFCP,
          v_valorFCP,
          b.aliquotaFCPST,
          v_baseFCPST,
          v_valorFCPST,
          b.aliquotaFCPSTAnteriormente,
          v_baseFCPSTAnteriormente,
          v_valorFCPSTAnteriormente,
          b.aliquotaFCPUFDestinatario,
          v_baseFCPUFDestinatario,
          v_valorFCPUFDestinatario,
          1,
          b.aliquotaEstimadaImpFederais,
          b.aliquotaEstimadaImpEstaduais,
          b.aliquotaEstimadaImpMunicipais,
          v_baseEstimadaImpostos,
          v_valorEstimadoImpFederais,
          v_valorEstimadoImpEstaduais,
          v_valorEstimadoImpMunicipais,
          b.produto,
          b.cor,
          b.tamanho,
          b.controleEstoque,
          b.tipoProduto,
          b.precoPautaTabelado,
          /* Retornos */
          v_baseISSQN,
          v_residuoISSQN,
          v_valorISSQN,
          v_baseRetIRRF,
          v_residuoRetIRRF,
          v_valorRetIRRF,
          v_baseRetINSS,
          v_residuoRetINSS,
          v_valorRetINSS,
          v_baseRetPIS,
          v_residuoRetPIS,
          v_valorRetPIS,
          v_baseRetCOFINS,
          v_residuoRetCOFINS,
          v_valorRetCOFINS,
          v_baseRetCSLL,
          v_residuoRetCSLL,
          v_valorRetCSLL,
          v_baseRetOutros,
          v_residuoRetOutros,
          v_valorRetOutros,
          v_baseII,
          v_valorII,
          v_baseIOF,
          v_valorIOF,
          v_baseIPI,
          v_valorIPI,
          v_basePIS,
          v_valorPIS,
          v_basePISST,
          v_valorPISST,
          v_baseCOFINS,
          v_valorCOFINS,
          v_baseCOFINSST,
          v_valorCOFINSST,
          v_baseCreditoSimplesNacional,
          v_valorCreditoSimplesNacional,
          v_baseICMS,
          v_valorICMSOperacao,
          v_valorICMSDiferido,
          v_valorICMS,
          v_valorICMSDesoneracao,
          v_baseICMSST,
          v_valorICMSST,
          v_baseICMSSTAnteriormente,
          v_valorICMSSTAnteriormente,
          v_valorICMSProprioSubstituto,
          v_baseICMSEfetivo,
          v_valorICMSEfetivo,
          v_auxNumber,
          v_auxNumber,
          v_auxNumber,
          v_auxNumber,
          v_auxNumber,
          v_baseICMSUFDestinatario,
          v_valorICMSUFDestinatario,
          v_baseICMSUFRemetente,
          v_valorICMSUFRemetente,
          v_baseFCP,
          v_valorFCP,
          v_baseFCPST,
          v_valorFCPST,
          v_baseFCPSTAnteriormente,
          v_valorFCPSTAnteriormente,
          v_baseFCPUFDestinatario,
          v_valorFCPUFDestinatario,
          v_baseEstimadaImpostos,
          v_valorEstimadoImpFederais,
          v_valorEstimadoImpEstaduais,
          v_valorEstimadoImpMunicipais);
        v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
          a.origemDocumento,
          0, -- a.nfFornecedor
          a.tipoPagamentoFrete,
          b.geraFinanceiro,
          v_valorProdutoServico,
          b.valorDescontoPagamento,
          b.valorOutrasDespesasPagamento,
          b.valorJurosPagamento,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          b.valorIPIDevolucao,
          b.retidoISSQN,
          v_valorISSQN,
          v_valorRetIRRF,
          v_valorRetINSS,
          v_valorRetPIS,
          v_valorRetCOFINS,
          v_valorRetCSLL,
          v_valorRetOutros,
          v_valorII,
          v_valorIOF,
          v_valorIPI,
          v_valorICMSST,
          0, -- p_item_valorICMSSTEscrit
          0, -- p_item_somarICMSST
          v_valorAcrescimoExtempTotal,
          b.modDoc_geraFinanceiro);
        v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
          0, -- a.nfFornecedor
          a.tipoPagamentoFrete,
          v_valorProdutoServico,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          b.valorIPIDevolucao,
          v_valorII,
          v_valorIOF,
          v_valorIPI,
          v_valorICMSST,
          0, -- p_item_valorICMSSTEscrit
          0 -- p_item_somarICMSST
          );
        ADD_CALCULA_CUSTO_CMV (
          a.atualizaCustoMedio,
          a.estabelecimento,
          0,
          b.modeloDocumento,
          b.quantidade,
          v_valorII,
          v_valorIOF,
          v_valorIPI,
          b.valorIPIDevolucao,
          v_valorPIS,
          v_valorPISST,
          v_valorCOFINS,
          v_valorCOFINSST,
          v_valorCreditoSimplesNacional,
          v_valorICMS,
          v_valorICMSST,
          0,
          v_valorLiquidoItem,
          b.valorDescontoCustoOpItem,
          b.valorDescontoCustoOpGeral,
          b.valorAcrescimoCustoOpItem,
          b.valorAcrescimoCustoOpGeral,
          v_valorAcrescimoExtempTotal,
          /* Retornos */
          v_valorDescontoCustoOpTotal,
          v_valorAcrescimoCustoOpTotal,
          v_precoCustoOperacao,
          v_valorCustoOperacao,
          v_precoCMV,
          v_valorCMV);
        UPDATE MOPREDOCUMXITENS SET
          precoUnitario                 = v_precoUnitario,
          precoUnitarioConvertido       = v_precoUnitarioConvertido,
          valorProdutoServico           = v_valorProdutoServico,
          valorBasePagamento            = v_valorBasePagamento,
          valorFreteTotal               = v_valorFreteTotal,
          valorSeguroTotal              = v_valorSeguroTotal,
          valorDescontoTotal            = v_valorDescontoTotal,
          valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
          valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
          valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
          baseISSQN                     = v_baseISSQN,
          valorISSQN                    = v_valorISSQN,
          baseRetIRRF                   = v_baseRetIRRF,
          valorRetIRRF                  = v_valorRetIRRF,
          baseRetINSS                   = v_baseRetINSS,
          valorRetINSS                  = v_valorRetINSS,
          baseRetPIS                    = v_baseRetPIS,
          valorRetPIS                   = v_valorRetPIS,
          baseRetCOFINS                 = v_baseRetCOFINS,
          valorRetCOFINS                = v_valorRetCOFINS,
          baseRetCSLL                   = v_baseRetCSLL,
          valorRetCSLL                  = v_valorRetCSLL,
          baseRetOutros                 = v_baseRetOutros,
          valorRetOutros                = v_valorRetOutros,
          baseII                        = v_baseII,
          valorII                       = v_valorII,
          baseIOF                       = v_baseIOF,
          valorIOF                      = v_valorIOF,
          baseIPI                       = v_baseIPI,
          valorIPI                      = v_valorIPI,
          basePIS                       = v_basePIS,
          valorPIS                      = v_valorPIS,
          basePISST                     = v_basePISST,
          valorPISST                    = v_valorPISST,
          baseCOFINS                    = v_baseCOFINS,
          valorCOFINS                   = v_valorCOFINS,
          baseCOFINSST                  = v_baseCOFINSST,
          valorCOFINSST                 = v_valorCOFINSST,
          baseCreditoSimplesNacional    = v_baseCreditoSimplesNacional,
          valorCreditoSimplesNacional   = v_valorCreditoSimplesNacional,
          baseICMS                      = v_baseICMS,
          valorICMSOperacao             = v_valorICMSOperacao,
          valorICMSDiferido             = v_valorICMSDiferido,
          valorICMS                     = v_valorICMS,
          valorICMSDesoneracao          = v_valorICMSDesoneracao,
          baseICMSST                    = v_baseICMSST,
          valorICMSST                   = v_valorICMSST,
          baseICMSSTAnteriormente       = v_baseICMSSTAnteriormente,
          valorICMSSTAnteriormente      = v_valorICMSSTAnteriormente,
          valorICMSProprioSubstituto    = v_valorICMSProprioSubstituto,
          baseICMSEfetivo               = v_baseICMSEfetivo,
          valorICMSEfetivo              = v_valorICMSEfetivo,
          baseICMSUFDestinatario        = v_baseICMSUFDestinatario,
          valorICMSUFDestinatario       = v_valorICMSUFDestinatario,
          baseICMSUFRemetente           = v_baseICMSUFRemetente,
          valorICMSUFRemetente          = v_valorICMSUFRemetente,
          baseFCP                       = v_baseFCP,
          valorFCP                      = v_valorFCP,
          baseFCPST                     = v_baseFCPST,
          valorFCPST                    = v_valorFCPST,
          baseFCPSTAnteriormente        = v_baseFCPSTAnteriormente,
          valorFCPSTAnteriormente       = v_valorFCPSTAnteriormente,
          baseFCPUFDestinatario         = v_baseFCPUFDestinatario,
          valorFCPUFDestinatario        = v_valorFCPUFDestinatario,
          baseEstimadaImpostos          = v_baseEstimadaImpostos,
          valorEstimadoImpFederais      = v_valorEstimadoImpFederais,
          valorEstimadoImpEstaduais     = v_valorEstimadoImpEstaduais,
          valorEstimadoImpMunicipais    = v_valorEstimadoImpMunicipais,
          valorLiquidoItem              = v_valorLiquidoItem,
          valorDescontoCustoOpTotal     = v_valorDescontoCustoOpTotal,
          valorAcrescimoCustoOpTotal    = v_valorAcrescimoCustoOpTotal,
          precoCustoOperacao            = v_precoCustoOperacao,
          valorCustoOperacao            = v_valorCustoOperacao,
          precoCMV                      = v_precoCMV,
          valorCMV                      = v_valorCMV,
          valorAcrescimoExtempSubtotal  = v_valorAcrescimoExtempSubtotal,
          valorAcrescimoExtempTotal     = v_valorAcrescimoExtempTotal
        WHERE idItemPreDocumento        = b.idItemPreDocumento;
        IF b.tipoProduto = '09' THEN
          v_cab_valorServicos            := v_cab_valorServicos + v_valorProdutoServico;
        ELSE
          v_cab_valorProdutos            := v_cab_valorProdutos + v_valorProdutoServico;
        END IF;
        v_cab_valorBasePagamento       := v_cab_valorBasePagamento + v_valorBasePagamento;
        IF b.usarPrecoAVista = 1 AND b.geraFinanceiro = 1 THEN
          v_cab_valorAVistaMinimo        := v_cab_valorAVistaMinimo + v_valorProdutoServico + b.valorDescontoPagamento - b.valorOutrasDespesasPagamento - b.valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
        END IF;
        v_cab_valorFreteTotal          := v_cab_valorFreteTotal + v_valorFreteTotal;
        v_cab_valorSeguroTotal         := v_cab_valorSeguroTotal + v_valorSeguroTotal;
        v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal + v_valorDescontoTotal;
        v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
        v_cab_valorAdicFreteMarinTotal := v_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
        v_cab_valorDespesasAduanTotal  := v_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
        v_cab_valorLiquidoItem         := v_cab_valorLiquidoItem + v_valorLiquidoItem;
        v_cab_valorDescCustoOpTotal    := v_cab_valorDescCustoOpTotal + v_valorDescontoCustoOpTotal;
        v_cab_valorAcrescCustoOpTotal  := v_cab_valorAcrescCustoOpTotal + v_valorAcrescimoCustoOpTotal;
        v_cab_valorCustoOperacao       := v_cab_valorCustoOperacao + v_valorCustoOperacao;
        v_cab_valorCMV                 := v_cab_valorCMV + v_valorCMV;
        v_cab_valorAcrescExtempTotal   := v_cab_valorAcrescExtempTotal + v_valorAcrescimoExtempTotal;
      END LOOP;
    END IF;
    UPDATE MOPREDOCUMENTOS SET 
      valorProdutos                 = v_cab_valorProdutos,
      valorServicos                 = v_cab_valorServicos,
      valorBasePagamento            = v_cab_valorBasePagamento,
      valorAVistaMinimo             = v_cab_valorAVistaMinimo,
      valorFreteTotal               = v_cab_valorFreteTotal,
      valorSeguroTotal              = v_cab_valorSeguroTotal,
      valorDescontoTotal            = v_cab_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_cab_valorAdicFreteMarinTotal,
      valorDespesasAduaneirasTotal  = v_cab_valorDespesasAduanTotal,
      valorLiquidoItem              = v_cab_valorLiquidoItem,
      valorDescontoCustoOpTotal     = v_cab_valorDescCustoOpTotal,
      valorAcrescimoCustoOpTotal    = v_cab_valorAcrescCustoOpTotal,
      valorCustoOperacao            = v_cab_valorCustoOperacao,
      valorCMV                      = v_cab_valorCMV,
      valorAcrescimoExtempTotal     = v_cab_valorAcrescExtempTotal
    WHERE preDocumento              = a.preDocumento;
  END LOOP;
END ADD_PRE_DOC_CALCULA_IMPOSTOS;

/

create or replace PROCEDURE ADD_DOC_FISC_CALCULA_IMPOSTOS (
  p_config_64_casasDecSaidas     IN CHAR,
  p_config_209_filtrarGrupoEcon  IN NUMBER,
  p_config_362_calcCustoPorGrade IN NUMBER,
  p_cab_idDocumentoFiscal        IN NUMBER,
  p_troca_tipoPagamentoFrete     IN NUMBER,
  p_a_cab_tipoPagamentoFrete     IN CHAR)
IS
  v_cab_valorProdutos            NUMBER;
  v_cab_valorServicos            NUMBER;
  v_cab_valorBasePagamento       NUMBER;
  v_cab_valorAVistaMinimo        NUMBER;
  v_cab_valorFreteTotal          NUMBER;
  v_cab_valorSeguroTotal         NUMBER;
  v_cab_valorDescontoTotal       NUMBER;
  v_cab_valorOutrasDespesasTotal NUMBER;
  v_cab_valorAdicFreteMarinTotal NUMBER;
  v_cab_valorDespesasAduanTotal  NUMBER;
  v_cab_valorLiquidoItem         NUMBER;
  v_cab_valorCustoOperacao       NUMBER;
  v_cab_valorCMV                 NUMBER;
  v_cab_valorDescCustoOpTotal    NUMBER;
  v_cab_valorAcrescCustoOpTotal  NUMBER;
  v_cab_valorAcrescExtempTotal   NUMBER;
  v_calcularImpostosItem         NUMBER;
  v_habilitaControleEntrega      NUMBER;
  v_valorDescontoPromocaoGeral   NUMBER;
  v_valorDescontoPromocaoPagamen NUMBER;
  v_rateioDescontofiltrarSemProm NUMBER;
  v_rateioDescontofiltrarAPrazo  NUMBER;
  v_rateioFretePorControleEntr   NUMBER;
  v_valorBaseFreteSemFinSemEntr  NUMBER;
  v_valorBaseFreteComFinSemEntr  NUMBER;
  v_valorBaseFreteSemFinComEntr  NUMBER;
  v_valorBaseFreteComFinComEntr  NUMBER;
  v_valorBaseRateio              NUMBER;
  v_valorBaseRateioComEntrega    NUMBER;
  v_valorBaseRateioFinanceiro    NUMBER;
  v_valorBaseRateioOutrasDespGer NUMBER;
  v_valorBaseRateioOutrasDespFin NUMBER;
  v_valorBaseRateioDescontoGeral NUMBER;
  v_valorBaseRateioPagamento     NUMBER;
  v_valorBaseRateioPagamFinanc   NUMBER;
  v_valorBaseRateioPagamDesconto NUMBER;
  v_valorBaseRateioPagamFinDesc  NUMBER;
  v_saldoRatFreteGeral           NUMBER;
  v_saldoRatSeguroGeral          NUMBER;
  v_saldoRatDescontoGeral        NUMBER;
  v_saldoRatOutrasDespesasGeral  NUMBER;
  v_saldoRatAdicFreteMarinGeral  NUMBER;
  v_saldoRatDespesasAduanGeral   NUMBER;
  v_saldoRatDescontoPagamento    NUMBER;
  v_saldoRatOutrasDespPagamento  NUMBER;
  v_saldoRatJurosPagamento       NUMBER;
  v_saldoRatDescCustoOpGeral     NUMBER;
  v_saldoRatAcrescCustoOpGeral   NUMBER;
  v_saldoRatAcrescExtempGeral    NUMBER;
  v_residuoFreteGeral            NUMBER;
  v_residuoSeguroGeral           NUMBER;
  v_residuoDescontoGeral         NUMBER;
  v_residuoOutrasDespesasGeral   NUMBER;
  v_residuoAdicFreteMarinGeral   NUMBER;
  v_residuoDespesasAduanGeral    NUMBER;
  v_residuoDescontoPagamento     NUMBER;
  v_residuoOutrasDespPagamento   NUMBER;
  v_residuoJurosPagamento        NUMBER;
  v_residuoDescCustoOpGeral      NUMBER;
  v_residuoAcrescCustoOpGeral    NUMBER;
  v_residuoAcrescExtempGeral     NUMBER;
  v_idItemDocFiscalUltimoItem    NUMBER;
  v_idItemDocFiscalRateioFrete   NUMBER;
  v_precoUnitario                NUMBER;
  v_precoUnitarioConvertido      NUMBER;
  v_valorProdutoServico          NUMBER;
  v_valorFreteGeral              NUMBER;
  v_valorSeguroGeral             NUMBER;
  v_valorDescontoGeral           NUMBER;
  v_valorOutrasDespesasGeral     NUMBER;
  v_valorAdicFreteMarinMerGeral  NUMBER;
  v_valorDespesasAduaneirasGeral NUMBER;
  v_valorDescontoCustoOpGeral    NUMBER;
  v_valorAcrescimoCustoOpGeral   NUMBER;
  v_valorAcrescimoExtempGeral    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_baseISSQN                    NUMBER;
  v_residuoISSQN                 NUMBER;
  v_valorISSQN                   NUMBER;
  v_baseRetIRRF                  NUMBER;
  v_residuoRetIRRF               NUMBER;
  v_valorRetIRRF                 NUMBER;
  v_baseRetINSS                  NUMBER;
  v_residuoRetINSS               NUMBER;
  v_valorRetINSS                 NUMBER;
  v_baseRetPIS                   NUMBER;
  v_residuoRetPIS                NUMBER;
  v_valorRetPIS                  NUMBER;
  v_baseRetCOFINS                NUMBER;
  v_residuoRetCOFINS             NUMBER;
  v_valorRetCOFINS               NUMBER;
  v_baseRetCSLL                  NUMBER;
  v_residuoRetCSLL               NUMBER;
  v_valorRetCSLL                 NUMBER;
  v_baseRetOutros                NUMBER;
  v_residuoRetOutros             NUMBER;
  v_valorRetOutros               NUMBER;
  v_baseII                       NUMBER;
  v_valorII                      NUMBER;
  v_baseIOF                      NUMBER;
  v_valorIOF                     NUMBER;
  v_baseIPI                      NUMBER;
  v_valorIPI                     NUMBER;
  v_basePIS                      NUMBER;
  v_valorPIS                     NUMBER;
  v_basePISST                    NUMBER;
  v_valorPISST                   NUMBER;
  v_baseCOFINS                   NUMBER;
  v_valorCOFINS                  NUMBER;
  v_baseCOFINSST                 NUMBER;
  v_valorCOFINSST                NUMBER;
  v_baseCreditoSimplesNacional   NUMBER;
  v_valorCreditoSimplesNacional  NUMBER;
  v_baseICMS                     NUMBER;
  v_valorICMSOperacao            NUMBER;
  v_valorICMSDiferido            NUMBER;
  v_valorICMS                    NUMBER;
  v_valorICMSDesoneracao         NUMBER;
  v_baseICMSST                   NUMBER;
  v_valorICMSST                  NUMBER;
  v_baseICMSSTAnteriormente      NUMBER;
  v_valorICMSSTAnteriormente     NUMBER;
  v_valorICMSProprioSubstituto   NUMBER;
  v_baseICMSEfetivo              NUMBER;
  v_valorICMSEfetivo             NUMBER;
  v_baseICMSEscrituracao         NUMBER;
  v_valorICMSEscrituracao        NUMBER;
  v_valorICMSDesonEscrituracao   NUMBER;
  v_baseICMSSTEscrituracao       NUMBER;
  v_valorICMSSTEscrituracao      NUMBER;
  v_baseICMSUFDestinatario       NUMBER;
  v_valorICMSUFDestinatario      NUMBER;
  v_baseICMSUFRemetente          NUMBER;
  v_valorICMSUFRemetente         NUMBER;
  v_baseFCP                      NUMBER;
  v_valorFCP                     NUMBER;
  v_baseFCPST                    NUMBER;
  v_valorFCPST                   NUMBER;
  v_baseFCPSTAnteriormente       NUMBER;
  v_valorFCPSTAnteriormente      NUMBER;
  v_baseFCPUFDestinatario        NUMBER;
  v_valorFCPUFDestinatario       NUMBER;
  v_baseEstimadaImpostos         NUMBER;
  v_valorEstimadoImpFederais     NUMBER;
  v_valorEstimadoImpEstaduais    NUMBER;
  v_valorEstimadoImpMunicipais   NUMBER;
  v_valorLiquidoItem             NUMBER;
  v_valorDescontoCustoOpTotal    NUMBER;
  v_valorAcrescimoCustoOpTotal   NUMBER;
  v_precoCustoOperacao           NUMBER;
  v_valorCustoOperacao           NUMBER;
  v_precoCMV                     NUMBER;
  v_valorCMV                     NUMBER;
  v_valorAcrescimoExtempSubtotal NUMBER;
  v_valorAcrescimoExtempTotal    NUMBER;
  v_auxNumber                    NUMBER;
BEGIN
  FOR a IN (
    SELECT
      a.idDocumentoFiscal,
      a.origemDocumento,
      a.entradaSaida,
      a.devolucaoAnulacaoRetorno,
      a.atualizaCustoMedio,
      a.estabelecimento,
      a.nfFornecedor,
      a.dataEntradaSaida,
      a.pessoa,
      a.localDestinoOperacao,
      a.indicadorConsumidorFinal,
      a.tipoPagamentoFrete,
      a.valorProdutos,
      a.valorServicos,
      a.valorFreteGeral,
      a.valorSeguroGeral,
      a.valorDescontoGeral,
      a.valorOutrasDespesasGeral,
      a.valorAdicFreteMarinhaMerGeral,
      a.valorDespesasAduaneirasGeral,
      a.valorDescontoCustoOpGeral,
      a.valorAcrescimoCustoOpGeral,
      a.valorAcrescimoExtempGeral,
      a.valorBasePagamento,
      a.valorAVistaMinimo,
      a.valorDescontoPagamento,
      a.valorOutrasDespesasPagamento,
      a.valorJurosPagamento,
      a.valorFreteTotal,
      a.valorSeguroTotal,
      a.valorDescontoTotal,
      a.valorOutrasDespesasTotal,
      a.valorAdicFreteMarinhaMerTotal,
      a.valorDespesasAduaneirasTotal,
      a.impostosEditados,
      a.valorLiquidoItem,
      a.valorDescontoCustoOpTotal,
      a.valorAcrescimoCustoOpTotal,
      a.valorCustoOperacao,
      a.valorCMV,
      a.valorAcrescimoExtempTotal,
      pess.indicadorInscricaoEstadual,
      COALESCE((
        SELECT MIN(munEndEst.uf)
        FROM PAESTABELECIMENTOS est
        JOIN CAENDERECOSPESSOA endEst
        ON endEst.pessoa = est.pessoaEstabelecimento
        JOIN SIMUNICIPIOS munEndEst
        ON munEndEst.municipio = endEst.municipio
        WHERE est.estabelecimento = a.estabelecimento
        AND endEst.ativo = 1
        AND endEst.principal = 1),'  ') munEndEst_uf
    FROM MODOCUMENTOSFISCAIS a
    JOIN CAPESSOAS pess
    ON pess.pessoa = a.pessoa
    WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal)
  LOOP
    v_cab_valorProdutos            := a.valorProdutos;
    v_cab_valorServicos            := a.valorServicos;
    v_cab_valorBasePagamento       := a.valorBasePagamento;
    v_cab_valorAVistaMinimo        := a.valorAVistaMinimo;
    v_cab_valorFreteTotal          := a.valorFreteTotal;
    v_cab_valorSeguroTotal         := a.valorSeguroTotal;
    v_cab_valorDescontoTotal       := a.valorDescontoTotal;
    v_cab_valorOutrasDespesasTotal := a.valorOutrasDespesasTotal;
    v_cab_valorAdicFreteMarinTotal := a.valorAdicFreteMarinhaMerTotal;
    v_cab_valorDespesasAduanTotal  := a.valorDespesasAduaneirasTotal;
    v_cab_valorLiquidoItem         := a.valorLiquidoItem;
    v_cab_valorDescCustoOpTotal    := a.valorDescontoCustoOpTotal;
    v_cab_valorAcrescCustoOpTotal  := a.valorAcrescimoCustoOpTotal;
    v_cab_valorCustoOperacao       := a.valorCustoOperacao;
    v_cab_valorCMV                 := a.valorCMV;
    v_cab_valorAcrescExtempTotal   := a.valorAcrescimoExtempTotal;
    SELECT
      CASE
        WHEN EXISTS (
          SELECT 1
          FROM MODOCFISCALXITENS a
          JOIN MODOCFISCALXORCAMENTOITEM docXorc
          ON docXorc.idItemDocFiscal = a.idItemDocFiscal
          JOIN MOORCAMENTOXITENS itemOrc
          ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento
          JOIN PACONTROLESENTREGA contr
          ON contr.controleEntrega = itemOrc.controleEntrega
          WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
          AND itemOrc.controleEntrega <> 0
          AND contr.habilitaFrete = 1)
        THEN 1
        ELSE 0
      END
    INTO v_habilitaControleEntrega
    FROM DUAL;
    -- RATEIO DESCONTOS E ACRÉSCIMOS
    v_cab_valorProdutos            := 0;
    v_cab_valorServicos            := 0;
    v_cab_valorBasePagamento       := 0;
    v_cab_valorAVistaMinimo        := 0;
    v_cab_valorFreteTotal          := 0;
    v_cab_valorSeguroTotal         := 0;
    v_cab_valorDescontoTotal       := 0;
    v_cab_valorOutrasDespesasTotal := 0;
    v_cab_valorAdicFreteMarinTotal := 0;
    v_cab_valorDespesasAduanTotal  := 0;
    v_cab_valorLiquidoItem         := 0;
    v_cab_valorDescCustoOpTotal    := 0;
    v_cab_valorAcrescCustoOpTotal  := 0;
    v_cab_valorCustoOperacao       := 0;
    v_cab_valorCMV                 := 0;
    v_cab_valorAcrescExtempTotal   := 0;
    v_calcularImpostosItem         := 0;
    v_saldoRatFreteGeral           := a.valorFreteGeral;
    v_saldoRatSeguroGeral          := a.valorSeguroGeral;
    v_saldoRatDescontoGeral        := a.valorDescontoGeral;
    v_saldoRatOutrasDespesasGeral  := a.valorOutrasDespesasGeral;
    v_saldoRatAdicFreteMarinGeral  := a.valorAdicFreteMarinhaMerGeral;
    v_saldoRatDespesasAduanGeral   := a.valorDespesasAduaneirasGeral;
    v_saldoRatDescontoPagamento    := a.valorDescontoPagamento;
    v_saldoRatOutrasDespPagamento  := a.valorOutrasDespesasPagamento;
    v_saldoRatJurosPagamento       := a.valorJurosPagamento;
    v_saldoRatDescCustoOpGeral     := a.valorDescontoCustoOpGeral;
    v_saldoRatAcrescCustoOpGeral   := a.valorAcrescimoCustoOpGeral;
    v_saldoRatAcrescExtempGeral    := a.valorAcrescimoExtempGeral;
    v_residuoFreteGeral            := 0;
    v_residuoSeguroGeral           := 0;
    v_residuoDescontoGeral         := 0;
    v_residuoOutrasDespesasGeral   := 0;
    v_residuoAdicFreteMarinGeral   := 0;
    v_residuoDespesasAduanGeral    := 0;
    v_residuoDescontoPagamento     := 0;
    v_residuoOutrasDespPagamento   := 0;
    v_residuoJurosPagamento        := 0;
    v_residuoDescCustoOpGeral      := 0;
    v_residuoAcrescCustoOpGeral    := 0;
    v_residuoAcrescExtempGeral     := 0;
    v_idItemDocFiscalUltimoItem    := 0;
    v_idItemDocFiscalRateioFrete   := 0;
    v_valorDescontoPromocaoGeral   := 0;
    v_valorDescontoPromocaoPagamen := 0;
    v_rateioDescontofiltrarSemProm := 0;
    v_rateioDescontofiltrarAPrazo  := 0;
    
    -- v_valorDescontoPromocaoGeral
    IF a.valorDescontoGeral > 0 THEN
      SELECT COALESCE (SUM (promo.valorDesconto),0)
      INTO v_valorDescontoPromocaoGeral
      FROM MODOCFISCALXITENS b
      JOIN MODOCFISCALXPROMOCOES promo
      ON promo.idItemDocFiscal = b.idItemDocFiscal
      WHERE b.idDocumentoFiscal = a.idDocumentoFiscal
      AND b.cancelado = 0
      AND promo.cabecalhoItemPagamento ='C';
    END IF;
    
    -- v_valorDescontoPromocaoPagamen
    IF a.valorDescontoPagamento > 0 THEN
      SELECT COALESCE (SUM (promo.valorDesconto),0)
      INTO v_valorDescontoPromocaoPagamen
      FROM MODOCFISCALXITENS b
      JOIN MODOCFISCALXPROMOCOES promo
      ON promo.idItemDocFiscal = b.idItemDocFiscal
      WHERE b.idDocumentoFiscal = a.idDocumentoFiscal
      AND b.cancelado = 0
      AND promo.cabecalhoItemPagamento ='P';
    END IF;
  
    -- v_rateioDescontofiltrarSemProm
    IF a.valorDescontoGeral > v_valorDescontoPromocaoGeral OR a.valorDescontoPagamento > v_valorDescontoPromocaoPagamen THEN
      SELECT
        CASE
          WHEN EXISTS (
            SELECT 1
            FROM MODOCFISCALXITENS b
            JOIN PAMODELOSDOCUMENTO modDoc
            ON modDoc.modeloDocumento = b.modeloDocumento
            WHERE b.idDocumentoFiscal = a.idDocumentoFiscal
            AND b.cancelado = 0
            AND COALESCE ((
              SELECT SUM (promo.valorDesconto)
              FROM MODOCFISCALXPROMOCOES promo
              WHERE promo.idItemDocFiscal = b.idItemDocFiscal
              AND promo.cabecalhoItemPagamento IN ('C','P')),0) > (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit  = 1 OR modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END
              - b.valorDescontoItem + b.valorAcrescimoItem))
          THEN 0
          WHEN COALESCE ((
            SELECT SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem)
            FROM MODOCFISCALXITENS b
            JOIN PAMODELOSDOCUMENTO modDoc
            ON modDoc.modeloDocumento = b.modeloDocumento
            JOIN MODOCFISCALXPROMOCOES promo
            ON promo.idItemDocFiscal = b.idItemDocFiscal
            WHERE b.idDocumentoFiscal = a.idDocumentoFiscal
            AND b.cancelado = 0),0) > (
              CASE
                WHEN a.valorDescontoGeral > v_valorDescontoPromocaoGeral
                THEN a.valorDescontoGeral - v_valorDescontoPromocaoGeral
                ELSE 0
              END +
              CASE
                WHEN a.valorDescontoPagamento > v_valorDescontoPromocaoPagamen
                THEN a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen
                ELSE 0
              END)
            AND EXISTS (
              SELECT 1
              FROM MODOCFISCALXITENS b
              WHERE b.idDocumentoFiscal = a.idDocumentoFiscal
              AND b.cancelado = 0
              AND NOT EXISTS (
                SELECT 1
                FROM MODOCFISCALXPROMOCOES promo
                WHERE promo.idItemDocFiscal = b.idItemDocFiscal))
          THEN 1
          ELSE 0
        END
      INTO v_rateioDescontofiltrarSemProm
      FROM DUAL;
    END IF;
  
    -- v_rateioDescontofiltrarAPrazo
    IF a.valorDescontoGeral > v_valorDescontoPromocaoGeral OR a.valorDescontoPagamento > v_valorDescontoPromocaoPagamen THEN
      SELECT
        CASE
          WHEN COALESCE ((
            SELECT SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem)
            FROM MODOCFISCALXITENS b
            JOIN PAMODELOSDOCUMENTO modDoc
            ON modDoc.modeloDocumento = b.modeloDocumento
            WHERE b.idDocumentoFiscal = a.idDocumentoFiscal
            AND b.cancelado = 0
            AND b.precoSugestaoAPrazo <> b.precoSugestaoAVista
            AND b.usarPrecoAVista = 1
            AND (v_rateioDescontofiltrarSemProm = 0
              OR NOT EXISTS (
                SELECT 1
                FROM MODOCFISCALXPROMOCOES promo
                WHERE promo.idItemDocFiscal = b.idItemDocFiscal))),0) > (
              CASE
                WHEN a.valorDescontoGeral > v_valorDescontoPromocaoGeral
                THEN a.valorDescontoGeral - v_valorDescontoPromocaoGeral
                ELSE 0
              END +
              CASE
                WHEN a.valorDescontoPagamento > v_valorDescontoPromocaoPagamen
                THEN a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen
                ELSE 0
              END)
            AND EXISTS (
              SELECT 1
              FROM MODOCFISCALXITENS b
              WHERE b.idDocumentoFiscal = a.idDocumentoFiscal
              AND b.cancelado = 0
              AND (b.precoSugestaoAPrazo = b.precoSugestaoAVista
                OR b.usarPrecoAVista = 0)
              AND (v_rateioDescontofiltrarSemProm = 0
                OR NOT(EXISTS(
                  SELECT 1
                  FROM MODOCFISCALXPROMOCOES promo
                  WHERE promo.idItemDocFiscal = b.idItemDocFiscal))))
          THEN 1
          ELSE 0
        END
      INTO v_rateioDescontofiltrarAPrazo
      FROM DUAL;
    END IF;
    
    -- Bases Rateio
    SELECT
      MAX (COALESCE ((CASE WHEN v_habilitaControleEntrega = 0 OR EXISTS(SELECT 1 FROM MODOCFISCALXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemDocFiscal = b.idItemDocFiscal AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1) THEN 1 ELSE 0 END),0)),
      COALESCE (SUM (CASE WHEN modDoc.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN modDoc.geraFinanceiro = 1 AND (v_habilitaControleEntrega = 0 OR EXISTS(SELECT 1 FROM MODOCFISCALXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemDocFiscal = b.idItemDocFiscal AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1)) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 AND (v_habilitaControleEntrega = 0 OR EXISTS(SELECT 1 FROM MODOCFISCALXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemDocFiscal = b.idItemDocFiscal AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1)) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem),0),
      COALESCE (SUM (CASE WHEN v_habilitaControleEntrega = 0 OR EXISTS(SELECT 1 FROM MODOCFISCALXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemDocFiscal = b.idItemDocFiscal AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN (v_rateioDescontofiltrarAPrazo = 0 OR b.precoSugestaoAPrazo = b.precoSugestaoAVista OR b.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MODOCFISCALXPROMOCOES promo WHERE promo.idItemDocFiscal = b.idItemDocFiscal))) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN (v_rateioDescontofiltrarAPrazo = 0 OR b.precoSugestaoAPrazo = b.precoSugestaoAVista OR b.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MODOCFISCALXPROMOCOES promo WHERE promo.idItemDocFiscal = b.idItemDocFiscal))) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0),
      COALESCE (SUM (CASE WHEN b.geraFinanceiro = 1 AND (v_rateioDescontofiltrarAPrazo = 0 OR b.precoSugestaoAPrazo = b.precoSugestaoAVista OR b.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MODOCFISCALXPROMOCOES promo WHERE promo.idItemDocFiscal = b.idItemDocFiscal))) THEN CASE WHEN b.valorProdutoServicoBruto > 0 AND (modDoc.diminuiDescontoPrUnit = 1 OR modDoc.somaAcrescimosPrUnit = 1 or modDoc.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem ELSE 0 END),0)
    INTO
      v_rateioFretePorControleEntr,
      v_valorBaseFreteSemFinSemEntr,
      v_valorBaseFreteComFinSemEntr,
      v_valorBaseFreteSemFinComEntr,
      v_valorBaseFreteComFinComEntr,
      v_valorBaseRateio,
      v_valorBaseRateioComEntrega,
      v_valorBaseRateioFinanceiro,
      v_valorBaseRateioOutrasDespGer,
      v_valorBaseRateioOutrasDespFin,
      v_valorBaseRateioDescontoGeral,
      v_valorBaseRateioPagamento,
      v_valorBaseRateioPagamFinanc,
      v_valorBaseRateioPagamDesconto,
      v_valorBaseRateioPagamFinDesc
    FROM MODOCFISCALXITENS b
    JOIN PAMODELOSDOCUMENTO modDoc
    ON modDoc.modeloDocumento = b.modeloDocumento
    WHERE b.idDocumentoFiscal = a.idDocumentoFiscal
    AND b.cancelado = 0;
  
    -- Efetua rateio
    FOR b IN (
      SELECT
        b.idItemDocFiscal,
        b.modeloDocumento,
        b.geraFinanceiro,
        b.quantidade,
        b.quantidadeConvertida,
        b.usarPrecoAVista,
        b.precoUnitarioBruto,
        b.acrescimoUnitarioComposicao,
        b.precoUnitario,
        b.precoUnitarioConvertido,
        b.valorProdutoServicoBruto,
        b.valorProdutoServico,
        b.valorDescontoItem,
        b.valorAcrescimoItem,
        b.valorFreteItem,
        b.valorSeguroItem,
        b.valorAdicFreteMarinhaMerItem,
        b.valorDespesasAduaneirasItem,
        b.valorFreteGeral,
        b.valorSeguroGeral,
        b.valorDescontoGeral,
        b.valorOutrasDespesasGeral,
        b.valorAdicFreteMarinhaMerGeral,
        b.valorDespesasAduaneirasGeral,
        b.valorBasePagamento,
        b.valorDescontoPagamento,
        b.valorOutrasDespesasPagamento,
        b.valorJurosPagamento,
        b.valorFreteTotal,
        b.valorSeguroTotal,
        b.valorDescontoTotal,
        b.valorOutrasDespesasTotal,
        b.valorAdicFreteMarinhaMerTotal,
        b.valorDespesasAduaneirasTotal,
        b.valorIPIDevolucao,
        b.retidoISSQN,
        b.valorISSQN,
        b.valorRetIRRF,
        b.valorRetINSS,
        b.valorRetPIS,
        b.valorRetCOFINS,
        b.valorRetCSLL,
        b.valorRetOutros,
        b.valorII,
        b.valorIOF,
        b.valorIPI,
        b.valorPIS,
        b.valorPISST,
        b.valorCOFINS,
        b.valorCOFINSST,
        b.valorCreditoSimplesNacional,
        b.valorICMS,
        b.valorICMSST,
        b.valorICMSSTEscrituracao,
        b.somarICMSST,
        b.valorLiquidoItem,
        b.valorDescontoCustoOpItem,
        b.valorDescontoCustoOpGeral,
        b.valorDescontoCustoOpTotal,
        b.valorAcrescimoCustoOpItem,
        b.valorAcrescimoCustoOpGeral,
        b.valorAcrescimoCustoOpTotal,
        b.precoCustoOperacao,
        b.valorCustoOperacao,
        b.precoCMV,
        b.valorCMV,
        b.quantidadeExtemporanea,
        b.acrescimoUnitarioExtemporaneo,
        b.valorAcrescimoExtempSubtotal,
        b.valorAcrescimoExtempItem,
        b.valorAcrescimoExtempGeral,
        b.valorAcrescimoExtempTotal,
        modDoc.geraFinanceiro modDoc_geraFinanceiro,
        modDoc.diminuiDescontoPrUnit,
        modDoc.somaAcrescimosPrUnit,
        modDoc.somaFreteSeguroPrUnit,
        prod.tipoProduto,
        CASE WHEN v_habilitaControleEntrega = 0 OR EXISTS(
          SELECT 1
          FROM MODOCFISCALXORCAMENTOITEM docXorc
          JOIN MOORCAMENTOXITENS itemOrc
          ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento
          JOIN PACONTROLESENTREGA contr
          ON contr.controleEntrega = itemOrc.controleEntrega
          WHERE docXorc.idItemDocFiscal = b.idItemDocFiscal
          AND contr.habilitaFrete = 1) THEN 1 ELSE 0 END rateioFrete,
        CASE WHEN b.precoSugestaoAPrazo <> b.precoSugestaoAVista AND b.usarPrecoAVista = 1 THEN 1 ELSE 0 END aVista,
        CASE WHEN EXISTS(
          SELECT 1
          FROM MODOCFISCALXPROMOCOES promo
          WHERE promo.idItemDocFiscal = b.idItemDocFiscal) THEN 1 ELSE 0 END promocao,
        COALESCE ((
          SELECT SUM (promo.valorDesconto)
          FROM MODOCFISCALXPROMOCOES promo
          WHERE promo.idItemDocFiscal = b.idItemDocFiscal
          AND promo.cabecalhoItemPagamento ='C'),0) valorDescontoPromocaoGeral,
        COALESCE ((
          SELECT SUM (promo.valorDesconto)
          FROM MODOCFISCALXPROMOCOES promo
          WHERE promo.idItemDocFiscal = b.idItemDocFiscal
          AND promo.cabecalhoItemPagamento ='P'),0) valorDescontoPromocaoPagamento,
        CASE
          WHEN EXISTS (
            SELECT 1
            FROM CAPRODUTOXCOMPOSICOESPREC compPrec
            WHERE compPrec.produto = gradProd.produto
            AND compPrec.ativo = 1)
          THEN 1
          ELSE 0
        END composicaoPreco
      FROM MODOCFISCALXITENS b
      JOIN PAMODELOSDOCUMENTO modDoc
      ON modDoc.modeloDocumento = b.modeloDocumento
      JOIN CAGRADESPRODUTO gradProd
      ON gradProd.gradeProduto = b.gradeProduto
      JOIN CAPRODUTOS prod
      ON prod.produto = gradProd.produto
      WHERE b.idDocumentoFiscal = a.idDocumentoFiscal
      AND b.cancelado = 0
      ORDER BY b.sequencia)
    LOOP
      v_idItemDocFiscalUltimoItem    := b.idItemDocFiscal;
      v_precoUnitario                := b.precoUnitario;
      v_precoUnitarioConvertido      := b.precoUnitarioConvertido;
      v_valorProdutoServico          := b.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           := b.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              := b.valorFreteTotal;
      v_valorSeguroTotal             := b.valorSeguroTotal;
      v_valorDescontoTotal           := b.valorDescontoTotal;
      v_valorOutrasDespesasTotal     := b.valorOutrasDespesasTotal;
      v_valorAdicFreteMarinMerTotal  := b.valorAdicFreteMarinhaMerTotal;
      v_valorDespesasAduaneirasTotal := b.valorDespesasAduaneirasTotal;
      v_valorLiquidoItem             := b.valorLiquidoItem;
      v_valorDescontoCustoOpTotal    := b.valorDescontoCustoOpTotal;
      v_valorAcrescimoCustoOpTotal   := b.valorAcrescimoCustoOpTotal;
      v_precoCustoOperacao           := b.precoCustoOperacao;
      v_valorCustoOperacao           := b.valorCustoOperacao;
      v_precoCMV                     := b.precoCMV;
      v_valorCMV                     := b.valorCMV;
      v_valorAcrescimoExtempSubtotal := b.valorAcrescimoExtempSubtotal;
      v_valorAcrescimoExtempTotal    := b.valorAcrescimoExtempTotal;
  
      -- v_valorDescontoGeral
      IF v_valorBaseRateioDescontoGeral > 0
        AND (v_rateioDescontofiltrarAPrazo = 0
          OR b.aVista = 0)
        AND (v_rateioDescontofiltrarSemProm = 0
          OR b.promocao = 0
          AND a.valorDescontoGeral - v_valorDescontoPromocaoGeral > 0)
      THEN
        v_valorDescontoGeral := v_valorDescontoGeral + (a.valorDescontoGeral - v_valorDescontoPromocaoGeral) * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END) / v_valorBaseRateioDescontoGeral;
      END IF;
      IF a.valorDescontoGeral        > 0
        AND v_valorDescontoPromocaoGeral > 0
        AND b.valorDescontoPromocaoGeral > 0
      THEN
        IF a.valorDescontoGeral < v_valorDescontoPromocaoGeral THEN
          v_valorDescontoGeral := v_valorDescontoGeral + b.valorDescontoPromocaoGeral * a.valorDescontoGeral / v_valorDescontoPromocaoGeral;
        ELSE
          v_valorDescontoGeral := v_valorDescontoGeral + b.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 b.rateioFrete = 1 AND b.geraFinanceiro = 1 THEN
        v_idItemDocFiscalRateioFrete := b.idItemDocFiscal;
        v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteComFinComEntr;
        v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteComFinComEntr;
      ELSIF v_valorBaseFreteSemFinComEntr > 0 AND v_valorBaseFreteComFinComEntr <= 0 AND v_rateioFretePorControleEntr = 1 AND b.rateioFrete = 1 AND b.modDoc_geraFinanceiro = 1 THEN
        v_idItemDocFiscalRateioFrete := b.idItemDocFiscal;
        v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteSemFinComEntr;
        v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteSemFinComEntr;
      ELSIF v_valorBaseRateioComEntrega > 0 AND v_valorBaseFreteSemFinComEntr <= 0 AND v_valorBaseFreteComFinComEntr <= 0 AND v_rateioFretePorControleEntr = 1 AND b.rateioFrete = 1 THEN
        v_idItemDocFiscalRateioFrete := b.idItemDocFiscal;
        v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioComEntrega;
        v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioComEntrega;
      ELSIF v_valorBaseFreteComFinSemEntr > 0 AND v_rateioFretePorControleEntr = 0 AND b.geraFinanceiro = 1 THEN
        v_idItemDocFiscalRateioFrete := b.idItemDocFiscal;
        v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteComFinSemEntr;
        v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteComFinSemEntr;
      ELSIF v_valorBaseFreteSemFinSemEntr > 0 AND v_valorBaseFreteComFinSemEntr <= 0 AND v_rateioFretePorControleEntr = 0 AND b.modDoc_geraFinanceiro = 1 THEN
        v_idItemDocFiscalRateioFrete := b.idItemDocFiscal;
        v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteSemFinSemEntr;
        v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseFreteSemFinSemEntr;
      ELSIF v_valorBaseRateio > 0 AND (v_valorBaseRateioComEntrega <= 0 AND v_valorBaseFreteSemFinComEntr <= 0 AND v_valorBaseFreteComFinComEntr <= 0 AND v_rateioFretePorControleEntr = 1 OR v_valorBaseFreteSemFinSemEntr <= 0 AND v_valorBaseFreteComFinSemEntr <= 0 AND v_rateioFretePorControleEntr = 0) THEN
        v_idItemDocFiscalRateioFrete := b.idItemDocFiscal;
        v_valorFreteGeral  := v_valorFreteGeral  + a.valorFreteGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
        v_valorSeguroGeral := v_valorSeguroGeral + a.valorSeguroGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.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 b.geraFinanceiro = 1 THEN 
        v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral  + a.valorAdicFreteMarinhaMerGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
        v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + a.valorDespesasAduaneirasGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
        v_valorDescontoCustoOpGeral    := v_valorDescontoCustoOpGeral    + a.valorDescontoCustoOpGeral    * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
        v_valorAcrescimoCustoOpGeral   := v_valorAcrescimoCustoOpGeral   + a.valorAcrescimoCustoOpGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
        v_valorAcrescimoExtempGeral    := v_valorAcrescimoExtempGeral    + a.valorAcrescimoExtempGeral   * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioFinanceiro;
      ELSIF v_valorBaseRateio > 0 AND v_valorBaseRateioFinanceiro <= 0 THEN
        v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral  + a.valorAdicFreteMarinhaMerGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
        v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + a.valorDespesasAduaneirasGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
        v_valorDescontoCustoOpGeral    := v_valorDescontoCustoOpGeral    + a.valorDescontoCustoOpGeral    * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
        v_valorAcrescimoCustoOpGeral   := v_valorAcrescimoCustoOpGeral   + a.valorAcrescimoCustoOpGeral  * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateio;
        v_valorAcrescimoExtempGeral    := v_valorAcrescimoExtempGeral    + a.valorAcrescimoExtempGeral   * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.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 b.geraFinanceiro = 1 THEN
        v_valorOutrasDespesasGeral := v_valorOutrasDespesasGeral + a.valorOutrasDespesasGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.valorAcrescimoItem END) / v_valorBaseRateioOutrasDespFin;
      ELSIF v_valorBaseRateioOutrasDespGer > 0 AND v_valorBaseRateioOutrasDespFin <= 0 THEN
        v_valorOutrasDespesasGeral := v_valorOutrasDespesasGeral + a.valorOutrasDespesasGeral * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico - b.valorDescontoItem + b.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 a.valorDescontoPagamento       > 0
        AND v_valorBaseRateioPagamFinDesc   > 0
        AND b.geraFinanceiro = 1
        AND (v_rateioDescontofiltrarAPrazo  = 0
          OR b.aVista = 0)
        AND (v_rateioDescontofiltrarSemProm = 0
          OR b.promocao = 0
          AND a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen > 0)
      THEN
        v_valorDescontoPagamento := v_valorDescontoPagamento + (a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen) * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamFinDesc;
      ELSIF a.valorDescontoPagamento    > 0
        AND v_valorBaseRateioPagamDesconto  > 0
        AND v_valorBaseRateioPagamFinDesc  <= 0
        AND (v_rateioDescontofiltrarAPrazo  = 0
          OR b.aVista = 0)
        AND (v_rateioDescontofiltrarSemProm = 0
          OR b.promocao = 0
          AND a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen > 0)
      THEN
        v_valorDescontoPagamento := v_valorDescontoPagamento + (a.valorDescontoPagamento - v_valorDescontoPromocaoPagamen) * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamDesconto;
      END IF;
      IF a.valorDescontoPagamento            > 0
        AND v_valorDescontoPromocaoPagamen   > 0
        AND b.valorDescontoPromocaoPagamento > 0
      THEN
        IF a.valorDescontoPagamento < v_valorDescontoPromocaoPagamen THEN
          v_valorDescontoPagamento := v_valorDescontoPagamento + b.valorDescontoPromocaoPagamento * a.valorDescontoPagamento / v_valorDescontoPromocaoPagamen;
        ELSE
          v_valorDescontoPagamento := v_valorDescontoPagamento + b.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 b.geraFinanceiro = 1 THEN
        v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + a.valorOutrasDespesasPagamento * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamFinanc;
        v_valorJurosPagamento          := v_valorJurosPagamento          + a.valorJurosPagamento          * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamFinanc;
      ELSIF v_valorBaseRateioPagamento > 0 AND v_valorBaseRateioPagamFinanc <= 0 THEN
        v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + a.valorOutrasDespesasPagamento * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.valorAcrescimoItem) / v_valorBaseRateioPagamento;
        v_valorJurosPagamento          := v_valorJurosPagamento          + a.valorJurosPagamento          * (CASE WHEN b.valorProdutoServicoBruto > 0 AND (b.diminuiDescontoPrUnit = 1 OR b.somaAcrescimosPrUnit = 1 or b.somaFreteSeguroPrUnit = 1) THEN b.valorProdutoServicoBruto ELSE b.valorProdutoServico END - b.valorDescontoItem + b.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 (
        a.tipoPagamentoFrete,
        b.quantidade,
        b.quantidadeConvertida,
        b.precoUnitarioBruto,
        b.acrescimoUnitarioComposicao,
        b.precoUnitario,
        b.valorDescontoItem,
        b.valorAcrescimoItem,
        b.valorFreteItem,
        b.valorSeguroItem,
        b.valorAdicFreteMarinhaMerItem,
        b.valorDespesasAduaneirasItem,
        v_valorFreteGeral,
        v_valorSeguroGeral,
        v_valorDescontoGeral,
        v_valorOutrasDespesasGeral,
        v_valorAdicFreteMarinMerGeral,
        v_valorDespesasAduaneirasGeral,
        v_valorDescontoPagamento,
        v_valorOutrasDespesasPagamento,
        v_valorJurosPagamento,
        b.diminuiDescontoPrUnit,
        b.somaAcrescimosPrUnit,
        b.somaFreteSeguroPrUnit,
        b.composicaoPreco,
        /* Retornos */
        v_precoUnitario,
        v_precoUnitarioConvertido,
        v_valorProdutoServico,
        v_valorFreteTotal,
        v_valorSeguroTotal,
        v_valorDescontoTotal,
        v_valorOutrasDespesasTotal,
        v_valorAdicFreteMarinMerTotal,
        v_valorDespesasAduaneirasTotal);
      v_valorAcrescimoExtempSubtotal := FUNC_ADD_CALC_EXTEMP_SUBTOTAL (
        b.quantidade,
        v_precoUnitario,
        b.quantidadeExtemporanea,
        b.acrescimoUnitarioExtemporaneo);
      v_valorAcrescimoExtempTotal := FUNC_ADD_CALC_EXTEMP_TOTAL (
        v_valorAcrescimoExtempSubtotal,
        b.valorAcrescimoExtempItem,
        v_valorAcrescimoExtempGeral);
      IF a.impostosEditados = 0 
          OR v_valorProdutoServico <> b.valorProdutoServico
          OR CASE WHEN a.tipoPagamentoFrete   = 'V' THEN 0 ELSE v_valorFreteTotal END
          <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE a.tipoPagamentoFrete END = 'V' THEN 0 ELSE b.valorFreteTotal END
          OR CASE WHEN a.tipoPagamentoFrete   = 'V' THEN 0 ELSE v_valorSeguroTotal END
          <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE a.tipoPagamentoFrete END = 'V' THEN 0 ELSE b.valorSeguroTotal END
          OR v_valorDescontoTotal <> b.valorDescontoTotal
          OR v_valorOutrasDespesasTotal <> b.valorOutrasDespesasTotal
          OR v_valorAdicFreteMarinMerTotal <> b.valorAdicFreteMarinhaMerTotal
          OR v_valorDespesasAduaneirasTotal <> b.valorDespesasAduaneirasTotal
          OR v_precoUnitario <> b.precoUnitario
          OR v_valorProdutoServico <> b.valorProdutoServico
      THEN
        v_calcularImpostosItem := 1;
      END IF;
      v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
        a.origemDocumento,
        a.nfFornecedor,
        a.tipoPagamentoFrete,
        b.geraFinanceiro,
        v_valorProdutoServico,
        v_valorDescontoPagamento,
        v_valorOutrasDespesasPagamento,
        v_valorJurosPagamento,
        v_valorFreteTotal,
        v_valorSeguroTotal,
        v_valorDescontoTotal,
        v_valorOutrasDespesasTotal,
        b.valorIPIDevolucao,
        b.retidoISSQN,
        b.valorISSQN,
        b.valorRetIRRF,
        b.valorRetINSS,
        b.valorRetPIS,
        b.valorRetCOFINS,
        b.valorRetCSLL,
        b.valorRetOutros,
        b.valorII,
        b.valorIOF,
        b.valorIPI,
        b.valorICMSST,
        b.valorICMSSTEscrituracao,
        b.somarICMSST,
        v_valorAcrescimoExtempTotal,
        b.modDoc_geraFinanceiro);
      v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
        a.nfFornecedor,
        a.tipoPagamentoFrete,
        v_valorProdutoServico,
        v_valorFreteTotal,
        v_valorSeguroTotal,
        v_valorDescontoTotal,
        v_valorOutrasDespesasTotal,
        b.valorIPIDevolucao,
        b.valorII,
        b.valorIOF,
        b.valorIPI,
        b.valorICMSST,
        b.valorICMSSTEscrituracao,
        b.somarICMSST);
      ADD_CALCULA_CUSTO_CMV (
        a.atualizaCustoMedio,
        a.estabelecimento,
        a.nfFornecedor,
        b.modeloDocumento,
        b.quantidade,
        b.valorII,
        b.valorIOF,
        b.valorIPI,
        b.valorIPIDevolucao,
        b.valorPIS,
        b.valorPISST,
        b.valorCOFINS,
        b.valorCOFINSST,
        b.valorCreditoSimplesNacional,
        b.valorICMS,
        b.valorICMSST,
        b.valorICMSSTEscrituracao,
        v_valorLiquidoItem,
        b.valorDescontoCustoOpItem,
        v_valorDescontoCustoOpGeral,
        b.valorAcrescimoCustoOpItem,
        v_valorAcrescimoCustoOpGeral,
        v_valorAcrescimoExtempTotal,
        /* Retornos */
        v_valorDescontoCustoOpTotal,
        v_valorAcrescimoCustoOpTotal,
        v_precoCustoOperacao,
        v_valorCustoOperacao,
        v_precoCMV,
        v_valorCMV);
  
      -- Atualiza Item
      UPDATE MODOCFISCALXITENS SET
        precoUnitario                 = v_precoUnitario,
        precoUnitarioConvertido       = v_precoUnitarioConvertido,
        valorProdutoServico           = v_valorProdutoServico,
        valorFreteGeral               = v_valorFreteGeral,
        valorSeguroGeral              = v_valorSeguroGeral,
        valorDescontoGeral            = v_valorDescontoGeral,
        valorOutrasDespesasGeral      = v_valorOutrasDespesasGeral,
        valorAdicFreteMarinhaMerGeral = v_valorAdicFreteMarinMerGeral,
        valorDespesasAduaneirasGeral  = v_valorDespesasAduaneirasGeral,
        valorBasePagamento            = v_valorBasePagamento,
        valorDescontoPagamento        = v_valorDescontoPagamento,
        valorOutrasDespesasPagamento  = v_valorOutrasDespesasPagamento,
        valorJurosPagamento           = v_valorJurosPagamento,
        valorFreteTotal               = v_valorFreteTotal,
        valorSeguroTotal              = v_valorSeguroTotal,
        valorDescontoTotal            = v_valorDescontoTotal,
        valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
        valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
        valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
        valorLiquidoItem              = v_valorLiquidoItem,
        valorDescontoCustoOpGeral     = v_valorDescontoCustoOpGeral,
        valorDescontoCustoOpTotal     = v_valorDescontoCustoOpTotal,
        valorAcrescimoCustoOpGeral    = v_valorAcrescimoCustoOpGeral,
        valorAcrescimoCustoOpTotal    = v_valorAcrescimoCustoOpTotal,
        precoCustoOperacao            = v_precoCustoOperacao,
        valorCustoOperacao            = v_valorCustoOperacao,
        precoCMV                      = v_precoCMV,
        valorCMV                      = v_valorCMV,
        valorAcrescimoExtempSubtotal  = v_valorAcrescimoExtempSubtotal,
        valorAcrescimoExtempGeral     = v_valorAcrescimoExtempGeral,
        valorAcrescimoExtempTotal     = v_valorAcrescimoExtempTotal
      WHERE idItemDocFiscal           = b.idItemDocFiscal;
      IF b.tipoProduto = '09' THEN
        v_cab_valorServicos            := v_cab_valorServicos + v_valorProdutoServico;
      ELSE
        v_cab_valorProdutos            := v_cab_valorProdutos + v_valorProdutoServico;
      END IF;
      v_cab_valorBasePagamento       := v_cab_valorBasePagamento + v_valorBasePagamento;
      IF b.usarPrecoAVista = 1 AND b.geraFinanceiro = 1 THEN
        v_cab_valorAVistaMinimo        := v_cab_valorAVistaMinimo + v_valorProdutoServico + v_valorDescontoPagamento - v_valorOutrasDespesasPagamento - v_valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
      END IF;
      v_cab_valorFreteTotal          := v_cab_valorFreteTotal + v_valorFreteTotal;
      v_cab_valorSeguroTotal         := v_cab_valorSeguroTotal + v_valorSeguroTotal;
      v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal + v_valorDescontoTotal;
      v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
      v_cab_valorAdicFreteMarinTotal := v_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
      v_cab_valorDespesasAduanTotal  := v_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
      v_cab_valorLiquidoItem         := v_cab_valorLiquidoItem + v_valorLiquidoItem;
      v_cab_valorDescCustoOpTotal    := v_cab_valorDescCustoOpTotal + v_valorDescontoCustoOpTotal;
      v_cab_valorAcrescCustoOpTotal  := v_cab_valorAcrescCustoOpTotal + v_valorAcrescimoCustoOpTotal;
      v_cab_valorCustoOperacao       := v_cab_valorCustoOperacao + v_valorCustoOperacao;
      v_cab_valorCMV                 := v_cab_valorCMV + v_valorCMV;
      v_cab_valorAcrescExtempTotal   := v_cab_valorAcrescExtempTotal + v_valorAcrescimoExtempTotal;
    END LOOP;
    IF v_idItemDocFiscalUltimoItem <> 0
      AND (v_saldoRatDescontoGeral <> 0
        OR v_saldoRatOutrasDespesasGeral <> 0
        OR v_saldoRatDescontoPagamento <> 0
        OR v_saldoRatOutrasDespPagamento <> 0
        OR v_saldoRatJurosPagamento <> 0
        OR v_saldoRatFreteGeral <> 0
        OR v_saldoRatSeguroGeral <> 0
        OR v_saldoRatAdicFreteMarinGeral <> 0
        OR v_saldoRatDespesasAduanGeral <> 0)
    THEN
      -- CALCULA RESÍDUOS
      FOR b IN (
        SELECT
          b.modeloDocumento,
          b.geraFinanceiro,
          b.quantidade,
          b.quantidadeConvertida,
          b.usarPrecoAVista,
          b.precoUnitarioBruto,
          b.acrescimoUnitarioComposicao,
          b.precoUnitario,
          b.precoUnitarioConvertido,
          b.valorProdutoServicoBruto,
          b.valorProdutoServico,
          b.valorDescontoItem,
          b.valorAcrescimoItem,
          b.valorFreteItem,
          b.valorSeguroItem,
          b.valorAdicFreteMarinhaMerItem,
          b.valorDespesasAduaneirasItem,
          b.valorFreteGeral,
          b.valorSeguroGeral,
          b.valorDescontoGeral,
          b.valorOutrasDespesasGeral,
          b.valorAdicFreteMarinhaMerGeral,
          b.valorDespesasAduaneirasGeral,
          b.valorBasePagamento,
          b.valorDescontoPagamento,
          b.valorOutrasDespesasPagamento,
          b.valorJurosPagamento,
          b.valorFreteTotal,
          b.valorSeguroTotal,
          b.valorDescontoTotal,
          b.valorOutrasDespesasTotal,
          b.valorAdicFreteMarinhaMerTotal,
          b.valorDespesasAduaneirasTotal,
          b.valorIPIDevolucao,
          b.retidoISSQN,
          b.valorISSQN,
          b.valorRetIRRF,
          b.valorRetINSS,
          b.valorRetPIS,
          b.valorRetCOFINS,
          b.valorRetCSLL,
          b.valorRetOutros,
          b.valorII,
          b.valorIOF,
          b.valorIPI,
          b.valorPIS,
          b.valorPISST,
          b.valorCOFINS,
          b.valorCOFINSST,
          b.valorCreditoSimplesNacional,
          b.valorICMS,
          b.valorICMSST,
          b.valorICMSSTEscrituracao,
          b.somarICMSST,
          b.valorLiquidoItem,
          b.valorDescontoCustoOpItem,
          b.valorDescontoCustoOpGeral,
          b.valorDescontoCustoOpTotal,
          b.valorAcrescimoCustoOpItem,
          b.valorAcrescimoCustoOpGeral,
          b.valorAcrescimoCustoOpTotal,
          b.precoCustoOperacao,
          b.valorCustoOperacao,
          b.precoCMV,
          b.valorCMV,
          b.quantidadeExtemporanea,
          b.acrescimoUnitarioExtemporaneo,
          b.valorAcrescimoExtempSubtotal,
          b.valorAcrescimoExtempItem,
          b.valorAcrescimoExtempGeral,
          b.valorAcrescimoExtempTotal,
          modDoc.geraFinanceiro modDoc_geraFinanceiro,
          modDoc.diminuiDescontoPrUnit,
          modDoc.somaAcrescimosPrUnit,
          modDoc.somaFreteSeguroPrUnit,
          prod.tipoProduto,
          CASE
            WHEN EXISTS (
              SELECT 1
              FROM CAPRODUTOXCOMPOSICOESPREC compPrec
              WHERE compPrec.produto = gradProd.produto
              AND compPrec.ativo = 1)
            THEN 1
            ELSE 0
          END composicaoPreco
        FROM MODOCFISCALXITENS b
        JOIN PAMODELOSDOCUMENTO modDoc
        ON modDoc.modeloDocumento = b.modeloDocumento
        JOIN CAGRADESPRODUTO gradProd
        ON gradProd.gradeProduto = b.gradeProduto
        JOIN CAPRODUTOS prod
        ON prod.produto = gradProd.produto
        WHERE b.idItemDocFiscal = CASE WHEN v_idItemDocFiscalRateioFrete = 0 THEN v_idItemDocFiscalUltimoItem ELSE v_idItemDocFiscalRateioFrete END
        ORDER BY b.sequencia)
      LOOP
        v_precoUnitario                := b.precoUnitario;
        v_precoUnitarioConvertido      := b.precoUnitarioConvertido;
        v_valorProdutoServico          := b.valorProdutoServico;
        v_valorFreteGeral              := b.valorFreteGeral;
        v_valorSeguroGeral             := b.valorSeguroGeral;
        v_valorDescontoGeral           := b.valorDescontoGeral;
        v_valorOutrasDespesasGeral     := b.valorOutrasDespesasGeral;
        v_valorAdicFreteMarinMerGeral  := b.valorAdicFreteMarinhaMerGeral;
        v_valorDespesasAduaneirasGeral := b.valorDespesasAduaneirasGeral;
        v_valorBasePagamento           := b.valorBasePagamento;
        v_valorDescontoPagamento       := b.valorDescontoPagamento;
        v_valorOutrasDespesasPagamento := b.valorOutrasDespesasPagamento;
        v_valorJurosPagamento          := b.valorJurosPagamento;
        v_valorFreteTotal              := b.valorFreteTotal;
        v_valorSeguroTotal             := b.valorSeguroTotal;
        v_valorDescontoTotal           := b.valorDescontoTotal;
        v_valorOutrasDespesasTotal     := b.valorOutrasDespesasTotal;
        v_valorAdicFreteMarinMerTotal  := b.valorAdicFreteMarinhaMerTotal;
        v_valorDespesasAduaneirasTotal := b.valorDespesasAduaneirasTotal;
        v_valorLiquidoItem             := b.valorLiquidoItem;
        v_valorDescontoCustoOpGeral    := b.valorDescontoCustoOpGeral;
        v_valorDescontoCustoOpTotal    := b.valorDescontoCustoOpTotal;
        v_valorAcrescimoCustoOpGeral   := b.valorAcrescimoCustoOpGeral;
        v_valorAcrescimoCustoOpTotal   := b.valorAcrescimoCustoOpTotal;
        v_precoCustoOperacao           := b.precoCustoOperacao;
        v_valorCustoOperacao           := b.valorCustoOperacao;
        v_precoCMV                     := b.precoCMV;
        v_valorCMV                     := b.valorCMV;
        v_valorAcrescimoExtempSubtotal := b.valorAcrescimoExtempSubtotal;
        v_valorAcrescimoExtempGeral    := b.valorAcrescimoExtempGeral;
        v_valorAcrescimoExtempTotal    := b.valorAcrescimoExtempTotal;    
        IF b.tipoProduto = '09' THEN
          v_cab_valorServicos          := v_cab_valorServicos - v_valorProdutoServico;
        ELSE
          v_cab_valorProdutos          := v_cab_valorProdutos - v_valorProdutoServico;
        END IF;
        v_cab_valorBasePagamento       := v_cab_valorBasePagamento - v_valorBasePagamento;
        IF b.usarPrecoAVista = 1 AND b.geraFinanceiro = 1 THEN
          v_cab_valorAVistaMinimo      := v_cab_valorAVistaMinimo - v_valorProdutoServico - v_valorDescontoPagamento + v_valorOutrasDespesasPagamento + v_valorJurosPagamento + v_valorDescontoTotal - v_valorOutrasDespesasTotal;
        END IF;
        v_cab_valorFreteTotal          := v_cab_valorFreteTotal - v_valorFreteTotal;
        v_cab_valorSeguroTotal         := v_cab_valorSeguroTotal - v_valorSeguroTotal;
        v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal - v_valorDescontoTotal;
        v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal - v_valorOutrasDespesasTotal;
        v_cab_valorAdicFreteMarinTotal := v_cab_valorAdicFreteMarinTotal - v_valorAdicFreteMarinMerTotal;
        v_cab_valorDespesasAduanTotal  := v_cab_valorDespesasAduanTotal - v_valorDespesasAduaneirasTotal;
        v_cab_valorLiquidoItem         := v_cab_valorLiquidoItem - v_valorLiquidoItem;
        v_cab_valorDescCustoOpTotal    := v_cab_valorDescCustoOpTotal - v_valorDescontoCustoOpTotal;
        v_cab_valorAcrescCustoOpTotal  := v_cab_valorAcrescCustoOpTotal - v_valorAcrescimoCustoOpTotal;
        v_cab_valorCustoOperacao       := v_cab_valorCustoOperacao - v_valorCustoOperacao;
        v_cab_valorCMV                 := v_cab_valorCMV - v_valorCMV;
        v_cab_valorAcrescExtempTotal   := v_cab_valorAcrescExtempTotal - v_valorAcrescimoExtempTotal;
        v_valorFreteGeral              := v_valorFreteGeral + v_saldoRatFreteGeral;
        v_valorSeguroGeral             := v_valorSeguroGeral + v_saldoRatSeguroGeral;
        v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral + v_saldoRatAdicFreteMarinGeral;
        v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + v_saldoRatDespesasAduanGeral;
        v_valorDescontoGeral           := v_valorDescontoGeral + v_saldoRatDescontoGeral;
        v_valorOutrasDespesasGeral     := v_valorDespesasAduaneirasGeral + v_saldoRatOutrasDespesasGeral;
        v_valorDescontoPagamento       := v_valorDescontoPagamento + v_saldoRatDescontoPagamento;
        v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + v_saldoRatOutrasDespPagamento;
        v_valorJurosPagamento          := v_valorJurosPagamento + v_saldoRatJurosPagamento;
        v_valorDescontoCustoOpGeral    := v_valorDescontoCustoOpGeral + v_saldoRatDescCustoOpGeral;
        v_valorAcrescimoCustoOpGeral   := v_valorAcrescimoCustoOpGeral + v_saldoRatAcrescCustoOpGeral;
        v_valorAcrescimoExtempGeral    := v_valorAcrescimoExtempGeral + v_saldoRatAcrescExtempGeral;
        ADD_CALCULA_TOTAIS_ITEM (
          a.tipoPagamentoFrete,
          b.quantidade,
          b.quantidadeConvertida,
          b.precoUnitarioBruto,
          b.acrescimoUnitarioComposicao,
          b.precoUnitario,
          b.valorDescontoItem,
          b.valorAcrescimoItem,
          b.valorFreteItem,
          b.valorSeguroItem,
          b.valorAdicFreteMarinhaMerItem,
          b.valorDespesasAduaneirasItem,
          v_valorFreteGeral,
          v_valorSeguroGeral,
          v_valorDescontoGeral,
          v_valorOutrasDespesasGeral,
          v_valorAdicFreteMarinMerGeral,
          v_valorDespesasAduaneirasGeral,
          v_valorDescontoPagamento,
          v_valorOutrasDespesasPagamento,
          v_valorJurosPagamento,
          b.diminuiDescontoPrUnit,
          b.somaAcrescimosPrUnit,
          b.somaFreteSeguroPrUnit,
          b.composicaoPreco,
          /* Retornos */
          v_precoUnitario,
          v_precoUnitarioConvertido,
          v_valorProdutoServico,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          v_valorAdicFreteMarinMerTotal,
          v_valorDespesasAduaneirasTotal);
        v_valorAcrescimoExtempSubtotal := FUNC_ADD_CALC_EXTEMP_SUBTOTAL (
          b.quantidade,
          v_precoUnitario,
          b.quantidadeExtemporanea,
          b.acrescimoUnitarioExtemporaneo);
        v_valorAcrescimoExtempTotal := FUNC_ADD_CALC_EXTEMP_TOTAL (
          v_valorAcrescimoExtempSubtotal,
          b.valorAcrescimoExtempItem,
          v_valorAcrescimoExtempGeral);
        IF a.impostosEditados = 0 
            OR v_valorProdutoServico <> b.valorProdutoServico
            OR CASE WHEN a.tipoPagamentoFrete = 'V' THEN 0 ELSE v_valorFreteTotal END
            <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE a.tipoPagamentoFrete END = 'V' THEN 0 ELSE b.valorFreteTotal END
            OR CASE WHEN a.tipoPagamentoFrete = 'V' THEN 0 ELSE v_valorSeguroTotal END
            <> CASE WHEN CASE WHEN p_troca_tipoPagamentoFrete = 1 THEN p_a_cab_tipoPagamentoFrete ELSE a.tipoPagamentoFrete END = 'V' THEN 0 ELSE b.valorSeguroTotal END
            OR v_valorDescontoTotal <> b.valorDescontoTotal
            OR v_valorOutrasDespesasTotal <> b.valorOutrasDespesasTotal
            OR v_valorAdicFreteMarinMerTotal <> b.valorAdicFreteMarinhaMerTotal
            OR v_valorDespesasAduaneirasTotal <> b.valorDespesasAduaneirasTotal
            OR v_precoUnitario <> b.precoUnitario
            OR v_valorProdutoServico <> b.valorProdutoServico
        THEN
          v_calcularImpostosItem := 1;
        END IF;
        v_valorBasePagamento := FUNC_ADD_CALC_BASE_PAGAMENTO (
          a.origemDocumento,
          a.nfFornecedor,
          a.tipoPagamentoFrete,
          b.geraFinanceiro,
          v_valorProdutoServico,
          v_valorDescontoPagamento,
          v_valorOutrasDespesasPagamento,
          v_valorJurosPagamento,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          b.valorIPIDevolucao,
          b.retidoISSQN,
          b.valorISSQN,
          b.valorRetIRRF,
          b.valorRetINSS,
          b.valorRetPIS,
          b.valorRetCOFINS,
          b.valorRetCSLL,
          b.valorRetOutros,
          b.valorII,
          b.valorIOF,
          b.valorIPI,
          b.valorICMSST,
          b.valorICMSSTEscrituracao,
          b.somarICMSST,
          v_valorAcrescimoExtempTotal,
          b.modDoc_geraFinanceiro);
        v_valorLiquidoItem := FUNC_ADD_CALC_VALOR_LIQUIDO (
          a.nfFornecedor,
          a.tipoPagamentoFrete,
          v_valorProdutoServico,
          v_valorFreteTotal,
          v_valorSeguroTotal,
          v_valorDescontoTotal,
          v_valorOutrasDespesasTotal,
          b.valorIPIDevolucao,
          b.valorII,
          b.valorIOF,
          b.valorIPI,
          b.valorICMSST,
          b.valorICMSSTEscrituracao,
          b.somarICMSST);
        ADD_CALCULA_CUSTO_CMV (
          a.atualizaCustoMedio,
          a.estabelecimento,
          a.nfFornecedor,
          b.modeloDocumento,
          b.quantidade,
          b.valorII,
          b.valorIOF,
          b.valorIPI,
          b.valorIPIDevolucao,
          b.valorPIS,
          b.valorPISST,
          b.valorCOFINS,
          b.valorCOFINSST,
          b.valorCreditoSimplesNacional,
          b.valorICMS,
          b.valorICMSST,
          b.valorICMSSTEscrituracao,
          v_valorLiquidoItem,
          b.valorDescontoCustoOpItem,
          v_valorDescontoCustoOpGeral,
          b.valorAcrescimoCustoOpItem,
          v_valorAcrescimoCustoOpGeral,
          v_valorAcrescimoExtempTotal,
          /* Retornos */
          v_valorDescontoCustoOpTotal,
          v_valorAcrescimoCustoOpTotal,
          v_precoCustoOperacao,
          v_valorCustoOperacao,
          v_precoCMV,
          v_valorCMV);
        UPDATE MODOCFISCALXITENS SET
          precoUnitario                 = v_precoUnitario,
          precoUnitarioConvertido       = v_precoUnitarioConvertido,
          valorProdutoServico           = v_valorProdutoServico,
          valorFreteGeral               = v_valorFreteGeral,
          valorSeguroGeral              = v_valorSeguroGeral,
          valorDescontoGeral            = v_valorDescontoGeral,
          valorOutrasDespesasGeral      = v_valorOutrasDespesasGeral,
          valorAdicFreteMarinhaMerGeral = v_valorAdicFreteMarinMerGeral,
          valorDespesasAduaneirasGeral  = v_valorDespesasAduaneirasGeral,
          valorBasePagamento            = v_valorBasePagamento,
          valorDescontoPagamento        = v_valorDescontoPagamento,
          valorOutrasDespesasPagamento  = v_valorOutrasDespesasPagamento,
          valorJurosPagamento           = v_valorJurosPagamento,
          valorFreteTotal               = v_valorFreteTotal,
          valorSeguroTotal              = v_valorSeguroTotal,
          valorDescontoTotal            = v_valorDescontoTotal,
          valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
          valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
          valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
          valorLiquidoItem              = v_valorLiquidoItem,
          valorDescontoCustoOpGeral     = v_valorDescontoCustoOpGeral,
          valorDescontoCustoOpTotal     = v_valorDescontoCustoOpTotal,
          valorAcrescimoCustoOpGeral    = v_valorAcrescimoCustoOpGeral,
          valorAcrescimoCustoOpTotal    = v_valorAcrescimoCustoOpTotal,
          precoCustoOperacao            = v_precoCustoOperacao,
          valorCustoOperacao            = v_valorCustoOperacao,
          precoCMV                      = v_precoCMV,
          valorCMV                      = v_valorCMV,
          valorAcrescimoExtempSubtotal  = v_valorAcrescimoExtempSubtotal,
          valorAcrescimoExtempGeral     = v_valorAcrescimoExtempGeral,
          valorAcrescimoExtempTotal     = v_valorAcrescimoExtempTotal
        WHERE idItemDocFiscal           = CASE WHEN v_idItemDocFiscalRateioFrete = 0 THEN v_idItemDocFiscalUltimoItem ELSE v_idItemDocFiscalRateioFrete END;
        IF b.tipoProduto = '09' THEN
          v_cab_valorServicos            := v_cab_valorServicos + v_valorProdutoServico;
        ELSE
          v_cab_valorProdutos            := v_cab_valorProdutos + v_valorProdutoServico;
        END IF;
        v_cab_valorBasePagamento       := v_cab_valorBasePagamento + v_valorBasePagamento;
        IF b.usarPrecoAVista = 1 AND b.geraFinanceiro = 1 THEN
          v_cab_valorAVistaMinimo        := v_cab_valorAVistaMinimo + v_valorProdutoServico + v_valorDescontoPagamento - v_valorOutrasDespesasPagamento - v_valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
        END IF;
        v_cab_valorFreteTotal          := v_cab_valorFreteTotal + v_valorFreteTotal;
        v_cab_valorSeguroTotal         := v_cab_valorSeguroTotal + v_valorSeguroTotal;
        v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal + v_valorDescontoTotal;
        v_cab_valorOutrasDespesasTotal := v_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
        v_cab_valorAdicFreteMarinTotal := v_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
        v_cab_valorDespesasAduanTotal  := v_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
        v_cab_valorLiquidoItem         := v_cab_valorLiquidoItem + v_valorLiquidoItem;
        v_cab_valorDescCustoOpTotal    := v_cab_valorDescCustoOpTotal + v_valorDescontoCustoOpTotal;
        v_cab_valorAcrescCustoOpTotal  := v_cab_valorAcrescCustoOpTotal + v_valorAcrescimoCustoOpTotal;
        v_cab_valorCustoOperacao       := v_cab_valorCustoOperacao + v_valorCustoOperacao;
        v_cab_valorCMV                 := v_cab_valorCMV + v_valorCMV;
        v_cab_valorAcrescExtempTotal   := v_cab_valorAcrescExtempTotal + v_valorAcrescimoExtempTotal;
      END LOOP;
    END IF;
    -- CÁLCULO IMPOSTOS
    IF v_calcularImpostosItem = 1 THEN
      v_cab_valorProdutos            := 0;
      v_cab_valorServicos            := 0;
      v_cab_valorBasePagamento       := 0;
      v_cab_valorAVistaMinimo        := 0;
      v_cab_valorFreteTotal          := 0;
      v_cab_valorSeguroTotal         := 0;
      v_cab_valorDescontoTotal       := 0;
      v_cab_valorOutrasDespesasTotal := 0;
      v_cab_valorAdicFreteMarinTotal := 0;
      v_cab_valorDespesasAduanTotal  := 0;
      v_cab_valorLiquidoItem         := 0;
      v_cab_valorDescCustoOpTotal    := 0;
      v_cab_valorAcrescCustoOpTotal  := 0;
      v_cab_valorCustoOperacao       := 0;
      v_cab_valorCMV                 := 0;
      v_cab_valorAcrescExtempTotal   := 0;
      v_residuoISSQN                 := 0;
      v_residuoRetIRRF               := 0;
      v_residuoRetINSS               := 0;
      v_residuoRetPIS                := 0;
      v_residuoRetCOFINS             := 0;
      v_residuoRetCSLL               := 0;
      v_residuoRetOutros             := 0;
      FOR b IN (
        SELECT
          b.idItemDocFiscal,
          b.modeloDocumento,
          b.personalizacao,
          b.quantidade,
          b.quantidadeConvertida,
          b.usarPrecoAVista,
          b.precoUnitarioBruto,
          b.acrescimoUnitarioComposicao,
          b.precoUnitario,
          b.precoUnitarioConvertido,
          b.valorProdutoServico,
          b.valorDescontoItem,
          b.valorAcrescimoItem,
          b.valorFreteItem,
          b.valorSeguroItem,
          b.valorAdicFreteMarinhaMerItem,
          b.valorDespesasAduaneirasItem,
          b.quantidadeExtemporanea,
          b.acrescimoUnitarioExtemporaneo,
          b.valorAcrescimoExtempSubtotal,
          b.valorAcrescimoExtempItem,
          b.valorDescontoCustoOpItem,
          b.valorAcrescimoCustoOpItem,
          b.valorFreteGeral,
          b.valorSeguroGeral,
          b.valorDescontoGeral,
          b.valorOutrasDespesasGeral,
          b.valorAdicFreteMarinhaMerGeral,
          b.valorDespesasAduaneirasGeral,
          b.valorAcrescimoExtempGeral,
          b.valorDescontoCustoOpGeral,
          b.valorAcrescimoCustoOpGeral,
          b.valorBasePagamento,
          b.valorDescontoPagamento,
          b.valorOutrasDespesasPagamento,
          b.valorJurosPagamento,
          b.valorFreteTotal,
          b.valorSeguroTotal,
          b.valorDescontoTotal,
          b.valorOutrasDespesasTotal,
          b.valorAdicFreteMarinhaMerTotal,
          b.valorDespesasAduaneirasTotal,
          b.valorAcrescimoExtempTotal,
          b.valorDescontoCustoOpTotal,
          b.valorAcrescimoCustoOpTotal,
          b.valorIPIDevolucao,
          b.geraFinanceiro,
          b.cfop,
          b.indicadorISSQN,
          b.aliquotaISSQN,
          b.retidoISSQN,
          b.retencaoIRRF,
          b.retencaoINSS,
          b.retencaoPIS,
          b.retencaoCOFINS,
          b.retencaoCSLL,
          b.retencaoOutros,
          b.aliquotaII,
          b.aliquotaIOF,
          b.aliquotaIPI,
          b.valorAliquotaIPI,
          b.aliquotaPIS,
          b.valorAliquotaPIS,
          b.aliquotaPISST,
          b.valorAliquotaPISST,
          b.aliquotaCOFINS,
          b.valorAliquotaCOFINS,
          b.aliquotaCOFINSST,
          b.valorAliquotaCOFINSST,
          b.stSimplesNacional,
          b.creditoSimplesNacional,
          b.stICMS,
          b.modalidadeBaseCalcICMS,
          b.reducaoBaseICMS,
          b.aliquotaICMS,
          b.diferimentoICMS,
          b.modalidadeBaseCalcICMSST,
          b.margemValorAdicionadoST,
          b.reducaoBaseST,
          b.aliquotaICMSST,
          b.reducaoBaseICMSEfetivo,
          b.aliquotaICMSEfetivo,
          b.stICMSEscrituracao,
          b.reducaoBaseICMSEscrituracao,
          b.aliquotaICMSEscrituracao,
          b.diferimentoICMSEscrituracao,
          b.margemValorAdicSTEscrituracao,
          b.reducaoBaseSTEscrituracao,
          b.aliquotaICMSSTEscrituracao,
          b.somarICMSST,
          b.aliquotaICMSUFDestinatario,
          b.aliquotaICMSInterestadual,
          b.partilhaICMSInterestadual,
          b.aliquotaFCP,
          b.aliquotaFCPST,
          b.aliquotaFCPSTAnteriormente,
          b.aliquotaFCPUFDestinatario,
          b.aliquotaEstimadaImpFederais,
          b.aliquotaEstimadaImpEstaduais,
          b.aliquotaEstimadaImpMunicipais,
          b.baseISSQN,
          b.valorISSQN,
          b.baseRetIRRF,
          b.valorRetIRRF,
          b.baseRetINSS,
          b.valorRetINSS,
          b.baseRetOutros,
          b.valorRetOutros,
          b.baseRetPIS,
          b.valorRetPIS,
          b.baseRetCOFINS,
          b.valorRetCOFINS,
          b.baseRetCSLL,
          b.valorRetCSLL,
          b.baseII,
          b.valorII,
          b.baseIOF,
          b.valorIOF,
          b.baseIPI,
          b.valorIPI,
          b.basePIS,
          b.valorPIS,
          b.basePISST,
          b.valorPISST,
          b.baseCOFINS,
          b.valorCOFINS,
          b.baseCOFINSST,
          b.valorCOFINSST,
          b.baseCreditoSimplesNacional,
          b.valorCreditoSimplesNacional,
          b.baseICMS,
          b.valorICMSOperacao,
          b.valorICMSDiferido,
          b.valorICMS,
          b.valorICMSDesoneracao,
          b.baseICMSST,
          b.valorICMSST,
          b.baseICMSSTAnteriormente,
          b.valorICMSSTAnteriormente,
          b.valorICMSProprioSubstituto,
          b.baseICMSEfetivo,
          b.valorICMSEfetivo,
          b.baseICMSEscrituracao,
          b.valorICMSEscrituracao,
          b.valorICMSDesonEscrituracao,
          b.baseICMSSTEscrituracao,
          b.valorICMSSTEscrituracao,
          b.baseICMSUFDestinatario,
          b.valorICMSUFDestinatario,
          b.baseICMSUFRemetente,
          b.valorICMSUFRemetente,
          b.baseFCP,
          b.valorFCP,
          b.baseFCPST,
          b.valorFCPST,
          b.baseFCPSTAnteriormente,
          b.valorFCPSTAnteriormente,
          b.baseFCPUFDestinatario,
          b.valorFCPUFDestinatario,
          b.baseEstimadaImpostos,
          b.valorEstimadoImpFederais,
          b.valorEstimadoImpEstaduais,
          b.valorEstimadoImpMunicipais,
          b.valorLiquidoItem,
          b.precoCustoOperacao,
          b.valorCustoOperacao,
          b.precoCMV,
          b.valorCMV,
          gradProd.produto,
          gradProd.cor,
          gradProd.tamanho,
          prod.controleEstoque,
          prod.tipoProduto,
          prod.precoPautaTabelado,
          modDoc.geraFinanceiro modDoc_geraFinanceiro,
          modDoc.diminuiDescontoPrUnit,
          modDoc.somaAcrescimosPrUnit,
          modDoc.somaFreteSeguroPrUnit,
          CASE
            WHEN EXISTS (
