SET DEFINE OFF;

UPDATE SIMEIOSPAGAMENTO SET formaPagamentoNfe = 19 WHERE meioPagamento = 16;
UPDATE SIMEIOSPAGAMENTO SET formaPagamentoNfe = 5  WHERE meioPagamento = 31;
UPDATE SIMEIOSPAGAMENTO SET formaPagamentoNfe = 90 WHERE meioPagamento = 38;

COMMIT;

DROP INDEX PADESONERACOESFISCAIS_K2;
CREATE UNIQUE INDEX PADESONERACOESFISCAIS_K2 ON PADESONERACOESFISCAIS (idNcm, produto, origemMercadoria, estabelecimento, ufOrigem, pessoa, stICMS);

create or replace PROCEDURE ADD_ITEM_DESON_FISCAL_BUSCA (
    p_cab_tipoDocumento            IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_pessoa                   IN NUMBER,
    p_cab_vendaConsumidor          IN NUMBER,
    p_endEst_UF                    IN CHAR,
    p_endPess_UF                   IN CHAR,
    p_stICMS                       IN CHAR,
    p_gradProd_produto             IN NUMBER,
    p_prod_origemMercadoria        IN CHAR,
    p_prod_idNcm                   IN NUMBER,
    r_encontouDesoneracao          OUT NUMBER,
    r_modalidadeBaseCalcICMS       OUT CHAR,
    r_reducaoBaseICMS              OUT NUMBER,
    r_aliquotaICMS                 OUT NUMBER,
    r_diferimentoICMS              OUT NUMBER,
    r_motivoDesoneracaoICMS        OUT CHAR,
    r_idBeneficio                  OUT NUMBER,
    r_informacaoComplementar       OUT NUMBER)
IS
BEGIN
  SELECT
    COALESCE(MAX(a.encontouDesoneracao),0),
    COALESCE(MAX(a.modalidadeBaseCalcICMS),' '),
    COALESCE(MAX(a.reducaoBaseICMS),0),
    COALESCE(MAX(a.aliquotaICMS),0),
    COALESCE(MAX(a.diferimentoICMS),0),
    COALESCE(MAX(a.motivoDesoneracaoICMS),'  '),
    COALESCE(MAX(a.idBeneficio),0),
    COALESCE(MAX(a.informacaoComplementar),0)
  INTO
    r_encontouDesoneracao,
    r_modalidadeBaseCalcICMS,
    r_reducaoBaseICMS,
    r_aliquotaICMS,
    r_diferimentoICMS,
    r_motivoDesoneracaoICMS,
    r_idBeneficio,
    r_informacaoComplementar
  FROM (
    SELECT
      1 encontouDesoneracao,
      modalidadeBaseCalcICMS,
      reducaoBaseICMS,
      aliquotaICMS,
      diferimentoICMS,
      motivoDesoneracaoICMS,
      idBeneficio,
      informacaoComplementar,
      ROW_NUMBER() OVER (
        ORDER BY
          produto          DESC,
          idNCM            DESC,
          origemMercadoria DESC,
          estabelecimento  DESC,
          ufOrigem         DESC,
          pessoa           DESC,
          stICMS           DESC
        ) rowNumber
    FROM PADESONERACOESFISCAIS
    WHERE idDesoneracaoFiscal > 0
    AND ativo                 = 1
    AND (idNcm                = 0
      OR idNcm                = p_prod_idNcm)
    AND (produto              = 0
      OR produto              = p_gradProd_produto)
    AND (origemMercadoria     = ' '
      OR origemMercadoria     = p_prod_origemMercadoria)
    AND (estabelecimento      = 0
      OR estabelecimento      = p_cab_estabelecimento)
    AND (ufOrigem             = ' '
      OR ufOrigem             = '  '
      OR ufOrigem             =
        CASE
          WHEN p_cab_entradaSaida  = 'S'
          OR p_endPess_UF          = '  '
          OR p_cab_vendaConsumidor = 1
          OR p_cab_tipoDocumento IN (503,504)
          THEN p_endEst_UF
          ELSE p_endPess_UF
        END)
    AND (pessoa               = 0
      OR pessoa               = p_cab_pessoa)
    AND (stICMS               = '  '
      OR stICMS               = p_stICMS)
  ) a
  WHERE a.rowNumber = 1;
END ADD_ITEM_DESON_FISCAL_BUSCA;

/

create or replace PROCEDURE ADD_ITEM_OPERACAO_FISCAL_BUSCA (
    p_inserindoItem                IN NUMBER,
    p_cab_origemDocumento          IN NUMBER,
    p_cab_tipoDocumento            IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_devolucaoAnulacaoRetorno IN NUMBER,
    p_cab_finalidadeNota           IN CHAR,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_nfFornecedor             IN NUMBER,
    p_cab_dataEmissao              IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_cab_vendaConsumidor          IN NUMBER,
    p_cab_enderecoEntregaPessoa    IN NUMBER,
    p_cab_localDestinoOperacao     IN CHAR,
    p_cab_indicadorConsumidorFinal IN CHAR,
    p_modDoc_movimentaEstoque      IN NUMBER,
    p_modDoc_geraFinanceiro        IN NUMBER,
    p_munEndEst_uf                 IN CHAR,
    p_pess_indicadorInscricaoEstad IN CHAR,
    p_endPess_enderecoPessoa       IN NUMBER,
    p_munEndPess_uf                IN CHAR,
    p_munEndEntr_uf                IN CHAR,
    p_item_operacaoFiscal          IN NUMBER,
    p_gradProd_produto             IN NUMBER,
    p_prod_tipoProduto             IN CHAR,
    p_prod_origemMercadoria        IN CHAR,
    p_prod_idNcm                   IN NUMBER,
    p_prod_listaServicos           IN NUMBER,
    p_movimentaEstoque             IN NUMBER,
    p_geraFinanceiro               IN NUMBER,
    p_item_cfop                    IN NUMBER,
    p_atualizarISSQN               IN NUMBER,
    p_item_indicadorISSQN          IN CHAR,
    p_item_aliquotaISSQN           IN NUMBER,
    p_atualizarIRRF                IN NUMBER,
    p_item_aliquotaIRRF            IN NUMBER,
    p_atualizarINSS                IN NUMBER,
    p_item_aliquotaINSS            IN NUMBER,
    p_atualizarRetencaoPIS         IN NUMBER,
    p_item_retencaoPIS             IN NUMBER,
    p_atualizarRetencaoCOFINS      IN NUMBER,
    p_item_retencaoCOFINS          IN NUMBER,
    p_atualizarRetencaoCSLL        IN NUMBER,
    p_item_retencaoCSLL            IN NUMBER,
    p_atualizarII                  IN NUMBER,
    p_item_aliquotaII              IN NUMBER,
    p_atualizarIOF                 IN NUMBER,
    p_item_aliquotaIOF             IN NUMBER,
    p_atualizarIPI                 IN NUMBER,
    p_item_codigoEnquadramentoIPI  IN NUMBER,
    p_item_stIPI                   IN CHAR,
    p_item_aliquotaIPI             IN NUMBER,
    p_item_valorAliquotaIPI        IN NUMBER,
    p_atualizarPIS                 IN NUMBER,
    p_item_stPIS                   IN CHAR,
    p_item_aliquotaPIS             IN NUMBER,
    p_item_valorAliquotaPIS        IN NUMBER,
    p_atualizarPISST               IN NUMBER,
    p_item_aliquotaPISST           IN NUMBER,
    p_item_valorAliquotaPISST      IN NUMBER,
    p_atualizarCOFINS              IN NUMBER,
    p_item_stCOFINS                IN CHAR,
    p_item_aliquotaCOFINS          IN NUMBER,
    p_item_valorAliquotaCOFINS     IN NUMBER,
    p_atualizarCOFINSST            IN NUMBER,
    p_item_aliquotaCOFINSST        IN NUMBER,
    p_item_valorAliquotaCOFINSST   IN NUMBER,
    p_atualizarSimplesNacional     IN NUMBER,
    p_item_stSimplesNacional       IN CHAR,
    p_item_creditoSimplesNacional  IN NUMBER,
    p_atualizarICMS                IN NUMBER,
    p_item_stICMS                  IN CHAR,
    p_item_modalidadeBaseCalcICMS  IN CHAR,
    p_item_reducaoBaseICMS         IN NUMBER,
    p_item_aliquotaICMS            IN NUMBER,
    p_item_diferimentoICMS         IN NUMBER,
    p_item_motivoDesoneracaoICMS   IN CHAR,
    p_item_idBeneficio             IN NUMBER,
    p_atualizarICMSST              IN NUMBER,
    p_item_modalBaseCalcICMSST     IN CHAR,
    p_item_margemValorAdicST       IN NUMBER,
    p_item_reducaoBaseST           IN NUMBER,
    p_item_aliquotaICMSST          IN NUMBER,
    p_atualizarICMSSTAnteriorEfet  IN NUMBER,
    p_item_aliquotaSTSuportConsF   IN NUMBER,
    p_item_reducaoBaseICMSEfetivo  IN NUMBER,
    p_item_aliquotaICMSEfetivo     IN NUMBER,
    p_atualizarICMSEscrituracao    IN NUMBER,
    p_item_stICMSEscrit            IN CHAR,
    p_item_reducaoBaseICMSEscrit   IN NUMBER,
    p_item_aliquotaICMSEscrit      IN NUMBER,
    p_atualizarICMSSTEscrituracao  IN NUMBER,
    p_item_margemValorAdicSTEscrit IN NUMBER,
    p_item_reducaoBaseSTEscrit     IN NUMBER,
    p_item_aliquotaICMSSTEscrit    IN NUMBER,
    p_item_somarICMSST             IN NUMBER,
    p_atualizarDIFAL               IN NUMBER,
    p_item_aliquotaICMSUFDestinat  IN NUMBER,
    p_item_aliquotaICMSInterestad  IN NUMBER,
    p_item_partilhaICMSInterestad  IN NUMBER,
    p_atualizarFCP                 IN NUMBER,
    p_item_aliquotaFCP             IN NUMBER,
    p_item_aliquotaFCPST           IN NUMBER,
    p_item_aliquotaFCPSTAnteriorm  IN NUMBER,
    p_item_aliquotaFCPUFDestinat   IN NUMBER,
    p_atualizarImpostosEstimados   IN NUMBER,
    p_item_aliquotaEstImpFederais  IN NUMBER,
    p_item_aliquotaEstImpEstaduais IN NUMBER,
    p_item_aliquotaEstImpMunicipai IN NUMBER,
    /* Retornos */
    r_encontrouRegistro            OUT NUMBER,
    r_movimentaEstoque             OUT NUMBER,
    r_geraFinanceiro               OUT NUMBER,
    r_item_cfop                    OUT NUMBER,
    r_item_indicadorISSQN          OUT CHAR,
    r_item_aliquotaISSQN           OUT NUMBER,
    r_item_aliquotaIRRF            OUT NUMBER,
    r_item_aliquotaINSS            OUT NUMBER,
    r_item_retencaoPIS             OUT NUMBER,
    r_item_retencaoCOFINS          OUT NUMBER,
    r_item_retencaoCSLL            OUT NUMBER,
    r_item_aliquotaII              OUT NUMBER,
    r_item_aliquotaIOF             OUT NUMBER,
    r_item_codigoEnquadramentoIPI  OUT NUMBER,
    r_item_stIPI                   OUT CHAR,
    r_item_aliquotaIPI             OUT NUMBER,
    r_item_valorAliquotaIPI        OUT NUMBER,
    r_item_stPIS                   OUT CHAR,
    r_item_aliquotaPIS             OUT NUMBER,
    r_item_valorAliquotaPIS        OUT NUMBER,
    r_item_aliquotaPISST           OUT NUMBER,
    r_item_valorAliquotaPISST      OUT NUMBER,
    r_item_stCOFINS                OUT CHAR,
    r_item_aliquotaCOFINS          OUT NUMBER,
    r_item_valorAliquotaCOFINS     OUT NUMBER,
    r_item_aliquotaCOFINSST        OUT NUMBER,
    r_item_valorAliquotaCOFINSST   OUT NUMBER,
    r_item_stSimplesNacional       OUT CHAR,
    r_item_creditoSimplesNacional  OUT NUMBER,
    r_item_stICMS                  OUT CHAR,
    r_item_modalidadeBaseCalcICMS  OUT CHAR,
    r_item_reducaoBaseICMS         OUT NUMBER,
    r_item_aliquotaICMS            OUT NUMBER,
    r_item_diferimentoICMS         OUT NUMBER,
    r_item_motivoDesoneracaoICMS   OUT CHAR,
    r_item_idBeneficio             OUT NUMBER,
    r_item_modalBaseCalcICMSST     OUT CHAR,
    r_item_margemValorAdicST       OUT NUMBER,
    r_item_reducaoBaseST           OUT NUMBER,
    r_item_aliquotaICMSST          OUT NUMBER,
    r_item_aliquotaSTSuportConsF   OUT NUMBER,
    r_item_reducaoBaseICMSEfetivo  OUT NUMBER,
    r_item_aliquotaICMSEfetivo     OUT NUMBER,
    r_item_stICMSEscrit            OUT CHAR,
    r_item_reducaoBaseICMSEscrit   OUT NUMBER,
    r_item_aliquotaICMSEscrit      OUT NUMBER,
    r_item_margemValorAdicSTEscrit OUT NUMBER,
    r_item_reducaoBaseSTEscrit     OUT NUMBER,
    r_item_aliquotaICMSSTEscrit    OUT NUMBER,
    r_item_somarICMSST             OUT NUMBER,
    r_item_aliquotaICMSUFDestinat  OUT NUMBER,
    r_item_aliquotaICMSInterestad  OUT NUMBER,
    r_item_partilhaICMSInterestad  OUT NUMBER,
    r_item_aliquotaFCP             OUT NUMBER,
    r_item_aliquotaFCPST           OUT NUMBER,
    r_item_aliquotaFCPSTAnteriorm  OUT NUMBER,
    r_item_aliquotaFCPUFDestinat   OUT NUMBER,
    r_item_aliquotaEstImpFederais  OUT NUMBER,
    r_item_aliquotaEstImpEstaduais OUT NUMBER,
    r_item_aliquotaEstImpMunicipai OUT NUMBER)    
IS    
    v_auxNumber                    NUMBER;
    v_auxVarchar                   VARCHAR2(60);  
    v_encontouDesoneracao          NUMBER;
    CURSOR c_opFisc IS
      SELECT
        opFisc.contaContabilDebito,
        opFisc.contaContabilCredito,
        opFisc.historicoContabil,
        opFisc.cfop,
        cfop.geraFinanceiro,
        opFisc.indicadorISSQN,
        opFisc.aliquotaISSQN,
        opFisc.aliquotaIRRF,
        opFisc.aliquotaINSS,
        opFisc.retencaoPIS,
        opFisc.retencaoCOFINS,
        opFisc.retencaoCSLL,
        opFisc.aliquotaII,
        opFisc.aliquotaIOF,
        opFisc.codigoEnquadramentoIPI,
        opFisc.stIPI,
        opFisc.aliquotaIPI,
        opFisc.valorAliquotaIPI,
        opFisc.stPIS,
        opFisc.aliquotaPIS,
        opFisc.valorAliquotaPIS,
        opFisc.aliquotaPISST,
        opFisc.valorAliquotaPISST,
        opFisc.stCOFINS,
        opFisc.aliquotaCOFINS,
        opFisc.valorAliquotaCOFINS,
        opFisc.aliquotaCOFINSST,
        opFisc.valorAliquotaCOFINSST,
        opFisc.stSimplesNacional,
        opFisc.creditoSimplesNacional,
        opFisc.stICMS,
        opFisc.modalidadeBaseCalcICMS,
        opFisc.reducaoBaseICMS,
        opFisc.aliquotaICMS,
        opFisc.diferimentoICMS,
        opFisc.motivoDesoneracaoICMS,
        opFisc.idBeneficio,
        opFisc.modalidadeBaseCalcICMSST,
        opFisc.margemValorAdicionadoST,
        opFisc.reducaoBaseST,
        opFisc.aliquotaICMSST,
        opFisc.aliquotaSTSuportConsFinal,
        opFisc.reducaoBaseICMSEfetivo,
        opFisc.aliquotaICMSEfetivo,
        opFisc.aliquotaICMSUFDestinatario,
        opFisc.aliquotaICMSInterestadual,
        opFisc.partilhaICMSInterestadual,
        opFisc.aliquotaFCP,
        opFisc.aliquotaFCPST,
        opFisc.aliquotaFCPSTAnteriormente,
        opFisc.aliquotaFCPUFDestinatario
      FROM PAOPERACOESFISCAIS opFisc
      JOIN SICFOPS cfop ON opFisc.cfop = cfop.cfop
      WHERE opFisc.operacaoFiscal = p_item_operacaoFiscal;
BEGIN
  r_movimentaEstoque             := p_movimentaEstoque;
  r_geraFinanceiro               := p_geraFinanceiro;
  r_item_cfop                    := p_item_cfop;
  r_item_indicadorISSQN          := p_item_indicadorISSQN;
  r_item_aliquotaISSQN           := p_item_aliquotaISSQN;
  r_item_aliquotaIRRF            := p_item_aliquotaIRRF;
  r_item_aliquotaINSS            := p_item_aliquotaINSS;
  r_item_retencaoPIS             := p_item_retencaoPIS;
  r_item_retencaoCOFINS          := p_item_retencaoCOFINS;
  r_item_retencaoCSLL            := p_item_retencaoCSLL;
  r_item_aliquotaII              := p_item_aliquotaII;
  r_item_aliquotaIOF             := p_item_aliquotaIOF;
  r_item_codigoEnquadramentoIPI  := p_item_codigoEnquadramentoIPI;
  r_item_stIPI                   := p_item_stIPI;
  r_item_aliquotaIPI             := p_item_aliquotaIPI;
  r_item_valorAliquotaIPI        := p_item_valorAliquotaIPI;
  r_item_stPIS                   := p_item_stPIS;
  r_item_aliquotaPIS             := p_item_aliquotaPIS;
  r_item_valorAliquotaPIS        := p_item_valorAliquotaPIS;
  r_item_aliquotaPISST           := p_item_aliquotaPISST;
  r_item_valorAliquotaPISST      := p_item_valorAliquotaPISST;
  r_item_stCOFINS                := p_item_stCOFINS;
  r_item_aliquotaCOFINS          := p_item_aliquotaCOFINS;
  r_item_valorAliquotaCOFINS     := p_item_valorAliquotaCOFINS;
  r_item_aliquotaCOFINSST        := p_item_aliquotaCOFINSST;
  r_item_valorAliquotaCOFINSST   := p_item_valorAliquotaCOFINSST;
  r_item_stSimplesNacional       := p_item_stSimplesNacional;
  r_item_creditoSimplesNacional  := p_item_creditoSimplesNacional;
  r_item_stICMS                  := p_item_stICMS;
  r_item_modalidadeBaseCalcICMS  := p_item_modalidadeBaseCalcICMS;
  r_item_reducaoBaseICMS         := p_item_reducaoBaseICMS;
  r_item_aliquotaICMS            := p_item_aliquotaICMS;
  r_item_diferimentoICMS         := p_item_diferimentoICMS;
  r_item_motivoDesoneracaoICMS   := p_item_motivoDesoneracaoICMS;
  r_item_idBeneficio             := p_item_idBeneficio;
  r_item_modalBaseCalcICMSST     := p_item_modalBaseCalcICMSST;
  r_item_margemValorAdicST       := p_item_margemValorAdicST;
  r_item_reducaoBaseST           := p_item_reducaoBaseST;
  r_item_aliquotaICMSST          := p_item_aliquotaICMSST;
  r_item_aliquotaSTSuportConsF   := p_item_aliquotaSTSuportConsF;
  r_item_reducaoBaseICMSEfetivo  := p_item_reducaoBaseICMSEfetivo;
  r_item_aliquotaICMSEfetivo     := p_item_aliquotaICMSEfetivo;
  r_item_stICMSEscrit            := p_item_stICMSEscrit;
  r_item_reducaoBaseICMSEscrit   := p_item_reducaoBaseICMSEscrit;
  r_item_aliquotaICMSEscrit      := p_item_aliquotaICMSEscrit;
  r_item_margemValorAdicSTEscrit := p_item_margemValorAdicSTEscrit;
  r_item_reducaoBaseSTEscrit     := p_item_reducaoBaseSTEscrit;
  r_item_aliquotaICMSSTEscrit    := p_item_aliquotaICMSSTEscrit;
  r_item_somarICMSST             := p_item_somarICMSST;
  r_item_aliquotaICMSUFDestinat  := p_item_aliquotaICMSUFDestinat;
  r_item_aliquotaICMSInterestad  := p_item_aliquotaICMSInterestad;
  r_item_partilhaICMSInterestad  := p_item_partilhaICMSInterestad;
  r_item_aliquotaFCP             := p_item_aliquotaFCP;
  r_item_aliquotaFCPST           := p_item_aliquotaFCPST;
  r_item_aliquotaFCPSTAnteriorm  := p_item_aliquotaFCPSTAnteriorm;
  r_item_aliquotaFCPUFDestinat   := p_item_aliquotaFCPUFDestinat;
  r_item_aliquotaEstImpFederais  := p_item_aliquotaEstImpFederais;
  r_item_aliquotaEstImpEstaduais := p_item_aliquotaEstImpEstaduais;
  r_item_aliquotaEstImpMunicipai := p_item_aliquotaEstImpMunicipai;
  r_encontrouRegistro := 0;
  FOR opFisc IN c_opFisc LOOP
    IF p_cab_origemDocumento NOT IN (4,6,9,10,11,12) OR p_inserindoItem = 1 THEN
      r_movimentaEstoque             := p_modDoc_movimentaEstoque;
    END IF;
    IF p_cab_origemDocumento NOT IN (4,6,9) OR p_inserindoItem = 1 THEN
      r_geraFinanceiro               := CASE WHEN p_modDoc_geraFinanceiro = 1 AND opFisc.geraFinanceiro = 1 THEN 1 ELSE 0 END;
    END IF;
    r_item_cfop                      := opFisc.cfop;
    IF p_atualizarISSQN = 1 THEN
      r_item_indicadorISSQN          := opFisc.indicadorISSQN;
      r_item_aliquotaISSQN           := opFisc.aliquotaISSQN;
    END IF;
    IF p_atualizarIRRF = 1 THEN
      r_item_aliquotaIRRF            := opFisc.aliquotaIRRF;
    END IF;
    IF p_atualizarINSS = 1 THEN
      r_item_aliquotaINSS            := opFisc.aliquotaINSS;
    END IF;
    IF p_atualizarRetencaoPIS = 1 THEN
      r_item_retencaoPIS             := opFisc.retencaoPIS;
    END IF;
    IF p_atualizarRetencaoCOFINS = 1 THEN
      r_item_retencaoCOFINS          := opFisc.retencaoCOFINS;
    END IF;
    IF p_atualizarRetencaoCSLL = 1 THEN
      r_item_retencaoCSLL            := opFisc.retencaoCSLL;
    END IF;
    IF p_atualizarII = 1 THEN
      r_item_aliquotaII              := opFisc.aliquotaII;
    END IF;
    IF p_atualizarIOF = 1 THEN
      r_item_aliquotaIOF             := opFisc.aliquotaIOF;
    END IF;
    IF p_atualizarIPI = 1 THEN
      r_item_codigoEnquadramentoIPI  := opFisc.codigoEnquadramentoIPI;
      r_item_stIPI                   := opFisc.stIPI;
      r_item_aliquotaIPI             := opFisc.aliquotaIPI;
      r_item_valorAliquotaIPI        := opFisc.valorAliquotaIPI;
    END IF;
    IF p_atualizarPIS = 1 THEN
      r_item_stPIS                   := opFisc.stPIS;
      r_item_aliquotaPIS             := opFisc.aliquotaPIS;
      r_item_valorAliquotaPIS        := opFisc.valorAliquotaPIS;
    END IF;
    IF p_atualizarPISST = 1 THEN
      r_item_aliquotaPISST           := opFisc.aliquotaPISST;
      r_item_valorAliquotaPISST      := opFisc.valorAliquotaPISST;
    END IF;
    IF p_atualizarCOFINS = 1 THEN
      r_item_stCOFINS                := opFisc.stCOFINS;
      r_item_aliquotaCOFINS          := opFisc.aliquotaCOFINS;
      r_item_valorAliquotaCOFINS     := opFisc.valorAliquotaCOFINS;
    END IF;
    IF p_atualizarCOFINSST = 1 THEN
      r_item_aliquotaCOFINSST        := opFisc.aliquotaCOFINSST;
      r_item_valorAliquotaCOFINSST   := opFisc.valorAliquotaCOFINSST;
    END IF;
    IF p_atualizarSimplesNacional = 1 THEN
      r_item_stSimplesNacional       := opFisc.stSimplesNacional;
      r_item_creditoSimplesNacional  := opFisc.creditoSimplesNacional;
    END IF;
    IF p_atualizarICMS = 1 THEN
      ADD_ITEM_DESON_FISCAL_BUSCA (
        p_cab_tipoDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_pessoa,
        p_cab_vendaConsumidor,
        p_munEndEst_uf,
        p_munEndPess_uf,
        r_item_stICMS,
        p_gradProd_produto,
        p_prod_origemMercadoria,
        p_prod_idNcm,
        /* Retornos */
        v_encontouDesoneracao,
        r_item_modalidadeBaseCalcICMS,
        r_item_reducaoBaseICMS,
        r_item_aliquotaICMS,
        r_item_diferimentoICMS,
        r_item_motivoDesoneracaoICMS,
        r_item_idBeneficio,
        v_auxNumber);
      IF v_encontouDesoneracao = 0 THEN
        r_item_stICMS                  := opFisc.stICMS;
        r_item_modalidadeBaseCalcICMS  := opFisc.modalidadeBaseCalcICMS;
        r_item_reducaoBaseICMS         := opFisc.reducaoBaseICMS;
        r_item_aliquotaICMS            := opFisc.aliquotaICMS;
        r_item_diferimentoICMS         := opFisc.diferimentoICMS;
        r_item_motivoDesoneracaoICMS   := opFisc.motivoDesoneracaoICMS;
        r_item_idBeneficio             := opFisc.idBeneficio;
      END IF;
      IF r_item_aliquotaICMS = 0 AND r_item_stICMS in ('00','10','20','70') THEN
        SELECT COALESCE(MAX(aliquotaIcms),0)
        INTO r_item_aliquotaICMS
        FROM SIUFORIGEMXUFDESTINO
        WHERE ufOrigem =
          CASE
            WHEN p_cab_entradaSaida  = 'S'
            OR p_munEndPess_uf          = '  '
            OR p_cab_vendaConsumidor = 1
            OR p_cab_tipoDocumento IN (503,504)
            THEN p_munEndEst_uf
            ELSE p_munEndPess_uf
          END
        AND ufDestino =
          CASE
            WHEN p_cab_entradaSaida  = 'E'
            OR p_munEndPess_uf          = '  '
            OR p_cab_vendaConsumidor = 1
            OR p_cab_tipoDocumento IN (503,504)
            THEN p_munEndEst_uf
            ELSE p_munEndPess_uf
          END;
      END IF;
    END IF;
    IF p_atualizarICMSST              = 1 THEN
      r_item_modalBaseCalcICMSST     := opFisc.modalidadeBaseCalcICMSST;
      r_item_margemValorAdicST       := opFisc.margemValorAdicionadoST;
      r_item_reducaoBaseST           := opFisc.reducaoBaseST;
      r_item_aliquotaICMSST          := opFisc.aliquotaICMSST;
      r_item_somarICMSST             := 1;
    END IF;
    IF p_atualizarICMSSTAnteriorEfet  = 1 THEN
      r_item_aliquotaSTSuportConsF   := opFisc.aliquotaSTSuportConsFinal;
      r_item_reducaoBaseICMSEfetivo  := opFisc.reducaoBaseICMSEfetivo;
      r_item_aliquotaICMSEfetivo     := opFisc.aliquotaICMSEfetivo;
    END IF;
    IF p_atualizarICMSEscrituracao    = 1 THEN
      r_item_stICMSEscrit            := CASE WHEN p_cab_nfFornecedor = 1 AND p_prod_tipoProduto IN('07','08') THEN '90' WHEN p_cab_nfFornecedor = 1 AND r_item_stICMS IN('10','30','70') OR p_cab_nfFornecedor = 1 AND r_item_stICMS = ' ' AND r_item_stSimplesNacional IN ('201','202','203') OR r_item_stICMS = ' ' AND r_item_stSimplesNacional = '500' THEN '60' WHEN r_item_stICMS <> ' ' THEN r_item_stICMS WHEN r_item_stSimplesNacional IN ('101','102') AND r_item_reducaoBaseICMS = 0 THEN '00' WHEN r_item_stSimplesNacional IN ('101','102') THEN '20' WHEN r_item_stSimplesNacional IN ('103','300') THEN '40' WHEN r_item_stSimplesNacional IN ('201','202','203') AND r_item_reducaoBaseICMS = 0 THEN '10' WHEN r_item_stSimplesNacional IN ('201','202','203') THEN '70' WHEN r_item_stSimplesNacional = '400' THEN '41' ELSE '90' END;
      r_item_reducaoBaseICMSEscrit   := CASE WHEN p_cab_nfFornecedor = 1 AND (p_prod_tipoProduto IN('07','08') OR r_item_stICMS IN('10','30','70') OR r_item_stICMS = ' ' AND r_item_stSimplesNacional IN ('201','202','203')) OR r_item_stICMS = ' ' AND r_item_stSimplesNacional = '500' THEN 0 WHEN r_item_stICMS <> ' ' THEN r_item_reducaoBaseICMS ELSE 0 END;
      r_item_aliquotaICMSEscrit      := CASE WHEN p_cab_nfFornecedor = 1 AND (p_prod_tipoProduto IN('07','08') OR r_item_stICMS IN('10','30','70') OR r_item_stICMS = ' ' AND r_item_stSimplesNacional IN ('201','202','203')) OR r_item_stICMS = ' ' AND r_item_stSimplesNacional = '500' THEN 0 WHEN r_item_stICMS <> ' ' THEN r_item_aliquotaICMS WHEN r_item_stSimplesNacional IN ('101','201') THEN r_item_creditoSimplesNacional ELSE 0 END;
    END IF;
    IF p_atualizarICMSEscrituracao    = 1 THEN
      r_item_margemValorAdicSTEscrit := CASE WHEN r_item_stICMS = ' ' OR p_cab_nfFornecedor = 1 AND (p_prod_tipoProduto IN('07','08') OR r_item_stICMS IN('10','30','60','70')) THEN 0 ELSE r_item_margemValorAdicST END;
      r_item_reducaoBaseSTEscrit     := CASE WHEN r_item_stICMS = ' ' OR p_cab_nfFornecedor = 1 AND (p_prod_tipoProduto IN('07','08') OR r_item_stICMS IN('10','30','60','70')) THEN 0 ELSE r_item_reducaoBaseST END;
      r_item_aliquotaICMSSTEscrit    := CASE WHEN r_item_stICMS = ' ' OR p_cab_nfFornecedor = 1 AND (p_prod_tipoProduto IN('07','08') OR r_item_stICMS IN('10','30','60','70')) THEN 0 ELSE r_item_aliquotaICMSST END;
    END IF;
    IF p_atualizarDIFAL                 = 1 THEN
      IF p_cab_entradaSaida='S'
        AND NOT(p_cab_finalidadeNota IN('2','3'))
        AND p_cab_localDestinoOperacao = '2'
        AND p_cab_indicadorConsumidorFinal = '1'
        AND p_pess_indicadorInscricaoEstad = '9'
        AND (p_cab_pessoa = 0
          OR p_cab_vendaConsumidor = 1
          OR p_cab_enderecoEntregaPessoa = p_endPess_enderecoPessoa
          OR p_munEndEntr_uf <> p_munEndEst_uf)
        AND NOT (r_item_cfop IN(6552,6922,6929))
        AND (p_prod_tipoProduto <> '09'
          OR NOT (r_item_indicadorISSQN IN('1','2','3','4','5','6','7')))
        AND NOT(r_item_stSimplesNacional IN('103','300','400'))
        AND NOT(r_item_stICMS IN('10','40','41','90')) THEN
        r_item_aliquotaICMSUFDestinat  := opFisc.aliquotaICMSUFDestinatario;
        r_item_aliquotaICMSInterestad  := opFisc.aliquotaICMSInterestadual;
        r_item_partilhaICMSInterestad  := opFisc.partilhaICMSInterestadual;
        IF r_item_aliquotaICMSUFDestinat = 0
          AND r_item_aliquotaICMSInterestad = 0
          AND r_item_partilhaICMSInterestad = 0
          AND (r_item_stSimplesNacional = ''
            OR r_item_stSimplesNacional = ' '
            OR r_item_stSimplesNacional = '  '
            OR r_item_stSimplesNacional = '   ') THEN
          SELECT COALESCE(MAX(aliquotaIcms),0)
          INTO r_item_aliquotaICMSUFDestinat
          FROM SIUFORIGEMXUFDESTINO
          WHERE ufOrigem = p_munEndPess_uf
          AND ufDestino = p_munEndPess_uf;
          IF p_prod_origemMercadoria = '0' THEN
            SELECT COALESCE(MAX(aliquotaIcms),0)
            INTO r_item_aliquotaICMSInterestad
            FROM SIUFORIGEMXUFDESTINO
            WHERE ufOrigem = p_munEndEst_uf
            AND ufDestino = p_munEndPess_uf;
          ELSE
            r_item_aliquotaICMSInterestad  := 4;
          END IF;
          r_item_partilhaICMSInterestad  := 100;
        END IF;
      ELSE
        r_item_aliquotaICMSUFDestinat  := 0;
        r_item_aliquotaICMSInterestad  := 0;
        r_item_partilhaICMSInterestad  := 0;
      END IF;
    END IF;
    IF p_atualizarFCP                 = 1 THEN
      r_item_aliquotaFCP             := opFisc.aliquotaFCP;
      r_item_aliquotaFCPST           := opFisc.aliquotaFCPST;
      r_item_aliquotaFCPSTAnteriorm  := opFisc.aliquotaFCPSTAnteriormente;
      r_item_aliquotaFCPUFDestinat   := opFisc.aliquotaFCPUFDestinatario;
    END IF;
    r_encontrouRegistro              := 1;
  END LOOP;
  
  IF r_encontrouRegistro              = 1 THEN
    IF p_atualizarImpostosEstimados   = 1 THEN
      r_item_aliquotaEstImpFederais  := 0;
      r_item_aliquotaEstImpEstaduais := 0;
      r_item_aliquotaEstImpMunicipai := 0;
      
      IF p_cab_entradaSaida = 'S' AND p_cab_devolucaoAnulacaoRetorno = 0 THEN
        ADD_BUSCA_IBPT (
          p_cab_dataEmissao,
          p_munEndEst_uf,
          p_prod_origemMercadoria,
          p_prod_idNcm,
          p_prod_listaServicos,
          /* Retornos */
          v_auxNumber,
          v_auxNumber,
          r_item_aliquotaEstImpFederais,
          r_item_aliquotaEstImpEstaduais,
          r_item_aliquotaEstImpMunicipai,
          v_auxVarchar,
          v_auxVarchar,
          v_auxVarchar
        );
      END IF;
    END IF;
  ELSE
    IF p_cab_origemDocumento NOT IN (4,6,9,10,11,12) THEN
      r_movimentaEstoque             := p_modDoc_movimentaEstoque;
      r_geraFinanceiro               := p_modDoc_geraFinanceiro;
    END IF;
    r_item_cfop                      := 0;
    IF p_atualizarISSQN               = 1 THEN
      r_item_indicadorISSQN          := ' ';
      r_item_aliquotaISSQN           := 0;
    END IF;
    IF p_atualizarIRRF                = 1 THEN
      r_item_aliquotaIRRF            := 0;
    END IF;
    IF p_atualizarINSS                = 1 THEN
      r_item_aliquotaINSS            := 0;
    END IF;
    IF p_atualizarRetencaoPIS         = 1 THEN
      r_item_retencaoPIS             := 0;
    END IF;
    IF p_atualizarRetencaoCOFINS      = 1 THEN
      r_item_retencaoCOFINS          := 0;
    END IF;
    IF p_atualizarRetencaoCSLL        = 1 THEN
      r_item_retencaoCSLL            := 0;
    END IF;
    IF p_atualizarII                  = 1 THEN
      r_item_aliquotaII              := 0;
    END IF;
    IF p_atualizarIOF                 = 1 THEN
      r_item_aliquotaIOF             := 0;
    END IF;
    IF p_atualizarIPI                 = 1 THEN
      r_item_codigoEnquadramentoIPI  := 0;
      r_item_stIPI                   := '  ';
      r_item_aliquotaIPI             := 0;
      r_item_valorAliquotaIPI        := 0;
    END IF;
    IF p_atualizarPIS                 = 1 THEN
      r_item_stPIS                   := '  ';
      r_item_aliquotaPIS             := 0;
      r_item_valorAliquotaPIS        := 0;
    END IF;
    IF p_atualizarPISST               = 1 THEN
      r_item_aliquotaPISST           := 0;
      r_item_valorAliquotaPISST      := 0;
    END IF;
    IF p_atualizarCOFINS              = 1 THEN
      r_item_stCOFINS                := '  ';
      r_item_aliquotaCOFINS          := 0;
      r_item_valorAliquotaCOFINS     := 0;
    END IF;
    IF p_atualizarCOFINSST            = 1 THEN
      r_item_aliquotaCOFINSST        := 0;
      r_item_valorAliquotaCOFINSST   := 0;
    END IF;
    IF p_atualizarSimplesNacional     = 1 THEN
      r_item_stSimplesNacional       := '   ';
      r_item_creditoSimplesNacional  := 0;
    END IF;
    IF p_atualizarICMS                = 1 THEN
      r_item_stICMS                  := '  ';
      r_item_modalidadeBaseCalcICMS  := ' ';
      r_item_reducaoBaseICMS         := 0;
      r_item_aliquotaICMS            := 0;
      r_item_diferimentoICMS         := 0;
      r_item_motivoDesoneracaoICMS   := '  ';
      r_item_idBeneficio             := 0;
    END IF;
    IF p_atualizarICMSST              = 1 THEN
      r_item_modalBaseCalcICMSST     := ' ';
      r_item_margemValorAdicST       := 0;
      r_item_reducaoBaseST           := 0;
      r_item_aliquotaICMSST          := 0;
      r_item_somarICMSST             := 0;
    END IF;
    IF p_atualizarICMSSTAnteriorEfet  = 1 THEN
      r_item_aliquotaSTSuportConsF   := 0;
      r_item_reducaoBaseICMSEfetivo  := 0;
      r_item_aliquotaICMSEfetivo     := 0;
    END IF;
    IF p_atualizarICMSEscrituracao    = 1 THEN
      r_item_stICMSEscrit            := '  ';
      r_item_reducaoBaseICMSEscrit   := 0;
      r_item_aliquotaICMSEscrit      := 0;
    END IF;
    IF p_atualizarICMSEscrituracao    = 1 THEN
      r_item_margemValorAdicSTEscrit := 0;
      r_item_reducaoBaseSTEscrit     := 0;
      r_item_aliquotaICMSSTEscrit    := 0;
    END IF;
    IF p_atualizarDIFAL               = 1 THEN
      r_item_aliquotaICMSUFDestinat  := 0;
      r_item_aliquotaICMSInterestad  := 0;
      r_item_partilhaICMSInterestad  := 0;
    END IF;
    IF p_atualizarFCP                 = 1 THEN
      r_item_aliquotaFCP             := 0;
      r_item_aliquotaFCPST           := 0;
      r_item_aliquotaFCPSTAnteriorm  := 0;
      r_item_aliquotaFCPUFDestinat   := 0;
    END IF;
    IF p_atualizarImpostosEstimados   = 1 THEN
      r_item_aliquotaEstImpFederais  := 0;
      r_item_aliquotaEstImpEstaduais := 0;
      r_item_aliquotaEstImpMunicipai := 0;
    END IF;
  END IF;
END ADD_ITEM_OPERACAO_FISCAL_BUSCA;

/

create or replace FUNCTION FUNC_ADD_BUSCA_INFO_DESON (
    p_cab_tipoDocumento            IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_pessoa                   IN NUMBER,
    p_cab_vendaConsumidor          IN NUMBER,
    p_endEst_UF                    IN CHAR,
    p_endPess_UF                   IN CHAR,
    p_stICMS                       IN CHAR,
    p_gradProd_produto             IN NUMBER,
    p_prod_origemMercadoria        IN CHAR,
    p_prod_idNcm                   IN NUMBER)
  RETURN NUMBER
IS
    r_informacaoComplementar       NUMBER;
BEGIN
  SELECT
    COALESCE(MAX(a.informacaoComplementar),0)
  INTO
    r_informacaoComplementar
  FROM (
    SELECT
      informacaoComplementar,
      ROW_NUMBER() OVER (
        ORDER BY
          produto          DESC,
          idNCM            DESC,
          origemMercadoria DESC,
          estabelecimento  DESC,
          ufOrigem         DESC,
          pessoa           DESC,
          stICMS           DESC
        ) rowNumber
    FROM PADESONERACOESFISCAIS
    WHERE idDesoneracaoFiscal > 0
    AND ativo                 = 1
    AND (idNcm                = 0
      OR idNcm                = p_prod_idNcm)
    AND (produto              = 0
      OR produto              = p_gradProd_produto)
    AND (origemMercadoria     = ' '
      OR origemMercadoria     = p_prod_origemMercadoria)
    AND (estabelecimento      = 0
      OR estabelecimento      = p_cab_estabelecimento)
    AND (ufOrigem             = ' '
      OR ufOrigem             = '  '
      OR ufOrigem             =
        CASE
          WHEN p_cab_entradaSaida  = 'S'
          OR p_endPess_UF          = '  '
          OR p_cab_vendaConsumidor = 1
          OR p_cab_tipoDocumento IN (503,504)
          THEN p_endEst_UF
          ELSE p_endPess_UF
        END)
    AND (pessoa               = 0
      OR pessoa               = p_cab_pessoa)
    AND (stICMS               = '  '
      OR stICMS               = p_stICMS)
  ) a
  WHERE a.rowNumber = 1;
  RETURN r_informacaoComplementar;
END;

/

create or replace PROCEDURE ADD_DOC_FISC_INFO_SISTEMA_CRIA (
  p_exclusivo                    IN VARCHAR2,
  p_paf                          IN NUMBER,
  p_perfilUsuarioLogado          IN NUMBER,
  p_usuarioLogado                IN NUMBER,
  p_estabelecimentoAtivo         IN NUMBER,
  p_cab_idDocumentoFiscal        IN NUMBER)
IS
  v_modeloDocumentoFiscal        CHAR(2);
  v_indicadorConsumidorFinal     CHAR(1);
  v_regimeTributario             CHAR(1);
  v_md5                          VARCHAR(32);
  v_documentoFiscalRef           NUMBER;
  v_dataEmissaoRef               DATE;
  v_valorPagamentoBruto          NUMBER;
  v_creditoSimplesNacional       NUMBER;
  v_valorCreditoSimplesNacional  NUMBER;
  v_valorFCP                     NUMBER;
  v_valorICMSUFDestinatario      NUMBER;
  v_valorICMSUFRemetente         NUMBER;
  v_baseEstimadaImpostos         NUMBER;
  v_valorEstimadoImpostos        NUMBER;
  v_possui_1913                  NUMBER;
  v_possui_5912                  NUMBER;
  v_motorista                    NUMBER;
  v_motoristaNomeRazaoSocial     VARCHAR2(60);
  v_sequenciaMD5                 NUMBER;
  v_sequenciaFCP                 NUMBER;
  v_sequenciaDestino             NUMBER;
  v_sequenciaRemetente           NUMBER;
  v_sequenciaTributosAprox       NUMBER;
  v_sequenciaVendaConsumidor     NUMBER;
  v_sequenciaNfTransporte        NUMBER;
  v_sequenciaAproveitamentoCred  NUMBER;
  v_sequenciaCreditoIPI          NUMBER;
  v_sequenciaMercadoriaDemo      NUMBER;
  v_sequenciaSuspensoSINIEF      NUMBER;
  v_sequenciaMotorista           NUMBER;
  CURSOR c_obs IS
    SELECT
      a.informacaoComplementar,
      a.descInformacaoComplementar
    FROM PAINFORMACOESCOMPLEMENTAR a
    WHERE a.informacaoComplementar > 0
    AND (
      EXISTS (
        SELECT 1
        FROM MODOCFISCALXITENS item
        JOIN PAOPERFISCALXINFOCOMPLEM opXInfo ON opXInfo.operacaoFiscal = item.operacaoFiscal
        WHERE item.idDocumentoFiscal = p_cab_idDocumentoFiscal
        AND item.cancelado = 0
        AND item.operacaoFiscal > 0
        AND opXInfo.informacaoComplementar = a.informacaoComplementar)
      OR EXISTS (
        SELECT 1
        FROM MODOCUMENTOSFISCAIS cab
        JOIN MODOCFISCALXITENS item ON item.idDocumentoFiscal = cab.idDocumentoFiscal
        JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = item.gradeProduto
        JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
        JOIN PAESTABELECIMENTOS est ON est.estabelecimento = cab.idDocumentoFiscal
        LEFT JOIN CAENDERECOSPESSOA endEst ON endEst.pessoa = est.pessoaEstabelecimento AND endEst.ativo = 1 AND endEst.principal = 1
        JOIN SIMUNICIPIOS munEst ON munEst.municipio = COALESCE(endEst.municipio,0)
        LEFT JOIN CAENDERECOSPESSOA endPess ON endPess.pessoa = cab.pessoa AND endPess.ativo = 1 AND endPess.principal = 1
        JOIN SIMUNICIPIOS munPess ON munPess.municipio = COALESCE(endPess.municipio,0)
        WHERE cab.idDocumentoFiscal = p_cab_idDocumentoFiscal
        AND item.cancelado = 0
        AND a.informacaoComplementar = 
          FUNC_ADD_BUSCA_INFO_DESON (
            cab.tipoDocumento,
            cab.entradaSaida,
            cab.estabelecimento,
            cab.pessoa,
            cab.vendaConsumidor,
            munEst.uf,
            munPess.uf,
            item.stICMS,
            gradProd.produto,
            prod.origemMercadoria,
            prod.idNcm)))
    ORDER BY a.informacaoComplementar;
  CURSOR c_nfe IS
    SELECT chaveNfe
    FROM MODOCFISCALXNFREF
    WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal;
BEGIN
  SELECT
    cab.modeloDocumentoFiscal,
    cab.indicadorConsumidorFinal,
    cab.valorPagamentoBruto,
    pess.regimeTributario
  INTO
    v_modeloDocumentoFiscal,
    v_indicadorConsumidorFinal,
    v_valorPagamentoBruto,
    v_regimeTributario
  FROM MODOCUMENTOSFISCAIS cab
  JOIN PAESTABELECIMENTOS est ON est.estabelecimento = cab.estabelecimento
  JOIN CAPESSOAS pess ON pess.pessoa = est.pessoaEstabelecimento
  WHERE cab.idDocumentoFiscal = p_cab_idDocumentoFiscal;
  IF p_paf = 1 AND FUNC_ADD_BUSCA_CONFIG (322, p_perfilUsuarioLogado, p_usuarioLogado, p_estabelecimentoAtivo) = 'S' THEN
    SELECT COALESCE (MAX (md5PAFECF), ' ') INTO v_md5
    FROM SIPAFLAUDO
    WHERE idLaudo = 1;
    IF v_md5 <> ' ' THEN
      SELECT COALESCE (MAX (sequencia), 0) INTO v_sequenciaMD5
      FROM MODOCFISCALXINFOCOMPLEMEN
      WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
      AND geradoPeloSistema = 1
      AND descInformacaoComplementar LIKE 'MD5:%';
      
      DELETE FROM MODOCFISCALXINFOCOMPLEMEN
      WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
      AND geradoPeloSistema = 1
      AND descInformacaoComplementar LIKE 'MD5:%';
    ELSE
      v_sequenciaMD5 := 0;
    END IF;  
  ELSE
    v_md5 := ' ';
    v_sequenciaMD5 := 0;
  END IF;
  SELECT
    COALESCE(MAX(docRef.documentoFiscal),0),
    MAX(TRUNC(doc.dataEmissao))
  INTO
    v_documentoFiscalRef,
    v_dataEmissaoRef
  FROM MODOCFISCALXITENS item
  JOIN MODOCUMENTOSFISCAIS doc ON doc.idDocumentoFiscal = item.idDocumentoFiscal
  JOIN MOENTREGAS entr ON entr.idItemDocFiscalRemessa = item.idItemDocFiscal
  JOIN MODOCFISCALXDOCFISCAL docXDoc ON docXDoc.idItemDocFiscal = item.idItemDocFiscal
  JOIN MODOCFISCALXITENS itemRef ON itemRef.idItemDocFiscal = docXDoc.idItemDocFiscalReferenciado
  JOIN MODOCUMENTOSFISCAIS docRef ON docRef.idDocumentoFiscal = itemRef.idDocumentoFiscal
  WHERE item.idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND doc.entradaSaida ='S'
  AND doc.devolucaoAnulacaoRetorno = 0
  AND docRef.entradaSaida ='S'
  AND docRef.devolucaoAnulacaoRetorno = 0;
  SELECT
    COALESCE (MAX (item.creditoSimplesNacional), 0),
    COALESCE (SUM (item.valorCreditoSimplesNacional), 0),
    COALESCE (SUM (item.valorFCP), 0),
    COALESCE (SUM (item.valorICMSUFDestinatario), 0),
    COALESCE (SUM (item.valorICMSUFRemetente), 0),
    COALESCE (SUM (item.baseEstimadaImpostos), 0),
    COALESCE (SUM (item.valorEstimadoImpFederais + item.valorEstimadoImpEstaduais + item.valorEstimadoImpMunicipais), 0),
    COALESCE (MAX (CASE WHEN cfop IN (1913,2913) THEN 1 ELSE 0 END), 0),
    COALESCE (MAX (CASE WHEN cfop IN (5912,6912) THEN 1 ELSE 0 END), 0),
    COALESCE (MAX (entr.motorista), 0)
  INTO
    v_creditoSimplesNacional,
    v_valorCreditoSimplesNacional,
    v_valorFCP,
    v_valorICMSUFDestinatario,
    v_valorICMSUFRemetente,
    v_baseEstimadaImpostos,
    v_valorEstimadoImpostos,
    v_possui_1913,
    v_possui_5912,
    v_motorista
  FROM MODOCFISCALXITENS item
  LEFT JOIN MOENTREGAS entr ON entr.idItemDocFiscalRemessa = item.idItemDocFiscal
  WHERE item.idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND item.cancelado = 0;
  
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar LIKE 'NF-e Ref.:%';
  
  SELECT COALESCE (MAX (sequencia), 0) INTO v_sequenciaFCP
  FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar LIKE 'Valor do ICMS relativo ao Fundo de Combate a Pobreza - FCP da UF de destino: R$%';
  
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar LIKE 'Valor do ICMS relativo ao Fundo de Combate a Pobreza - FCP da UF de destino: R$%';
  
  SELECT COALESCE (MAX (sequencia), 0) INTO v_sequenciaDestino
  FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar LIKE 'Valor do ICMS  Interestadual para a UF de destino: R$%';
  
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar LIKE 'Valor do ICMS  Interestadual para a UF de destino: R$%';
  
  SELECT COALESCE (MAX (sequencia), 0) INTO v_sequenciaRemetente
  FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar LIKE 'Valor do ICMS Interestadual para a UF do remetente: R$%';
  
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar LIKE 'Valor do ICMS Interestadual para a UF do remetente: R$%';
  
  SELECT COALESCE (MAX (sequencia), 0) INTO v_sequenciaTributosAprox
  FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar LIKE 'Valor Aproximado Tributos: R$%';
  
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar LIKE 'Valor Aproximado Tributos: R$%';
  
  SELECT COALESCE (MAX (sequencia), 0) INTO v_sequenciaVendaConsumidor
  FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar = 'Venda destinada a consumidor final sem fins comerciais.';
  
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar = 'Venda destinada a consumidor final sem fins comerciais.';
  
  SELECT COALESCE (MAX (sequencia), 0) INTO v_sequenciaNfTransporte
  FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar LIKE 'Nota de transporte referente a nota de antecipação de faturamento%';
  
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar LIKE 'Nota de transporte referente a nota de antecipação de faturamento%';
  
  SELECT COALESCE (MAX (sequencia), 0) INTO v_sequenciaAproveitamentoCred
  FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar LIKE 'Permite aproveitamento de credito de ICMS no valor de R$%';
  
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar LIKE 'Permite aproveitamento de credito de ICMS no valor de R$%';
  
  SELECT COALESCE (MAX (sequencia), 0) INTO v_sequenciaCreditoIPI
  FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar = 'Documento emitido por ME ou EPP optante pelo Simples Nacional; Nao gera direito a credito fiscal de IPI.';
  
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar = 'Documento emitido por ME ou EPP optante pelo Simples Nacional; Nao gera direito a credito fiscal de IPI.';
  
  SELECT COALESCE (MAX (sequencia), 0) INTO v_sequenciaMercadoriaDemo
  FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar = 'Mercadoria remetida para demonstracao.';
  
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar = 'Mercadoria remetida para demonstracao.';
  
  SELECT COALESCE (MAX (sequencia), 0) INTO v_sequenciaSuspensoSINIEF
  FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar = 'Imposto suspenso nos termos do Ajuste SINIEF 02/18.';
  
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar = 'Imposto suspenso nos termos do Ajuste SINIEF 02/18.';
  
  SELECT COALESCE (MAX (sequencia), 0) INTO v_sequenciaMotorista
  FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar LIKE 'Motorista:%';
  
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND geradoPeloSistema = 1
  AND descInformacaoComplementar LIKE 'Motorista:%';
  
  DELETE FROM MODOCFISCALXINFOCOMPLEMEN
  WHERE idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND informacaoComplementar > 0;

  IF v_md5 <> ' ' THEN  
    IF v_sequenciaMD5 > 0 THEN
      ADD_DOC_FISC_INFO_GRAVA_SEQ (
        p_estabelecimentoAtivo,
        p_cab_idDocumentoFiscal,
        v_sequenciaMD5,
        1,
        1,
        0,
        0,
        'MD5: ' || RTRIM(v_md5)
      );
    ELSE
      ADD_DOC_FISC_INFO_CRIA (
        p_estabelecimentoAtivo,
        p_cab_idDocumentoFiscal,
        1,
        1,
        0,
        0,
        'MD5: ' || RTRIM(v_md5)
      );
    END IF;
  END IF;
  IF v_modeloDocumentoFiscal <> '58' THEN
    FOR nfe IN c_nfe LOOP      
      ADD_DOC_FISC_INFO_GRAVA_DESCR (
        p_estabelecimentoAtivo,
        p_cab_idDocumentoFiscal,
        1,
        1,
        0,
        0,
        'NF-e Ref.: '
        || SUBSTR(nfe.chaveNfe,1,2)
        || '-' || SUBSTR(nfe.chaveNfe,3,4)
        || '-' || SUBSTR(nfe.chaveNfe,7,2)
        || '.' || SUBSTR(nfe.chaveNfe,9,3)
        || '.' || SUBSTR(nfe.chaveNfe,12,3)
        || '/' || SUBSTR(nfe.chaveNfe,15,4)
        || '-' || SUBSTR(nfe.chaveNfe,19,2)
        || '-' || SUBSTR(nfe.chaveNfe,21,2)
        || '-' || SUBSTR(nfe.chaveNfe,23,3)
        || '-' || SUBSTR(nfe.chaveNfe,26,3)
        || '.' || SUBSTR(nfe.chaveNfe,29,3)
        || '.' || SUBSTR(nfe.chaveNfe,32,3)
        || '-' || SUBSTR(nfe.chaveNfe,35,3)
        || '.' || SUBSTR(nfe.chaveNfe,38,3)
        || '.' || SUBSTR(nfe.chaveNfe,41,3)
        || '-' || SUBSTR(nfe.chaveNfe,44,1)
      );
    END LOOP;
  END IF;
  IF v_valorFCP > 0 THEN  
    IF v_sequenciaFCP > 0 THEN
      ADD_DOC_FISC_INFO_GRAVA_SEQ (
        p_estabelecimentoAtivo,
        p_cab_idDocumentoFiscal,
        v_sequenciaFCP,
        1,
        1,
        0,
        0,
        'Valor do ICMS relativo ao Fundo de Combate a Pobreza - FCP da UF de destino: R$ ' || TRIM (TO_CHAR (v_valorFCP, 'FM999G999G999G999G999G990D00')) || '.'
      );
    ELSE
      ADD_DOC_FISC_INFO_CRIA (
        p_estabelecimentoAtivo,
        p_cab_idDocumentoFiscal,
        1,
        1,
        0,
        0,
        'Valor do ICMS relativo ao Fundo de Combate a Pobreza - FCP da UF de destino: R$ ' || TRIM (TO_CHAR (v_valorFCP, 'FM999G999G999G999G999G990D00')) || '.'
      );
    END IF;
  END IF;
    
  IF v_valorICMSUFDestinatario > 0 OR v_valorICMSUFRemetente > 0 THEN
    IF v_sequenciaDestino > 0 THEN
      ADD_DOC_FISC_INFO_GRAVA_SEQ (
        p_estabelecimentoAtivo,
        p_cab_idDocumentoFiscal,
        v_sequenciaDestino,
        1,
        1,
        0,
        0,
        'Valor do ICMS  Interestadual para a UF de destino: R$ ' || TRIM (TO_CHAR (v_valorICMSUFDestinatario, 'FM999G999G999G999G999G990D00')) || '.'
      );
    ELSE
      ADD_DOC_FISC_INFO_CRIA (
        p_estabelecimentoAtivo,
        p_cab_idDocumentoFiscal,
        1,
        1,
        0,
        0,
        'Valor do ICMS  Interestadual para a UF de destino: R$ ' || TRIM (TO_CHAR (v_valorICMSUFDestinatario, 'FM999G999G999G999G999G990D00')) || '.'
      );
    END IF;
  END IF;
    
  IF v_valorICMSUFDestinatario > 0 OR v_valorICMSUFRemetente > 0 THEN
    IF v_sequenciaRemetente > 0 THEN
      ADD_DOC_FISC_INFO_GRAVA_SEQ (
        p_estabelecimentoAtivo,
        p_cab_idDocumentoFiscal,
        v_sequenciaRemetente,
        1,
        1,
        0,
        0,
        'Valor do ICMS Interestadual para a UF do remetente: R$ ' || TRIM (TO_CHAR (v_valorICMSUFRemetente, 'FM999G999G999G999G999G990D00')) || '.'
      );
    ELSE
      ADD_DOC_FISC_INFO_CRIA (
        p_estabelecimentoAtivo,
        p_cab_idDocumentoFiscal,
        1,
        1,
        0,
        0,
        'Valor do ICMS Interestadual para a UF do remetente: R$ ' || TRIM (TO_CHAR (v_valorICMSUFRemetente, 'FM999G999G999G999G999G990D00')) || '.'
      );
    END IF;
  END IF;
    
  IF v_valorEstimadoImpostos > 0 THEN
    IF v_sequenciaTributosAprox > 0 THEN
      ADD_DOC_FISC_INFO_GRAVA_SEQ (
        p_estabelecimentoAtivo,
        p_cab_idDocumentoFiscal,
        v_sequenciaTributosAprox,
        1,
        1,
        0,
        0,
        'Valor Aproximado Tributos: R$ ' || TRIM (TO_CHAR (v_valorEstimadoImpostos, 'FM999G999G999G999G999G990D00')) || ' (' || CASE WHEN v_baseEstimadaImpostos = 0 THEN '0,00' ELSE TRIM (TO_CHAR (100* ROUND(v_valorEstimadoImpostos / v_baseEstimadaImpostos,2), 'FM999G999G999G999G999G990D00')) END || '%) Fonte: IBPT.'
      );
    ELSE
      ADD_DOC_FISC_INFO_CRIA (
        p_estabelecimentoAtivo,
        p_cab_idDocumentoFiscal,
        1,
        1,
        0,
        0,
        'Valor Aproximado Tributos: R$ ' || TRIM (TO_CHAR (v_valorEstimadoImpostos, 'FM999G999G999G999G999G990D00')) || ' (' || CASE WHEN v_baseEstimadaImpostos = 0 THEN '0,00' ELSE TRIM (TO_CHAR (100* ROUND(v_valorEstimadoImpostos / v_baseEstimadaImpostos,2), 'FM999G999G999G999G999G990D00')) END || '%) Fonte: IBPT.'
      );
    END IF;
  END IF;
    
  IF v_indicadorConsumidorFinal = '1' THEN
    IF v_sequenciaVendaConsumidor > 0 THEN
      ADD_DOC_FISC_INFO_GRAVA_SEQ (
        p_estabelecimentoAtivo,
        p_cab_idDocumentoFiscal,
        v_sequenciaVendaConsumidor,
        1,
        1,
        0,
        0,
        'Venda destinada a consumidor final sem fins comerciais.'
      );
    ELSE
      ADD_DOC_FISC_INFO_CRIA (
        p_estabelecimentoAtivo,
        p_cab_idDocumentoFiscal,
        1,
        1,
        0,
        0,
        'Venda destinada a consumidor final sem fins comerciais.'
      );
    END IF;
  END IF;
    
  IF v_documentoFiscalRef > 0 THEN
    IF v_sequenciaNfTransporte > 0 THEN
      ADD_DOC_FISC_INFO_GRAVA_SEQ (
        p_estabelecimentoAtivo,
        p_cab_idDocumentoFiscal,
        v_sequenciaNfTransporte,
        1,
        1,
        0,
        0,
        'Nota de transporte referente a nota de antecipação de faturamento ' || TRIM (TO_CHAR (v_documentoFiscalRef)) || CASE WHEN v_dataEmissaoRef IS NULL THEN '' ELSE ' gerada na data ' || TO_CHAR(v_dataEmissaoRef,'DD/MM/YYYY') END || '.'
      );
    ELSE
      ADD_DOC_FISC_INFO_CRIA (
        p_estabelecimentoAtivo,
        p_cab_idDocumentoFiscal,
        1,
        1,
        0,
        0,
        'Nota de transporte referente a nota de antecipação de faturamento ' || TRIM (TO_CHAR (v_documentoFiscalRef)) || CASE WHEN v_dataEmissaoRef IS NULL THEN '' ELSE ' gerada na data ' || TO_CHAR(v_dataEmissaoRef,'DD/MM/YYYY') END || '.'
      );
    END IF;
  END IF;
    
  IF v_regimeTributario IN ('1','2') AND v_valorCreditoSimplesNacional > 0 THEN
    IF v_sequenciaAproveitamentoCred > 0 THEN
      ADD_DOC_FISC_INFO_GRAVA_SEQ (
        p_estabelecimentoAtivo,
        p_cab_idDocumentoFiscal,
        v_sequenciaAproveitamentoCred,
        1,
        1,
        0,
        0,
        'Permite aproveitamento de credito de ICMS no valor de R$ ' || TRIM (TO_CHAR (v_valorCreditoSimplesNacional, 'FM999G999G999G999G999G990D00')) || ', correspondente a aliquota de ' || TRIM (TO_CHAR (v_creditoSimplesNacional, 'FM999G999G999G999G999G990D00')) || '%, nos termos do art. 23 da LC. 123, de 2006.'
      );
    ELSE
      ADD_DOC_FISC_INFO_CRIA (
        p_estabelecimentoAtivo,
        p_cab_idDocumentoFiscal,
        1,
        1,
        0,
        0,
        'Permite aproveitamento de credito de ICMS no valor de R$ ' || TRIM (TO_CHAR (v_valorCreditoSimplesNacional, 'FM999G999G999G999G999G990D00')) || ', correspondente a aliquota de ' || TRIM (TO_CHAR (v_creditoSimplesNacional, 'FM999G999G999G999G999G990D00')) || '%, nos termos do art. 23 da LC. 123, de 2006.'
      );
    END IF;
  END IF;
    
  IF v_regimeTributario IN ('1','2') THEN
    IF v_sequenciaCreditoIPI > 0 THEN
      ADD_DOC_FISC_INFO_GRAVA_SEQ (
        p_estabelecimentoAtivo,
        p_cab_idDocumentoFiscal,
        v_sequenciaCreditoIPI,
        1,
        1,
        0,
        0,
        'Documento emitido por ME ou EPP optante pelo Simples Nacional; Nao gera direito a credito fiscal de IPI.'
      );
    ELSE
      ADD_DOC_FISC_INFO_CRIA (
        p_estabelecimentoAtivo,
        p_cab_idDocumentoFiscal,
        1,
        1,
        0,
        0,
        'Documento emitido por ME ou EPP optante pelo Simples Nacional; Nao gera direito a credito fiscal de IPI.'
      );
    END IF;
  END IF;
  
  FOR obs IN c_obs LOOP
    
    ADD_DOC_FISC_INFO_GRAVA_DESCR (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      obs.informacaoComplementar,
      obs.descInformacaoComplementar
    );
    
  END LOOP;
  
  IF v_possui_5912 = 1 THEN
  
    ADD_DOC_FISC_INFO_GRAVA_DESCR (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      0,
      'Mercadoria remetida para demonstracao.'
    );

  END IF;
  
  IF v_possui_5912 = 1 OR v_possui_1913 = 1 THEN

    ADD_DOC_FISC_INFO_GRAVA_DESCR (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      0,
      'Imposto suspenso nos termos do Ajuste SINIEF 02/18.'
    );
    
  END IF;
   
  IF v_motorista <> 0 THEN
   
    SELECT COALESCE (MAX (nomeRazaoSocial), ' ') INTO v_motoristaNomeRazaoSocial
    FROM CAPESSOAS
    WHERE pessoa = v_motorista;
  
    ADD_DOC_FISC_INFO_GRAVA_DESCR (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      0,
      'Motorista: ' || TRIM (v_motoristaNomeRazaoSocial)
    );
  END IF;

  IF p_exclusivo = 'BITELO' THEN
    ADD_DOC_FISC_INFO_GRAVA_DESCR (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      0,
      'ATENÇÃO: 
CONFIRA A MERCADORIA NO ATO DA ENTREGA, OS MATERIAIS SERÃO DESCARREGADOS AO LADO DO CAMINHÃO. 
DÚVIDAS E RECLAMAÇÕES SOBRE ENTREGAS LIGAR PARA (51) 3497-7589.'
    );
  END IF;

  IF p_exclusivo = 'DC' THEN
    ADD_DOC_FISC_INFO_GRAVA_DESCR (
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      1,
      1,
      0,
      0,
      'Declaro que o produto acima se encontra em perfeito estado, não constando nenhum dano físico, ou avarias, e, sobretudo com número de série idêntico ao da embalagem e com todos os acessórios e itens que o acompanham, bem como sua embalagem também em perfeito estado.

______________________________
    Assinatura do Recebido
    CPF/RG:'
    );
  END IF;
  
  IF v_modeloDocumentoFiscal = '55'
    AND v_valorPagamentoBruto > 0
    AND FUNC_ADD_BUSCA_CONFIG (110, p_perfilUsuarioLogado, p_usuarioLogado, p_estabelecimentoAtivo) = 'S' THEN
    DELETE MODOCFISCALXINFOCOMPLEMEN
    WHERE IdDocumentoFiscal = p_cab_idDocumentoFiscal
    AND geradoPeloSistema = 1
    AND imprimir = 1
    AND informacaoComplementar = 0
    AND (descInformacaoComplementar LIKE 'P%R$%'
      OR descInformacaoComplementar LIKE 'T%R$%')
    AND SUBSTR(descInformacaoComplementar,2,1) BETWEEN '1' AND '9';
    ADD_DOC_FISC_INFO_PAG_DOC_FISC (
      p_perfilUsuarioLogado,
      p_usuarioLogado,
      p_estabelecimentoAtivo,
      p_cab_idDocumentoFiscal,
      p_cab_idDocumentoFiscal,
      0
    );
  END IF;
END ADD_DOC_FISC_INFO_SISTEMA_CRIA;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_INSERE_COMB (
    p_uniqueMachineID              IN VARCHAR2,
    p_usuarioLogado                IN NUMBER,
    p_perfilUsuarioLogado          IN NUMBER,
    p_estabelecimentoAtivo         IN NUMBER,
    p_config_64_casasDecSaidas     IN CHAR,
    p_config_65_casasDecEntrada    IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_330_redIcmsBasePisCof IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_config_378_calcularVolumes   IN NUMBER,
    p_regMarg_tipoPreco            IN CHAR,
    p_regMarg_tabelaPreco          IN VARCHAR2,
    p_regMarg_fatorMultiplicador   IN NUMBER,
    p_regMarg_tipoPrecoB           IN CHAR,
    p_regMarg_tabelaPrecoB         IN VARCHAR2,
    p_regMarg_fatorMultiplicadorB  IN NUMBER,
    p_regMarg_reduzirImpostos      IN NUMBER,
    p_regMarg_reduzirTarifaCartao  IN NUMBER,
    p_regMarg_taxaCapitacaoCustoFi IN NUMBER,
    p_regMarg_exibPercMargemCab    IN NUMBER,
    p_regMarg_exibImagemMargemCab  IN NUMBER,
    p_regMarg_regraImagemCab       IN NUMBER,
    p_regMarg_exibPercMargemItem   IN NUMBER,
    p_regMarg_exibImagemMargemItem IN NUMBER,
    p_regMarg_regraImagemItem      IN NUMBER,
    p_regMarg_exibDetMargemItem    IN NUMBER,
    p_obrigaFinalizar              IN NUMBER,
    p_cab_orcamento                IN NUMBER,
    p_cab_origemDocumento          IN NUMBER,
    p_cab_tipoDocumento            IN NUMBER,
    p_cab_modeloDocumento          IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_finalidadeNota           IN CHAR,
    p_cab_atualizaCustoMedio       IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEmissao              IN DATE,
    p_cab_dataPreco                IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_cab_dataEntrega              IN DATE,
    p_cab_enderecoEntregaPessoa    IN NUMBER,
    p_cab_municipioFatoGerador     IN NUMBER,
    p_cab_localDestinoOperacao     IN CHAR,
    p_cab_indicadorConsumidorFinal IN CHAR,
    p_cab_tipoPagamentoFrete       IN CHAR,
    p_cab_quantidadeVolume         IN NUMBER,
    p_cab_quantidade               IN NUMBER,
    p_cab_pesoLiquido              IN NUMBER,
    p_cab_pesoBruto                IN NUMBER,
    p_cab_valorProdutosBruto       IN NUMBER,
    p_cab_valorProdutos            IN NUMBER,
    p_cab_valorDescontoProdutos    IN NUMBER,
    p_cab_valorAcrescimoProdutos   IN NUMBER,
    p_cab_valorServicosBruto       IN NUMBER,
    p_cab_valorServicos            IN NUMBER,
    p_cab_valorDescontoServicos    IN NUMBER,
    p_cab_valorAcrescimoServicos   IN NUMBER,
    p_cab_prazoMedioPonderado      IN NUMBER,
    p_cab_valorBasePagamento       IN NUMBER,
    p_cab_valorAVistaMinimo        IN NUMBER,
    p_cab_valorDescontoTotal       IN NUMBER,
    p_cab_valorOutrasDespTotal     IN NUMBER,
    p_cab_valorFreteTotal          IN NUMBER,
    p_cab_valorSeguroTotal         IN NUMBER,
    p_cab_valorAdicFreteMarTotal   IN NUMBER,
    p_cab_valorDespesasAduanTotal  IN NUMBER,
    p_cab_valorImpostosSomaPag     IN NUMBER,
    p_cab_valorImpostosDiminuiPag  IN NUMBER,
    p_cab_valorLiquidoItem         IN NUMBER,
    p_cab_valorTarifaCartao        IN NUMBER,
    p_cab_valorMargem              IN NUMBER,
    p_modDoc_capituloNatFiscal     IN NUMBER,
    p_modDoc_movimentaEstoque      IN NUMBER,
    p_modDoc_geraFinanceiro        IN NUMBER,
    p_modDoc_habilitaAmbiente      IN NUMBER,
    p_modDoc_tipoPreco             IN CHAR,
    p_modDoc_tabelaPreco           IN VARCHAR2,
    p_modDoc_fatorMultipPreco      IN NUMBER,
    p_modDoc_tipoPrecoB            IN CHAR,
    p_modDoc_tabelaPrecoB          IN VARCHAR2,
    p_modDoc_fatorMultipPrecoB     IN NUMBER,
    p_modDoc_diminuiDescontoPrUnit IN NUMBER,
    p_modDoc_somaAcrescimosPrUnit  IN NUMBER,
    p_modDoc_somaFreteSeguroPrUnit IN NUMBER,
    p_est_grupoFiscal              IN NUMBER,
    p_pessEst_regimeTributario     IN CHAR,
    p_munEndEst_uf                 IN CHAR,
    p_pess_indicadorInscricaoEstad IN CHAR,
    p_endPess_enderecoPessoa       IN NUMBER,
    p_munEndPess_uf                IN CHAR,
    p_munEndEntr_uf                IN CHAR,
    p_etOrc_situacaoOrcamento      IN NUMBER,
    p_item_vendedor                IN NUMBER,
    p_item_gradeProduto            IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_dataEntrega             IN DATE,
    p_item_quantidade              IN NUMBER,
    p_item_controleEntrega         IN NUMBER,
    p_item_usarPrecoAVista         IN NUMBER,
    p_item_percDescontoItem        IN NUMBER,
    p_item_percAcrescimoItem       IN NUMBER,
    p_item_observacoesDigitadas    IN VARCHAR2,
    p_idEnderecoEstoque            IN NUMBER,
    p_item_ambiente                IN NUMBER,
    p_item_amb_observacoes         IN VARCHAR2,
    p_atualizarTempMargem          IN NUMBER,
    p_idItemOrcamentoReferenciado  IN NUMBER,
    p_idItemDocTransferencia       IN NUMBER,
    p_buffer_idItemOrcamento       IN VARCHAR2,
    /* Retornos */
    r_obrigaFinalizar              OUT NUMBER,
    r_cab_quantidadeVolume         OUT NUMBER,
    r_cab_quantidade               OUT NUMBER,
    r_cab_pesoLiquido              OUT NUMBER,
    r_cab_pesoBruto                OUT NUMBER,
    r_cab_valorProdutosBruto       OUT NUMBER,
    r_cab_valorProdutos            OUT NUMBER,
    r_cab_valorDescontoProdutos    OUT NUMBER,
    r_cab_valorAcrescimoProdutos   OUT NUMBER,
    r_cab_valorServicosBruto       OUT NUMBER,
    r_cab_valorServicos            OUT NUMBER,
    r_cab_valorDescontoServicos    OUT NUMBER,
    r_cab_valorAcrescimoServicos   OUT NUMBER,
    r_cab_valorBasePagamento       OUT NUMBER,
    r_cab_valorAVistaMinimo        OUT NUMBER,
    r_cab_valorDescontoTotal       OUT NUMBER,
    r_cab_valorOutrasDespTotal     OUT NUMBER,
    r_cab_valorImpostosSomaPag     OUT NUMBER,
    r_cab_valorImpostosDiminuiPag  OUT NUMBER,
    r_cab_valorLiquidoItem         OUT NUMBER,
    r_cab_valorMargem              OUT NUMBER,
    r_cab_percentualMargem         OUT NUMBER,
    r_cab_imagemMargem             OUT VARCHAR2,
    r_buffer_idItemOrcamento       OUT VARCHAR2,
    r_item_valorTotalItem          OUT NUMBER)
IS
    v_auxNumber                    NUMBER;
    v_auxVarchar                   VARCHAR2(256);
    v_item_idItemOrcamento         NUMBER;
    v_item_sequencia               NUMBER;
    v_item_servico                 NUMBER;
    v_item_operacaoFiscal          NUMBER;
    v_item_movimentaEstoque        NUMBER;
    v_item_geraFinanceiro          NUMBER;
    v_item_controleQuantidade      NUMBER;
    v_item_unidadeMedidaConversao  VARCHAR2(6);
    v_item_conversorQuantidade     NUMBER;
    v_item_loteMinimo              NUMBER;
    v_item_loteMultiplo            NUMBER;
    v_item_altura                  NUMBER;
    v_item_largura                 NUMBER;
    v_item_comprimento             NUMBER;
    v_item_pecas                   NUMBER;
    v_item_quantidade              NUMBER;
    v_item_quantidadeConvertida    NUMBER;
    v_item_pesoLiquido             NUMBER;
    v_item_pesoBruto               NUMBER;
    v_item_tipoPreco               CHAR(1);
    v_item_tabelaPreco             VARCHAR2(10);
    v_item_precoSugestaoAPrazo     NUMBER;
    v_item_precoSugestaoAVista     NUMBER;
    v_item_precoDesconto           NUMBER;
    v_item_precoMinimo             NUMBER;
    v_item_precoPautaTabelado      NUMBER;
    v_item_precoUnitarioBruto      NUMBER;
    v_item_precoUnitario           NUMBER;
    v_item_precoUnitarioConvertido NUMBER;
    v_item_valorProdutoServicoBrut NUMBER;
    v_item_valorProdutoServico     NUMBER;
    v_item_valorDescontoItem       NUMBER;
    v_item_valorAcrescimoItem      NUMBER;
    v_item_valorBasePagamento      NUMBER;
    v_item_valorTotalItem          NUMBER;
    v_item_valorDescontoTotal      NUMBER;
    v_item_valorOutrasDespTotal    NUMBER;
    v_item_cfop                    NUMBER;
    v_item_indicadorISSQN          CHAR(1);
    v_item_aliquotaISSQN           NUMBER;
    v_item_baseISSQN               NUMBER;
    v_item_valorISSQN              NUMBER;
    v_item_aliquotaIRRF            NUMBER;
    v_item_baseIRRF                NUMBER;
    v_item_valorIRRF               NUMBER;
    v_item_aliquotaINSS            NUMBER;
    v_item_baseINSS                NUMBER;
    v_item_valorINSS               NUMBER;
    v_item_retencaoPIS             NUMBER;
    v_item_baseRetPIS              NUMBER;
    v_item_valorRetPIS             NUMBER;
    v_item_retencaoCOFINS          NUMBER;
    v_item_baseRetCOFINS           NUMBER;
    v_item_valorRetCOFINS          NUMBER;
    v_item_retencaoCSLL            NUMBER;
    v_item_baseRetCSLL             NUMBER;
    v_item_valorRetCSLL            NUMBER;
    v_item_aliquotaII              NUMBER;
    v_item_baseII                  NUMBER;
    v_item_valorII                 NUMBER;
    v_item_aliquotaIOF             NUMBER;
    v_item_baseIOF                 NUMBER;
    v_item_valorIOF                NUMBER;
    v_item_codigoEnquadramentoIPI  NUMBER;
    v_item_stIPI                   CHAR(2);
    v_item_aliquotaIPI             NUMBER;
    v_item_valorAliquotaIPI        NUMBER;
    v_item_baseIPI                 NUMBER;
    v_item_valorIPI                NUMBER;
    v_item_stPIS                   CHAR(2);
    v_item_aliquotaPIS             NUMBER;
    v_item_valorAliquotaPIS        NUMBER;
    v_item_basePIS                 NUMBER;
    v_item_valorPIS                NUMBER;
    v_item_aliquotaPISST           NUMBER;
    v_item_valorAliquotaPISST      NUMBER;
    v_item_basePISST               NUMBER;
    v_item_valorPISST              NUMBER;
    v_item_stCOFINS                CHAR(2);
    v_item_aliquotaCOFINS          NUMBER;
    v_item_valorAliquotaCOFINS     NUMBER;
    v_item_baseCOFINS              NUMBER;
    v_item_valorCOFINS             NUMBER;
    v_item_aliquotaCOFINSST        NUMBER;
    v_item_valorAliquotaCOFINSST   NUMBER;
    v_item_baseCOFINSST            NUMBER;
    v_item_valorCOFINSST           NUMBER;
    v_item_stSimplesNacional       CHAR(3);
    v_item_creditoSimplesNacional  NUMBER;
    v_item_baseCreditoSimplesNac   NUMBER;
    v_item_valorCreditoSimplesNac  NUMBER;
    v_item_stICMS                  CHAR(2);
    v_item_modalBaseCalcICMS       CHAR(1);
    v_item_reducaoBaseICMS         NUMBER;
    v_item_aliquotaICMS            NUMBER;
    v_item_diferimentoICMS         NUMBER;
    v_item_motivoDesoneracaoICMS   CHAR(2);
    v_item_baseICMS                NUMBER;
    v_item_valorICMSOperacao       NUMBER;
    v_item_valorICMSDiferido       NUMBER;
    v_item_valorICMS               NUMBER;
    v_item_valorICMSDesoneracao    NUMBER;
    v_item_modalBaseCalcICMSST     CHAR(1);
    v_item_margemValorAdicST       NUMBER;
    v_item_reducaoBaseST           NUMBER;
    v_item_aliquotaICMSST          NUMBER;
    v_item_aliquotaSTSuportConsFin NUMBER;
    v_item_reducaoBaseICMSEfetivo  NUMBER;
    v_item_baseICMSST              NUMBER;
    v_item_valorICMSST             NUMBER;
    v_item_baseICMSSTAnteriormente NUMBER;
    v_item_valorICMSSTAnteriorment NUMBER;
    v_item_valorICMSProprioSubstit NUMBER;
    v_item_aliquotaICMSEfetivo     NUMBER;
    v_item_baseICMSEfetivo         NUMBER;
    v_item_valorICMSEfetivo        NUMBER;
    v_item_aliquotaICMSUFDestinat  NUMBER;
    v_item_aliquotaICMSInterestad  NUMBER;
    v_item_partilhaICMSInterestad  NUMBER;
    v_item_baseICMSUFDestinatario  NUMBER;
    v_item_valorICMSUFDestinatario NUMBER;
    v_item_baseICMSUFRemetente     NUMBER;
    v_item_valorICMSUFRemetente    NUMBER;
    v_item_aliquotaFCP             NUMBER;
    v_item_baseFCP                 NUMBER;
    v_item_valorFCP                NUMBER;
    v_item_aliquotaFCPST           NUMBER;
    v_item_baseFCPST               NUMBER;
    v_item_valorFCPST              NUMBER;
    v_item_aliquotaFCPSTAnteriorm  NUMBER;
    v_item_aliquotaFCPUFDestinat   NUMBER;
    v_item_baseFCPSTAnteriormente  NUMBER;
    v_item_valorFCPSTAnteriormente NUMBER;
    v_item_baseFCPUFDestinatario   NUMBER;
    v_item_valorFCPUFDestinatario  NUMBER;
    v_item_aliquotaEstImpFederais  NUMBER;
    v_item_aliquotaEstImpEstaduais NUMBER;
    v_item_aliquotaEstImpMunicipai NUMBER;
    v_item_baseEstimadaImpostos    NUMBER;
    v_item_valorEstImpFederais     NUMBER;
    v_item_valorEstImpEstaduais    NUMBER;
    v_item_valorEstImpMunicipais   NUMBER;
    v_item_valorImpostosSomaPag    NUMBER;
    v_item_valorImpostosDiminuiPag NUMBER;
    v_item_valorLiquidoItem        NUMBER;
    v_item_observacoes             VARCHAR2(4000);
    v_locEst_indicadorPropPosseIt CHAR(1);    
    CURSOR c_comb IS
      SELECT
        comb.gradeProdutoFilho,
        comb.quantidade,
        gradProd.produto,
        gradProd.cor,
        gradProd.tamanho,
        prod.controleEstoque,
        prod.unidadeMedida,
        prod.controleQuantidadeVenda,
        prod.unidadeMedidaVenda,
        prod.conversorQuantidadeVenda,
        prod.loteMinimoVenda,
        prod.loteMultiploVenda,
        prod.pesoLiquido,
        prod.pesoBruto,
        prod.altura,
        prod.largura,
        prod.comprimento,
        prod.tipoProduto,
        prod.origemMercadoria,
        prod.idNcm,
        prod.listaServicos,
        prod.precoPautaTabelado,
        unMed.casasDecimaisUnidadeMedida
      FROM CAGRADEPRODUTOXKITSCOMBOS comb
      JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = comb.gradeProdutoFilho
      JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
      JOIN SIUNIDADESMEDIDA unMed ON unMed.unidadeMedida = prod.unidadeMedida
      WHERE comb.gradeProduto = p_item_gradeProduto
      AND comb.ativo = 1
      AND comb.gradeProduto <> comb.gradeProdutoFilho;
BEGIN
  r_obrigaFinalizar              := p_obrigaFinalizar;
  r_cab_quantidadeVolume         := p_cab_quantidadeVolume;
  r_cab_quantidade               := p_cab_quantidade;
  r_cab_pesoLiquido              := p_cab_pesoLiquido;
  r_cab_pesoBruto                := p_cab_pesoBruto;
  r_cab_valorProdutosBruto       := p_cab_valorProdutosBruto;
  r_cab_valorProdutos            := p_cab_valorProdutos;
  r_cab_valorDescontoProdutos    := p_cab_valorDescontoProdutos;
  r_cab_valorAcrescimoProdutos   := p_cab_valorAcrescimoProdutos;
  r_cab_valorServicosBruto       := p_cab_valorServicosBruto;
  r_cab_valorServicos            := p_cab_valorServicos;
  r_cab_valorDescontoServicos    := p_cab_valorDescontoServicos;
  r_cab_valorAcrescimoServicos   := p_cab_valorAcrescimoServicos;
  r_cab_valorBasePagamento       := p_cab_valorBasePagamento;
  r_cab_valorAVistaMinimo        := p_cab_valorAVistaMinimo;
  r_cab_valorDescontoTotal       := p_cab_valorDescontoTotal;
  r_cab_valorOutrasDespTotal     := p_cab_valorOutrasDespTotal;
  r_cab_valorImpostosSomaPag     := p_cab_valorImpostosSomaPag;
  r_cab_valorImpostosDiminuiPag  := p_cab_valorImpostosDiminuiPag;
  r_cab_valorLiquidoItem         := p_cab_valorLiquidoItem;
  r_cab_valorMargem              := p_cab_valorMargem;
  r_buffer_idItemOrcamento       := p_buffer_idItemOrcamento;
  r_item_valorTotalItem          := 0;
  SELECT locEst.indicadorPropriedadePosseItem
  INTO v_locEst_indicadorPropPosseIt
  FROM PALOCAISESTOQUE locEst
  WHERE locEst.localEstoque = p_item_localEstoque;
  FOR comb IN c_comb LOOP
    v_item_quantidade := ROUND (p_item_quantidade * comb.quantidade, comb.casasDecimaisUnidadeMedida);
    IF comb.controleEstoque = 3 THEN
      ADD_ORCAMENTO_ITEM_INSERE_COMB (
        p_uniqueMachineID,
        p_usuarioLogado,
        p_perfilUsuarioLogado,
        p_estabelecimentoAtivo,
        p_config_64_casasDecSaidas,
        p_config_65_casasDecEntrada,
        p_config_209_filtrarGrupoEcon,
        p_config_330_redIcmsBasePisCof,
        p_config_362_calcCustoPorGrade,
        p_config_378_calcularVolumes,
        p_regMarg_tipoPreco,
        p_regMarg_tabelaPreco,
        p_regMarg_fatorMultiplicador,
        p_regMarg_tipoPrecoB,
        p_regMarg_tabelaPrecoB,
        p_regMarg_fatorMultiplicadorB,
        p_regMarg_reduzirImpostos,
        p_regMarg_reduzirTarifaCartao,
        p_regMarg_taxaCapitacaoCustoFi,
        p_regMarg_exibPercMargemCab,
        p_regMarg_exibImagemMargemCab,
        p_regMarg_regraImagemCab,
        p_regMarg_exibPercMargemItem,
        p_regMarg_exibImagemMargemItem,
        p_regMarg_regraImagemItem,
        p_regMarg_exibDetMargemItem,
        r_obrigaFinalizar,
        p_cab_orcamento,
        p_cab_origemDocumento,
        p_cab_tipoDocumento,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_finalidadeNota,
        p_cab_atualizaCustoMedio,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataPreco,
        p_cab_pessoa,
        p_cab_dataEntrega,
        p_cab_enderecoEntregaPessoa,
        p_cab_municipioFatoGerador,
        p_cab_localDestinoOperacao,
        p_cab_indicadorConsumidorFinal,
        p_cab_tipoPagamentoFrete,
        r_cab_quantidadeVolume,
        r_cab_quantidade,
        r_cab_pesoLiquido,
        r_cab_pesoBruto,
        r_cab_valorProdutosBruto,
        r_cab_valorProdutos,
        r_cab_valorDescontoProdutos,
        r_cab_valorAcrescimoProdutos,
        r_cab_valorServicosBruto,
        r_cab_valorServicos,
        r_cab_valorDescontoServicos,
        r_cab_valorAcrescimoServicos,
        p_cab_prazoMedioPonderado,
        r_cab_valorBasePagamento,
        r_cab_valorAVistaMinimo,
        r_cab_valorDescontoTotal,
        r_cab_valorOutrasDespTotal,
        p_cab_valorFreteTotal,
        p_cab_valorSeguroTotal,
        p_cab_valorAdicFreteMarTotal,
        p_cab_valorDespesasAduanTotal,
        r_cab_valorImpostosSomaPag,
        r_cab_valorImpostosDiminuiPag,
        r_cab_valorLiquidoItem,
        p_cab_valorTarifaCartao,
        r_cab_valorMargem,
        p_modDoc_capituloNatFiscal,
        p_modDoc_movimentaEstoque,
        p_modDoc_geraFinanceiro,
        p_modDoc_habilitaAmbiente,
        p_modDoc_tipoPreco,
        p_modDoc_tabelaPreco,
        p_modDoc_fatorMultipPreco,
        p_modDoc_tipoPrecoB,
        p_modDoc_tabelaPrecoB,
        p_modDoc_fatorMultipPrecoB,
        p_modDoc_diminuiDescontoPrUnit,
        p_modDoc_somaAcrescimosPrUnit,
        p_modDoc_somaFreteSeguroPrUnit,
        p_est_grupoFiscal,
        p_pessEst_regimeTributario,
        p_munEndEst_uf,
        p_pess_indicadorInscricaoEstad,
        p_endPess_enderecoPessoa,
        p_munEndPess_uf,
        p_munEndEntr_uf,
        p_etOrc_situacaoOrcamento,
        p_item_vendedor,
        comb.gradeProdutoFilho,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_dataEntrega,
        v_item_quantidade,
        p_item_controleEntrega,
        p_item_usarPrecoAVista,
        p_item_percDescontoItem,
        p_item_percAcrescimoItem,
        p_item_observacoesDigitadas,
        p_idEnderecoEstoque,
        p_item_ambiente,
        p_item_amb_observacoes,
        p_atualizarTempMargem,
        p_idItemOrcamentoReferenciado,
        p_idItemDocTransferencia,
        r_buffer_idItemOrcamento,
        /* Retornos */
        r_obrigaFinalizar,
        r_cab_quantidadeVolume,
        r_cab_quantidade,
        r_cab_pesoLiquido,
        r_cab_pesoBruto,
        r_cab_valorProdutosBruto,
        r_cab_valorProdutos,
        r_cab_valorDescontoProdutos,
        r_cab_valorAcrescimoProdutos,
        r_cab_valorServicosBruto,
        r_cab_valorServicos,
        r_cab_valorDescontoServicos,
        r_cab_valorAcrescimoServicos,
        r_cab_valorBasePagamento,
        r_cab_valorAVistaMinimo,
        r_cab_valorDescontoTotal,
        r_cab_valorOutrasDespTotal,
        r_cab_valorImpostosSomaPag,
        r_cab_valorImpostosDiminuiPag,
        r_cab_valorLiquidoItem,
        r_cab_valorMargem,
        r_cab_percentualMargem,
        r_cab_imagemMargem,
        r_buffer_idItemOrcamento,
        v_item_valorTotalItem);
      r_item_valorTotalItem := r_item_valorTotalItem + v_item_valorTotalItem;
    ELSE
      v_item_idItemOrcamento := 0;
      ADD_ITEM_PROD_DADOS_BUSCA (
        p_cab_entradaSaida,
        0,
        p_cab_pessoa,
        v_item_quantidade,
        comb.produto,
        comb.unidadeMedida,
        comb.controleQuantidadeVenda,
        comb.unidadeMedidaVenda,
        comb.conversorQuantidadeVenda,
        comb.loteMinimoVenda,
        comb.loteMultiploVenda,
        comb.pesoLiquido,
        comb.pesoBruto,
        comb.altura,
        comb.largura,
        comb.comprimento,
        comb.tipoProduto,
        comb.precoPautaTabelado,
        comb.casasDecimaisUnidadeMedida,
        /* Retornos */
        v_item_servico,
        v_item_controleQuantidade,
        v_item_unidadeMedidaConversao,
        v_item_conversorQuantidade,
        v_item_loteMinimo,
        v_item_loteMultiplo,
        v_item_altura,
        v_item_largura,
        v_item_comprimento,
        v_item_pecas,
        v_item_quantidadeConvertida,
        v_item_pesoLiquido,
        v_item_pesoBruto,
        v_item_precoPautaTabelado);
      ADD_BUSCA_PRECO (
        p_config_64_casasDecSaidas,
        p_config_65_casasDecEntrada,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        p_cab_entradaSaida,
        0,
        p_cab_estabelecimento,
        NULL,
        p_cab_dataPreco,
        p_cab_pessoa,
        p_modDoc_capituloNatFiscal,
        p_modDoc_tipoPreco,
        p_modDoc_tabelaPreco,
        p_modDoc_fatorMultipPreco,
        p_modDoc_tipoPrecoB,
        p_modDoc_tabelaPrecoB,
        p_modDoc_fatorMultipPrecoB,
        p_munEndEst_uf,
        p_munEndPess_uf,
        p_item_vendedor,
        0,
        0,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        v_item_quantidade,
        comb.produto,
        comb.cor,
        comb.tamanho,
        comb.controleEstoque,
        v_locEst_indicadorPropPosseIt,
        0,
        v_item_precoSugestaoAPrazo,
        v_item_precoSugestaoAVista,
        v_item_tipoPreco,
        v_item_tabelaPreco,
        /* Retornos */
        v_item_tipoPreco,
        v_item_tabelaPreco,
        v_item_precoSugestaoAPrazo,
        v_item_precoSugestaoAVista,
        v_item_precoDesconto,
        v_item_precoMinimo,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber);
      v_item_precoUnitarioBruto      := CASE WHEN p_item_usarPrecoAVista = 1 THEN v_item_precoSugestaoAVista ELSE v_item_precoSugestaoAPrazo END;
      v_item_precoUnitario           := v_item_precoUnitarioBruto;
      v_item_valorProdutoServicoBrut := ROUND ((v_item_quantidade * v_item_precoUnitarioBruto), 2);
      v_item_valorProdutoServico     := v_item_valorProdutoServicoBrut;
      v_item_valorDescontoItem       := ROUND ((v_item_valorProdutoServico * p_item_percDescontoItem / 100), 2);
      v_item_valorAcrescimoItem      := ROUND ((v_item_valorProdutoServico * p_item_percAcrescimoItem / 100), 2);
      v_item_operacaoFiscal          := FUNC_ADD_BUSCA_OPERACAO_FISCAL (
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_pessoa,
        0,
        p_cab_municipioFatoGerador,
        p_cab_indicadorConsumidorFinal,
        p_est_grupoFiscal,
        p_pessEst_regimeTributario,
        p_munEndEst_uf,
        p_pess_indicadorInscricaoEstad,
        p_munEndPess_uf,
        comb.produto);
      ADD_ITEM_OPERACAO_FISCAL_BUSCA (
        1,
        p_cab_origemDocumento,
        p_cab_tipoDocumento,
        p_cab_entradaSaida,
        0,
        p_cab_finalidadeNota,
        p_cab_estabelecimento,
        0,
        p_cab_dataEmissao,
        p_cab_pessoa,
        0,
        p_cab_enderecoEntregaPessoa,
        p_cab_localDestinoOperacao,
        p_cab_indicadorConsumidorFinal,
        p_modDoc_movimentaEstoque,
        p_modDoc_geraFinanceiro,
        p_munEndEst_uf,
        p_pess_indicadorInscricaoEstad,
        p_endPess_enderecoPessoa,
        p_munEndPess_uf,
        p_munEndEntr_uf,
        v_item_operacaoFiscal,
        comb.produto,
        comb.tipoProduto,
        comb.origemMercadoria,
        comb.idNcm,
        comb.listaServicos,
        0,
        0,
        0,
        1,
        ' ',
        0,
        1,
        0,
        1,
        0,
        1,
        0,
        1,
        0,
        1,
        0,
        1,
        0,
        1,
        0,
        1,
        0,
        '  ',
        0,
        0,
        1,
        '  ',
        0,
        0,
        1,
        0,
        0,
        1,
        '  ',
        0,
        0,
        1,
        0,
        0,
        1,
        '   ',
        0,
        1,
        '  ',
        ' ',
        0,
        0,
        0,
        '  ',
        0,
        1,
        ' ',
        0,
        0,
        0,
        1,
        0,
        0,
        0,
        0,
        '  ',
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        1,
        0,
        0,
        0,
        1,
        0,
        0,
        0,
        0,
        1,
        0,
        0,
        0,
        /* Retornos */
        v_auxNumber,
        v_item_movimentaEstoque,
        v_item_geraFinanceiro,
        v_item_cfop,
        v_item_indicadorISSQN,
        v_item_aliquotaISSQN,
        v_item_aliquotaIRRF,
        v_item_aliquotaINSS,
        v_item_retencaoPIS,
        v_item_retencaoCOFINS,
        v_item_retencaoCSLL,
        v_item_aliquotaII,
        v_item_aliquotaIOF,
        v_item_codigoEnquadramentoIPI,
        v_item_stIPI,
        v_item_aliquotaIPI,
        v_item_valorAliquotaIPI,
        v_item_stPIS,
        v_item_aliquotaPIS,
        v_item_valorAliquotaPIS,
        v_item_aliquotaPISST,
        v_item_valorAliquotaPISST,
        v_item_stCOFINS,
        v_item_aliquotaCOFINS,
        v_item_valorAliquotaCOFINS,
        v_item_aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST,
        v_item_stSimplesNacional,
        v_item_creditoSimplesNacional,
        v_item_stICMS,
        v_item_modalBaseCalcICMS,
        v_item_reducaoBaseICMS,
        v_item_aliquotaICMS,
        v_item_diferimentoICMS,
        v_item_motivoDesoneracaoICMS,
        v_auxNumber,
        v_item_modalBaseCalcICMSST,
        v_item_margemValorAdicST,
        v_item_reducaoBaseST,
        v_item_aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin,
        v_item_reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo,
        v_auxVarchar,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_item_aliquotaICMSUFDestinat,
        v_item_aliquotaICMSInterestad,
        v_item_partilhaICMSInterestad,
        v_item_aliquotaFCP,
        v_item_aliquotaFCPST,
        v_item_aliquotaFCPSTAnteriorm,
        v_item_aliquotaFCPUFDestinat,
        v_item_aliquotaEstImpFederais,
        v_item_aliquotaEstImpEstaduais,
        v_item_aliquotaEstImpMunicipai);      
      v_item_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
        p_uniqueMachineID,
        p_perfilUsuarioLogado,
        p_usuarioLogado,
        ' ',
        0,
        0,
        0,
        0,
        'O',
        p_cab_entradaSaida,
        0,
        p_cab_estabelecimento,
        0,
        comb.gradeProdutoFilho,
        0,
        0,
        0,
        v_item_controleQuantidade,
        v_item_loteMultiplo,
        v_item_altura,
        v_item_largura,
        v_item_comprimento,
        v_item_quantidade,
        p_item_observacoesDigitadas);
      ADD_CALCULA_TOTAIS_ITEM (
        p_uniqueMachineID,
        ' ',
        0,
        0,
        0,
        0,
        'O',
        p_cab_entradaSaida,
        0,
        p_cab_tipoPagamentoFrete,
        p_cab_tipoPagamentoFrete,
        0,
        p_modDoc_diminuiDescontoPrUnit,
        p_modDoc_somaAcrescimosPrUnit,
        p_modDoc_somaFreteSeguroPrUnit,
        0,
        v_item_quantidade,
        v_item_quantidadeConvertida,
        v_item_precoUnitarioBruto,
        v_item_precoUnitario,
        v_item_valorProdutoServicoBrut,
        v_item_valorProdutoServico,
        v_item_valorDescontoItem,
        v_item_valorAcrescimoItem,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        v_item_valorDescontoTotal,
        v_item_valorOutrasDespTotal,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        /* Retornos */
        v_auxNumber,
        v_auxNumber,
        v_item_precoUnitario,
        v_auxNumber,
        v_item_precoUnitarioConvertido,
        v_auxNumber,
        v_item_valorProdutoServico,
        v_auxNumber,
        v_item_valorTotalItem,
        v_auxNumber,
        v_auxNumber,
        v_item_valorDescontoTotal,
        v_item_valorOutrasDespTotal,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber);
      ADD_CALCULA_IMPOSTOS_ITEM (
        p_config_64_casasDecSaidas,
        p_config_209_filtrarGrupoEcon,
        p_config_330_redIcmsBasePisCof,
        p_config_362_calcCustoPorGrade,
        p_cab_entradaSaida,
        0,
        p_cab_estabelecimento,
        0,
        p_cab_dataEmissao,
        p_cab_pessoa,
        p_cab_localDestinoOperacao,
        p_cab_indicadorConsumidorFinal,
        p_cab_tipoPagamentoFrete,
        p_pess_indicadorInscricaoEstad,
        0,
        v_item_quantidade,
        v_item_precoPautaTabelado,
        v_item_valorProdutoServico,
        0,
        0,
        v_item_valorDescontoTotal,
        v_item_valorOutrasDespTotal,
        0,
        0,
        v_item_cfop,
        1,
        v_item_indicadorISSQN,
        v_item_aliquotaISSQN,
        0,
        0,
        1,
        v_item_aliquotaIRRF,
        0,
        0,
        1,
        v_item_aliquotaINSS,
        0,
        0,
        1,
        v_item_retencaoPIS,
        0,
        0,
        1,
        v_item_retencaoCOFINS,
        0,
        0,
        1,
        v_item_retencaoCSLL,
        0,
        0,
        1,
        v_item_aliquotaII,
        0,
        0,
        1,
        v_item_aliquotaIOF,
        0,
        0,
        1,
        v_item_aliquotaIPI,
        v_item_valorAliquotaIPI,
        0,
        0,
        0,
        1,
        v_item_aliquotaPIS,
        v_item_valorAliquotaPIS,
        0,
        0,
        1,
        v_item_aliquotaPISST,
        v_item_valorAliquotaPISST,
        0,
        0,
        1,
        v_item_aliquotaCOFINS,
        v_item_valorAliquotaCOFINS,
        0,
        0,
        1,
        v_item_aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST,
        0,
        0,
        1,
        v_item_stSimplesNacional,
        v_item_creditoSimplesNacional,
        0,
        0,
        1,
        v_item_stICMS,
        v_item_modalBaseCalcICMS,
        v_item_reducaoBaseICMS,
        v_item_aliquotaICMS,
        v_item_diferimentoICMS,
        0,
        0,
        0,
        0,
        0,
        1,
        v_item_modalBaseCalcICMSST,
        v_item_margemValorAdicST,
        v_item_reducaoBaseST,
        v_item_aliquotaICMSST,
        0,
        0,
        1,
        0,
        0,
        0,
        v_item_reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo,
        0,
        0,
        0,
        '  ',
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        1,
        v_item_aliquotaICMSUFDestinat,
        v_item_aliquotaICMSInterestad,
        v_item_partilhaICMSInterestad,
        0,
        0,
        0,
        0,
        1,
        v_item_aliquotaFCP,
        0,
        0,
        v_item_aliquotaFCPST,
        0,
        0,
        v_item_aliquotaFCPSTAnteriorm,
        0,
        0,
        v_item_aliquotaFCPUFDestinat,
        0,
        0,
        1,
        v_item_aliquotaEstImpFederais,
        v_item_aliquotaEstImpEstaduais,
        v_item_aliquotaEstImpMunicipai,
        0,
        0,
        0,
        0,
        comb.produto,
        comb.cor,
        comb.tamanho,
        comb.controleEstoque,
        comb.tipoProduto,
        /* Retornos */
        v_item_baseISSQN,
        v_item_valorISSQN,
        v_item_baseIRRF,
        v_item_valorIRRF,
        v_item_baseINSS,
        v_item_valorINSS,
        v_item_baseRetPIS,
        v_item_valorRetPIS,
        v_item_baseRetCOFINS,
        v_item_valorRetCOFINS,
        v_item_baseRetCSLL,
        v_item_valorRetCSLL,
        v_item_baseII,
        v_item_valorII,
        v_item_baseIOF,
        v_item_valorIOF,
        v_item_baseIPI,
        v_item_valorIPI,
        v_item_basePIS,
        v_item_valorPIS,
        v_item_basePISST,
        v_item_valorPISST,
        v_item_baseCOFINS,
        v_item_valorCOFINS,
        v_item_baseCOFINSST,
        v_item_valorCOFINSST,
        v_item_baseCreditoSimplesNac,
        v_item_valorCreditoSimplesNac,
        v_item_baseICMS,
        v_item_valorICMSOperacao,
        v_item_valorICMSDiferido,
        v_item_valorICMS,
        v_item_valorICMSDesoneracao,
        v_item_baseICMSST,
        v_item_valorICMSST,
        v_item_baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment,
        v_item_valorICMSProprioSubstit,
        v_item_baseICMSEfetivo,
        v_item_valorICMSEfetivo,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_item_baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente,
        v_item_valorICMSUFRemetente,
        v_item_baseFCP,
        v_item_valorFCP,
        v_item_baseFCPST,
        v_item_valorFCPST,
        v_item_baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente,
        v_item_baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario,
        v_item_baseEstimadaImpostos,
        v_item_valorEstImpFederais,
        v_item_valorEstImpEstaduais,
        v_item_valorEstImpMunicipais);
      ADD_CALCULA_VALOR_LIQUIDO (
        0,
        p_cab_tipoPagamentoFrete,
        v_item_geraFinanceiro,
        v_item_valorProdutoServico,
        0,
        0,
        0,
        0,
        0,
        v_item_valorDescontoTotal,
        v_item_valorOutrasDespTotal,
        v_item_valorIRRF,
        v_item_valorINSS,
        v_item_valorRetPIS,
        v_item_valorRetCOFINS,
        v_item_valorRetCSLL,
        v_item_valorII,
        v_item_valorIOF,
        v_item_valorIPI,
        0,
        v_item_valorICMSST,
        0,
        0,
        0,
        /* Retornos */
        v_item_valorBasePagamento,
        v_item_valorImpostosSomaPag,
        v_item_valorImpostosDiminuiPag,
        v_item_valorLiquidoItem);
      IF p_config_378_calcularVolumes = 1 THEN
        r_cab_quantidadeVolume       := r_cab_quantidadeVolume + TRUNC(CASE WHEN v_item_controleQuantidade = 1 AND v_item_loteMultiplo <> 0 THEN v_item_quantidade / v_item_loteMultiplo ELSE v_item_quantidadeConvertida END,0);
      END IF;
      r_cab_quantidade               := r_cab_quantidade + v_item_quantidadeConvertida;
      r_cab_pesoLiquido              := r_cab_pesoLiquido + v_item_pesoLiquido;
      r_cab_pesoBruto                := r_cab_pesoBruto + v_item_pesoBruto;
      IF v_item_servico = 1 THEN
        r_cab_valorServicosBruto     := r_cab_valorServicosBruto + v_item_valorProdutoServicoBrut;
        r_cab_valorServicos          := r_cab_valorServicos + v_item_valorProdutoServico;
        r_cab_valorDescontoServicos  := r_cab_valorDescontoServicos + v_item_valorDescontoItem;
        r_cab_valorAcrescimoServicos := r_cab_valorAcrescimoServicos + v_item_valorAcrescimoItem;
      ELSE 
        r_cab_valorProdutosBruto     := r_cab_valorProdutosBruto + v_item_valorProdutoServicoBrut;
        r_cab_valorProdutos          := r_cab_valorProdutos + v_item_valorProdutoServico;
        r_cab_valorDescontoProdutos  := r_cab_valorDescontoProdutos + v_item_valorDescontoItem;
        r_cab_valorAcrescimoProdutos := r_cab_valorAcrescimoProdutos + v_item_valorAcrescimoItem;
      END IF;
      r_cab_valorBasePagamento       := r_cab_valorBasePagamento + v_item_valorBasePagamento;
      IF p_item_usarPrecoAVista = 1 AND v_item_geraFinanceiro = 1 THEN
        r_cab_valorAVistaMinimo      := r_cab_valorAVistaMinimo + v_item_valorProdutoServico - v_item_valorDescontoTotal + v_item_valorOutrasDespTotal;
      END IF;
      r_cab_valorDescontoTotal       := r_cab_valorDescontoTotal + v_item_valorDescontoTotal;
      r_cab_valorOutrasDespTotal     := r_cab_valorOutrasDespTotal + v_item_valorOutrasDespTotal;
      r_cab_valorImpostosSomaPag     := r_cab_valorImpostosSomaPag + v_item_valorImpostosSomaPag;
      r_cab_valorImpostosDiminuiPag  := r_cab_valorImpostosDiminuiPag + v_item_valorImpostosDiminuiPag;
      r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem + v_item_valorLiquidoItem;
      SELECT COALESCE (MAX (sequencia),0) + 1
      INTO v_item_sequencia
      FROM MOORCAMENTOXITENS
      WHERE orcamento = p_cab_orcamento;
      ADD_ORCAMENTO_ITEM_GRAVA (
        p_estabelecimentoAtivo,
        r_obrigaFinalizar,
        p_cab_orcamento,
        p_cab_modeloDocumento,
        p_cab_entradaSaida,
        p_cab_estabelecimento,
        p_cab_dataEmissao,
        p_cab_dataEntrega,
        p_etOrc_situacaoOrcamento,
        0,
        v_item_sequencia,
        0,
        0,
        p_item_vendedor,
        0,
        comb.gradeProdutoFilho,
        v_item_servico,
        0,
        'A',
        0,
        0,
        0,
        0,
        0,
        999,
        v_item_operacaoFiscal,
        0,
        v_item_movimentaEstoque,
        v_item_geraFinanceiro,
        0,
        p_item_localEstoque,
        0,
        p_item_pessoaParticipante,
        p_item_dataEntrega,
        v_item_controleQuantidade,
        v_item_unidadeMedidaConversao,
        v_item_conversorQuantidade,
        v_item_loteMinimo,
        v_item_loteMultiplo,
        v_item_altura,
        v_item_largura,
        v_item_comprimento,
        v_item_pecas,
        v_item_quantidade,
        v_item_quantidadeConvertida,
        0,
        v_item_quantidade,
        p_item_controleEntrega,
        1,
        v_item_pesoLiquido,
        v_item_pesoBruto,
        v_item_tipoPreco,
        v_item_tabelaPreco,
        v_item_precoSugestaoAPrazo,
        v_item_precoSugestaoAVista,
        v_item_precoDesconto,
        v_item_precoMinimo,
        p_item_usarPrecoAVista,
        v_item_precoPautaTabelado,
        v_item_precoUnitarioBruto,
        0,
        v_item_precoUnitario,
        v_item_precoUnitarioConvertido,
        v_item_valorProdutoServicoBrut,
        v_item_valorProdutoServico,
        p_item_percDescontoItem,
        v_item_valorDescontoItem,
        p_item_percAcrescimoItem,
        v_item_valorAcrescimoItem,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        v_item_valorBasePagamento,
        0,
        0,
        0,
        0,
        0,
        v_item_valorDescontoTotal,
        v_item_valorOutrasDespTotal,
        0,
        0,
        v_item_cfop,
        v_item_indicadorISSQN,
        v_item_aliquotaISSQN,
        v_item_baseISSQN,
        v_item_valorISSQN,
        v_item_aliquotaIRRF,
        v_item_baseIRRF,
        v_item_valorIRRF,
        v_item_aliquotaINSS,
        v_item_baseINSS,
        v_item_valorINSS,
        v_item_retencaoPIS,
        v_item_baseRetPIS,
        v_item_valorRetPIS,
        v_item_retencaoCOFINS,
        v_item_baseRetCOFINS,
        v_item_valorRetCOFINS,
        v_item_retencaoCSLL,
        v_item_baseRetCSLL,
        v_item_valorRetCSLL,
        v_item_aliquotaII,
        v_item_baseII,
        v_item_valorII,
        v_item_aliquotaIOF,
        v_item_baseIOF,
        v_item_valorIOF,
        v_item_codigoEnquadramentoIPI,
        v_item_stIPI,
        v_item_aliquotaIPI,
        v_item_valorAliquotaIPI,
        v_item_baseIPI,
        v_item_valorIPI,
        v_item_stPIS,
        v_item_aliquotaPIS,
        v_item_valorAliquotaPIS,
        v_item_basePIS,
        v_item_valorPIS,
        v_item_aliquotaPISST,
        v_item_valorAliquotaPISST,
        v_item_basePISST,
        v_item_valorPISST,
        v_item_stCOFINS,
        v_item_aliquotaCOFINS,
        v_item_valorAliquotaCOFINS,
        v_item_baseCOFINS,
        v_item_valorCOFINS,
        v_item_aliquotaCOFINSST,
        v_item_valorAliquotaCOFINSST,
        v_item_baseCOFINSST,
        v_item_valorCOFINSST,
        v_item_stSimplesNacional,
        v_item_creditoSimplesNacional,
        v_item_baseCreditoSimplesNac,
        v_item_valorCreditoSimplesNac,
        v_item_stICMS,
        v_item_modalBaseCalcICMS,
        v_item_reducaoBaseICMS,
        v_item_aliquotaICMS,
        v_item_diferimentoICMS,
        v_item_motivoDesoneracaoICMS,
        v_item_baseICMS,
        v_item_valorICMSOperacao,
        v_item_valorICMSDiferido,
        v_item_valorICMS,
        v_item_valorICMSDesoneracao,
        v_item_modalBaseCalcICMSST,
        v_item_margemValorAdicST,
        v_item_reducaoBaseST,
        v_item_aliquotaICMSST,
        v_item_aliquotaSTSuportConsFin,
        v_item_baseICMSST,
        v_item_valorICMSST,
        v_item_baseICMSSTAnteriormente,
        v_item_valorICMSSTAnteriorment,
        v_item_valorICMSProprioSubstit,
        v_item_reducaoBaseICMSEfetivo,
        v_item_aliquotaICMSEfetivo,
        v_item_baseICMSEfetivo,
        v_item_valorICMSEfetivo,
        v_item_aliquotaICMSUFDestinat,
        v_item_aliquotaICMSInterestad,
        v_item_partilhaICMSInterestad,
        v_item_baseICMSUFDestinatario,
        v_item_valorICMSUFDestinatario,
        v_item_baseICMSUFRemetente,
        v_item_valorICMSUFRemetente,
        v_item_aliquotaFCP,
        v_item_baseFCP,
        v_item_valorFCP,
        v_item_aliquotaFCPST,
        v_item_baseFCPST,
        v_item_valorFCPST,
        v_item_aliquotaFCPSTAnteriorm,
        v_item_baseFCPSTAnteriormente,
        v_item_valorFCPSTAnteriormente,
        v_item_aliquotaFCPUFDestinat,
        v_item_baseFCPUFDestinatario,
        v_item_valorFCPUFDestinatario,
        v_item_aliquotaEstImpFederais,
        v_item_aliquotaEstImpEstaduais,
        v_item_aliquotaEstImpMunicipai,
        v_item_baseEstimadaImpostos,
        v_item_valorEstImpFederais,
        v_item_valorEstImpEstaduais,
        v_item_valorEstImpMunicipais,
        v_item_valorImpostosSomaPag,
        v_item_valorImpostosDiminuiPag,
        v_item_valorLiquidoItem,
        p_item_observacoesDigitadas,
        v_item_observacoes,
        /* Retornos */
        r_obrigaFinalizar,
        v_item_idItemOrcamento);
        r_item_valorTotalItem    := r_item_valorTotalItem + v_item_valorTotalItem;
        r_buffer_idItemOrcamento := CASE WHEN (r_buffer_idItemOrcamento IS NULL OR r_buffer_idItemOrcamento = '' OR r_buffer_idItemOrcamento = ' ') THEN '' ELSE RTRIM (r_buffer_idItemOrcamento) || ';' END || TO_CHAR (LPAD(v_item_idItemOrcamento,14,'0'));
      IF p_modDoc_habilitaAmbiente = 1 THEN
        MERGE INTO MOORCAMENTOXAMBIENTES a
        USING (
          SELECT
            v_item_idItemOrcamento idItemOrcamento,
            p_item_ambiente        ambiente,
            p_item_amb_observacoes observacoes
          FROM DUAL
        ) b ON (a.idItemOrcamento = b.idItemOrcamento)
        WHEN MATCHED THEN
          UPDATE SET
            a.ambiente    = b.ambiente,
            a.observacoes = b.observacoes
        WHEN NOT MATCHED THEN
          INSERT (
            idItemOrcamento,
            ambiente,
            observacoes)
          VALUES (
            b.idItemOrcamento,
            b.ambiente,
            b.observacoes);
      END IF;
      IF p_idItemOrcamentoReferenciado > 0 THEN
        ADD_ORCAMENTO_ITEM_ORC_GRAVA (
          p_estabelecimentoAtivo,
          v_item_idItemOrcamento,
          p_idItemOrcamentoReferenciado,
          v_item_quantidade);
      END IF;
      IF p_idItemDocTransferencia > 0 THEN
        ADD_ORCAMENTO_ITEM_TRANS_GRAVA (
          p_estabelecimentoAtivo,
          p_cab_entradaSaida,
          p_idItemDocTransferencia,
          v_item_idItemOrcamento,
          v_item_quantidade);
      END IF;
      IF p_idEnderecoEstoque > 0 THEN
        ADD_ORCAMENTO_ITEM_ENDER_GRAVA (
          p_estabelecimentoAtivo,
          0,
          v_item_idItemOrcamento,
          p_idEnderecoEstoque,
          v_item_quantidade,
          v_item_quantidade,
          v_item_observacoes,
          /* Retornos */
          v_auxNumber);
      END IF;
      IF p_atualizarTempMargem = 1 
        AND (p_regMarg_exibPercMargemCab = 1
          OR p_regMarg_exibImagemMargemCab = 1
          OR p_regMarg_exibPercMargemItem = 1
          OR p_regMarg_exibImagemMargemItem = 1
          OR p_regMarg_exibDetMargemItem = 1)
        AND p_cab_tipoDocumento IN (101,102,301,501,503) THEN
        ADD_TEMP_MARGEM_ITEM_GRAVA (
          p_uniqueMachineID,
          p_config_65_casasDecEntrada,
          p_config_209_filtrarGrupoEcon,
          p_config_362_calcCustoPorGrade,
          p_regMarg_tipoPreco,
          p_regMarg_tabelaPreco,
          p_regMarg_fatorMultiplicador,
          p_regMarg_tipoPrecoB,
          p_regMarg_tabelaPrecoB,
          p_regMarg_fatorMultiplicadorB,
          p_regMarg_reduzirImpostos,
          p_regMarg_reduzirTarifaCartao,
          p_regMarg_taxaCapitacaoCustoFi,
          p_regMarg_exibImagemMargemCab,
          p_regMarg_regraImagemCab,
          p_regMarg_exibImagemMargemItem,
          p_regMarg_regraImagemItem,
          'O',
          p_cab_orcamento,
          p_cab_estabelecimento,
          p_cab_dataPreco,
          p_cab_prazoMedioPonderado,
          p_cab_valorFreteTotal,
          p_cab_valorSeguroTotal,
          p_cab_valorAdicFreteMarTotal,
          p_cab_valorDespesasAduanTotal,
          r_cab_valorLiquidoItem,
          p_cab_valorTarifaCartao,
          r_cab_valorMargem,
          p_munEndEst_uf,
          v_item_sequencia,
          0,
          0,
          0,
          0,
          p_item_localEstoque,
          p_item_pessoaParticipante,
          v_item_quantidade,
          0,
          0,
          0,
          0,
          v_item_valorII,
          v_item_valorIOF,
          v_item_valorIPI,
          0,
          v_item_valorPIS,
          v_item_valorPISST,
          v_item_valorCOFINS,
          v_item_valorCOFINSST,
          v_item_valorCreditoSimplesNac,
          v_item_valorICMSOperacao,
          v_item_valorICMSDiferido,
          v_item_valorICMS,
          v_item_valorICMSDesoneracao,
          v_item_valorICMSST,
          v_item_valorICMSSTAnteriorment,
          v_item_valorICMSUFDestinatario,
          v_item_valorICMSUFRemetente,
          v_item_valorFCP,
          v_item_valorFCPST,
          v_item_valorFCPSTAnteriormente,
          v_item_valorFCPUFDestinatario,
          v_item_valorLiquidoItem,
          comb.produto,
          comb.cor,
          comb.tamanho,
          comb.controleEstoque,
          v_locEst_indicadorPropPosseIt,
          /* Retornos */
          r_cab_valorMargem,
          r_cab_percentualMargem,
          r_cab_imagemMargem,
          v_auxNumber,
          v_auxNumber,
          v_auxNumber,
          v_auxNumber,
          v_auxNumber,
          v_auxNumber,
          v_auxNumber,
          v_auxNumber,
          v_auxVarchar);
      END IF;
    END IF;
  END LOOP;
END ADD_ORCAMENTO_ITEM_INSERE_COMB;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_INSERE (
    p_uniqueMachineID              IN VARCHAR2,
    p_usuarioLogado                IN NUMBER,
    p_perfilUsuarioLogado          IN NUMBER,
    p_estabelecimentoAtivo         IN NUMBER,
    p_person_190_modeloFrete       IN CHAR,
    p_config_64_casasDecSaidas     IN CHAR,
    p_config_65_casasDecEntrada    IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_330_redIcmsBasePisCof IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_config_378_calcularVolumes   IN NUMBER,
    p_regMarg_tipoPreco            IN CHAR,
    p_regMarg_tabelaPreco          IN VARCHAR2,
    p_regMarg_fatorMultiplicador   IN NUMBER,
    p_regMarg_tipoPrecoB           IN CHAR,
    p_regMarg_tabelaPrecoB         IN VARCHAR2,
    p_regMarg_fatorMultiplicadorB  IN NUMBER,
    p_regMarg_reduzirImpostos      IN NUMBER,
    p_regMarg_reduzirTarifaCartao  IN NUMBER,
    p_regMarg_taxaCapitacaoCustoFi IN NUMBER,
    p_regMarg_exibPercMargemCab    IN NUMBER,
    p_regMarg_exibImagemMargemCab  IN NUMBER,
    p_regMarg_regraImagemCab       IN NUMBER,
    p_regMarg_exibPercMargemItem   IN NUMBER,
    p_regMarg_exibImagemMargemItem IN NUMBER,
    p_regMarg_regraImagemItem      IN NUMBER,
    p_regMarg_exibDetMargemItem    IN NUMBER,
    p_obrigaFinalizar              IN NUMBER,
    p_calculoImpostosPendente      IN NUMBER,
    p_manterFinanceiro             IN NUMBER,
    p_nomeTempComposicao           IN VARCHAR2,
    p_temp_sequencia               IN NUMBER,
    p_cab_orcamento                IN NUMBER,
    p_cab_valorTarifaCartao        IN NUMBER,
    p_cab_valorMargem              IN NUMBER,
    p_item_vendedor                IN NUMBER,
    p_item_gradeProduto            IN NUMBER,
    p_item_servico                 IN NUMBER,
    p_item_atividadeServico        IN NUMBER,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_idLoteEstoque           IN NUMBER,
    p_item_vinculoItemDocumento    IN NUMBER,
    p_item_operacaoFiscal          IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_item_pessoaParticipante      IN NUMBER,
    p_item_dataEntrega             IN DATE,
    p_item_controleQuantidade      IN NUMBER,
    p_item_unidadeMedidaConversao  IN VARCHAR2,
    p_item_conversorQuantidade     IN NUMBER,
    p_item_loteMinimo              IN NUMBER,
    p_item_loteMultiplo            IN NUMBER,
    p_item_altura                  IN NUMBER,
    p_item_largura                 IN NUMBER,
    p_item_comprimento             IN NUMBER,
    p_item_pecas                   IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_item_quantidadeConvertida    IN NUMBER,
    p_item_controleEntrega         IN NUMBER,
    p_item_pesoLiquido             IN NUMBER,
    p_item_pesoBruto               IN NUMBER,
    p_item_tipoPreco               IN CHAR,
    p_item_tabelaPreco             IN VARCHAR2,
    p_item_precoSugestaoAPrazo     IN NUMBER,
    p_item_precoSugestaoAVista     IN NUMBER,
    p_item_precoDesconto           IN NUMBER,
    p_item_precoMinimo             IN NUMBER,
    p_item_usarPrecoAVista         IN NUMBER,
    p_item_precoPautaTabelado      IN NUMBER,
    p_item_precoUnitarioBruto      IN NUMBER,
    p_item_acrescimoUnitarioCompos IN NUMBER,
    p_item_precoUnitario           IN NUMBER,
    p_item_precoUnitarioConvertido IN NUMBER,
    p_item_valorProdutoServicoBrut IN NUMBER,
    p_item_valorProdutoServico     IN NUMBER,
    p_item_percDescontoItem        IN NUMBER,
    p_item_valorDescontoItem       IN NUMBER,
    p_item_percAcrescimoItem       IN NUMBER,
    p_item_valorAcrescimoItem      IN NUMBER,
    p_item_valorFreteItem          IN NUMBER,
    p_item_valorSeguroItem         IN NUMBER,
    p_item_valorAdicFreteMarItem   IN NUMBER,
    p_item_valorDespesasAduanItem  IN NUMBER,
    p_item_valorFreteGeral         IN NUMBER,
    p_item_valorSeguroGeral        IN NUMBER,
    p_item_valorDescontoGeral      IN NUMBER,
    p_item_valorOutrasDespGeral    IN NUMBER,
    p_item_valorAdicFreteMarGeral  IN NUMBER,
    p_item_valorDespesasAduanGeral IN NUMBER,
    p_item_valorFreteTotal         IN NUMBER,
    p_item_valorSeguroTotal        IN NUMBER,
    p_item_valorDescontoTotal      IN NUMBER,
    p_item_valorOutrasDespTotal    IN NUMBER,
    p_item_valorAdicFreteMarTotal  IN NUMBER,
    p_item_valorDespesasAduanTotal IN NUMBER,
    p_item_observacoesDigitadas    IN VARCHAR2,
    p_idEnderecoEstoque            IN NUMBER,
    p_idNumeroSerie                IN NUMBER,
    p_item_ambiente                IN NUMBER,
    p_item_amb_observacoes         IN VARCHAR2,
    p_atualizarTempMargem          IN NUMBER,
    p_idItemOrcamentoReferenciado  IN NUMBER,
    p_idItemDocTransferencia       IN NUMBER,
    /* Retornos */
    r_obrigaFinalizar              OUT NUMBER,
    r_calculoImpostosPendente      OUT NUMBER,
    r_cab_modalidadeFrete          OUT CHAR,
    r_cab_ultimoVendedorItem       OUT NUMBER,
    r_cab_quantidade               OUT NUMBER,
    r_cab_valorProdutosBruto       OUT NUMBER,
    r_cab_valorProdutos            OUT NUMBER,
    r_cab_valorDescontoProdutos    OUT NUMBER,
    r_cab_valorAcrescimoProdutos   OUT NUMBER,
    r_cab_valorServicosBruto       OUT NUMBER,
    r_cab_valorServicos            OUT NUMBER,
    r_cab_valorDescontoServicos    OUT NUMBER,
    r_cab_valorAcrescimoServicos   OUT NUMBER,
    r_cab_valorFreteItem           OUT NUMBER,
    r_cab_valorFreteGeral          OUT NUMBER,
    r_cab_valorDescontoGeral       OUT NUMBER,
    r_cab_valorOutrasDespGeral     OUT NUMBER,
    r_cab_valorBasePagamento       OUT NUMBER,
    r_cab_valorAVistaMinimo        OUT NUMBER,
    r_cab_valorPagamentoBruto      OUT NUMBER,
    r_cab_valorPagamentoLiquido    OUT NUMBER,
    r_cab_valorTroco               OUT NUMBER,
    r_cab_valorFreteTotal          OUT NUMBER,
    r_cab_valorSeguroTotal         OUT NUMBER,
    r_cab_valorAdicFreteMarTotal   OUT NUMBER,
    r_cab_valorDespesasAduanTotal  OUT NUMBER,
    r_cab_valorImpostosSomaPag     OUT NUMBER,
    r_cab_valorImpostosDiminuiPag  OUT NUMBER,
    r_cab_valorLiquidoItem         OUT NUMBER,
    r_cab_valorMargem              OUT NUMBER,
    r_cab_percentualMargem         OUT NUMBER,
    r_cab_imagemMargem             OUT VARCHAR2,
    r_idItemOrcamento              OUT NUMBER,
    r_item_valorBasePagamento      OUT NUMBER,
    r_item_valorLiquidoSemFreteSeg OUT NUMBER,
    r_item_valorCaptacao           OUT NUMBER,
    r_item_valorTarifaCartao       OUT NUMBER,
    r_item_valorImpostos           OUT NUMBER,
    r_item_precoCusto              OUT NUMBER,
    r_item_valorCusto              OUT NUMBER,
    r_item_valorMargem             OUT NUMBER,
    r_item_percentualMargem        OUT NUMBER,
    r_item_imagemMargem            OUT VARCHAR2)
IS
    v_auxNumber                    NUMBER;
    v_auxVarchar                   VARCHAR2(256);
    v_cab_origemDocumento          NUMBER;
    v_cab_tipoDocumento            NUMBER;
    v_cab_modeloDocumento          NUMBER;
    v_cab_entradaSaida             CHAR;
    v_cab_finalidadeNota           CHAR;
    v_cab_atualizaCustoMedio       NUMBER;
    v_cab_estabelecimento          NUMBER;
    v_cab_dataEmissao              DATE;
    v_cab_dataPreco                DATE;
    v_cab_pessoa                   NUMBER;
    v_cab_dataEntrega              DATE;
    v_cab_municipioFatoGerador     NUMBER;
    v_cab_localDestinoOperacao     CHAR;
    v_cab_enderecoEntregaPessoa    NUMBER;
    v_cab_indicadorConsumidorFinal CHAR;
    v_cab_tipoPagamentoFrete       CHAR;
    v_cab_quantidadeVolume         NUMBER;
    v_cab_pesoLiquido              NUMBER;
    v_cab_pesoBruto                NUMBER;
    v_cab_valorSeguroItem          NUMBER;
    v_cab_valorAdicFreteMarItem    NUMBER;
    v_cab_valorDespesasAduanItem   NUMBER;
    v_cab_valorSeguroGeral         NUMBER;
    v_cab_valorAdicFreteMarGeral   NUMBER;
    v_cab_valorDespesasAduanGeral  NUMBER;
    v_cab_condicaoPagamento        NUMBER;
    v_cab_numeroParcelas           NUMBER;
    v_cab_somaPrazoParcelas        NUMBER;
    v_cab_valorXPrazoParcelas      NUMBER;
    v_cab_prazoMedio               NUMBER;
    v_cab_prazoMedioPonderado      NUMBER;
    v_cab_valorEntradaMinima       NUMBER;
    v_cab_valorAVistaEntrada       NUMBER;
    v_cab_valorDescontoPagamento   NUMBER;
    v_cab_valorOutrasDespPag       NUMBER;
    v_cab_valorJurosPagamento      NUMBER;
    v_cab_valorDescontoTotal       NUMBER;
    v_cab_valorOutrasDespTotal     NUMBER;
    v_modDoc_capituloNatFiscal     NUMBER;
    v_modDoc_movimentaEstoque      NUMBER;
    v_modDoc_geraFinanceiro        NUMBER;
    v_modDoc_habilitaAmbiente      NUMBER;
    v_modDoc_tipoPreco             CHAR(1);
    v_modDoc_tabelaPreco           VARCHAR2(10);
    v_modDoc_fatorMultipPreco      NUMBER;
    v_modDoc_tipoPrecoB            CHAR(1);
    v_modDoc_tabelaPrecoB          VARCHAR2(10);
    v_modDoc_fatorMultipPrecoB     NUMBER;
    v_modDoc_diminuiDescontoPrUnit NUMBER;
    v_modDoc_somaAcrescimosPrUnit  NUMBER;
    v_modDoc_somaFreteSeguroPrUnit NUMBER;
    v_est_grupoFiscal              NUMBER;
    v_pessEst_regimeTributario     CHAR(1);
    v_munEndEst_uf                 CHAR(2);
    v_pess_indicadorInscricaoEstad CHAR(1);
    v_endPess_enderecoPessoa       NUMBER;
    v_munEndPess_uf                CHAR(2);
    v_munEndEntr_uf                CHAR(2);
    v_etOrc_situacaoOrcamento      NUMBER;
    v_item_sequencia               NUMBER;
    v_item_movimentaEstoque        NUMBER;
    v_item_geraFinanceiro          NUMBER;
    v_item_cfop                    NUMBER;
    v_item_valorDescontoGeral      NUMBER;
    v_item_indicadorISSQN          CHAR(1);
    v_item_aliquotaISSQN           NUMBER;
    v_item_baseISSQN               NUMBER;
    v_item_valorISSQN              NUMBER;
    v_item_aliquotaIRRF            NUMBER;
    v_item_baseIRRF                NUMBER;
    v_item_valorIRRF               NUMBER;
    v_item_aliquotaINSS            NUMBER;
    v_item_baseINSS                NUMBER;
    v_item_valorINSS               NUMBER;
    v_item_retencaoPIS             NUMBER;
    v_item_baseRetPIS              NUMBER;
    v_item_valorRetPIS             NUMBER;
    v_item_retencaoCOFINS          NUMBER;
    v_item_baseRetCOFINS           NUMBER;
    v_item_valorRetCOFINS          NUMBER;
    v_item_retencaoCSLL            NUMBER;
    v_item_baseRetCSLL             NUMBER;
    v_item_valorRetCSLL            NUMBER;
    v_item_aliquotaII              NUMBER;
    v_item_baseII                  NUMBER;
    v_item_valorII                 NUMBER;
    v_item_aliquotaIOF             NUMBER;
    v_item_baseIOF                 NUMBER;
    v_item_valorIOF                NUMBER;
    v_item_codigoEnquadramentoIPI  NUMBER;
    v_item_stIPI                   CHAR(2);
    v_item_aliquotaIPI             NUMBER;
    v_item_valorAliquotaIPI        NUMBER;
    v_item_baseIPI                 NUMBER;
    v_item_valorIPI                NUMBER;
    v_item_stPIS                   CHAR(2);
    v_item_aliquotaPIS             NUMBER;
    v_item_valorAliquotaPIS        NUMBER;
    v_item_basePIS                 NUMBER;
    v_item_valorPIS                NUMBER;
    v_item_aliquotaPISST           NUMBER;
    v_item_valorAliquotaPISST      NUMBER;
    v_item_basePISST               NUMBER;
    v_item_valorPISST              NUMBER;
    v_item_stCOFINS                CHAR(2);
    v_item_aliquotaCOFINS          NUMBER;
    v_item_valorAliquotaCOFINS     NUMBER;
    v_item_baseCOFINS              NUMBER;
    v_item_valorCOFINS             NUMBER;
    v_item_aliquotaCOFINSST        NUMBER;
    v_item_valorAliquotaCOFINSST   NUMBER;
    v_item_baseCOFINSST            NUMBER;
    v_item_valorCOFINSST           NUMBER;
    v_item_stSimplesNacional       CHAR(3);
    v_item_creditoSimplesNacional  NUMBER;
    v_item_baseCreditoSimplesNac   NUMBER;
    v_item_valorCreditoSimplesNac  NUMBER;
    v_item_stICMS                  CHAR(2);
    v_item_modalBaseCalcICMS       CHAR(1);
    v_item_reducaoBaseICMS         NUMBER;
    v_item_aliquotaICMS            NUMBER;
    v_item_diferimentoICMS         NUMBER;
    v_item_motivoDesoneracaoICMS   CHAR(2);
    v_item_baseICMS                NUMBER;
    v_item_valorICMSOperacao       NUMBER;
    v_item_valorICMSDiferido       NUMBER;
    v_item_valorICMS               NUMBER;
    v_item_valorICMSDesoneracao    NUMBER;
    v_item_modalBaseCalcICMSST     CHAR(1);
    v_item_margemValorAdicST       NUMBER;
    v_item_reducaoBaseST           NUMBER;
    v_item_aliquotaICMSST          NUMBER;
    v_item_aliquotaSTSuportConsFin NUMBER;
    v_item_baseICMSST              NUMBER;
    v_item_valorICMSST             NUMBER;
    v_item_baseICMSSTAnteriormente NUMBER;
    v_item_valorICMSSTAnteriorment NUMBER;
    v_item_valorICMSProprioSubstit NUMBER;
    v_item_reducaoBaseICMSEfetivo  NUMBER;
    v_item_aliquotaICMSEfetivo     NUMBER;
    v_item_baseICMSEfetivo         NUMBER;
    v_item_valorICMSEfetivo        NUMBER;
    v_item_aliquotaICMSUFDestinat  NUMBER;
    v_item_aliquotaICMSInterestad  NUMBER;
    v_item_partilhaICMSInterestad  NUMBER;
    v_item_baseICMSUFDestinatario  NUMBER;
    v_item_valorICMSUFDestinatario NUMBER;
    v_item_baseICMSUFRemetente     NUMBER;
    v_item_valorICMSUFRemetente    NUMBER;
    v_item_aliquotaFCP             NUMBER;
    v_item_baseFCP                 NUMBER;
    v_item_valorFCP                NUMBER;
    v_item_aliquotaFCPST           NUMBER;
    v_item_baseFCPST               NUMBER;
    v_item_valorFCPST              NUMBER;
    v_item_aliquotaFCPSTAnteriorm  NUMBER;
    v_item_aliquotaFCPUFDestinat   NUMBER;
    v_item_baseFCPSTAnteriormente  NUMBER;
    v_item_valorFCPSTAnteriormente NUMBER;
    v_item_baseFCPUFDestinatario   NUMBER;
    v_item_valorFCPUFDestinatario  NUMBER;
    v_item_aliquotaEstImpFederais  NUMBER;
    v_item_aliquotaEstImpEstaduais NUMBER;
    v_item_aliquotaEstImpMunicipai NUMBER;
    v_item_baseEstimadaImpostos    NUMBER;
    v_item_valorEstImpFederais     NUMBER;
    v_item_valorEstImpEstaduais    NUMBER;
    v_item_valorEstImpMunicipais   NUMBER;
    v_item_valorImpostosSomaPag    NUMBER;
    v_item_valorImpostosDiminuiPag NUMBER;
    v_item_valorLiquidoItem        NUMBER;
    v_item_observacoes             VARCHAR2 (4000);
    v_gradProd_produto             NUMBER;
    v_gradProd_cor                 NUMBER;
    v_gradProd_tamanho             VARCHAR(10);
    v_prod_controleEstoque         NUMBER;
    v_prod_tipoProduto             CHAR(2);
    v_prod_origemMercadoria        CHAR(1);
    v_prod_idNcm                   NUMBER;
    v_prod_listaServicos           NUMBER;
    v_ativServ_validoPrevisto      NUMBER;
    v_ativServ_habilitaAtivPrev    NUMBER;   
    v_locEst_indicadorPropPosseIt  CHAR(1);
    v_idEnderecoEstoqueOrcamento   NUMBER;
    v_buffer_idItemOrcamento       VARCHAR2 (32000);
    v_item_valorTotalItem          NUMBER;
    v_item_valorTotalItemComb      NUMBER;
    v_residuoRateioDescontoItem    NUMBER;
    v_residuoRateioAcrescimoItem   NUMBER;
    v_aj_idItemOrcamento           NUMBER;
    v_aj_valorTotalItem            NUMBER;
    v_aj_servico                   NUMBER;
    v_aj_quantidade                NUMBER;
    v_aj_quantidadeConvertida      NUMBER;
    v_aj_precoUnitarioBruto        NUMBER;
    v_aj_acrescimoUnitarioCompos   NUMBER;
    v_aj_precoUnitario             NUMBER;
    v_aj_precoUnitarioConvertido   NUMBER;
    v_aj_valorProdutoServicoBrut   NUMBER;
    v_aj_valorProdutoServico       NUMBER;
    v_aj_valorDescontoItem         NUMBER;
    v_aj_valorAcrescimoItem        NUMBER;
    v_aj_valorFreteItem            NUMBER;
    v_aj_valorSeguroItem           NUMBER;
    v_aj_valorAdicFreteMarItem     NUMBER;
    v_aj_valorDespesasAduanItem    NUMBER;
    v_aj_valorBasePagamento        NUMBER;
    v_aj_valorFreteTotal           NUMBER;
    v_aj_valorSeguroTotal          NUMBER;
    v_aj_valorDescontoTotal        NUMBER;
    v_aj_valorOutrasDespTotal      NUMBER;
    v_aj_valorAdicFreteMarTotal    NUMBER;
    v_aj_valorDespesasAduanTotal   NUMBER;
    v_aj_valorLiquidoItem          NUMBER;
    v_aj_usarPrecoAVista           NUMBER;
    v_aj_geraFinanceiro            NUMBER;
    v_aj_cfop_geraFinanceiro       NUMBER;
BEGIN
  v_item_valorDescontoGeral      := p_item_valorDescontoGeral;
  v_buffer_idItemOrcamento       := '';
  v_item_valorTotalItem          := 0;
  v_item_valorTotalItemComb      := 0;
  SELECT
    cab.origemDocumento,
    cab.tipoDocumento,
    cab.modeloDocumento,
    cab.entradaSaida,
    cab.finalidadeNota,
    cab.atualizaCustoMedio,
    cab.estabelecimento,
    cab.dataEmissao,
    cab.dataPreco,
    cab.pessoa,
    cab.dataEntrega,
    cab.municipioFatoGerador,
    cab.localDestinoOperacao,
    cab.enderecoEntregaPessoa,
    cab.indicadorConsumidorFinal,
    cab.modalidadeFrete,
    cab.tipoPagamentoFrete,
    cab.quantidadeVolume,
    cab.ultimoVendedorItem,
    cab.quantidade,
    cab.pesoLiquido,
    cab.pesoBruto,
    cab.valorProdutosBruto,
    cab.valorProdutos,
    cab.valorDescontoProdutos,
    cab.valorAcrescimoProdutos,
    cab.valorServicosBruto,
    cab.valorServicos,
    cab.valorDescontoServicos,
    cab.valorAcrescimoServicos,
    cab.valorFreteItem,
    cab.valorSeguroItem,
    cab.valorAdicFreteMarinhaMerItem,
    cab.valorDespesasAduaneirasItem,
    cab.valorFreteGeral,
    cab.valorSeguroGeral,
    cab.valorDescontoGeral,
    cab.valorOutrasDespesasGeral,
    cab.valorAdicFreteMarinhaMerGeral,
    cab.valorDespesasAduaneirasGeral,
    cab.condicaoPagamento,
    cab.numeroParcelas,
    cab.somaPrazoParcelas,
    cab.valorXPrazoParcelas,
    cab.prazoMedio,
    cab.prazoMedioPonderado,
    cab.valorBasePagamento,
    cab.valorAVistaMinimo,
    cab.valorEntradaMinima,
    cab.valorAVistaEntrada,
    cab.valorPagamentoBruto,
    cab.valorDescontoPagamento,
    cab.valorOutrasDespesasPagamento,
    cab.valorJurosPagamento,
    cab.valorPagamentoLiquido,
    cab.valorTroco,
    cab.valorFreteTotal,
    cab.valorSeguroTotal,
    cab.valorDescontoTotal,
    cab.valorOutrasDespesasTotal,
    cab.valorAdicFreteMarinhaMerTotal,
    cab.valorDespesasAduaneirasTotal,
    cab.valorImpostosSomaPagamento,
    cab.valorImpostosDiminuiPagamento,
    cab.valorLiquidoItem,
    modDoc.capituloNaturezaFiscal,
    modDoc.movimentaEstoque,
    modDoc.geraFinanceiro,
    modDoc.habilitaAmbiente,
    modDoc.tipoPreco,
    modDoc.tabelaPreco,
    modDoc.fatorMultiplicadorPreco,
    modDoc.tipoPrecoB,
    modDoc.tabelaPrecoB,
    modDoc.fatorMultiplicadorPrecoB,
    modDoc.diminuiDescontoPrUnit,
    modDoc.somaAcrescimosPrUnit,
    modDoc.somaFreteSeguroPrUnit,
    est.grupoFiscal,
    COALESCE (pessEst.regimeTributario, ' '),
    COALESCE ((SELECT MIN(munEst.uf) FROM CAENDERECOSPESSOA endEst JOIN SIMUNICIPIOS munEst ON munEst.municipio = endEst.municipio WHERE endEst.pessoa = est.pessoaEstabelecimento AND endEst.ativo = 1 AND endEst.principal = 1), '  '),
    pess.indicadorInscricaoEstadual,
    COALESCE ((SELECT MIN(enderecoPessoa) FROM CAENDERECOSPESSOA endPess JOIN SIMUNICIPIOS munPess ON munPess.municipio = endPess.municipio WHERE endPess.pessoa = cab.pessoa AND endPess.ativo = 1 AND endPess.principal = 1), 0),
    COALESCE ((SELECT MIN(munPess.uf) FROM CAENDERECOSPESSOA endPess JOIN SIMUNICIPIOS munPess ON munPess.municipio = endPess.municipio WHERE endPess.pessoa = cab.pessoa AND endPess.ativo = 1 AND endPess.principal = 1), '  '),
    munEndEntr.uf,
    etOrc.situacaoOrcamento
  INTO
    v_cab_origemDocumento,
    v_cab_tipoDocumento,
    v_cab_modeloDocumento,
    v_cab_entradaSaida,
    v_cab_finalidadeNota,
    v_cab_atualizaCustoMedio,
    v_cab_estabelecimento,
    v_cab_dataEmissao,
    v_cab_dataPreco,
    v_cab_pessoa,
    v_cab_dataEntrega,
    v_cab_municipioFatoGerador,
    v_cab_localDestinoOperacao,
    v_cab_enderecoEntregaPessoa,
    v_cab_indicadorConsumidorFinal,
    r_cab_modalidadeFrete,
    v_cab_tipoPagamentoFrete,
    v_cab_quantidadeVolume,
    r_cab_ultimoVendedorItem,
    r_cab_quantidade,
    v_cab_pesoLiquido,
    v_cab_pesoBruto,
    r_cab_valorProdutosBruto,
    r_cab_valorProdutos,
    r_cab_valorDescontoProdutos,
    r_cab_valorAcrescimoProdutos,
    r_cab_valorServicosBruto,
    r_cab_valorServicos,
    r_cab_valorDescontoServicos,
    r_cab_valorAcrescimoServicos,
    r_cab_valorFreteItem,
    v_cab_valorSeguroItem,
    v_cab_valorAdicFreteMarItem,
    v_cab_valorDespesasAduanItem,
    r_cab_valorFreteGeral,
    v_cab_valorSeguroGeral,
    r_cab_valorDescontoGeral,
    r_cab_valorOutrasDespGeral,
    v_cab_valorAdicFreteMarGeral,
    v_cab_valorDespesasAduanGeral,
    v_cab_condicaoPagamento,
    v_cab_numeroParcelas,
    v_cab_somaPrazoParcelas,
    v_cab_valorXPrazoParcelas,
    v_cab_prazoMedio,
    v_cab_prazoMedioPonderado,
    r_cab_valorBasePagamento,
    r_cab_valorAVistaMinimo,
    v_cab_valorEntradaMinima,
    v_cab_valorAVistaEntrada,
    r_cab_valorPagamentoBruto,
    v_cab_valorDescontoPagamento,
    v_cab_valorOutrasDespPag,
    v_cab_valorJurosPagamento,
    r_cab_valorPagamentoLiquido,
    r_cab_valorTroco,
    r_cab_valorFreteTotal,
    r_cab_valorSeguroTotal,
    v_cab_valorDescontoTotal,
    v_cab_valorOutrasDespTotal,
    r_cab_valorAdicFreteMarTotal,
    r_cab_valorDespesasAduanTotal,
    r_cab_valorImpostosSomaPag,
    r_cab_valorImpostosDiminuiPag,
    r_cab_valorLiquidoItem,
    v_modDoc_capituloNatFiscal,
    v_modDoc_movimentaEstoque,
    v_modDoc_geraFinanceiro,
    v_modDoc_habilitaAmbiente,
    v_modDoc_tipoPreco,
    v_modDoc_tabelaPreco,
    v_modDoc_fatorMultipPreco,
    v_modDoc_tipoPrecoB,
    v_modDoc_tabelaPrecoB,
    v_modDoc_fatorMultipPrecoB,
    v_modDoc_diminuiDescontoPrUnit,
    v_modDoc_somaAcrescimosPrUnit,
    v_modDoc_somaFreteSeguroPrUnit,
    v_est_grupoFiscal,
    v_pessEst_regimeTributario,
    v_munEndEst_uf,
    v_pess_indicadorInscricaoEstad,
    v_endPess_enderecoPessoa,
    v_munEndPess_uf,
    v_munEndEntr_uf,
    v_etOrc_situacaoOrcamento
  FROM MOORCAMENTOS cab
  JOIN PAMODELOSDOCUMENTO modDoc ON modDoc.modeloDocumento = cab.modeloDocumento
  JOIN PAESTABELECIMENTOS est ON est.estabelecimento = cab.estabelecimento
  JOIN CAPESSOAS pessEst ON pessEst.pessoa = est.pessoaEstabelecimento
  JOIN CAPESSOAS pess ON pess.pessoa = cab.pessoa
  JOIN CAENDERECOSPESSOA endEntr ON endEntr.enderecoPessoa = cab.enderecoEntregaPessoa
  JOIN SIMUNICIPIOS munEndEntr ON munEndEntr.municipio = endEntr.municipio
  JOIN PAETAPASORCAMENTO etOrc ON etOrc.etapaOrcamento = cab.etapaOrcamento
  WHERE cab.orcamento = p_cab_orcamento;
  SELECT
    gradProd.produto,
    gradProd.cor,
    gradProd.tamanho,
    prod.controleEstoque,
    prod.tipoProduto,
    prod.origemMercadoria,
    prod.idNcm,
    prod.listaServicos
  INTO
    v_gradProd_produto,
    v_gradProd_cor,
    v_gradProd_tamanho,
    v_prod_controleEstoque,
    v_prod_tipoProduto,
    v_prod_origemMercadoria,
    v_prod_idNcm,
    v_prod_listaServicos
  FROM CAGRADESPRODUTO gradProd
  JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
  WHERE gradProd.gradeProduto = p_item_gradeProduto;
  SELECT
    validoPrevisto,
    habilitaAtividadePrevista
  INTO
    v_ativServ_validoPrevisto,
    v_ativServ_habilitaAtivPrev
  FROM PAATIVIDADESSERVICO
  WHERE atividadeServico = p_item_atividadeServico;
    SELECT indicadorPropriedadePosseItem
  INTO v_locEst_indicadorPropPosseIt
  FROM PALOCAISESTOQUE
  WHERE localEstoque = p_item_localEstoque;
  v_item_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
    p_uniqueMachineID,
    p_perfilUsuarioLogado,
    p_usuarioLogado,
    ' ',
    0,
    0,
    0,
    0,
    'O',
    v_cab_entradaSaida,
    0,
    v_cab_estabelecimento,
    0,
    p_item_gradeProduto,
    0,
    0,
    0,
    p_item_controleQuantidade,
    p_item_loteMultiplo,
    p_item_altura,
    p_item_largura,
    p_item_comprimento,
    p_item_quantidade,
    p_item_observacoesDigitadas);
  r_obrigaFinalizar         := p_obrigaFinalizar;
  r_calculoImpostosPendente := p_calculoImpostosPendente;
  r_cab_valorMargem         := p_cab_valorMargem;
  r_idItemOrcamento         := 0;
  IF p_manterFinanceiro = 0
    AND (r_cab_valorFreteGeral <> 0
      OR v_cab_valorSeguroGeral <> 0
      OR r_cab_valorDescontoGeral <> 0
      OR r_cab_valorOutrasDespGeral <> 0
      OR v_cab_valorAdicFreteMarGeral <> 0
      OR v_cab_valorDespesasAduanGeral <> 0) THEN
    r_calculoImpostosPendente := 1;
  END IF;  
  IF p_manterFinanceiro = 0
    AND (r_cab_valorDescontoGeral <> 0
      OR r_cab_valorOutrasDespGeral <> 0
      OR r_cab_valorPagamentoBruto <> 0) THEN
    r_calculoImpostosPendente := 1;
    ADD_ORCAMENTO_PAG_EXCLUI_TROCA (
      r_calculoImpostosPendente,
      p_cab_orcamento,
      r_cab_valorDescontoGeral,
      r_cab_valorOutrasDespGeral,
      v_cab_valorDescontoPagamento,
      v_cab_valorOutrasDespPag,
      v_cab_valorJurosPagamento,
      0,
      v_item_valorDescontoGeral,
      0,
      0,
      0,
      /* Retornos */
      r_calculoImpostosPendente,
      r_cab_valorDescontoGeral,
      v_cab_condicaoPagamento,
      v_cab_numeroParcelas,
      v_cab_somaPrazoParcelas,
      v_cab_valorXPrazoParcelas,
      v_cab_prazoMedio,
      v_cab_prazoMedioPonderado,
      v_cab_valorEntradaMinima,
      v_cab_valorAVistaEntrada,
      r_cab_valorPagamentoBruto,
      v_cab_valorDescontoPagamento,
      v_cab_valorOutrasDespPag,
      v_cab_valorJurosPagamento,
      r_cab_valorPagamentoLiquido,
      r_cab_valorTroco,
      v_item_valorDescontoGeral,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber);
  END IF;
  r_cab_ultimoVendedorItem := p_item_vendedor;
  IF v_prod_controleEstoque = 3 THEN
    v_auxNumber := 0;
    ADD_ORCAMENTO_ITEM_INSERE_COMB (
      p_uniqueMachineID,
      p_usuarioLogado,
      p_perfilUsuarioLogado,
      p_estabelecimentoAtivo,
      p_config_64_casasDecSaidas,
      p_config_65_casasDecEntrada,
      p_config_209_filtrarGrupoEcon,
      p_config_330_redIcmsBasePisCof,
      p_config_362_calcCustoPorGrade,
      p_config_378_calcularVolumes,
      p_regMarg_tipoPreco,
      p_regMarg_tabelaPreco,
      p_regMarg_fatorMultiplicador,
      p_regMarg_tipoPrecoB,
      p_regMarg_tabelaPrecoB,
      p_regMarg_fatorMultiplicadorB,
      p_regMarg_reduzirImpostos,
      p_regMarg_reduzirTarifaCartao,
      p_regMarg_taxaCapitacaoCustoFi,
      p_regMarg_exibPercMargemCab,
      p_regMarg_exibImagemMargemCab,
      p_regMarg_regraImagemCab,
      p_regMarg_exibPercMargemItem,
      p_regMarg_exibImagemMargemItem,
      p_regMarg_regraImagemItem,
      p_regMarg_exibDetMargemItem,
      r_obrigaFinalizar,
      p_cab_orcamento,
      v_cab_origemDocumento,
      v_cab_tipoDocumento,
      v_cab_modeloDocumento,
      v_cab_entradaSaida,
      v_cab_finalidadeNota,
      v_cab_atualizaCustoMedio,
      v_cab_estabelecimento,
      v_cab_dataEmissao,
      v_cab_dataPreco,
      v_cab_pessoa,
      v_cab_dataEntrega,
      v_cab_enderecoEntregaPessoa,
      v_cab_municipioFatoGerador,
      v_cab_localDestinoOperacao,
      v_cab_indicadorConsumidorFinal,
      v_cab_tipoPagamentoFrete,
      v_cab_quantidadeVolume,
      r_cab_quantidade,
      v_cab_pesoLiquido,
      v_cab_pesoBruto,
      r_cab_valorProdutosBruto,
      r_cab_valorProdutos,
      r_cab_valorDescontoProdutos,
      r_cab_valorAcrescimoProdutos,
      r_cab_valorServicosBruto,
      r_cab_valorServicos,
      r_cab_valorDescontoServicos,
      r_cab_valorAcrescimoServicos,
      v_cab_prazoMedioPonderado,
      r_cab_valorBasePagamento,
      r_cab_valorAVistaMinimo,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespTotal,
      r_cab_valorFreteTotal,
      r_cab_valorSeguroTotal,
      r_cab_valorAdicFreteMarTotal,
      r_cab_valorDespesasAduanTotal,
      r_cab_valorImpostosSomaPag,
      r_cab_valorImpostosDiminuiPag,
      r_cab_valorLiquidoItem,
      p_cab_valorTarifaCartao,
      r_cab_valorMargem,
      v_modDoc_capituloNatFiscal,
      v_modDoc_movimentaEstoque,
      v_modDoc_geraFinanceiro,
      v_modDoc_habilitaAmbiente,
      v_modDoc_tipoPreco,
      v_modDoc_tabelaPreco,
      v_modDoc_fatorMultipPreco,
      v_modDoc_tipoPrecoB,
      v_modDoc_tabelaPrecoB,
      v_modDoc_fatorMultipPrecoB,
      v_modDoc_diminuiDescontoPrUnit,
      v_modDoc_somaAcrescimosPrUnit,
      v_modDoc_somaFreteSeguroPrUnit,
      v_est_grupoFiscal,
      v_pessEst_regimeTributario,
      v_munEndEst_uf,
      v_pess_indicadorInscricaoEstad,
      v_endPess_enderecoPessoa,
      v_munEndPess_uf,
      v_munEndEntr_uf,
      v_etOrc_situacaoOrcamento,
      p_item_vendedor,
      p_item_gradeProduto,
      p_item_localEstoque,
      p_item_pessoaParticipante,
      p_item_dataEntrega,
      p_item_quantidade,
      p_item_controleEntrega,
      p_item_usarPrecoAVista,
      p_item_percDescontoItem,
      p_item_percAcrescimoItem,
      v_item_observacoes,
      p_idEnderecoEstoque,
      p_item_ambiente,
      p_item_amb_observacoes,
      p_atualizarTempMargem,
      p_idItemOrcamentoReferenciado,
      p_idItemDocTransferencia,
      v_buffer_idItemOrcamento,
      /* Retornos */
      r_obrigaFinalizar,
      v_cab_quantidadeVolume,
      r_cab_quantidade,
      v_cab_pesoLiquido,
      v_cab_pesoBruto,
      r_cab_valorProdutosBruto,
      r_cab_valorProdutos,
      r_cab_valorDescontoProdutos,
      r_cab_valorAcrescimoProdutos,
      r_cab_valorServicosBruto,
      r_cab_valorServicos,
      r_cab_valorDescontoServicos,
      r_cab_valorAcrescimoServicos,
      r_cab_valorBasePagamento,
      r_cab_valorAVistaMinimo,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespTotal,
      r_cab_valorImpostosSomaPag,
      r_cab_valorImpostosDiminuiPag,
      r_cab_valorLiquidoItem,
      r_cab_valorMargem,
      r_cab_percentualMargem,
      r_cab_imagemMargem,
      v_buffer_idItemOrcamento,
      v_item_valorTotalItemComb);
      ADD_CALCULA_TOTAIS_ITEM (
        p_uniqueMachineID,
        ' ',
        0,
        0,
        0,
        0,
        'O',
        v_cab_entradaSaida,
        0,
        v_cab_tipoPagamentoFrete,
        v_cab_tipoPagamentoFrete,
        0,
        v_modDoc_diminuiDescontoPrUnit,
        v_modDoc_somaAcrescimosPrUnit,
        v_modDoc_somaFreteSeguroPrUnit,
        0,
        p_item_quantidade,
        p_item_quantidadeConvertida,
        p_item_precoUnitarioBruto,
        p_item_precoUnitario,
        p_item_valorProdutoServicoBrut,
        p_item_valorProdutoServico,
        p_item_valorDescontoItem,
        p_item_valorAcrescimoItem,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        p_item_valorDescontoTotal,
        p_item_valorOutrasDespTotal,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        /* Retornos */
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_item_valorTotalItem,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber,
        v_auxNumber);
    IF v_item_valorTotalItem <> 0 AND v_item_valorTotalItem <> v_item_valorTotalItemComb THEN
      v_residuoRateioDescontoItem  := 0;
      v_residuoRateioAcrescimoItem := 0;
      WHILE v_buffer_idItemOrcamento IS NOT NULL AND LENGTH(RTRIM(v_buffer_idItemOrcamento)) >= 14
      LOOP
        v_aj_idItemOrcamento     := TO_NUMBER(SUBSTR(v_buffer_idItemOrcamento, 1, 14));
        v_aj_valorTotalItem      := 0;
        v_buffer_idItemOrcamento := RTRIM(SUBSTR(v_buffer_idItemOrcamento,16,32000));
        SELECT
          a.servico,
          a.quantidade,
          a.quantidadeConvertida,
          a.precoUnitarioBruto,
          a.acrescimoUnitarioComposicao,
          a.precoUnitario,
          a.precoUnitarioConvertido,
          a.valorProdutoServicoBruto,
          a.valorProdutoServico,
          a.valorDescontoItem,
          a.valorAcrescimoItem,
          a.valorFreteItem,
          a.valorSeguroItem,
          a.valorAdicFreteMarinhaMerItem,
          a.valorDespesasAduaneirasItem,
          a.valorBasePagamento,
          a.valorFreteTotal,
          a.valorSeguroTotal,
          a.valorDescontoTotal,
          a.valorOutrasDespesasTotal,
          a.valorAdicFreteMarinhaMerTotal,
          a.valorDespesasAduaneirasTotal,
          a.valorLiquidoItem,
          a.usarPrecoAVista,
          a.geraFinanceiro,
          cfop.geraFinanceiro
        INTO
          v_aj_servico,
          v_aj_quantidade,
          v_aj_quantidadeConvertida,
          v_aj_precoUnitarioBruto,
          v_aj_acrescimoUnitarioCompos,
          v_aj_precoUnitario,
          v_aj_precoUnitarioConvertido,
          v_aj_valorProdutoServicoBrut,
          v_aj_valorProdutoServico,
          v_aj_valorDescontoItem,
          v_aj_valorAcrescimoItem,
          v_aj_valorFreteItem,
          v_aj_valorSeguroItem,
          v_aj_valorAdicFreteMarItem,
          v_aj_valorDespesasAduanItem,
          v_aj_valorBasePagamento,
          v_aj_valorFreteTotal,
          v_aj_valorSeguroTotal,
          v_aj_valorDescontoTotal,
          v_aj_valorOutrasDespTotal,
          v_aj_valorAdicFreteMarTotal,
          v_aj_valorDespesasAduanTotal,
          v_aj_valorLiquidoItem,
          v_aj_usarPrecoAVista,
          v_aj_geraFinanceiro,
          v_aj_cfop_geraFinanceiro
        FROM MOORCAMENTOXITENS a
        JOIN SICFOPS cfop ON cfop.cfop = a.cfop
        WHERE a.idItemOrcamento = v_aj_idItemOrcamento;        
        IF v_aj_servico = 1 THEN
          r_cab_valorServicosBruto       := r_cab_valorServicosBruto      - v_aj_valorProdutoServicoBrut;
          r_cab_valorServicos            := r_cab_valorServicos           - v_aj_valorProdutoServico;
          r_cab_valorDescontoServicos    := r_cab_valorDescontoServicos   - v_aj_valorDescontoItem;
          r_cab_valorAcrescimoServicos   := r_cab_valorAcrescimoServicos  - v_aj_valorAcrescimoItem;
        ELSE 
          r_cab_valorProdutosBruto       := r_cab_valorProdutosBruto      - v_aj_valorProdutoServicoBrut;
          r_cab_valorProdutos            := r_cab_valorProdutos           - v_aj_valorProdutoServico;
          r_cab_valorDescontoProdutos    := r_cab_valorDescontoProdutos   - v_aj_valorDescontoItem;
          r_cab_valorAcrescimoProdutos   := r_cab_valorAcrescimoProdutos  - v_aj_valorAcrescimoItem;
        END IF;
        r_cab_valorFreteItem           := r_cab_valorFreteItem          - v_aj_valorFreteItem;
        v_cab_valorSeguroItem          := v_cab_valorSeguroItem         - v_aj_valorSeguroItem;
        v_cab_valorAdicFreteMarItem    := v_cab_valorAdicFreteMarItem   - v_aj_valorAdicFreteMarItem;
        v_cab_valorDespesasAduanItem   := v_cab_valorDespesasAduanItem  - v_aj_valorDespesasAduanItem;
        r_cab_valorBasePagamento       := r_cab_valorBasePagamento      - v_aj_valorBasePagamento;
        r_item_valorBasePagamento      := r_item_valorBasePagamento     - v_aj_valorBasePagamento;
        IF v_aj_usarPrecoAVista = 1 AND v_aj_geraFinanceiro = 1 AND v_aj_cfop_geraFinanceiro = 1 THEN
          r_cab_valorAVistaMinimo        := r_cab_valorAVistaMinimo - v_aj_valorProdutoServico + v_aj_valorDescontoTotal - v_aj_valorOutrasDespTotal;
        END IF;
        r_cab_valorFreteTotal          := r_cab_valorFreteTotal         - v_aj_valorFreteTotal;
        r_cab_valorSeguroTotal         := r_cab_valorSeguroTotal        - v_aj_valorSeguroTotal;
        v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal      - v_aj_valorDescontoTotal;
        v_cab_valorOutrasDespTotal     := v_cab_valorOutrasDespTotal    - v_aj_valorOutrasDespTotal;
        r_cab_valorAdicFreteMarTotal   := r_cab_valorAdicFreteMarTotal  - v_aj_valorAdicFreteMarTotal;
        r_cab_valorDespesasAduanTotal  := r_cab_valorDespesasAduanTotal - v_aj_valorDespesasAduanTotal;
        r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem        - v_aj_valorLiquidoItem;
        -- Total item original        
        ADD_CALCULA_TOTAIS_ITEM (
          p_uniqueMachineID,
          ' ',
          0,
          0,
          0,
          0,
          'O',
          v_cab_entradaSaida,
          0,
          v_cab_tipoPagamentoFrete,
          v_cab_tipoPagamentoFrete,
          0,
          v_modDoc_diminuiDescontoPrUnit,
          v_modDoc_somaAcrescimosPrUnit,
          v_modDoc_somaFreteSeguroPrUnit,
          0,
          v_aj_quantidade,
          v_aj_quantidadeConvertida,
          v_aj_precoUnitarioBruto,
          v_aj_precoUnitario,
          v_aj_valorProdutoServicoBrut,
          v_aj_valorProdutoServico,
          v_aj_valorDescontoItem,
          v_aj_valorAcrescimoItem,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          v_aj_valorDescontoTotal,
          v_aj_valorOutrasDespTotal,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          /* Retornos */
          v_aj_acrescimoUnitarioCompos,
          v_auxNumber,
          v_aj_precoUnitario,
          v_auxNumber,
          v_aj_precoUnitarioConvertido,
          v_auxNumber,
          v_aj_valorProdutoServico,
          v_auxNumber,
          v_aj_valorTotalItem,
          v_aj_valorFreteTotal,
          v_aj_valorSeguroTotal,
          v_aj_valorDescontoTotal,
          v_aj_valorOutrasDespTotal,
          v_aj_valorAdicFreteMarTotal,
          v_aj_valorDespesasAduanTotal,
          v_auxNumber,
          v_auxNumber,
          v_auxNumber);
        v_aj_valorDescontoItem := 
          v_aj_valorDescontoItem
          + ROUND(
              CASE
                WHEN v_item_valorTotalItemComb > v_item_valorTotalItem
                THEN v_item_valorTotalItemComb - v_item_valorTotalItem
                ELSE 0
              END
              * v_aj_valorTotalItem / v_item_valorTotalItemComb
              + v_residuoRateioDescontoItem,2);
        v_residuoRateioDescontoItem :=
          CASE
            WHEN v_item_valorTotalItemComb > v_item_valorTotalItem
            THEN v_item_valorTotalItemComb - v_item_valorTotalItem
            ELSE 0
          END
          * v_aj_valorTotalItem / v_item_valorTotalItemComb
          + v_residuoRateioDescontoItem
          - ROUND(
              CASE
                WHEN v_item_valorTotalItemComb > v_item_valorTotalItem
                THEN v_item_valorTotalItemComb - v_item_valorTotalItem
                ELSE 0
              END
              * v_aj_valorTotalItem / v_item_valorTotalItemComb
              + v_residuoRateioDescontoItem,2);
        v_aj_valorAcrescimoItem :=
          v_aj_valorAcrescimoItem
          + ROUND(
              CASE
                WHEN v_item_valorTotalItem > v_item_valorTotalItemComb
                THEN v_item_valorTotalItem - v_item_valorTotalItemComb
                ELSE 0
              END
              * v_aj_valorTotalItem / v_item_valorTotalItemComb
              + v_residuoRateioAcrescimoItem,2);
        v_residuoRateioAcrescimoItem :=
          CASE
            WHEN v_item_valorTotalItem > v_item_valorTotalItemComb
            THEN v_item_valorTotalItem - v_item_valorTotalItemComb
            ELSE 0
          END
          * v_aj_valorTotalItem / v_item_valorTotalItemComb
          + v_residuoRateioAcrescimoItem
          - ROUND(
              CASE 
                WHEN v_item_valorTotalItem > v_item_valorTotalItemComb
                THEN v_item_valorTotalItem - v_item_valorTotalItemComb
                ELSE 0
              END
              * v_aj_valorTotalItem / v_item_valorTotalItemComb
              + v_residuoRateioAcrescimoItem,2);
        -- Total item novo
        ADD_CALCULA_TOTAIS_ITEM (
          p_uniqueMachineID,
          ' ',
          0,
          0,
          0,
          0,
          'O',
          v_cab_entradaSaida,
          0,
          v_cab_tipoPagamentoFrete,
          v_cab_tipoPagamentoFrete,
          0,
          v_modDoc_diminuiDescontoPrUnit,
          v_modDoc_somaAcrescimosPrUnit,
          v_modDoc_somaFreteSeguroPrUnit,
          0,
          v_aj_quantidade,
          v_aj_quantidadeConvertida,
          v_aj_precoUnitarioBruto,
          v_aj_precoUnitario,
          v_aj_valorProdutoServicoBrut,
          v_aj_valorProdutoServico,
          v_aj_valorDescontoItem,
          v_aj_valorAcrescimoItem,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          v_aj_valorDescontoTotal,
          v_aj_valorOutrasDespTotal,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          /* Retornos */
          v_aj_acrescimoUnitarioCompos,
          v_auxNumber,
          v_aj_precoUnitario,
          v_auxNumber,
          v_aj_precoUnitarioConvertido,
          v_auxNumber,
          v_aj_valorProdutoServico,
          v_auxNumber,
          v_aj_valorTotalItem,
          v_aj_valorFreteTotal,
          v_aj_valorSeguroTotal,
          v_aj_valorDescontoTotal,
          v_aj_valorOutrasDespTotal,
          v_aj_valorAdicFreteMarTotal,
          v_aj_valorDespesasAduanTotal,
          v_auxNumber,
          v_auxNumber,
          v_auxNumber);
        IF v_aj_servico = 1 THEN
          r_cab_valorServicosBruto       := r_cab_valorServicosBruto      + v_aj_valorProdutoServicoBrut;
          r_cab_valorServicos            := r_cab_valorServicos           + v_aj_valorProdutoServico;
          r_cab_valorDescontoServicos    := r_cab_valorDescontoServicos   + v_aj_valorDescontoItem;
          r_cab_valorAcrescimoServicos   := r_cab_valorAcrescimoServicos  + v_aj_valorAcrescimoItem;
        ELSE 
          r_cab_valorProdutosBruto       := r_cab_valorProdutosBruto      + v_aj_valorProdutoServicoBrut;
          r_cab_valorProdutos            := r_cab_valorProdutos           + v_aj_valorProdutoServico;
          r_cab_valorDescontoProdutos    := r_cab_valorDescontoProdutos   + v_aj_valorDescontoItem;
          r_cab_valorAcrescimoProdutos   := r_cab_valorAcrescimoProdutos  + v_aj_valorAcrescimoItem;
        END IF;
        r_cab_valorFreteItem           := r_cab_valorFreteItem          + v_aj_valorFreteItem;
        v_cab_valorSeguroItem          := v_cab_valorSeguroItem         + v_aj_valorSeguroItem;
        v_cab_valorAdicFreteMarItem    := v_cab_valorAdicFreteMarItem   + v_aj_valorAdicFreteMarItem;
        v_cab_valorDespesasAduanItem   := v_cab_valorDespesasAduanItem  + v_aj_valorDespesasAduanItem;
        r_cab_valorBasePagamento       := r_cab_valorBasePagamento      + v_aj_valorBasePagamento;
        r_item_valorBasePagamento      := r_item_valorBasePagamento     + v_aj_valorBasePagamento;
        IF v_aj_usarPrecoAVista = 1 AND v_aj_geraFinanceiro = 1 AND v_aj_cfop_geraFinanceiro = 1 THEN
          r_cab_valorAVistaMinimo        := r_cab_valorAVistaMinimo + v_aj_valorProdutoServico - v_aj_valorDescontoTotal + v_aj_valorOutrasDespTotal;
        END IF;
        r_cab_valorFreteTotal          := r_cab_valorFreteTotal         + v_aj_valorFreteTotal;
        r_cab_valorSeguroTotal         := r_cab_valorSeguroTotal        + v_aj_valorSeguroTotal;
        v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal      + v_aj_valorDescontoTotal;
        v_cab_valorOutrasDespTotal     := v_cab_valorOutrasDespTotal    + v_aj_valorOutrasDespTotal;
        r_cab_valorAdicFreteMarTotal   := r_cab_valorAdicFreteMarTotal  + v_aj_valorAdicFreteMarTotal;
        r_cab_valorDespesasAduanTotal  := r_cab_valorDespesasAduanTotal + v_aj_valorDespesasAduanTotal;
        r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem        + v_aj_valorLiquidoItem;
        r_calculoImpostosPendente      := 1;
        UPDATE MOORCAMENTOXITENS SET
          acrescimoUnitarioComposicao   = v_aj_acrescimoUnitarioCompos,
          precoUnitario                 = v_aj_precoUnitario,
          precoUnitarioConvertido       = v_aj_precoUnitarioConvertido,
          valorProdutoServico           = v_aj_valorProdutoServico,
          percDescontoItem              = CASE WHEN v_aj_valorProdutoServicoBrut = 0 THEN 0 ELSE ROUND(100* v_aj_valorDescontoItem / v_aj_valorProdutoServicoBrut,4) END,
          valorDescontoItem             = v_aj_valorDescontoItem,
          percAcrescimoItem              = CASE WHEN v_aj_valorProdutoServicoBrut = 0 THEN 0 ELSE ROUND(100* v_aj_valorAcrescimoItem / v_aj_valorProdutoServicoBrut,4) END,
          valorAcrescimoItem            = v_aj_valorAcrescimoItem,
          valorFreteTotal               = v_aj_valorFreteTotal,
          valorSeguroTotal              = v_aj_valorSeguroTotal,
          valorDescontoTotal            = v_aj_valorDescontoTotal,
          valorOutrasDespesasTotal      = v_aj_valorOutrasDespTotal,
          valorAdicFreteMarinhaMerTotal = v_aj_valorAdicFreteMarTotal,
          valorDespesasAduaneirasTotal  = v_aj_valorDespesasAduanTotal
        WHERE idItemOrcamento = v_aj_idItemOrcamento;
      END LOOP;
    END IF;
  ELSE
    r_item_valorBasePagamento      := 0;
    ADD_ITEM_OPERACAO_FISCAL_BUSCA (
      1,
      v_cab_origemDocumento,
      v_cab_tipoDocumento,
      v_cab_entradaSaida,
      0,
      v_cab_finalidadeNota,
      v_cab_estabelecimento,
      0,
      v_cab_dataEmissao,
      v_cab_pessoa,
      0,
      v_cab_enderecoEntregaPessoa,
      v_cab_localDestinoOperacao,
      v_cab_indicadorConsumidorFinal,
      v_modDoc_movimentaEstoque,
      v_modDoc_geraFinanceiro,
      v_munEndEst_uf,
      v_pess_indicadorInscricaoEstad,
      v_endPess_enderecoPessoa,
      v_munEndPess_uf,
      v_munEndEntr_uf,
      p_item_operacaoFiscal,
      v_gradProd_produto,
      v_prod_tipoProduto,
      v_prod_origemMercadoria,
      v_prod_idNcm,
      v_prod_listaServicos,
      0,
      0,
      0,
      1,
      ' ',
      0,
      1,
      0,
      1,
      0,
      1,
      0,
      1,
      0,
      1,
      0,
      1,
      0,
      1,
      0,
      1,
      0,
      '  ',
      0,
      0,
      1,
      '  ',
      0,
      0,
      1,
      0,
      0,
      1,
      '  ',
      0,
      0,
      1,
      0,
      0,
      1,
      '   ',
      0,
      1,
      '  ',
      ' ',
      0,
      0,
      0,
      '  ',
      0,
      1,
      ' ',
      0,
      0,
      0,
      1,
      0,
      0,
      0,
      0,
      '  ',
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      1,
      0,
      0,
      0,
      1,
      0,
      0,
      0,
      0,
      1,
      0,
      0,
      0,
      /* Retornos */
      v_auxNumber,
      v_item_movimentaEstoque,
      v_item_geraFinanceiro,
      v_item_cfop,
      v_item_indicadorISSQN,
      v_item_aliquotaISSQN,
      v_item_aliquotaIRRF,
      v_item_aliquotaINSS,
      v_item_retencaoPIS,
      v_item_retencaoCOFINS,
      v_item_retencaoCSLL,
      v_item_aliquotaII,
      v_item_aliquotaIOF,
      v_item_codigoEnquadramentoIPI,
      v_item_stIPI,
      v_item_aliquotaIPI,
      v_item_valorAliquotaIPI,
      v_item_stPIS,
      v_item_aliquotaPIS,
      v_item_valorAliquotaPIS,
      v_item_aliquotaPISST,
      v_item_valorAliquotaPISST,
      v_item_stCOFINS,
      v_item_aliquotaCOFINS,
      v_item_valorAliquotaCOFINS,
      v_item_aliquotaCOFINSST,
      v_item_valorAliquotaCOFINSST,
      v_item_stSimplesNacional,
      v_item_creditoSimplesNacional,
      v_item_stICMS,
      v_item_modalBaseCalcICMS,
      v_item_reducaoBaseICMS,
      v_item_aliquotaICMS,
      v_item_diferimentoICMS,
      v_item_motivoDesoneracaoICMS,
      v_auxNumber,
      v_item_modalBaseCalcICMSST,
      v_item_margemValorAdicST,
      v_item_reducaoBaseST,
      v_item_aliquotaICMSST,
      v_item_aliquotaSTSuportConsFin,
      v_item_reducaoBaseICMSEfetivo,
      v_item_aliquotaICMSEfetivo,
      v_auxVarchar,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_item_aliquotaICMSUFDestinat,
      v_item_aliquotaICMSInterestad,
      v_item_partilhaICMSInterestad,
      v_item_aliquotaFCP,
      v_item_aliquotaFCPST,
      v_item_aliquotaFCPSTAnteriorm,
      v_item_aliquotaFCPUFDestinat,
      v_item_aliquotaEstImpFederais,
      v_item_aliquotaEstImpEstaduais,
      v_item_aliquotaEstImpMunicipai);      
    ADD_CALCULA_IMPOSTOS_ITEM (
      p_config_64_casasDecSaidas,
      p_config_209_filtrarGrupoEcon,
      p_config_330_redIcmsBasePisCof,
      p_config_362_calcCustoPorGrade,
      v_cab_entradaSaida,
      0,
      v_cab_estabelecimento,
      0,
      v_cab_dataEmissao,
      v_cab_pessoa,
      v_cab_localDestinoOperacao,
      v_cab_indicadorConsumidorFinal,
      v_cab_tipoPagamentoFrete,
      v_pess_indicadorInscricaoEstad,
      p_item_pessoaParticipante,
      p_item_quantidade,
      p_item_precoPautaTabelado,
      p_item_valorProdutoServico,
      p_item_valorFreteTotal,
      p_item_valorSeguroTotal,
      p_item_valorDescontoTotal,
      p_item_valorOutrasDespTotal,
      p_item_valorAdicFreteMarTotal,
      p_item_valorDespesasAduanTotal,
      v_item_cfop,
      1,
      v_item_indicadorISSQN,
      v_item_aliquotaISSQN,
      0,
      0,
      1,
      v_item_aliquotaIRRF,
      0,
      0,
      1,
      v_item_aliquotaINSS,
      0,
      0,
      1,
      v_item_retencaoPIS,
      0,
      0,
      1,
      v_item_retencaoCOFINS,
      0,
      0,
      1,
      v_item_retencaoCSLL,
      0,
      0,
      1,
      v_item_aliquotaII,
      0,
      0,
      1,
      v_item_aliquotaIOF,
      0,
      0,
      1,
      v_item_aliquotaIPI,
      v_item_valorAliquotaIPI,
      0,
      0,
      0,
      1,
      v_item_aliquotaPIS,
      v_item_valorAliquotaPIS,
      0,
      0,
      1,
      v_item_aliquotaPISST,
      v_item_valorAliquotaPISST,
      0,
      0,
      1,
      v_item_aliquotaCOFINS,
      v_item_valorAliquotaCOFINS,
      0,
      0,
      1,
      v_item_aliquotaCOFINSST,
      v_item_valorAliquotaCOFINSST,
      0,
      0,
      1,
      v_item_stSimplesNacional,
      v_item_creditoSimplesNacional,
      0,
      0,
      1,
      v_item_stICMS,
      v_item_modalBaseCalcICMS,
      v_item_reducaoBaseICMS,
      v_item_aliquotaICMS,
      v_item_diferimentoICMS,
      0,
      0,
      0,
      0,
      0,
      1,
      v_item_modalBaseCalcICMSST,
      v_item_margemValorAdicST,
      v_item_reducaoBaseST,
      v_item_aliquotaICMSST,
      0,
      0,
      1,
      0,
      0,
      0,
      v_item_reducaoBaseICMSEfetivo,
      v_item_aliquotaICMSEfetivo,
      0,
      0,
      0,
      '  ',
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      1,
      v_item_aliquotaICMSUFDestinat,
      v_item_aliquotaICMSInterestad,
      v_item_partilhaICMSInterestad,
      0,
      0,
      0,
      0,
      1,
      v_item_aliquotaFCP,
      0,
      0,
      v_item_aliquotaFCPST,
      0,
      0,
      v_item_aliquotaFCPSTAnteriorm,
      0,
      0,
      v_item_aliquotaFCPUFDestinat,
      0,
      0,
      1,
      v_item_aliquotaEstImpFederais,
      v_item_aliquotaEstImpEstaduais,
      v_item_aliquotaEstImpMunicipai,
      0,
      0,
      0,
      0,
      v_gradProd_produto,
      v_gradProd_cor,
      v_gradProd_tamanho,
      v_prod_controleEstoque,
      v_prod_tipoProduto,
      /* Retornos */
      v_item_baseISSQN,
      v_item_valorISSQN,
      v_item_baseIRRF,
      v_item_valorIRRF,
      v_item_baseINSS,
      v_item_valorINSS,
      v_item_baseRetPIS,
      v_item_valorRetPIS,
      v_item_baseRetCOFINS,
      v_item_valorRetCOFINS,
      v_item_baseRetCSLL,
      v_item_valorRetCSLL,
      v_item_baseII,
      v_item_valorII,
      v_item_baseIOF,
      v_item_valorIOF,
      v_item_baseIPI,
      v_item_valorIPI,
      v_item_basePIS,
      v_item_valorPIS,
      v_item_basePISST,
      v_item_valorPISST,
      v_item_baseCOFINS,
      v_item_valorCOFINS,
      v_item_baseCOFINSST,
      v_item_valorCOFINSST,
      v_item_baseCreditoSimplesNac,
      v_item_valorCreditoSimplesNac,
      v_item_baseICMS,
      v_item_valorICMSOperacao,
      v_item_valorICMSDiferido,
      v_item_valorICMS,
      v_item_valorICMSDesoneracao,
      v_item_baseICMSST,
      v_item_valorICMSST,
      v_item_baseICMSSTAnteriormente,
      v_item_valorICMSSTAnteriorment,
      v_item_valorICMSProprioSubstit,
      v_item_baseICMSEfetivo,
      v_item_valorICMSEfetivo,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_item_baseICMSUFDestinatario,
      v_item_valorICMSUFDestinatario,
      v_item_baseICMSUFRemetente,
      v_item_valorICMSUFRemetente,
      v_item_baseFCP,
      v_item_valorFCP,
      v_item_baseFCPST,
      v_item_valorFCPST,
      v_item_baseFCPSTAnteriormente,
      v_item_valorFCPSTAnteriormente,
      v_item_baseFCPUFDestinatario,
      v_item_valorFCPUFDestinatario,
      v_item_baseEstimadaImpostos,
      v_item_valorEstImpFederais,
      v_item_valorEstImpEstaduais,
      v_item_valorEstImpMunicipais);
    ADD_CALCULA_VALOR_LIQUIDO (
      0,
      v_cab_tipoPagamentoFrete,
      v_item_geraFinanceiro,
      p_item_valorProdutoServico,
      0,
      0,
      0,
      p_item_valorFreteTotal,
      p_item_valorSeguroTotal,
      p_item_valorDescontoTotal,
      p_item_valorOutrasDespTotal,
      v_item_valorIRRF,
      v_item_valorINSS,
      v_item_valorRetPIS,
      v_item_valorRetCOFINS,
      v_item_valorRetCSLL,
      v_item_valorII,
      v_item_valorIOF,
      v_item_valorIPI,
      0,
      v_item_valorICMSST,
      0,
      0,
      0,
      /* Retornos */
      r_item_valorBasePagamento,
      v_item_valorImpostosSomaPag,
      v_item_valorImpostosDiminuiPag,
      v_item_valorLiquidoItem);
    IF p_config_378_calcularVolumes = 1 THEN
      v_cab_quantidadeVolume         := v_cab_quantidadeVolume + TRUNC(CASE WHEN p_item_controleQuantidade = 1 AND p_item_loteMultiplo <> 0 THEN p_item_quantidade / p_item_loteMultiplo ELSE p_item_quantidadeConvertida END,0);
    END IF;
    r_cab_quantidade               := r_cab_quantidade + p_item_quantidadeConvertida;
    v_cab_pesoLiquido              := v_cab_pesoLiquido + p_item_pesoLiquido;
    v_cab_pesoBruto                := v_cab_pesoBruto + p_item_pesoBruto;
    IF p_item_servico = 1 THEN
      r_cab_valorServicosBruto       := r_cab_valorServicosBruto + p_item_valorProdutoServicoBrut;
      r_cab_valorServicos            := r_cab_valorServicos + p_item_valorProdutoServico;
      r_cab_valorDescontoServicos    := r_cab_valorDescontoServicos + p_item_valorDescontoItem;
      r_cab_valorAcrescimoServicos   := r_cab_valorAcrescimoServicos + p_item_valorAcrescimoItem;
    ELSE 
      r_cab_valorProdutosBruto       := r_cab_valorProdutosBruto + p_item_valorProdutoServicoBrut;
      r_cab_valorProdutos            := r_cab_valorProdutos + p_item_valorProdutoServico;
      r_cab_valorDescontoProdutos    := r_cab_valorDescontoProdutos + p_item_valorDescontoItem;
      r_cab_valorAcrescimoProdutos   := r_cab_valorAcrescimoProdutos + p_item_valorAcrescimoItem;
    END IF;
    r_cab_valorFreteItem           := r_cab_valorFreteItem + p_item_valorFreteItem;
    v_cab_valorSeguroItem          := v_cab_valorSeguroItem + p_item_valorSeguroItem;
    v_cab_valorAdicFreteMarItem    := v_cab_valorAdicFreteMarItem + p_item_valorAdicFreteMarItem;
    v_cab_valorDespesasAduanItem   := v_cab_valorDespesasAduanItem + p_item_valorDespesasAduanItem;
    r_cab_valorFreteGeral          := r_cab_valorFreteGeral + p_item_valorFreteGeral;
    v_cab_valorSeguroGeral         := v_cab_valorSeguroGeral + p_item_valorSeguroGeral;
    r_cab_valorDescontoGeral       := r_cab_valorDescontoGeral + v_item_valorDescontoGeral;
    r_cab_valorOutrasDespGeral     := r_cab_valorOutrasDespGeral + p_item_valorOutrasDespGeral;
    v_cab_valorAdicFreteMarGeral   := v_cab_valorAdicFreteMarGeral + p_item_valorAdicFreteMarGeral;
    v_cab_valorDespesasAduanGeral  := v_cab_valorDespesasAduanGeral + p_item_valorDespesasAduanGeral;
    r_cab_valorBasePagamento       := r_cab_valorBasePagamento + r_item_valorBasePagamento;
    IF p_item_usarPrecoAVista = 1 AND v_item_geraFinanceiro = 1 THEN
      r_cab_valorAVistaMinimo        := r_cab_valorAVistaMinimo + p_item_valorProdutoServico - p_item_valorDescontoTotal + p_item_valorOutrasDespTotal;
    END IF;
    IF r_cab_valorFreteTotal = 0 AND p_item_valorFreteTotal <> 0 AND NOT(p_person_190_modeloFrete IS NULL) AND p_person_190_modeloFrete <> ' ' THEN
      r_cab_modalidadeFrete          := p_person_190_modeloFrete;
    END IF;    
    r_cab_valorFreteTotal          := r_cab_valorFreteTotal + p_item_valorFreteTotal;
    r_cab_valorSeguroTotal         := r_cab_valorSeguroTotal + p_item_valorSeguroTotal;
    v_cab_valorDescontoTotal       := v_cab_valorDescontoTotal + p_item_valorDescontoTotal;
    v_cab_valorOutrasDespTotal     := v_cab_valorOutrasDespTotal + p_item_valorOutrasDespTotal;
    r_cab_valorAdicFreteMarTotal   := r_cab_valorAdicFreteMarTotal + p_item_valorAdicFreteMarTotal;
    r_cab_valorDespesasAduanTotal  := r_cab_valorDespesasAduanTotal + p_item_valorDespesasAduanTotal;
    r_cab_valorImpostosSomaPag     := r_cab_valorImpostosSomaPag + v_item_valorImpostosSomaPag;
    r_cab_valorImpostosDiminuiPag  := r_cab_valorImpostosDiminuiPag + v_item_valorImpostosDiminuiPag;
    r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem + v_item_valorLiquidoItem;
    SELECT COALESCE (MAX (sequencia),0) + 1
    INTO v_item_sequencia
    FROM MOORCAMENTOXITENS
    WHERE orcamento = p_cab_orcamento;
    ADD_ORCAMENTO_ITEM_GRAVA (
      p_estabelecimentoAtivo,
      r_obrigaFinalizar,
      p_cab_orcamento,
      v_cab_modeloDocumento,
      v_cab_entradaSaida,
      v_cab_estabelecimento,
      v_cab_dataEmissao,
      v_cab_dataEntrega,
      v_etOrc_situacaoOrcamento,
      0,
      v_item_sequencia,
      0,
      0,
      p_item_vendedor,
      0,
      p_item_gradeProduto,
      p_item_servico,
      p_item_atividadeServico,
      'A',
      0,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      0,
      p_item_idLoteEstoque,
      p_item_vinculoItemDocumento,
      p_item_operacaoFiscal,
      0,
      v_item_movimentaEstoque,
      v_item_geraFinanceiro,
      0,
      p_item_localEstoque,
      0,
      p_item_pessoaParticipante,
      p_item_dataEntrega,
      p_item_controleQuantidade,
      p_item_unidadeMedidaConversao,
      p_item_conversorQuantidade,
      p_item_loteMinimo,
      p_item_loteMultiplo,
      p_item_altura,
      p_item_largura,
      p_item_comprimento,
      p_item_pecas,
      p_item_quantidade,
      p_item_quantidadeConvertida,
      0,
      p_item_quantidade,
      p_item_controleEntrega,
      1,
      p_item_pesoLiquido,
      p_item_pesoBruto,
      p_item_tipoPreco,
      p_item_tabelaPreco,
      p_item_precoSugestaoAPrazo,
      p_item_precoSugestaoAVista,
      p_item_precoDesconto,
      p_item_precoMinimo,
      p_item_usarPrecoAVista,
      p_item_precoPautaTabelado,
      p_item_precoUnitarioBruto,
      p_item_acrescimoUnitarioCompos,
      p_item_precoUnitario,
      p_item_precoUnitarioConvertido,
      p_item_valorProdutoServicoBrut,
      p_item_valorProdutoServico,
      p_item_percDescontoItem,
      p_item_valorDescontoItem,
      p_item_percAcrescimoItem,
      p_item_valorAcrescimoItem,
      p_item_valorFreteItem,
      p_item_valorSeguroItem,
      p_item_valorAdicFreteMarItem,
      p_item_valorDespesasAduanItem,
      p_item_valorFreteGeral,
      p_item_valorSeguroGeral,
      v_item_valorDescontoGeral,
      p_item_valorOutrasDespGeral,
      p_item_valorAdicFreteMarGeral,
      p_item_valorDespesasAduanGeral,
      r_item_valorBasePagamento,
      0,
      0,
      0,
      p_item_valorFreteTotal,
      p_item_valorSeguroTotal,
      p_item_valorDescontoTotal,
      p_item_valorOutrasDespTotal,
      p_item_valorAdicFreteMarTotal,
      p_item_valorDespesasAduanTotal,
      v_item_cfop,
      v_item_indicadorISSQN,
      v_item_aliquotaISSQN,
      v_item_baseISSQN,
      v_item_valorISSQN,
      v_item_aliquotaIRRF,
      v_item_baseIRRF,
      v_item_valorIRRF,
      v_item_aliquotaINSS,
      v_item_baseINSS,
      v_item_valorINSS,
      v_item_retencaoPIS,
      v_item_baseRetPIS,
      v_item_valorRetPIS,
      v_item_retencaoCOFINS,
      v_item_baseRetCOFINS,
      v_item_valorRetCOFINS,
      v_item_retencaoCSLL,
      v_item_baseRetCSLL,
      v_item_valorRetCSLL,
      v_item_aliquotaII,
      v_item_baseII,
      v_item_valorII,
      v_item_aliquotaIOF,
      v_item_baseIOF,
      v_item_valorIOF,
      v_item_codigoEnquadramentoIPI,
      v_item_stIPI,
      v_item_aliquotaIPI,
      v_item_valorAliquotaIPI,
      v_item_baseIPI,
      v_item_valorIPI,
      v_item_stPIS,
      v_item_aliquotaPIS,
      v_item_valorAliquotaPIS,
      v_item_basePIS,
      v_item_valorPIS,
      v_item_aliquotaPISST,
      v_item_valorAliquotaPISST,
      v_item_basePISST,
      v_item_valorPISST,
      v_item_stCOFINS,
      v_item_aliquotaCOFINS,
      v_item_valorAliquotaCOFINS,
      v_item_baseCOFINS,
      v_item_valorCOFINS,
      v_item_aliquotaCOFINSST,
      v_item_valorAliquotaCOFINSST,
      v_item_baseCOFINSST,
      v_item_valorCOFINSST,
      v_item_stSimplesNacional,
      v_item_creditoSimplesNacional,
      v_item_baseCreditoSimplesNac,
      v_item_valorCreditoSimplesNac,
      v_item_stICMS,
      v_item_modalBaseCalcICMS,
      v_item_reducaoBaseICMS,
      v_item_aliquotaICMS,
      v_item_diferimentoICMS,
      v_item_motivoDesoneracaoICMS,
      v_item_baseICMS,
      v_item_valorICMSOperacao,
      v_item_valorICMSDiferido,
      v_item_valorICMS,
      v_item_valorICMSDesoneracao,
      v_item_modalBaseCalcICMSST,
      v_item_margemValorAdicST,
      v_item_reducaoBaseST,
      v_item_aliquotaICMSST,
      v_item_aliquotaSTSuportConsFin,
      v_item_baseICMSST,
      v_item_valorICMSST,
      v_item_baseICMSSTAnteriormente,
      v_item_valorICMSSTAnteriorment,
      v_item_valorICMSProprioSubstit,
      v_item_reducaoBaseICMSEfetivo,
      v_item_aliquotaICMSEfetivo,
      v_item_baseICMSEfetivo,
      v_item_valorICMSEfetivo,
      v_item_aliquotaICMSUFDestinat,
      v_item_aliquotaICMSInterestad,
      v_item_partilhaICMSInterestad,
      v_item_baseICMSUFDestinatario,
      v_item_valorICMSUFDestinatario,
      v_item_baseICMSUFRemetente,
      v_item_valorICMSUFRemetente,
      v_item_aliquotaFCP,
      v_item_baseFCP,
      v_item_valorFCP,
      v_item_aliquotaFCPST,
      v_item_baseFCPST,
      v_item_valorFCPST,
      v_item_aliquotaFCPSTAnteriorm,
      v_item_baseFCPSTAnteriormente,
      v_item_valorFCPSTAnteriormente,
      v_item_aliquotaFCPUFDestinat,
      v_item_baseFCPUFDestinatario,
      v_item_valorFCPUFDestinatario,
      v_item_aliquotaEstImpFederais,
      v_item_aliquotaEstImpEstaduais,
      v_item_aliquotaEstImpMunicipai,
      v_item_baseEstimadaImpostos,
      v_item_valorEstImpFederais,
      v_item_valorEstImpEstaduais,
      v_item_valorEstImpMunicipais,
      v_item_valorImpostosSomaPag,
      v_item_valorImpostosDiminuiPag,
      v_item_valorLiquidoItem,
      p_item_observacoesDigitadas,
      v_item_observacoes,
      /* Retornos */
      r_obrigaFinalizar,
      r_idItemOrcamento);    
    IF v_modDoc_habilitaAmbiente = 1 THEN
      MERGE INTO MOORCAMENTOXAMBIENTES a USING (
        SELECT
          r_idItemOrcamento      idItemOrcamento,
          p_item_ambiente        ambiente,
          p_item_amb_observacoes observacoes
        FROM DUAL
      ) b ON (a.idItemOrcamento = b.idItemOrcamento)
      WHEN MATCHED THEN
        UPDATE SET
          a.ambiente    = b.ambiente,
          a.observacoes = b.observacoes
      WHEN NOT MATCHED THEN
        INSERT (
          idItemOrcamento,
          ambiente,
          observacoes)
        VALUES (
          b.idItemOrcamento,
          b.ambiente,
          b.observacoes);
    END IF;
    IF p_idItemOrcamentoReferenciado > 0 THEN
      ADD_ORCAMENTO_ITEM_ORC_GRAVA (
        p_estabelecimentoAtivo,
        r_idItemOrcamento,
        p_idItemOrcamentoReferenciado,
        p_item_quantidade);
    ELSE
      IF p_nomeTempComposicao <> ' ' THEN
        ADD_ORCAMENTO_ITEM_COMP_TEMP (
          p_uniqueMachineID,
          p_estabelecimentoAtivo,
          p_nomeTempComposicao,
          p_temp_sequencia,
          r_idItemOrcamento);
      END IF;
    END IF;
    IF p_idItemDocTransferencia > 0 THEN
      ADD_ORCAMENTO_ITEM_TRANS_GRAVA (
        p_estabelecimentoAtivo,
        v_cab_entradaSaida,
        p_idItemDocTransferencia,
        r_idItemOrcamento,
        p_item_quantidade);
    END IF;
    v_idEnderecoEstoqueOrcamento := 0;
    IF p_idEnderecoEstoque > 0 THEN
      ADD_ORCAMENTO_ITEM_ENDER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_idItemOrcamento,
        p_idEnderecoEstoque,
        p_item_quantidade,
        p_item_quantidade,
        ' ',
        /* Retornos */
        v_idEnderecoEstoqueOrcamento);
    END IF;
    IF p_idNumeroSerie > 0 THEN
      ADD_ORCAMENTO_ITEM_N_SER_GRAVA (
        p_estabelecimentoAtivo,
        0,
        r_idItemOrcamento,
        v_idEnderecoEstoqueOrcamento,
        p_item_gradeProduto,
        p_idNumeroSerie,
        0,
        /* Retornos */
        v_auxNumber);
    END IF;
    IF p_item_servico = 1 AND p_item_atividadeServico > 0 AND v_ativServ_habilitaAtivPrev = 1 THEN
      ADD_ORCAMENTO_ITEM_PREV_INSERE (
        p_usuarioLogado,
        p_estabelecimentoAtivo,
        r_idItemOrcamento,
        p_item_atividadeServico,
        v_ativServ_validoPrevisto);
    END IF;
    IF p_atualizarTempMargem = 1
      AND (p_regMarg_exibPercMargemCab = 1
        OR p_regMarg_exibImagemMargemCab = 1
        OR p_regMarg_exibPercMargemItem = 1
        OR p_regMarg_exibImagemMargemItem = 1
        OR p_regMarg_exibDetMargemItem = 1)
      AND v_cab_tipoDocumento IN (101,102,301,501,503) THEN
      ADD_TEMP_MARGEM_ITEM_GRAVA (
        p_uniqueMachineID,
        p_config_65_casasDecEntrada,
        p_config_209_filtrarGrupoEcon,
        p_config_362_calcCustoPorGrade,
        p_regMarg_tipoPreco,
        p_regMarg_tabelaPreco,
        p_regMarg_fatorMultiplicador,
        p_regMarg_tipoPrecoB,
        p_regMarg_tabelaPrecoB,
        p_regMarg_fatorMultiplicadorB,
        p_regMarg_reduzirImpostos,
        p_regMarg_reduzirTarifaCartao,
        p_regMarg_taxaCapitacaoCustoFi,
        p_regMarg_exibImagemMargemCab,
        p_regMarg_regraImagemCab,
        p_regMarg_exibImagemMargemItem,
        p_regMarg_regraImagemItem,
        'O',
        p_cab_orcamento,
        v_cab_estabelecimento,
        v_cab_dataPreco,
        v_cab_prazoMedioPonderado,
        r_cab_valorFreteTotal,
        r_cab_valorSeguroTotal,
        r_cab_valorAdicFreteMarTotal,
        r_cab_valorDespesasAduanTotal,
        r_cab_valorLiquidoItem,
        p_cab_valorTarifaCartao,
        r_cab_valorMargem,
        v_munEndEst_uf,
        v_item_sequencia,
        0,
        0,
        p_item_idFormulaTinta,
        p_item_personalizacao,
        p_item_localEstoque,
        p_item_pessoaParticipante,
        p_item_quantidade,
        p_item_valorFreteTotal,
        p_item_valorSeguroTotal,
        p_item_valorAdicFreteMarTotal,
        p_item_valorDespesasAduanTotal,
        v_item_valorII,
        v_item_valorIOF,
        v_item_valorIPI,
        0,
        v_item_valorPIS,
        v_item_valorPISST,
        v_item_valorCOFINS,
        v_item_valorCOFINSST,
        v_item_valorCreditoSimplesNac,
        v_item_valorICMSOperacao,
        v_item_valorICMSDiferido,
        v_item_valorICMS,
        v_item_valorICMSDesoneracao,
        v_item_valorICMSST,
        v_item_valorICMSSTAnteriorment,
        v_item_valorICMSUFDestinatario,
        v_item_valorICMSUFRemetente,
        v_item_valorFCP,
        v_item_valorFCPST,
        v_item_valorFCPSTAnteriormente,
        v_item_valorFCPUFDestinatario,
        v_item_valorLiquidoItem,
        v_gradProd_produto,
        v_gradProd_cor,
        v_gradProd_tamanho,
        v_prod_controleEstoque,
        v_locEst_indicadorPropPosseIt,
        /* Retornos */
        r_cab_valorMargem,
        r_cab_percentualMargem,
        r_cab_imagemMargem,
        r_item_valorLiquidoSemFreteSeg,
        r_item_valorCaptacao,
        r_item_valorTarifaCartao,
        r_item_valorImpostos,
        r_item_precoCusto,
        r_item_valorCusto,
        r_item_valorMargem,
        r_item_percentualMargem,
        r_item_imagemMargem);
    END IF;
  END IF;
  IF p_manterFinanceiro = 0
    AND (r_cab_valorFreteGeral <> 0
      OR v_cab_valorSeguroGeral <> 0
      OR r_cab_valorDescontoGeral <> 0
      OR r_cab_valorOutrasDespGeral <> 0
      OR v_cab_valorAdicFreteMarGeral <> 0
      OR v_cab_valorDespesasAduanGeral <> 0) THEN
    r_calculoImpostosPendente := 1;
  END IF;
  UPDATE MOORCAMENTOS SET
    modalidadeFrete               = r_cab_modalidadeFrete,
    ultimoVendedorItem            = r_cab_ultimoVendedorItem,
    quantidadeVolume              = v_cab_quantidadeVolume,
    quantidade                    = r_cab_quantidade,
    pesoLiquido                   = v_cab_pesoLiquido,
    pesoBruto                     = v_cab_pesoBruto,
    valorProdutosBruto            = r_cab_valorProdutosBruto,
    valorProdutos                 = r_cab_valorProdutos,
    valorDescontoProdutos         = r_cab_valorDescontoProdutos,
    valorAcrescimoProdutos        = r_cab_valorAcrescimoProdutos,
    valorServicosBruto            = r_cab_valorServicosBruto,
    valorServicos                 = r_cab_valorServicos,
    valorDescontoServicos         = r_cab_valorDescontoServicos,
    valorAcrescimoServicos        = r_cab_valorAcrescimoServicos,
    valorFreteItem                = r_cab_valorFreteItem,
    valorSeguroItem               = v_cab_valorSeguroItem,
    valorAdicFreteMarinhaMerItem  = v_cab_valorAdicFreteMarItem,
    valorDespesasAduaneirasItem   = v_cab_valorDespesasAduanItem,
    valorFreteGeral               = r_cab_valorFreteGeral,
    valorSeguroGeral              = v_cab_valorSeguroGeral,
    valorDescontoGeral            = r_cab_valorDescontoGeral,
    valorOutrasDespesasGeral      = r_cab_valorOutrasDespGeral,
    valorAdicFreteMarinhaMerGeral = v_cab_valorAdicFreteMarGeral,
    valorDespesasAduaneirasGeral  = v_cab_valorDespesasAduanGeral,
    condicaoPagamento             = v_cab_condicaoPagamento,
    numeroParcelas                = v_cab_numeroParcelas,
    somaPrazoParcelas             = v_cab_somaPrazoParcelas,
    valorXPrazoParcelas           = v_cab_valorXPrazoParcelas,
    prazoMedio                    = v_cab_prazoMedio,
    prazoMedioPonderado           = v_cab_prazoMedioPonderado,
    valorBasePagamento            = r_cab_valorBasePagamento,
    valorAVistaMinimo             = r_cab_valorAVistaMinimo,
    valorEntradaMinima            = v_cab_valorEntradaMinima,
    valorAVistaEntrada            = v_cab_valorAVistaEntrada,
    valorPagamentoBruto           = r_cab_valorPagamentoBruto,
    valorDescontoPagamento        = v_cab_valorDescontoPagamento,
    valorOutrasDespesasPagamento  = v_cab_valorOutrasDespPag,
    valorJurosPagamento           = v_cab_valorJurosPagamento,
    valorPagamentoLiquido         = r_cab_valorPagamentoLiquido,
    valorTroco                    = r_cab_valorTroco,
    valorFreteTotal               = r_cab_valorFreteTotal,
    valorSeguroTotal              = r_cab_valorSeguroTotal,
    valorDescontoTotal            = v_cab_valorDescontoTotal,
    valorOutrasDespesasTotal      = v_cab_valorOutrasDespTotal,
    valorAdicFreteMarinhaMerTotal = r_cab_valorAdicFreteMarTotal,
    valorDespesasAduaneirasTotal  = r_cab_valorDespesasAduanTotal,
    valorImpostosSomaPagamento    = r_cab_valorImpostosSomaPag,
    valorImpostosDiminuiPagamento = r_cab_valorImpostosDiminuiPag,
    valorLiquidoItem              = r_cab_valorLiquidoItem
  WHERE orcamento = p_cab_orcamento;
END ADD_ORCAMENTO_ITEM_INSERE;

/

create or replace PROCEDURE ADD_TROCA_PESSOA(
    p_pessoaDe   IN NUMBER,
    p_pessoaPara IN NUMBER)
IS
  v_existe NUMBER;
BEGIN
  -- Pessoa Fisica
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAPESSOASFISICAS
  WHERE pessoa = p_pessoaPara;
  IF v_existe = 0 THEN
    INSERT INTO CAPESSOASFISICAS (
      pessoa,
      sexo,
      rg,
      ufRg,
      orgaoEmissorRg,
      dataEmissaoRg,
      dataValidadeIdEstrangeiro,
      mae,
      pai,
      nacionalidade,
      municipioNaturalidade,
      tipoImovel,
      valorImovel,
      valorAluguelFinanciamento,
      desdeImovel,
      comprovouResidencia,
      comprovanteResidencia,
      escolaridade,
      ocupacaoPessoa,
      remuneracao,
      outrosRendimentos,
      comprovouRendimento,
      comprovanteRendimento,
      empregoRazaoSocial,
      empregoCnpjCpfIdEstrangeiro,
      empregoFone,
      empregoAdmissao,
      empregoCep,
      empregoTipoLogradouro,
      empregoLogradouro,
      empregoNumero,
      empregoComplemento,
      empregoBairroDistrito,
      empregoMunicipio,
      empregoPais,
      empregoObservacoes,
      estadoCivil,
      numeroDependentes,
      conjugeNome,
      conjugeCpf,
      conjugeRemuneracao,
      conjugeComprovouRendim,
      conjugeComprovanteRendim,
      conjugeFone,
      possuiCartaoCredito,
      bandeiraCartaoDebCred,
      ultimosDigitosCartaoCred,
      credscoreData,
      credscoreNota,
      rendaPresumidaData,
      rendaPresumidaValor,
      consultaSpcData,
      estaNoSpc,
      registroSpcData,
      registroSpcValor,
      estaNoSpcLoja,
      estaEmCobranca,
      protestado)
    SELECT p_pessoaPara,
      sexo,
      rg,
      ufRg,
      orgaoEmissorRg,
      dataEmissaoRg,
      dataValidadeIdEstrangeiro,
      mae,
      pai,
      nacionalidade,
      municipioNaturalidade,
      tipoImovel,
      valorImovel,
      valorAluguelFinanciamento,
      desdeImovel,
      comprovouResidencia,
      comprovanteResidencia,
      escolaridade,
      ocupacaoPessoa,
      remuneracao,
      outrosRendimentos,
      comprovouRendimento,
      comprovanteRendimento,
      empregoRazaoSocial,
      empregoCnpjCpfIdEstrangeiro,
      empregoFone,
      empregoAdmissao,
      empregoCep,
      empregoTipoLogradouro,
      empregoLogradouro,
      empregoNumero,
      empregoComplemento,
      empregoBairroDistrito,
      empregoMunicipio,
      empregoPais,
      empregoObservacoes,
      estadoCivil,
      numeroDependentes,
      conjugeNome,
      conjugeCpf,
      conjugeRemuneracao,
      conjugeComprovouRendim,
      conjugeComprovanteRendim,
      conjugeFone,
      possuiCartaoCredito,
      bandeiraCartaoDebCred,
      ultimosDigitosCartaoCred,
      credscoreData,
      credscoreNota,
      rendaPresumidaData,
      rendaPresumidaValor,
      consultaSpcData,
      estaNoSpc,
      registroSpcData,
      registroSpcValor,
      estaNoSpcLoja,
      estaEmCobranca,
      protestado
    FROM CAPESSOASFISICAS
    WHERE pessoa = p_pessoaDe;
  END IF;
  -- Transportadora
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CATRANSPORTADORAS
  WHERE transportadora = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CATRANSPORTADORAS a
    SET a.ativo            = 1
    WHERE a.transportadora = p_pessoaPara
    AND a.ativo            = 0
    AND EXISTS
      (SELECT 1
      FROM CATRANSPORTADORAS b
      WHERE b.transportadora = p_pessoaDe
      AND b.ativo            = 1
      );
  ELSE
    INSERT INTO CATRANSPORTADORAS (
      transportadora,
      ativo)
    SELECT p_pessoaPara,
      ativo
    FROM CATRANSPORTADORAS
    WHERE transportadora = p_pessoaDe;
  END IF;
  -- Vendedor
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAVENDEDORES
  WHERE vendedor = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CAVENDEDORES a
    SET a.ativo      = 1
    WHERE a.vendedor = p_pessoaPara
    AND a.ativo      = 0
    AND EXISTS
      (SELECT 1 FROM CAVENDEDORES b WHERE b.vendedor = p_pessoaDe AND b.ativo = 1
      );
  ELSE
    INSERT INTO CAVENDEDORES (
      vendedor,
      ativo)
    SELECT
      p_pessoaPara,
      ativo
    FROM CAVENDEDORES
    WHERE vendedor = p_pessoaDe;
  END IF;
  -- Comissionado B
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACOMISSIONADOSB
  WHERE comissionadoB = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CACOMISSIONADOSB a
    SET a.ativo           = 1
    WHERE a.comissionadoB = p_pessoaPara
    AND a.ativo           = 0
    AND EXISTS
      (SELECT 1
      FROM CACOMISSIONADOSB b
      WHERE b.comissionadoB = p_pessoaDe
      AND b.ativo           = 1
      );
  ELSE
    INSERT INTO CACOMISSIONADOSB (
      comissionadoB,
      ativo)
    SELECT p_pessoaPara,
      ativo
    FROM CACOMISSIONADOSB
    WHERE comissionadoB = p_pessoaDe;
  END IF;
  -- Comissionado C
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACOMISSIONADOSC
  WHERE comissionadoC = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CACOMISSIONADOSC a
    SET a.ativo           = 1
    WHERE a.comissionadoC = p_pessoaPara
    AND a.ativo           = 0
    AND EXISTS
      (SELECT 1
      FROM CACOMISSIONADOSC b
      WHERE b.comissionadoC = p_pessoaDe
      AND b.ativo           = 1
      );
  ELSE
    INSERT INTO CACOMISSIONADOSC (
      comissionadoC,
      ativo,
      percentualComissaoB,
      percentualComissaoC)
    SELECT p_pessoaPara,
      ativo,
      percentualComissaoB,
      percentualComissaoC
    FROM CACOMISSIONADOSC
    WHERE comissionadoC = p_pessoaDe;
  END IF;
  -- Colaborador
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACOLABORADORES
  WHERE colaborador = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CACOLABORADORES a
    SET a.ativo         = 1
    WHERE a.colaborador = p_pessoaPara
    AND a.ativo         = 0
    AND EXISTS
      (SELECT 1
      FROM CACOLABORADORES b
      WHERE b.colaborador = p_pessoaDe
      AND b.ativo         = 1
      );
  ELSE
    INSERT INTO CACOLABORADORES (
      colaborador,
      ativo,
      permiteDescontoEmFolha)
    SELECT p_pessoaPara,
      ativo,
      permiteDescontoEmFolha
    FROM CACOLABORADORES
    WHERE colaborador = p_pessoaDe;
  END IF;
  -- Usuário
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAUSUARIOS
  WHERE usuario = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CAUSUARIOS a
    SET a.login = COALESCE((SELECT MAX(b.login)
      FROM CAUSUARIOS b
      WHERE b.usuario = p_pessoaDe),' '),
      a.senha = COALESCE((SELECT MAX(b.senha)
      FROM CAUSUARIOS b
      WHERE b.usuario = p_pessoaDe),' '),
      a.ativo     = 1
    WHERE a.usuario = p_pessoaPara
    AND a.ativo     = 0
    AND EXISTS
      (SELECT 1
      FROM CAUSUARIOS b
      WHERE b.usuario = p_pessoaDe
      AND b.ativo     = 1
      );
  ELSE
    INSERT INTO CAUSUARIOS (
      usuario,
      ativo,
      login,
      senha,
      perfilUsuario)
    SELECT p_pessoaPara,
      ativo,
      login,
      senha,
      perfilUsuario
    FROM CAUSUARIOS
    WHERE usuario = p_pessoaDe;
  END IF;
  -- Técnico
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CATECNICOS
  WHERE tecnico = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CATECNICOS a
    SET a.ativo     = 1
    WHERE a.tecnico = p_pessoaPara
    AND a.ativo     = 0
    AND EXISTS
      (SELECT 1
      FROM CATECNICOS b
      WHERE b.tecnico = p_pessoaDe
      AND b.ativo     = 1
      );
  ELSE
    INSERT INTO CATECNICOS (
      tecnico,
      ativo,
      equipeTecnica)
    SELECT p_pessoaPara,
      ativo,
      equipeTecnica
    FROM CATECNICOS
    WHERE tecnico = p_pessoaDe;
  END IF;
  -- Separador
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CASEPARADORES
  WHERE separador = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CASEPARADORES a
    SET a.ativo       = 1
    WHERE a.separador = p_pessoaPara
    AND a.ativo       = 0
    AND EXISTS
      (SELECT 1
      FROM CASEPARADORES b
      WHERE b.separador = p_pessoaDe
      AND b.ativo       = 1
      );
  ELSE
    INSERT INTO CASEPARADORES (
      separador,
      ativo)
    SELECT
      p_pessoaPara,
      ativo
    FROM CASEPARADORES
    WHERE separador = p_pessoaDe;
  END IF;
  -- Profissional Registrado
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAPROFISSIONAISREGISTRAD
  WHERE profissionalRegistrado = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CAPROFISSIONAISREGISTRAD a
    SET a.ativo                    = 1
    WHERE a.profissionalRegistrado = p_pessoaPara
    AND a.ativo                    = 0
    AND EXISTS
      (SELECT 1
      FROM CAPROFISSIONAISREGISTRAD b
      WHERE b.profissionalRegistrado = p_pessoaDe
      AND b.ativo                    = 1
      );
  ELSE
    INSERT INTO CAPROFISSIONAISREGISTRAD (
      profissionalRegistrado,
      ativo,
      conselhoClasseProfissional,
      uf,
      registroConselhoClassePro)
    SELECT p_pessoaPara,
      ativo,
      conselhoClasseProfissional,
      uf,
      registroConselhoClassePro
    FROM CAPROFISSIONAISREGISTRAD
    WHERE profissionalRegistrado = p_pessoaDe;
  END IF;
  -- Credenciadora Cartão
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACREDENCIADORASCARTAO
  WHERE credenciadoraCartao = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CACREDENCIADORASCARTAO a
    SET a.ativo                 = 1
    WHERE a.credenciadoraCartao = p_pessoaPara
    AND a.ativo                 = 0
    AND EXISTS
      (SELECT 1
      FROM CACREDENCIADORASCARTAO b
      WHERE b.credenciadoraCartao = p_pessoaDe
      AND b.ativo                 = 1
      );
  ELSE
    INSERT INTO CACREDENCIADORASCARTAO (
      credenciadoraCartao,
      ativo,
      credenciadoraTef)
    SELECT p_pessoaPara,
      ativo,
      credenciadoraTef
    FROM CACREDENCIADORASCARTAO
    WHERE credenciadoraCartao = p_pessoaDe;
  END IF;
  -- Orgão Federal / Estadual / Municipal
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAORGAOSFEDERESTADMUNIC
  WHERE orgaoFederalEstadualMunicipal = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CAORGAOSFEDERESTADMUNIC a
    SET a.ativo                           = 1
    WHERE a.orgaoFederalEstadualMunicipal = p_pessoaPara
    AND a.ativo                           = 0
    AND EXISTS
      (SELECT 1
      FROM CAORGAOSFEDERESTADMUNIC b
      WHERE b.orgaoFederalEstadualMunicipal = p_pessoaDe
      AND b.ativo                           = 1
      );
  ELSE
    INSERT INTO CAORGAOSFEDERESTADMUNIC (
        orgaoFederalEstadualMunicipal,
        ativo,
        federalEstadualMunicipal)
    SELECT p_pessoaPara,
      ativo,
      federalEstadualMunicipal
    FROM CAORGAOSFEDERESTADMUNIC
    WHERE orgaoFederalEstadualMunicipal = p_pessoaDe;
  END IF;
  -- Pessoa Estabelecimento
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAPESSOAESTABELECIMENTOS
  WHERE pessoaEstabelecimento = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CAPESSOAESTABELECIMENTOS a
    SET a.ativo                   = 1
    WHERE a.pessoaEstabelecimento = p_pessoaPara
    AND a.ativo                   = 0
    AND EXISTS
      (SELECT 1
      FROM CAPESSOAESTABELECIMENTOS b
      WHERE b.pessoaEstabelecimento = p_pessoaDe
      AND b.ativo                   = 1
      );
  ELSE
    INSERT INTO CAPESSOAESTABELECIMENTOS (
      pessoaEstabelecimento,
      ativo)
    SELECT p_pessoaPara,
      ativo
    FROM CAPESSOAESTABELECIMENTOS
    WHERE pessoaEstabelecimento = p_pessoaDe;
  END IF;
  -- Cliente
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACLIENTES
  WHERE cliente = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CACLIENTES a
    SET a.ativo     = 1
    WHERE a.cliente = p_pessoaPara
    AND a.ativo     = 0
    AND EXISTS
      (SELECT 1
      FROM CACLIENTES b
      WHERE b.cliente = p_pessoaDe
      AND b.ativo     = 1
      );
  ELSE
    INSERT INTO CACLIENTES (
      cliente,
      ativo,
      permiteVendaACredito,
      permiteVendaConsignada,
      permiteVendaContaCorrente,
      convenio,
      classificacaoPessoa,
      pontuacaoCredito,
      limiteCredito,
      creditoPorParcela,
      percAcrescimoCredito,
      percEntradaMinima,
      condicaoPagamento,
      diaFixoVencimento)
    SELECT p_pessoaPara,
      ativo,
      permiteVendaACredito,
      permiteVendaConsignada,
      permiteVendaContaCorrente,
      convenio,
      classificacaoPessoa,
      pontuacaoCredito,
      limiteCredito,
      creditoPorParcela,
      percAcrescimoCredito,
      percEntradaMinima,
      condicaoPagamento,
      diaFixoVencimento
    FROM CACLIENTES
    WHERE cliente = p_pessoaDe;
  END IF;
  -- Fornecedor
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAFORNECEDORES
  WHERE fornecedor = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE CAFORNECEDORES a
    SET a.ativo        = 1
    WHERE a.fornecedor = p_pessoaPara
    AND a.ativo        = 0
    AND EXISTS
      (SELECT 1
      FROM CAFORNECEDORES b
      WHERE b.fornecedor = fornecedor
      AND b.ativo        = 1
      );
  ELSE
    INSERT INTO CAFORNECEDORES (
      fornecedor,
      ativo,
      condicaoPagamento,
      prazoEntrega,
      valorMinimoPedidoCompra)
    SELECT p_pessoaPara,
      ativo,
      condicaoPagamento,
      prazoEntrega,
      valorMinimoPedidoCompra
    FROM CAFORNECEDORES
    WHERE fornecedor = p_pessoaDe;
  END IF;
  -- Botões
  UPDATE CAAUTORIZADOSPESSOA       a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM CAAUTORIZADOSPESSOA b WHERE b.pessoa = p_pessoaPara AND b.pessoaAutorizada = a.pessoaAutorizada));
  UPDATE CAAUTORIZADOSPESSOA       a SET a.pessoaAutorizada = p_pessoaPara WHERE a.pessoaAutorizada = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM CAAUTORIZADOSPESSOA b WHERE b.pessoaAutorizada = p_pessoaPara AND b.pessoa = a.pessoa));
  UPDATE CAREFERBANCARIASPESSOA    a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM CAREFERBANCARIASPESSOA b WHERE b.pessoa = p_pessoaPara AND b.banco = a.banco AND b.agenciaBanco = a.agenciaBanco AND b.contaBanco = a.contaBanco));
  UPDATE CAREFERCOMERCIAISPESSOA   a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM CAREFERCOMERCIAISPESSOA b WHERE b.pessoa = p_pessoaPara AND b.empresa = a.empresa));
  UPDATE CAREFERPESSOAISPESSOA     a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM CAREFERPESSOAISPESSOA b WHERE b.pessoa = p_pessoaPara AND b.contato = a.contato));
  UPDATE CAPESSOAXARQUIVOS           SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE CAPESSOAXBIOMETRIAS       a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM CAPESSOAXBIOMETRIAS b WHERE b.pessoa = p_pessoaPara AND b.dedo = a.dedo));
  UPDATE CAPESSOASXESTABELECIMTOS  a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM CAPESSOASXESTABELECIMTOS b WHERE b.pessoa = p_pessoaPara AND b.estabelecimento = a.estabelecimento));
  UPDATE CAPESSOASXESTABELECIMTOS  a SET a.ativo = 1 WHERE a.pessoa = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM CAPESSOASXESTABELECIMTOS b WHERE b.pessoa = p_pessoaDe AND b.estabelecimento = a.estabelecimento AND b.ativo = 1);
  -- Parâmetros
  UPDATE PAREGRASFRETE             a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAREGRASFRETE b WHERE b.pessoa = p_pessoaPara AND b.estabelecimento = a.estabelecimento AND b.uf = a.uf AND b.mesorregiaoGeografica = a.mesorregiaoGeografica AND b.microrregiaoGeografica = a.microrregiaoGeografica AND b.municipio = a.municipio AND b.bairroDistrito = a.bairroDistrito AND b.exclusivoPessoaA = a.exclusivoPessoaA AND b.exclusivoPessoaB = a.exclusivoPessoaB AND b.exclusivoPessoaC = a.exclusivoPessoaC AND b.exclusivoPessoaD = a.exclusivoPessoaD AND b.exclusivoPessoaE = a.exclusivoPessoaE));
  UPDATE PAPROJETOS                  SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE PAFILTROCABECXPESSOAS     a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAFILTROCABECXPESSOAS b WHERE b.pessoa = p_pessoaPara AND b.filtroCabecalho = a.filtroCabecalho));
  UPDATE PAFILTROCABECXPESSOAS     a SET a.ativo = 1 WHERE a.pessoa = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM PAFILTROCABECXPESSOAS b WHERE b.pessoa = p_pessoaDe AND b.filtroCabecalho = a.filtroCabecalho AND b.ativo = 1);
  UPDATE PACARTOESPROPRIOS           SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE PAMODELOSFINANCEIRO         SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE PAOPERACOESFISCAIS          SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE PAMVAS                    a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAMVAS b WHERE b.pessoa = p_pessoaPara AND b.idNcm = a.idNcm AND b.produto = a.produto AND b.origemMercadoria = a.origemMercadoria AND b.estabelecimento = a.estabelecimento AND b.ufOrigem = a.ufOrigem));
  -- Cadastros
  UPDATE CAGRADEPRODUTOXPESSOAS    a SET a.pessoa = p_pessoaPara WHERE a.pessoa = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM CAGRADEPRODUTOXPESSOAS b WHERE b.pessoa = p_pessoaPara AND b.gradeProduto = a.gradeProduto AND b.codigoProduto = a.codigoProduto));
  UPDATE CARECEITASLENTESCLIENTE     SET paciente = p_pessoaPara WHERE paciente = p_pessoaDe;
  -- Movimentações
  UPDATE MOHISTORICOCREDITO          SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOCONTABEIS                 SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOORCAMENTOS                SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOORCAMENTOXITENS           SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOORCAMENTOXBLOQUEIOSEST    SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOPREDOCUMENTOS             SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOPREDOCUMXITENS            SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOPREDOCUMXPAGAMENTOS       SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MOPREDOCUMXBLOQUEIOSEST     SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MODOCUMENTOSFISCAIS         SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MODOCFISCALXNFREF           SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MODOCFISCALXITENS           SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MODOCFISCALXPAGAMENTOS      SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MODOCFISCALXBLOQUEIOSEST    SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOVALESDESCONTO             SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOFINANCEIROS               SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOFINANCEIROS               SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MOFINANCEIROXCOMISSOES      SET comissionado = p_pessoaPara WHERE comissionado = p_pessoaDe;
  UPDATE MOFINANCEIROXBAIXAS         SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MONEGOCIACOESDIVIDAS        SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MOREPARCELAMENTOS           SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MOREPARCXPAGAMENTOS         SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MOSPCREGISTROS              SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOHISTORICOCOBRANCA         SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOHISTORICOCRM              SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOPONTUACOES                SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOORCAMENTOXPAGAMENTOS      SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MOPREVISOESFINANCEIRAS      SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOPREVISOESFINANCEIRAS      SET cobranca = p_pessoaPara WHERE cobranca = p_pessoaDe;
  UPDATE MOSEPARACOES                SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOSEPARACAOXITENS           SET pessoaParticipanteSaida = p_pessoaPara WHERE pessoaParticipanteSaida = p_pessoaDe;
  UPDATE MOSEPARACAOXITENS           SET pessoaParticipanteEntrada = p_pessoaPara WHERE pessoaParticipanteEntrada = p_pessoaDe;
  UPDATE MOSEPARACAOXBLOQUEIOSEST    SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOINVENTARIOESTOQUEXITENS   SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOESTOQUES                  SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MODOCUMENTOSTROCA           SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MODOCTROCAXITENS            SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOBALANCOS                  SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MODOCUMENTOSTRANSFERENCIA   SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MODOCUMENTOTRANSFXITENS     SET pessoaParticipanteSaida = p_pessoaPara WHERE pessoaParticipanteSaida = p_pessoaDe;
  UPDATE MODOCUMENTOTRANSFXITENS     SET pessoaParticipanteEntrada = p_pessoaPara WHERE pessoaParticipanteEntrada = p_pessoaDe;
  UPDATE MODOCTRANSFXBLOQUEIOSEST    SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOCONSERTOS                 SET cliente = p_pessoaPara WHERE cliente = p_pessoaDe;
  UPDATE MORESERVASESTOQUE           SET pessoaParticipante = p_pessoaPara WHERE pessoaParticipante = p_pessoaDe;
  UPDATE MOMOTIVOSBLOQUEIOS          SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOLOTESINGRESSO             SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  UPDATE MOEVENTOS                   SET pessoa = p_pessoaPara WHERE pessoa = p_pessoaDe;
  -- Transportadoras
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CATRANSPORTADORAS
  WHERE transportadora = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Parâmetros
    UPDATE PAREGRASFRETE               SET transportadora = p_pessoaPara WHERE transportadora = p_pessoaDe;
    -- Cadastros
    UPDATE CAPLACAS                    SET transportadora = p_pessoaPara WHERE transportadora = p_pessoaDe;
    -- Movimentações
    UPDATE MOORCAMENTOS                SET transportadora = p_pessoaPara WHERE transportadora = p_pessoaDe;
    UPDATE MOPREDOCUMENTOS             SET transportadora = p_pessoaPara WHERE transportadora = p_pessoaDe;
    UPDATE MODOCUMENTOSFISCAIS         SET transportadora = p_pessoaPara WHERE transportadora = p_pessoaDe;
  END IF;
  -- Vendedores
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAVENDEDORES
  WHERE vendedor = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Parâmetros
    UPDATE PAFILTROPRODUTOXVENDEDOR  a SET a.vendedor = p_pessoaPara WHERE a.vendedor = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAFILTROPRODUTOXVENDEDOR b WHERE b.vendedor = p_pessoaPara AND b.filtroProduto = a.filtroProduto));
    UPDATE PAFILTROPRODUTOXVENDEDOR  a SET a.ativo = 1 WHERE a.vendedor = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM PAFILTROPRODUTOXVENDEDOR b WHERE b.vendedor = p_pessoaDe AND b.filtroProduto = a.filtroProduto AND b.ativo = 1);
    UPDATE PATABELAPRECOXVENDEDORES  a SET a.vendedor = p_pessoaPara WHERE a.vendedor = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PATABELAPRECOXVENDEDORES b WHERE b.vendedor = p_pessoaPara AND b.tabelaPreco = a.tabelaPreco));
    UPDATE PATABELAPRECOXVENDEDORES  a SET a.ativo = 1 WHERE a.vendedor = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM PATABELAPRECOXVENDEDORES b WHERE b.vendedor = p_pessoaDe AND b.tabelaPreco = a.tabelaPreco AND b.ativo = 1);
    UPDATE PAMETAXCONTEUDOS            SET vendedor = p_pessoaPara WHERE vendedor = p_pessoaDe;
    UPDATE PAMETAXVENDEDOR           a SET a.vendedor = p_pessoaPara WHERE a.vendedor = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAMETAXVENDEDOR b WHERE b.vendedor = p_pessoaPara AND b.idMetaXConteudo = a.idMetaXConteudo));
    UPDATE PAMETAXVENDEDOR           a SET a.ativo = 1 WHERE a.vendedor = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM PAMETAXVENDEDOR b WHERE b.vendedor = p_pessoaDe AND b.idMetaXConteudo = a.idMetaXConteudo AND b.ativo = 1);
    -- Cadastros
    UPDATE CAVENDEDORESXCLIENTES     a SET a.vendedor = p_pessoaPara WHERE a.vendedor = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM CAVENDEDORESXCLIENTES b WHERE b.vendedor = p_pessoaPara AND b.cliente = a.cliente));
    UPDATE CAVENDEDORESXCLIENTES     a SET a.ativo = 1 WHERE a.vendedor = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM CAVENDEDORESXCLIENTES b WHERE b.vendedor = p_pessoaDe AND b.cliente = a.cliente AND b.ativo = 1);
    -- Movimentações
    UPDATE MOORCAMENTOS                SET ultimoVendedorItem = p_pessoaPara WHERE ultimoVendedorItem = p_pessoaDe;
    UPDATE MOORCAMENTOXITENS           SET vendedor = p_pessoaPara WHERE vendedor = p_pessoaDe;
    UPDATE MOPREDOCUMENTOS             SET ultimoVendedorItem = p_pessoaPara WHERE ultimoVendedorItem = p_pessoaDe;
    UPDATE MOPREDOCUMXITENS            SET vendedor = p_pessoaPara WHERE vendedor = p_pessoaDe;
    UPDATE MODOCUMENTOSFISCAIS         SET ultimoVendedorItem = p_pessoaPara WHERE ultimoVendedorItem = p_pessoaDe;
    UPDATE MODOCFISCALXITENS           SET vendedor = p_pessoaPara WHERE vendedor = p_pessoaDe;
    UPDATE MOVALESDESCONTO             SET vendedor = p_pessoaPara WHERE vendedor = p_pessoaDe;
    UPDATE MODOCUMENTOSTROCA           SET ultimoVendedorItem = p_pessoaPara WHERE ultimoVendedorItem = p_pessoaDe;
    UPDATE MODOCTROCAXITENS            SET vendedor = p_pessoaPara WHERE vendedor = p_pessoaDe;
    UPDATE MODOCUMENTOSTRANSFERENCIA   SET vendedor = p_pessoaPara WHERE vendedor = p_pessoaDe;
    UPDATE MOCONSERTOS                 SET vendedor = p_pessoaPara WHERE vendedor = p_pessoaDe;
    UPDATE MOMOTIVOSBLOQUEIOS          SET vendedor = p_pessoaPara WHERE vendedor = p_pessoaDe;
  END IF;
  -- Comissionado B
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACOMISSIONADOSB
  WHERE comissionadoB = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Movimentações
    UPDATE MOATENDIMENTOS              SET comissionadoB = p_pessoaPara WHERE comissionadoB = p_pessoaDe;
    UPDATE MOORCAMENTOS                SET comissionadoB = p_pessoaPara WHERE comissionadoB = p_pessoaDe;
    UPDATE MOPREDOCUMENTOS             SET comissionadoB = p_pessoaPara WHERE comissionadoB = p_pessoaDe;
    UPDATE MODOCUMENTOSFISCAIS         SET comissionadoB = p_pessoaPara WHERE comissionadoB = p_pessoaDe;
  END IF;
  -- Comissionado C
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACOMISSIONADOSC
  WHERE comissionadoC = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Movimentações
    UPDATE MOATENDIMENTOS              SET comissionadoC = p_pessoaPara WHERE comissionadoC = p_pessoaDe;
    UPDATE MOORCAMENTOS                SET comissionadoC = p_pessoaPara WHERE comissionadoC = p_pessoaDe;
    UPDATE MOPREDOCUMENTOS             SET comissionadoC = p_pessoaPara WHERE comissionadoC = p_pessoaDe;
    UPDATE MODOCUMENTOSFISCAIS         SET comissionadoC = p_pessoaPara WHERE comissionadoC = p_pessoaDe;
  END IF;
  -- Colaboradores
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACOLABORADORES
  WHERE colaborador = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Parâmetros
    UPDATE PAINDICADORES               SET colaboradorResponsavel = p_pessoaPara WHERE colaboradorResponsavel = p_pessoaDe;
    -- Movimentações
    UPDATE MOORCAMENTOS                SET colaboradorResponsavel = p_pessoaPara WHERE colaboradorResponsavel = p_pessoaDe;
    UPDATE MOPLANEJAMENTOATIVIDADES    SET colaboradorResponsavel = p_pessoaPara WHERE colaboradorResponsavel = p_pessoaDe;
    UPDATE MODOCUMENTOSTRANSFERENCIA   SET colaboradorResponsavelRetirada = p_pessoaPara WHERE colaboradorResponsavelRetirada = p_pessoaDe;
    UPDATE MODOCUMENTOSTRANSFERENCIA   SET colaboradorResponsavelRecebim  = p_pessoaPara WHERE colaboradorResponsavelRecebim  = p_pessoaDe;
    UPDATE MOORCAMENTOS                SET motorista = p_pessoaPara WHERE motorista = p_pessoaDe;
    UPDATE MOPREDOCUMENTOS             SET motorista = p_pessoaPara WHERE motorista = p_pessoaDe;
    UPDATE MODOCUMENTOSFISCAIS         SET motorista = p_pessoaPara WHERE motorista = p_pessoaDe;
    UPDATE MOENTREGAS                  SET motorista = p_pessoaPara WHERE motorista = p_pessoaDe;
    UPDATE MOPAINEISCOMPRA             SET comprador = p_pessoaPara WHERE comprador = p_pessoaDe;
    UPDATE MOLOTESINGRESSO             SET colaboradorResponsavel = p_pessoaPara WHERE colaboradorResponsavel = p_pessoaDe;
  END IF;
  -- Usuários
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAUSUARIOS
  WHERE usuario = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Parâmetros
    UPDATE PAFILTROCABECXUSUARIOS    a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAFILTROCABECXUSUARIOS b WHERE b.usuario = p_pessoaPara AND b.filtroCabecalho = a.filtroCabecalho));
    UPDATE PAFILTROCABECXUSUARIOS    a SET a.ativo = 1 WHERE a.usuario = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM PAFILTROCABECXUSUARIOS b WHERE b.usuario = p_pessoaDe AND b.filtroCabecalho = a.filtroCabecalho AND b.ativo = 1);
    UPDATE PACONFIGURACAOXCONTEUDOS  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PACONFIGURACAOXCONTEUDOS b WHERE b.usuario = p_pessoaPara AND b.configuracao = a.configuracao AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario));
    UPDATE PAPERSCAMPOSXCONTEUDOS    a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAPERSCAMPOSXCONTEUDOS b WHERE b.usuario = p_pessoaPara AND b.personalizacaoCampo = a.personalizacaoCampo AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario));
    UPDATE PAMEMORIASISTEMAXUSUARIOS a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAMEMORIASISTEMAXUSUARIOS b WHERE b.usuario = p_pessoaPara AND b.memoriaSistema = a.memoriaSistema));
    UPDATE PAMENUXPERMISSOES         a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAMENUXPERMISSOES b WHERE b.usuario = p_pessoaPara AND b.tipoMenu = a.tipoMenu AND b.categoriaMenu = a.categoriaMenu AND b.menu = a.menu AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario));
    UPDATE PAMENUXCAMPOSPESQUISA     a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAMENUXCAMPOSPESQUISA b WHERE b.usuario = p_pessoaPara AND b.menu = a.menu AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario));
    UPDATE PAMENUXLAYOUTPESQUISA     a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAMENUXLAYOUTPESQUISA b WHERE b.usuario = p_pessoaPara AND b.menu = a.menu AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.dispositivo = a.dispositivo));
    UPDATE PACARTEIRASFINPERMITIDAS  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PACARTEIRASFINPERMITIDAS b WHERE b.usuario = p_pessoaPara AND b.carteiraFinanceira = a.carteiraFinanceira AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario));
    UPDATE PACARTEIRASFINPERMITIDAS  a SET a.permitido = 1 WHERE a.usuario = p_pessoaPara AND a.permitido = 0 AND EXISTS(SELECT 1 FROM PACARTEIRASFINPERMITIDAS b WHERE b.usuario = p_pessoaPara AND b.carteiraFinanceira = a.carteiraFinanceira AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.permitido = 1);
    UPDATE PAMODELOSFINANPERMITIDOS  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAMODELOSFINANPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.modeloFinanceiro = a.modeloFinanceiro AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario));
    UPDATE PAMODELOSFINANPERMITIDOS  a SET a.permitido = 1 WHERE a.usuario = p_pessoaPara AND a.permitido = 0 AND EXISTS(SELECT 1 FROM PAMODELOSFINANPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.modeloFinanceiro = a.modeloFinanceiro AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.permitido = 1);
    UPDATE PAMODELOSDOCUMPERMITIDOS  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAMODELOSDOCUMPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.modeloDocumento = a.modeloDocumento AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario));
    UPDATE PAMODELOSDOCUMPERMITIDOS  a SET a.permitido = 1 WHERE a.usuario = p_pessoaPara AND a.permitido = 0 AND EXISTS(SELECT 1 FROM PAMODELOSDOCUMPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.modeloDocumento = a.modeloDocumento AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.permitido = 1);
    UPDATE PALOCAISESTOQUEPERMITIDOS a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PALOCAISESTOQUEPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.localEstoque = a.localEstoque AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario));
    UPDATE PALOCAISESTOQUEPERMITIDOS a SET a.permitido = 1 WHERE a.usuario = p_pessoaPara AND a.permitido = 0 AND EXISTS(SELECT 1 FROM PALOCAISESTOQUEPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.localEstoque = a.localEstoque AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.permitido = 1);
    UPDATE PAVALIDACOESPESSOA        a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAVALIDACOESPESSOA b WHERE b.usuario = p_pessoaPara AND b.campoValidarPessoa = a.campoValidarPessoa AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.localValidarCampoPessoa = a.localValidarCampoPessoa AND b.meioPagamento = a.meioPagamento));
    UPDATE PACONTROLESENTREGA          SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE PAREGRASENTREGA             SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE PALISTACOBRANCAXUSUARIOS  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PALISTACOBRANCAXUSUARIOS b WHERE b.usuario = p_pessoaPara AND b.listaCobranca = a.listaCobranca));
    UPDATE PALISTACOBRANCAXUSUARIOS  a SET a.ativo = 1 WHERE a.usuario = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM PALISTACOBRANCAXUSUARIOS b WHERE b.usuario = p_pessoaDe AND b.listaCobranca = a.listaCobranca AND b.ativo = 1);
    UPDATE PALISTACRMXUSUARIOS       a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PALISTACRMXUSUARIOS b WHERE b.usuario = p_pessoaPara AND b.listaCRM = a.listaCRM));
    UPDATE PALISTACRMXUSUARIOS       a SET a.ativo = 1 WHERE a.usuario = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM PALISTACRMXUSUARIOS b WHERE b.usuario = p_pessoaDe AND b.listaCRM = a.listaCRM AND b.ativo = 1);
    UPDATE PAREGRASCREDITO             SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE PAMOTORCREDITO              SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE PAGERADORESRELPERMITIDOS  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAGERADORESRELPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.categoriaGeradorRelatorio = a.categoriaGeradorRelatorio AND b.geradorRelatorio = a.geradorRelatorio AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario));
    UPDATE PAGERADORESRELPERMITIDOS  a SET a.permitido = 1 WHERE a.usuario = p_pessoaPara AND a.permitido = 0 AND EXISTS(SELECT 1 FROM PAGERADORESRELPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.categoriaGeradorRelatorio = a.categoriaGeradorRelatorio AND b.geradorRelatorio = a.geradorRelatorio AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.permitido = 1);
    UPDATE PAMOTIVOSBLOQPERMITIDOS   a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAMOTIVOSBLOQPERMITIDOS b WHERE b.usuario = p_pessoaPara AND b.motivoBloqueioDocumento = a.motivoBloqueioDocumento AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario));
    UPDATE PAETAPASORCAMENTODEPARA   a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAETAPASORCAMENTODEPARA b WHERE b.usuario = p_pessoaPara AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.etapaOrcamentoDe = a.etapaOrcamentoDe AND b.etapaOrcamentoPara = a.etapaOrcamentoPara));
    UPDATE PAETAPASORCAMENTOPERMITID a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAETAPASORCAMENTOPERMITID b WHERE b.usuario = p_pessoaPara AND b.etapaOrcamento = a.etapaOrcamento AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario));
    UPDATE PAETAPASORCAMENTOPERMITID a SET a.permitido = 1 WHERE a.usuario = p_pessoaPara AND a.permitido = 0 AND EXISTS(SELECT 1 FROM PAETAPASORCAMENTOPERMITID b WHERE b.usuario = p_pessoaPara AND b.etapaOrcamento = a.etapaOrcamento AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.permitido = 1);
    UPDATE PAEMAILS                  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAEMAILS b WHERE b.usuario = p_pessoaPara AND b.tipoEmail = a.tipoEmail AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario));
    UPDATE PAEMAILS                  a SET a.ativo = 1 WHERE a.usuario = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM PAEMAILS b WHERE b.usuario = p_pessoaDe AND b.tipoEmail = a.tipoEmail AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.ativo = 1);
    UPDATE PAIMAGENSSISTEMA          a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAIMAGENSSISTEMA b WHERE b.usuario = p_pessoaPara AND b.tipoImagemSistema = a.tipoImagemSistema AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.dispositivo = a.dispositivo));
    UPDATE PAIMPRESSORAXDOCUMENTO    a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAIMPRESSORAXDOCUMENTO b WHERE b.usuario = p_pessoaPara AND b.tipoDocumentoImpresso = a.tipoDocumentoImpresso AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.dispositivo = a.dispositivo AND b.enderecoMAC = a.enderecoMAC AND b.etapaOrcamento = a.etapaOrcamento));
    UPDATE PACAIXASUSUARIOS          a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PACAIXASUSUARIOS b WHERE b.usuario = p_pessoaPara AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.dispositivo = a.dispositivo AND b.enderecoMAC = a.enderecoMAC));
    UPDATE PAMEIOSPAGAMENTOAUTOEFET  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAMEIOSPAGAMENTOAUTOEFET b WHERE b.usuario = p_pessoaPara AND b.meioPagamento = a.meioPagamento AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario));
    UPDATE PAMEIOSPAGAMENTOAUTOEFET  a SET a.autoEfetivar = 1 WHERE a.usuario = p_pessoaPara AND a.autoEfetivar = 0 AND EXISTS(SELECT 1 FROM PAMEIOSPAGAMENTOAUTOEFET b WHERE b.usuario = p_pessoaPara AND b.meioPagamento = a.meioPagamento AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario AND b.autoEfetivar = 1);
    UPDATE PAREGRASCAIXAS            a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAREGRASCAIXAS b WHERE b.usuario = p_pessoaPara AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario));
    UPDATE PAREGRASMARGEMCONTRIBUIC  a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PAREGRASMARGEMCONTRIBUIC b WHERE b.usuario = p_pessoaPara AND b.estabelecimento = a.estabelecimento AND b.perfilUsuario = a.perfilUsuario));
    UPDATE PACATEGORIASPRODUTOSVENDA   SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE PAREGRASFAIXASATRASO        SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    -- Cadastros
    UPDATE CAPRODUTOS                  SET usuarioInclusao = p_pessoaPara WHERE usuarioInclusao = p_pessoaDe;
    UPDATE CAPRODUTOS                  SET usuarioAlteracao = p_pessoaPara WHERE usuarioAlteracao = p_pessoaDe;
    UPDATE CATABELAPRECOXALTERACOES    SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE CAPRODUTOXCONTROLEENTREGA   SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    -- Movimentações
    UPDATE MOCATEGORIASMENUUSUARIO   a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM MOCATEGORIASMENUUSUARIO b WHERE b.usuario = p_pessoaPara AND b.guia = a.guia AND b.categoriaMenu = a.categoriaMenu));
    UPDATE MOACESSOSMENU             a SET a.usuario = p_pessoaPara WHERE a.usuario = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM MOACESSOSMENU b WHERE b.usuario = p_pessoaPara AND b.menu = a.menu));
    UPDATE MOSESSOES                   SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOSPCCONSULTAS              SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOORCAMENTOXETAPAS          SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOORCAMENTOXBLOQUEIOSEST    SET usuarioLiberacao = p_pessoaPara WHERE usuarioLiberacao = p_pessoaDe;
    UPDATE MOSESSOESCAIXA              SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOPREDOCUMXSTATUS           SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOPREDOCUMXBLOQUEIOSEST     SET usuarioLiberacao = p_pessoaPara WHERE usuarioLiberacao = p_pessoaDe;
    UPDATE MODOCFISCALXSITUACOES       SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MODOCFISCALXBLOQUEIOSEST    SET usuarioLiberacao = p_pessoaPara WHERE usuarioLiberacao = p_pessoaDe;
    UPDATE MOFINANCEIROXBAIXAS         SET descontoAutorizadoPor = p_pessoaPara WHERE descontoAutorizadoPor = p_pessoaDe;
    UPDATE MONEGOCIACOESDIVIDAS        SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOREPARCELAMENTOS           SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOHISTORICOCOBRANCA         SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOHISTORICOCRM              SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOPONTUACOES                SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOARQUIVOSCONCILIACOES      SET usuarioImportacao = p_pessoaPara WHERE usuarioImportacao = p_pessoaDe;
    UPDATE MOCONCILIACOESCARTOES       SET usuarioProcessamento = p_pessoaPara WHERE usuarioProcessamento = p_pessoaDe;
    UPDATE MOSEPARACAOXBLOQUEIOSEST    SET usuarioLiberacao = p_pessoaPara WHERE usuarioLiberacao = p_pessoaDe;
    UPDATE MODOCTRANSFXBLOQUEIOSEST    SET usuarioLiberacao = p_pessoaPara WHERE usuarioLiberacao = p_pessoaDe;
    UPDATE MOCONSERTOS                 SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOCONSERTOS                 SET usuarioLiberacao = p_pessoaPara WHERE usuarioLiberacao = p_pessoaDe;
    UPDATE MOENTREGAXSITUACOES         SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOMOTBLOQXLIBERACOES        SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
    UPDATE MOEVENTOS                   SET usuario = p_pessoaPara WHERE usuario = p_pessoaDe;
  END IF;
  -- Técnicos
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CATECNICOS
  WHERE tecnico = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Cadastros
    UPDATE CATECNICOSXCLIENTES       a SET a.tecnico = p_pessoaPara WHERE a.tecnico = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM CATECNICOSXCLIENTES b WHERE b.tecnico = p_pessoaPara AND b.cliente = a.cliente));
    UPDATE CATECNICOSXCLIENTES       a SET a.ativo = 1 WHERE a.tecnico = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM CATECNICOSXCLIENTES b WHERE b.tecnico = p_pessoaDe AND b.cliente = a.cliente AND b.ativo = 1);
    -- Movimentações
    UPDATE MOORCAMENTOXATIVIDADEPREV   SET tecnico = p_pessoaPara WHERE tecnico = p_pessoaDe;
    UPDATE MOORCAMENTOXATIVIDADEREAL   SET tecnico = p_pessoaPara WHERE tecnico = p_pessoaDe;
  END IF;
  -- Separadores
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CASEPARADORES
  WHERE separador = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Movimentações
    UPDATE MOSEPARACOES                SET separador = p_pessoaPara WHERE separador = p_pessoaDe;
  END IF;
  -- Profissionais Registrados
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAPROFISSIONAISREGISTRAD
  WHERE profissionalRegistrado = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Parâmetros
    UPDATE PAESTABELECIMENTOS          SET contador = p_pessoaPara WHERE contador = p_pessoaDe;
    -- Cadastros
    UPDATE CARECEITASLENTESCLIENTE     SET medico = p_pessoaPara WHERE medico = p_pessoaDe;
  END IF;
  -- Credenciadoras Cartões
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACREDENCIADORASCARTAO
  WHERE credenciadoraCartao = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Parâmetros
    UPDATE PACONDPAGAMXBANDEIRASCART a SET a.credenciadoraCartao = p_pessoaPara WHERE a.credenciadoraCartao = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM PACONDPAGAMXBANDEIRASCART b WHERE b.credenciadoraCartao = p_pessoaPara AND b.meioPagamento = a.meioPagamento AND b.condicaoPagamento = a.condicaoPagamento AND b.estabelecimento = a.estabelecimento AND b.bandeiraCartaoDebCred = a.bandeiraCartaoDebCred));
    UPDATE PACONDPAGAMXBANDEIRASCART a SET a.ativo = 1 WHERE a.credenciadoraCartao = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM PACONDPAGAMXBANDEIRASCART b WHERE b.credenciadoraCartao = p_pessoaDe AND b.meioPagamento = a.meioPagamento AND b.condicaoPagamento = a.condicaoPagamento AND b.estabelecimento = a.estabelecimento AND b.bandeiraCartaoDebCred = a.bandeiraCartaoDebCred AND b.ativo = 1);
    -- Movimentações
    UPDATE MOFINANCEIROXCARTAO         SET credenciadoraCartao = p_pessoaPara WHERE credenciadoraCartao = p_pessoaDe;
  END IF;
  -- Estabelecimentos
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAPESSOAESTABELECIMENTOS
  WHERE pessoaEstabelecimento = p_pessoaPara;
  IF v_existe = 1 THEN
    UPDATE PAESTABELECIMENTOS          SET pessoaEstabelecimento = p_pessoaPara WHERE pessoaEstabelecimento = p_pessoaDe;
  END IF;
  -- Clientes
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CACLIENTES
  WHERE cliente = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Cadastros
    UPDATE CAVENDEDORESXCLIENTES     a SET a.cliente = p_pessoaPara WHERE a.cliente = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM CAVENDEDORESXCLIENTES b WHERE b.cliente = p_pessoaPara AND b.vendedor = a.vendedor));
    UPDATE CAVENDEDORESXCLIENTES     a SET a.ativo = 1 WHERE a.cliente = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM CAVENDEDORESXCLIENTES b WHERE b.cliente = p_pessoaDe AND b.vendedor = a.vendedor AND b.ativo = 1);
    UPDATE CATECNICOSXCLIENTES       a SET a.cliente = p_pessoaPara WHERE a.cliente = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM CATECNICOSXCLIENTES b WHERE b.cliente = p_pessoaPara AND b.tecnico = a.tecnico));
    UPDATE CATECNICOSXCLIENTES       a SET a.ativo = 1 WHERE a.cliente = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM CATECNICOSXCLIENTES b WHERE b.cliente = p_pessoaDe AND b.tecnico = a.tecnico AND b.ativo = 1);
    UPDATE CARECEITASLENTESCLIENTE     SET cliente = p_pessoaPara WHERE cliente = p_pessoaDe;
    -- Movimentações
    UPDATE MOATENDIMENTOS              SET cliente = p_pessoaPara WHERE cliente = p_pessoaDe;
  END IF;
  -- Fornecedores
  SELECT COALESCE(MAX(1),0)
  INTO v_existe
  FROM CAFORNECEDORES
  WHERE fornecedor = p_pessoaPara;
  IF v_existe = 1 THEN
    -- Cadastros
    UPDATE CAPRODUTOXFORNECEDORES    a SET a.fornecedor = p_pessoaPara WHERE a.fornecedor = p_pessoaDe AND NOT(EXISTS(SELECT 1 FROM CAPRODUTOXFORNECEDORES b WHERE b.fornecedor = p_pessoaPara AND b.produto = a.produto AND b.codigoProduto = a.codigoProduto));
    UPDATE CAPRODUTOXFORNECEDORES    a SET a.ativo = 1 WHERE a.fornecedor = p_pessoaPara AND a.ativo = 0 AND EXISTS(SELECT 1 FROM CAPRODUTOXFORNECEDORES b WHERE b.fornecedor = p_pessoaDe AND b.produto = a.produto AND b.codigoProduto = a.codigoProduto AND b.ativo = 1);
    -- Movimentações
    UPDATE MOORCAMENTOXRECEITASOCUL    SET laboratorio = p_pessoaPara WHERE laboratorio = p_pessoaDe;
    UPDATE MOCONSERTOS                 SET fornecedor = p_pessoaPara WHERE fornecedor = p_pessoaDe;
    UPDATE MOPAINEISCOMPRA             SET fornecedor = p_pessoaPara WHERE fornecedor = p_pessoaDe;
    UPDATE MOPAINELCOMPRAXITENS        SET fornecedor = p_pessoaPara WHERE fornecedor = p_pessoaDe;
  END IF;  
END ADD_TROCA_PESSOA;

/

create or replace PROCEDURE ADD_ORCAMENTO_CALC_IMP_RATEIO (
    p_cab_orcamento                IN NUMBER,
    p_cab_modeloDocumento          IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_atualizaCustoMedio       IN NUMBER,
    p_a_cab_tipoPagamentoFrete     IN CHAR,
    p_cab_tipoPagamentoFrete       IN CHAR,
    p_cab_valorFreteGeral          IN NUMBER,
    p_cab_valorSeguroGeral         IN NUMBER,
    p_cab_valorDescontoGeral       IN NUMBER,
    p_cab_valorOutrasDespesasGeral IN NUMBER,
    p_cab_valorAdicFreteMarinGeral IN NUMBER,
    p_cab_valorDespesasAduanGeral  IN NUMBER,
    p_cab_valorDescontoPagamento   IN NUMBER,
    p_cab_valorOutrasDespPagamento IN NUMBER,
    p_cab_valorJurosPagamento      IN NUMBER,
    p_cab_impostosEditados         IN NUMBER,
    p_modDoc_diminuiDescontoPrUnit IN NUMBER,
    p_modDoc_somaAcrescimosPrUnit  IN NUMBER,
    p_modDoc_somaFreteSeguroPrUnit IN NUMBER,
    p_modDoc_habilitaControleEntr  IN NUMBER,
    /* Retornos */
    r_cab_valorProdutos            OUT NUMBER,
    r_cab_valorServicos            OUT NUMBER,
    r_cab_valorBasePagamento       OUT NUMBER,
    r_cab_valorAVistaMinimo        OUT NUMBER,
    r_cab_valorFreteTotal          OUT NUMBER,
    r_cab_valorSeguroTotal         OUT NUMBER,
    r_cab_valorDescontoTotal       OUT NUMBER,
    r_cab_valorOutrasDespesasTotal OUT NUMBER,
    r_cab_valorAdicFreteMarinTotal OUT NUMBER,
    r_cab_valorDespesasAduanTotal  OUT NUMBER,
    r_cab_valorImpSomaPagamento    OUT NUMBER,
    r_cab_valorImpDiminuiPagamento OUT NUMBER,
    r_cab_valorLiquidoItem         OUT NUMBER,
    r_calcularImpostosItem         OUT NUMBER)
IS
    v_auxNumber                    NUMBER;
    v_valorDescontoPromocaoGeral   NUMBER;
    v_valorDescontoPromocaoPagamen NUMBER;
    v_rateioDescontofiltrarSemProm NUMBER;
    v_rateioDescontofiltrarAPrazo  NUMBER;
    v_rateioFretePorControleEntr   NUMBER;
    v_valorBaseRateio              NUMBER;
    v_valorBaseRateioFrete         NUMBER;
    v_valorBaseRateioFinanceiro    NUMBER;
    v_valorBaseRateioFinancFrete   NUMBER;
    v_valorBaseRateioDesconto      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_acrescimoUnitarioComposicao  NUMBER;
    v_precoUnitario                NUMBER;
    v_precoUnitarioConvertido      NUMBER;
    v_valorProdutoServico          NUMBER;
    v_valorFreteGeral              NUMBER;
    v_valorSeguroGeral             NUMBER;
    v_valorDescontoGeral           NUMBER;
    v_valorOutrasDespesasGeral     NUMBER;
    v_valorAdicFreteMarinMerGeral  NUMBER;
    v_valorDespesasAduaneirasGeral NUMBER;
    v_valorBasePagamento           NUMBER;
    v_valorDescontoPagamento       NUMBER;
    v_valorOutrasDespesasPagamento NUMBER;
    v_valorJurosPagamento          NUMBER;
    v_valorFreteTotal              NUMBER;
    v_valorSeguroTotal             NUMBER;
    v_valorDescontoTotal           NUMBER;
    v_valorOutrasDespesasTotal     NUMBER;
    v_valorAdicFreteMarinMerTotal  NUMBER;
    v_valorDespesasAduaneirasTotal NUMBER;
    v_valorImpSomaPagamento        NUMBER;
    v_valorImpDiminuiPagamento     NUMBER;
    v_valorLiquidoItem             NUMBER;
    CURSOR c_item IS
      SELECT
        a.idItemOrcamento,
        a.servico,
        a.geraFinanceiro,
        a.quantidade,
        a.quantidadeConvertida,
        a.usarPrecoAVista,
        a.precoUnitarioBruto,
        a.acrescimoUnitarioComposicao,
        a.precoUnitario,
        a.precoUnitarioConvertido,
        a.valorProdutoServicoBruto,
        a.valorProdutoServico,
        a.valorDescontoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorBasePagamento,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.valorFreteTotal,
        a.valorSeguroTotal,
        a.valorDescontoTotal,
        a.valorOutrasDespesasTotal,
        a.valorAdicFreteMarinhaMerTotal,
        a.valorDespesasAduaneirasTotal,
        a.valorIRRF,
        a.valorINSS,
        a.valorRetPIS,
        a.valorRetCOFINS,
        a.valorRetCSLL,
        a.valorII,
        a.valorIOF,
        a.valorIPI,
        a.valorPIS,
        a.valorPISST,
        a.valorCOFINS,
        a.valorCOFINSST,
        a.valorCreditoSimplesNacional,
        a.valorICMS,
        a.valorICMSST,
        a.valorImpostosSomaPagamento,
        a.valorImpostosDiminuiPagamento,
        a.valorLiquidoItem,
        CASE WHEN p_modDoc_habilitaControleEntr = 0 OR contr.habilitaFrete = 1 THEN 1 ELSE 0 END rateioFrete,
        CASE WHEN a.precoSugestaoAPrazo <> a.precoSugestaoAVista AND a.usarPrecoAVista = 1 THEN 1 ELSE 0 END aVista,
        CASE WHEN EXISTS(SELECT 1 FROM MOORCAMENTOXPROMOCOES promo WHERE promo.idItemOrcamento = a.idItemOrcamento) THEN 1 ELSE 0 END promocao,
        COALESCE((SELECT SUM(promo.valorDesconto) FROM MOORCAMENTOXPROMOCOES promo WHERE promo.idItemOrcamento = a.idItemOrcamento AND promo.cabecalhoItemPagamento ='C'),0) valorDescontoPromocaoGeral,
        COALESCE((SELECT SUM(promo.valorDesconto) FROM MOORCAMENTOXPROMOCOES promo WHERE promo.idItemOrcamento = a.idItemOrcamento AND promo.cabecalhoItemPagamento ='P'),0) valorDescontoPromocaoPagamento
      FROM MOORCAMENTOXITENS a
      JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = a.controleEntrega
      WHERE a.orcamento = p_cab_orcamento
      AND a.cancelado = 0
      ORDER BY a.sequencia;
BEGIN
  v_idItemOrcamentoUltimoItem    := 0;
  v_idItemOrcamentoRateioFrete   := 0;
  r_cab_valorProdutos            := 0;
  r_cab_valorServicos            := 0;
  r_cab_valorBasePagamento       := 0;
  r_cab_valorAVistaMinimo        := 0;
  r_cab_valorFreteTotal          := 0;
  r_cab_valorSeguroTotal         := 0;
  r_cab_valorDescontoTotal       := 0;
  r_cab_valorOutrasDespesasTotal := 0;
  r_cab_valorAdicFreteMarinTotal := 0;
  r_cab_valorDespesasAduanTotal  := 0;
  r_cab_valorImpSomaPagamento    := 0;
  r_cab_valorImpDiminuiPagamento := 0;
  r_cab_valorLiquidoItem         := 0;
  r_calcularImpostosItem         := 0;
  v_saldoRatFreteGeral           := p_cab_valorFreteGeral;
  v_saldoRatSeguroGeral          := p_cab_valorSeguroGeral;
  v_saldoRatDescontoGeral        := p_cab_valorDescontoGeral;
  v_saldoRatOutrasDespesasGeral  := p_cab_valorOutrasDespesasGeral;
  v_saldoRatAdicFreteMarinGeral  := p_cab_valorAdicFreteMarinGeral;
  v_saldoRatDespesasAduanGeral   := p_cab_valorDespesasAduanGeral;
  v_saldoRatDescontoPagamento    := p_cab_valorDescontoPagamento;
  v_saldoRatOutrasDespPagamento  := p_cab_valorOutrasDespPagamento;
  v_saldoRatJurosPagamento       := p_cab_valorJurosPagamento;
  v_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
  IF p_cab_valorDescontoGeral > 0 THEN
    SELECT COALESCE(SUM(promo.valorDesconto),0)
    INTO v_valorDescontoPromocaoGeral
    FROM MOORCAMENTOXITENS a
    JOIN MOORCAMENTOXPROMOCOES promo ON promo.idItemOrcamento = a.idItemOrcamento
    WHERE a.orcamento = p_cab_orcamento
    AND a.cancelado = 0
    AND promo.cabecalhoItemPagamento ='C';
  ELSE
    v_valorDescontoPromocaoGeral := 0;
  END IF;
  -- v_valorDescontoPromocaoPagamen
  IF p_cab_valorDescontoPagamento > 0 THEN
    SELECT COALESCE(SUM(promo.valorDesconto),0)
    INTO v_valorDescontoPromocaoPagamen
    FROM MOORCAMENTOXITENS a
    JOIN MOORCAMENTOXPROMOCOES promo ON promo.idItemOrcamento = a.idItemOrcamento
    WHERE a.orcamento = p_cab_orcamento
    AND a.cancelado = 0
    AND promo.cabecalhoItemPagamento ='P';
  ELSE
    v_valorDescontoPromocaoPagamen := 0;
  END IF;
  IF p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral OR p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen THEN
    -- v_rateioDescontofiltrarSemProm
    SELECT
      CASE
        WHEN COALESCE ((
          SELECT SUM (a.valorProdutoServicoBruto - a.valorDescontoItem + a.valorAcrescimoItem)
          FROM MOORCAMENTOXITENS a
          JOIN MOORCAMENTOXPROMOCOES b ON b.idItemOrcamento = a.idItemOrcamento
          WHERE a.orcamento = p_cab_orcamento
          AND a.cancelado = 0),0) > (
            CASE
              WHEN p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral
              THEN p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral
              ELSE 0
            END +
            CASE
              WHEN p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen
              THEN p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen
              ELSE 0
            END)
          AND EXISTS (
            SELECT 1
            FROM MOORCAMENTOXITENS a
            WHERE a.orcamento = p_cab_orcamento
            AND a.cancelado = 0
            AND NOT (EXISTS(
              SELECT 1
              FROM MOORCAMENTOXPROMOCOES b
              WHERE b.idItemOrcamento = a.idItemOrcamento)))
        THEN 1
        ELSE 0
      END
    INTO v_rateioDescontofiltrarSemProm
    FROM DUAL;
    -- v_rateioDescontofiltrarAPrazo
    SELECT
      CASE
        WHEN COALESCE ((
          SELECT SUM (a.valorProdutoServicoBruto - a.valorDescontoItem + a.valorAcrescimoItem)
          FROM MOORCAMENTOXITENS a
          WHERE a.orcamento = p_cab_orcamento
          AND a.cancelado = 0
          AND a.precoSugestaoAPrazo <> a.precoSugestaoAVista
          AND a.usarPrecoAVista = 1
          AND (v_rateioDescontofiltrarSemProm = 0
            OR NOT(EXISTS(
              SELECT 1
              FROM MOORCAMENTOXPROMOCOES promo
              WHERE promo.idItemOrcamento = a.idItemOrcamento)))),0) > (
            CASE
              WHEN p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral
              THEN p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral
              ELSE 0
            END +
            CASE
              WHEN p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen
              THEN p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen
              ELSE 0
            END)
          AND EXISTS (
            SELECT 1
            FROM MOORCAMENTOXITENS a
            WHERE a.orcamento = p_cab_orcamento
            AND a.cancelado = 0
            AND (a.precoSugestaoAPrazo = a.precoSugestaoAVista
              OR a.usarPrecoAVista = 0)
            AND (v_rateioDescontofiltrarSemProm = 0
              OR NOT(EXISTS(
                SELECT 1
                FROM MOORCAMENTOXPROMOCOES promo
                WHERE promo.idItemOrcamento = a.idItemOrcamento))))
        THEN 1
        ELSE 0
      END
    INTO v_rateioDescontofiltrarAPrazo
    FROM DUAL;
  ELSE
    v_rateioDescontofiltrarSemProm := 0;
    v_rateioDescontofiltrarAPrazo  := 0;
  END IF;
  -- Bases Rateio
  SELECT
    COALESCE(MAX(CASE WHEN p_modDoc_habilitaControleEntr = 0 OR a.controleEntrega > 0 AND contr.habilitaFrete = 1 THEN 1 ELSE 0 END),0),
    COALESCE(SUM(a.valorProdutoServicoBruto - a.valorDescontoItem + a.valorAcrescimoItem),0),
    COALESCE(SUM(CASE WHEN p_modDoc_habilitaControleEntr = 0 OR a.controleEntrega > 0 AND contr.habilitaFrete = 1 THEN a.valorProdutoServicoBruto - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 THEN a.valorProdutoServicoBruto - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 AND (p_modDoc_habilitaControleEntr = 0 OR a.controleEntrega > 0 AND contr.habilitaFrete = 1) THEN a.valorProdutoServicoBruto - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN (v_rateioDescontofiltrarAPrazo = 0 OR a.precoSugestaoAPrazo = a.precoSugestaoAVista OR a.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MOORCAMENTOXPROMOCOES promo WHERE promo.idItemOrcamento = a.idItemOrcamento))) THEN a.valorProdutoServicoBruto - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0)
  INTO
    v_rateioFretePorControleEntr,
    v_valorBaseRateio,
    v_valorBaseRateioFrete,
    v_valorBaseRateioFinanceiro,
    v_valorBaseRateioFinancFrete,
    v_valorBaseRateioDesconto
  FROM MOORCAMENTOXITENS a
  JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = a.controleEntrega
  WHERE a.orcamento = p_cab_orcamento
  AND a.cancelado = 0;
  -- Efetua rateio
  FOR item IN c_item LOOP
    v_idItemOrcamentoUltimoItem    := item.idItemOrcamento;
    v_acrescimoUnitarioComposicao  := item.acrescimoUnitarioComposicao;
    v_precoUnitario                := item.precoUnitario;
    v_precoUnitarioConvertido      := item.precoUnitarioConvertido;
    v_valorProdutoServico          := item.valorProdutoServico;
    v_valorBasePagamento           := item.valorBasePagamento;
    v_valorFreteTotal              := item.valorFreteTotal;
    v_valorSeguroTotal             := item.valorSeguroTotal;
    v_valorDescontoTotal           := item.valorDescontoTotal;
    v_valorOutrasDespesasTotal     := item.valorOutrasDespesasTotal;
    v_valorAdicFreteMarinMerTotal  := item.valorAdicFreteMarinhaMerTotal;
    v_valorDespesasAduaneirasTotal := item.valorDespesasAduaneirasTotal;
    v_valorImpSomaPagamento        := item.valorImpostosSomaPagamento;
    v_valorImpDiminuiPagamento     := item.valorImpostosDiminuiPagamento;
    v_valorLiquidoItem             := item.valorLiquidoItem;
    IF CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFinancFrete ELSE v_valorBaseRateioFinanceiro END > 0 THEN
      IF item.geraFinanceiro = 1 AND (v_rateioFretePorControleEntr = 0 OR item.rateioFrete = 1) THEN
        v_idItemOrcamentoRateioFrete := item.idItemOrcamento;
        -- v_valorFreteGeral
        v_auxNumber :=
          CASE
            WHEN CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFinancFrete ELSE v_valorBaseRateioFinanceiro END = 0
            THEN 0
            ELSE p_cab_valorFreteGeral
              * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
              / CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFinancFrete ELSE v_valorBaseRateioFinanceiro END
              + v_residuoFreteGeral
          END;
        v_valorFreteGeral    := ROUND (v_auxNumber,2);
        v_residuoFreteGeral  := v_auxNumber - v_valorFreteGeral;
        v_saldoRatFreteGeral := v_saldoRatFreteGeral - v_valorFreteGeral;
        -- v_valorSeguroGeral
        v_auxNumber :=
          CASE
            WHEN CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFinancFrete ELSE v_valorBaseRateioFinanceiro END = 0
            THEN 0
            ELSE p_cab_valorSeguroGeral
              * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
              / CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFinancFrete ELSE v_valorBaseRateioFinanceiro END
              + v_residuoSeguroGeral
          END;
        v_valorSeguroGeral    := ROUND (v_auxNumber,2);
        v_residuoSeguroGeral  := v_auxNumber - v_valorSeguroGeral;
        v_saldoRatSeguroGeral := v_saldoRatSeguroGeral - v_valorSeguroGeral;
      ELSE
        v_valorFreteGeral  := 0;
        v_valorSeguroGeral := 0;
      END IF;
    ELSE
      IF v_rateioFretePorControleEntr = 0 OR item.rateioFrete = 1 THEN
        v_idItemOrcamentoRateioFrete := item.idItemOrcamento;
        -- v_valorFreteGeral
        v_auxNumber :=
          CASE
            WHEN CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFrete ELSE v_valorBaseRateio END = 0
            THEN 0
            ELSE p_cab_valorFreteGeral
              * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
              / CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFrete ELSE v_valorBaseRateio END
              + v_residuoFreteGeral
          END;
        v_valorFreteGeral    := ROUND (v_auxNumber,2);
        v_residuoFreteGeral  := v_auxNumber - v_valorFreteGeral;
        v_saldoRatFreteGeral := v_saldoRatFreteGeral - v_valorFreteGeral;
        -- v_valorSeguroGeral
        v_auxNumber :=
          CASE
            WHEN CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFrete ELSE v_valorBaseRateio END = 0
            THEN 0
            ELSE p_cab_valorSeguroGeral
              * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
              / CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFrete ELSE v_valorBaseRateio END
              + v_residuoSeguroGeral
          END;
        v_valorSeguroGeral    := ROUND (v_auxNumber,2);
        v_residuoSeguroGeral  := v_auxNumber - v_valorSeguroGeral;
        v_saldoRatSeguroGeral := v_saldoRatSeguroGeral - v_valorSeguroGeral;
      ELSE
        v_valorFreteGeral := 0;
        v_valorSeguroGeral := 0;
      END IF;
    END IF;
    IF v_valorBaseRateioFinanceiro > 0 THEN
      IF item.geraFinanceiro = 1 THEN
        -- v_valorAdicFreteMarinMerGeral
        v_auxNumber :=
          p_cab_valorAdicFreteMarinGeral
          * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioFinanceiro
          + v_residuoAdicFreteMarinGeral;
        v_valorAdicFreteMarinMerGeral := ROUND (v_auxNumber,2);
        v_residuoAdicFreteMarinGeral  := v_auxNumber - v_valorAdicFreteMarinMerGeral;
        v_saldoRatAdicFreteMarinGeral := v_saldoRatAdicFreteMarinGeral - v_valorAdicFreteMarinMerGeral;
        -- v_valorDespesasAduaneirasGeral
        v_auxNumber :=
          p_cab_valorDespesasAduanGeral
          * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioFinanceiro
          + v_residuoDespesasAduanGeral;
        v_valorDespesasAduaneirasGeral := ROUND (v_auxNumber,2);
        v_residuoDespesasAduanGeral    := v_auxNumber - v_valorDespesasAduaneirasGeral;
        v_saldoRatDespesasAduanGeral   := v_saldoRatDespesasAduanGeral - v_valorDespesasAduaneirasGeral;
        -- v_valorOutrasDespesasGeral
        v_auxNumber :=
          p_cab_valorOutrasDespesasGeral
          * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioFinanceiro
          + v_residuoOutrasDespesasGeral;
        v_valorOutrasDespesasGeral    := ROUND (v_auxNumber,2);
        v_residuoOutrasDespesasGeral  := v_auxNumber - v_valorOutrasDespesasGeral;
        v_saldoRatOutrasDespesasGeral := v_saldoRatOutrasDespesasGeral - v_valorOutrasDespesasGeral;
        -- v_valorOutrasDespesasPagamento
        v_auxNumber :=
          p_cab_valorOutrasDespPagamento
          * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioFinanceiro
          + v_residuoOutrasDespPagamento;
        v_valorOutrasDespesasPagamento := ROUND (v_auxNumber,2);
        v_residuoOutrasDespPagamento   := v_auxNumber - v_valorOutrasDespesasPagamento;
        v_saldoRatOutrasDespPagamento  := v_saldoRatOutrasDespPagamento - v_valorOutrasDespesasPagamento;
        -- v_valorJurosPagamento
        v_auxNumber :=
          p_cab_valorJurosPagamento
          * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioFinanceiro
          + v_residuoJurosPagamento;
        v_valorJurosPagamento    := ROUND (v_auxNumber,2);
        v_residuoJurosPagamento  := v_auxNumber - v_valorJurosPagamento;
        v_saldoRatJurosPagamento := v_saldoRatJurosPagamento - v_valorJurosPagamento;
      ELSE
        v_valorAdicFreteMarinMerGeral  := 0;
        v_valorDespesasAduaneirasGeral := 0;
        v_valorOutrasDespesasGeral     := 0;
        v_valorOutrasDespesasPagamento := 0;
        v_valorJurosPagamento          := 0;
      END IF;
    ELSIF v_valorBaseRateio > 0 THEN
      -- v_valorAdicFreteMarinMerGeral
      v_auxNumber :=
        p_cab_valorAdicFreteMarinGeral
        * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
        / v_valorBaseRateio
        + v_residuoAdicFreteMarinGeral;
      v_valorAdicFreteMarinMerGeral := ROUND (v_auxNumber,2);
      v_residuoAdicFreteMarinGeral  := v_auxNumber - v_valorAdicFreteMarinMerGeral;
      v_saldoRatAdicFreteMarinGeral := v_saldoRatAdicFreteMarinGeral - v_valorAdicFreteMarinMerGeral;
      -- v_valorDespesasAduaneirasGeral
      v_auxNumber :=
        p_cab_valorDespesasAduanGeral
        * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
        / v_valorBaseRateio
        + v_residuoDespesasAduanGeral;
      v_valorDespesasAduaneirasGeral := ROUND (v_auxNumber,2);
      v_residuoDespesasAduanGeral    := v_auxNumber - v_valorDespesasAduaneirasGeral;
      v_saldoRatDespesasAduanGeral   := v_saldoRatDespesasAduanGeral - v_valorDespesasAduaneirasGeral;
      -- v_valorOutrasDespesasGeral
      v_auxNumber :=
        p_cab_valorOutrasDespesasGeral
        * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
        / v_valorBaseRateio
        + v_residuoOutrasDespesasGeral;
      v_valorOutrasDespesasGeral    := ROUND (v_auxNumber,2);
      v_residuoOutrasDespesasGeral  := v_auxNumber - v_valorOutrasDespesasGeral;
      v_saldoRatOutrasDespesasGeral := v_saldoRatOutrasDespesasGeral - v_valorOutrasDespesasGeral;
      -- v_valorOutrasDespesasPagamento
      v_auxNumber :=
        p_cab_valorOutrasDespPagamento
        * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
        / v_valorBaseRateio
        + v_residuoOutrasDespPagamento;
      v_valorOutrasDespesasPagamento := ROUND (v_auxNumber,2);
      v_residuoOutrasDespPagamento   := v_auxNumber - v_valorOutrasDespesasPagamento;
      v_saldoRatOutrasDespPagamento  := v_saldoRatOutrasDespPagamento - v_valorOutrasDespesasPagamento;
      -- v_valorJurosPagamento
      v_auxNumber :=
        p_cab_valorJurosPagamento
        * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
        / v_valorBaseRateio
        + v_residuoJurosPagamento;
      v_valorJurosPagamento    := ROUND (v_auxNumber,2);
      v_residuoJurosPagamento  := v_auxNumber - v_valorJurosPagamento;
      v_saldoRatJurosPagamento := v_saldoRatJurosPagamento - v_valorJurosPagamento;
    ELSE
      v_valorAdicFreteMarinMerGeral  := 0;
      v_valorDespesasAduaneirasGeral := 0;
      v_valorOutrasDespesasGeral     := 0;
      v_valorOutrasDespesasPagamento := 0;
      v_valorJurosPagamento          := 0;
    END IF;
    -- v_valorDescontoGeral
    v_auxNumber :=
      CASE
        WHEN v_valorBaseRateioDesconto = 0
          OR p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral <= 0
          OR v_rateioDescontofiltrarAPrazo = 1 AND item.aVista = 1
          OR v_rateioDescontofiltrarSemProm = 1 AND item.promocao = 1
        THEN 0
        ELSE (p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral)
          * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioDesconto
      END
      + CASE
          WHEN p_cab_valorDescontoGeral = 0 OR v_valorDescontoPromocaoGeral = 0 OR item.valorDescontoPromocaoGeral = 0
          THEN 0
          WHEN p_cab_valorDescontoGeral < v_valorDescontoPromocaoGeral
          THEN item.valorDescontoPromocaoGeral * p_cab_valorDescontoGeral / v_valorDescontoPromocaoGeral
          ELSE item.valorDescontoPromocaoGeral
        END
      + v_residuoDescontoGeral;
    IF ROUND (v_auxNumber,2) >= v_saldoRatDescontoGeral THEN
      v_valorDescontoGeral := v_saldoRatDescontoGeral;
      v_residuoDescontoGeral := 0;
    ELSE
      v_valorDescontoGeral := ROUND (v_auxNumber,2);
      v_residuoDescontoGeral := v_auxNumber - v_valorDescontoGeral;
    END IF;
    v_saldoRatDescontoGeral := v_saldoRatDescontoGeral - v_valorDescontoGeral;
    -- v_valorDescontoPagamento
    v_auxNumber :=
      CASE
        WHEN v_valorBaseRateioDesconto = 0
          OR p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen <= 0
          OR v_rateioDescontofiltrarAPrazo = 1 AND item.aVista = 1
          OR v_rateioDescontofiltrarSemProm = 1 AND item.promocao = 1
        THEN 0
        ELSE (p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen)
          * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioDesconto
      END
      + CASE
          WHEN p_cab_valorDescontoPagamento = 0 OR v_valorDescontoPromocaoPagamen = 0 OR item.valorDescontoPromocaoPagamento = 0
          THEN 0
          WHEN p_cab_valorDescontoPagamento < v_valorDescontoPromocaoPagamen
          THEN item.valorDescontoPromocaoPagamento * p_cab_valorDescontoPagamento / v_valorDescontoPromocaoPagamen
          ELSE item.valorDescontoPromocaoPagamento
        END
      + v_residuoDescontoPagamento;
    IF ROUND (v_auxNumber,2) >= v_saldoRatDescontoPagamento THEN
      v_valorDescontoPagamento := v_saldoRatDescontoPagamento;
      v_residuoDescontoPagamento := 0;
    ELSE
      v_valorDescontoPagamento := ROUND (v_auxNumber,2);
      v_residuoDescontoPagamento := v_auxNumber - v_valorDescontoPagamento;
    END IF;
    v_saldoRatDescontoPagamento := v_saldoRatDescontoPagamento - v_valorDescontoPagamento;
    -- Recalcula Valores
    ADD_CALCULA_TOTAIS_ITEM(
      ' ',
      ' ',
      0,
      0,
      0,
      0,
      'O',
      p_cab_entradaSaida,
      0,
      p_a_cab_tipoPagamentoFrete,
      p_cab_tipoPagamentoFrete,
      p_cab_impostosEditados,
      p_modDoc_diminuiDescontoPrUnit,
      p_modDoc_somaAcrescimosPrUnit,
      p_modDoc_somaFreteSeguroPrUnit,
      item.idItemOrcamento,
      item.quantidade,
      item.quantidadeConvertida,
      item.precoUnitarioBruto,
      v_precoUnitario,
      item.valorProdutoServicoBruto,
      v_valorProdutoServico,
      item.valorDescontoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      v_valorFreteGeral,
      v_valorSeguroGeral,
      v_valorDescontoGeral,
      v_valorOutrasDespesasGeral,
      v_valorAdicFreteMarinMerGeral,
      v_valorDespesasAduaneirasGeral,
      v_valorDescontoPagamento,
      v_valorOutrasDespesasPagamento,
      v_valorJurosPagamento,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal,
      0,
      0,
      0,
      0,
      r_calcularImpostosItem,
      /* Retornos */
      v_acrescimoUnitarioComposicao,
      v_auxNumber,
      v_precoUnitario,
      v_auxNumber,
      v_precoUnitarioConvertido,
      v_auxNumber,
      v_valorProdutoServico,
      v_auxNumber,
      v_auxNumber,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal,
      v_auxNumber,
      v_auxNumber,
      r_calcularImpostosItem);
    ADD_CALCULA_VALOR_LIQUIDO (
      0,
      p_cab_tipoPagamentoFrete,
      item.geraFinanceiro,
      v_valorProdutoServico,
      v_valorDescontoPagamento,
      v_valorOutrasDespesasPagamento,
      v_valorJurosPagamento,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      item.valorIRRF,
      item.valorINSS,
      item.valorRetPIS,
      item.valorRetCOFINS,
      item.valorRetCSLL,
      item.valorII,
      item.valorIOF,
      item.valorIPI,
      0,
      item.valorICMSST,
      0,
      0,
      0,
      /* Retornos */
      v_valorBasePagamento,
      v_valorImpSomaPagamento,
      v_valorImpDiminuiPagamento,
      v_valorLiquidoItem);
    -- Atualiza Item
    UPDATE MOORCAMENTOXITENS SET
      acrescimoUnitarioComposicao   = v_acrescimoUnitarioComposicao,
      precoUnitario                 = v_precoUnitario,
      precoUnitarioConvertido       = v_precoUnitarioConvertido,
      valorProdutoServico           = v_valorProdutoServico,
      valorFreteGeral               = v_valorFreteGeral,
      valorSeguroGeral              = v_valorSeguroGeral,
      valorDescontoGeral            = v_valorDescontoGeral,
      valorOutrasDespesasGeral      = v_valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral = v_valorAdicFreteMarinMerGeral,
      valorDespesasAduaneirasGeral  = v_valorDespesasAduaneirasGeral,
      valorBasePagamento            = v_valorBasePagamento,
      valorDescontoPagamento        = v_valorDescontoPagamento,
      valorOutrasDespesasPagamento  = v_valorOutrasDespesasPagamento,
      valorJurosPagamento           = v_valorJurosPagamento,
      valorFreteTotal               = v_valorFreteTotal,
      valorSeguroTotal              = v_valorSeguroTotal,
      valorDescontoTotal            = v_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
      valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
      valorImpostosSomaPagamento    = v_valorImpSomaPagamento,
      valorImpostosDiminuiPagamento = v_valorImpDiminuiPagamento,
      valorLiquidoItem              = v_valorLiquidoItem
    WHERE idItemOrcamento           = item.idItemOrcamento;
    -- Totaliza cabeçalho
    IF item.servico = 1 THEN
      r_cab_valorServicos            := r_cab_valorServicos + v_valorProdutoServico;
    ELSE
      r_cab_valorProdutos            := r_cab_valorProdutos + v_valorProdutoServico;
    END IF;
    r_cab_valorBasePagamento       := r_cab_valorBasePagamento + v_valorBasePagamento;
    IF item.usarPrecoAVista = 1 AND item.geraFinanceiro = 1 THEN
      r_cab_valorAVistaMinimo        := r_cab_valorAVistaMinimo + v_valorProdutoServico + v_valorDescontoPagamento - v_valorOutrasDespesasPagamento - v_valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
    END IF;
    r_cab_valorFreteTotal          := r_cab_valorFreteTotal + v_valorFreteTotal;
    r_cab_valorSeguroTotal         := r_cab_valorSeguroTotal + v_valorSeguroTotal;
    r_cab_valorDescontoTotal       := r_cab_valorDescontoTotal + v_valorDescontoTotal;
    r_cab_valorOutrasDespesasTotal := r_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
    r_cab_valorAdicFreteMarinTotal := r_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
    r_cab_valorDespesasAduanTotal  := r_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
    r_cab_valorImpSomaPagamento    := r_cab_valorImpSomaPagamento + v_valorImpSomaPagamento;
    r_cab_valorImpDiminuiPagamento := r_cab_valorImpDiminuiPagamento + v_valorImpDiminuiPagamento;
    r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem + v_valorLiquidoItem;
  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
    ADD_ORCAMENTO_CALC_IMP_RESIDUO (
      p_cab_modeloDocumento,
      p_cab_entradaSaida,
      p_cab_atualizaCustoMedio,
      p_a_cab_tipoPagamentoFrete,
      p_cab_tipoPagamentoFrete,
      r_cab_valorProdutos,
      r_cab_valorServicos,
      r_cab_valorBasePagamento,
      r_cab_valorAVistaMinimo,
      r_cab_valorFreteTotal,
      r_cab_valorSeguroTotal,
      r_cab_valorDescontoTotal,
      r_cab_valorOutrasDespesasTotal,
      r_cab_valorAdicFreteMarinTotal,
      r_cab_valorDespesasAduanTotal,
      p_cab_impostosEditados,
      r_cab_valorImpSomaPagamento,
      r_cab_valorImpDiminuiPagamento,
      r_cab_valorLiquidoItem,
      p_modDoc_diminuiDescontoPrUnit,
      p_modDoc_somaAcrescimosPrUnit,
      p_modDoc_somaFreteSeguroPrUnit,
      CASE WHEN v_idItemOrcamentoRateioFrete = 0 THEN v_idItemOrcamentoUltimoItem ELSE v_idItemOrcamentoRateioFrete END,
      v_saldoRatFreteGeral,
      v_saldoRatSeguroGeral,
      v_saldoRatDescontoGeral,
      v_saldoRatOutrasDespesasGeral,
      v_saldoRatAdicFreteMarinGeral,
      v_saldoRatDespesasAduanGeral,
      v_saldoRatDescontoPagamento,
      v_saldoRatOutrasDespPagamento,
      v_saldoRatJurosPagamento,
      r_calcularImpostosItem,
      /* Retornos */
      r_cab_valorProdutos,
      r_cab_valorServicos,
      r_cab_valorBasePagamento,
      r_cab_valorAVistaMinimo,
      r_cab_valorFreteTotal,
      r_cab_valorSeguroTotal,
      r_cab_valorDescontoTotal,
      r_cab_valorOutrasDespesasTotal,
      r_cab_valorAdicFreteMarinTotal,
      r_cab_valorDespesasAduanTotal,
      r_cab_valorImpSomaPagamento,
      r_cab_valorImpDiminuiPagamento,
      r_cab_valorLiquidoItem,
      r_calcularImpostosItem);
  END IF;
END ADD_ORCAMENTO_CALC_IMP_RATEIO;

/

create or replace PROCEDURE ADD_PRE_DOC_CALC_IMP_RATEIO (
    p_cab_preDocumento             IN NUMBER,
    p_cab_modeloDocumento          IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_devolucaoAnulacaoRetorno IN NUMBER,
    p_cab_atualizaCustoMedio       IN NUMBER,
    p_a_cab_tipoPagamentoFrete     IN CHAR,
    p_cab_tipoPagamentoFrete       IN CHAR,
    p_cab_valorFreteGeral          IN NUMBER,
    p_cab_valorSeguroGeral         IN NUMBER,
    p_cab_valorDescontoGeral       IN NUMBER,
    p_cab_valorOutrasDespesasGeral IN NUMBER,
    p_cab_valorAdicFreteMarinGeral IN NUMBER,
    p_cab_valorDespesasAduanGeral  IN NUMBER,
    p_cab_valorDescontoPagamento   IN NUMBER,
    p_cab_valorOutrasDespPagamento IN NUMBER,
    p_cab_valorJurosPagamento      IN NUMBER,
    p_cab_impostosEditados         IN NUMBER,
    p_cab_valorDescCustoOpGeral    IN NUMBER,
    p_cab_valorAcrescCustoOpGeral  IN NUMBER,
    p_cab_valorAcrescExtempGeral   IN NUMBER,
    p_modDoc_diminuiDescontoPrUnit IN NUMBER,
    p_modDoc_somaAcrescimosPrUnit  IN NUMBER,
    p_modDoc_somaFreteSeguroPrUnit IN NUMBER,
    p_modDoc_habilitaControleEntr  IN NUMBER,
    /* Retornos */
    r_cab_valorProdutos            OUT NUMBER,
    r_cab_valorServicos            OUT NUMBER,
    r_cab_valorBasePagamento       OUT NUMBER,
    r_cab_valorAVistaMinimo        OUT NUMBER,
    r_cab_valorFreteTotal          OUT NUMBER,
    r_cab_valorSeguroTotal         OUT NUMBER,
    r_cab_valorDescontoTotal       OUT NUMBER,
    r_cab_valorOutrasDespesasTotal OUT NUMBER,
    r_cab_valorAdicFreteMarinTotal OUT NUMBER,
    r_cab_valorDespesasAduanTotal  OUT NUMBER,
    r_cab_valorImpSomaPagamento    OUT NUMBER,
    r_cab_valorImpDiminuiPagamento OUT NUMBER,
    r_cab_valorLiquidoItem         OUT NUMBER,
    r_cab_valorDescCustoOpTotal    OUT NUMBER,
    r_cab_valorAcrescCustoOpTotal  OUT NUMBER,
    r_cab_valorCustoOperacao       OUT NUMBER,
    r_cab_valorCMV                 OUT NUMBER,
    r_cab_valorAcrescExtempTotal   OUT NUMBER,
    r_calcularImpostosItem         OUT NUMBER)
IS
    v_auxNumber                    NUMBER;
    v_valorDescontoPromocaoGeral   NUMBER;
    v_valorDescontoPromocaoPagamen NUMBER;
    v_rateioDescontofiltrarSemProm NUMBER;
    v_rateioDescontofiltrarAPrazo  NUMBER;
    v_rateioFretePorControleEntr   NUMBER;
    v_valorBaseRateio              NUMBER;
    v_valorBaseRateioFrete         NUMBER;
    v_valorBaseRateioFinanceiro    NUMBER;
    v_valorBaseRateioFinancFrete   NUMBER;
    v_valorBaseRateioDesconto      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_acrescimoUnitarioComposicao  NUMBER;
    v_precoUnitario                NUMBER;
    v_precoUnitarioConvertido      NUMBER;
    v_valorProdutoServico          NUMBER;
    v_valorFreteGeral              NUMBER;
    v_valorSeguroGeral             NUMBER;
    v_valorDescontoGeral           NUMBER;
    v_valorOutrasDespesasGeral     NUMBER;
    v_valorAdicFreteMarinMerGeral  NUMBER;
    v_valorDespesasAduaneirasGeral NUMBER;
    v_valorBasePagamento           NUMBER;
    v_valorDescontoPagamento       NUMBER;
    v_valorOutrasDespesasPagamento NUMBER;
    v_valorJurosPagamento          NUMBER;
    v_valorFreteTotal              NUMBER;
    v_valorSeguroTotal             NUMBER;
    v_valorDescontoTotal           NUMBER;
    v_valorOutrasDespesasTotal     NUMBER;
    v_valorAdicFreteMarinMerTotal  NUMBER;
    v_valorDespesasAduaneirasTotal NUMBER;
    v_valorImpSomaPagamento        NUMBER;
    v_valorImpDiminuiPagamento     NUMBER;
    v_valorLiquidoItem             NUMBER;
    v_valorDescontoCustoOpGeral    NUMBER;
    v_valorDescontoCustoOpTotal    NUMBER;
    v_valorAcrescimoCustoOpGeral   NUMBER;
    v_valorAcrescimoCustoOpTotal   NUMBER;
    v_precoCustoOperacao           NUMBER;
    v_valorCustoOperacao           NUMBER;
    v_precoCMV                     NUMBER;
    v_valorCMV                     NUMBER;
    v_valorAcrescimoExtempSubtotal NUMBER;
    v_valorAcrescimoExtempGeral    NUMBER;
    v_valorAcrescimoExtempTotal    NUMBER;
    v_calculoImpostosPendenteItem  NUMBER;
    CURSOR c_item IS
      SELECT
        a.idItemPreDocumento,
        a.servico,
        a.geraFinanceiro,
        a.quantidade,
        a.quantidadeConvertida,
        a.usarPrecoAVista,
        a.precoUnitarioBruto,
        a.acrescimoUnitarioComposicao,
        a.precoUnitario,
        a.precoUnitarioConvertido,
        a.valorProdutoServicoBruto,
        a.valorProdutoServico,
        a.valorDescontoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorBasePagamento,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.valorFreteTotal,
        a.valorSeguroTotal,
        a.valorDescontoTotal,
        a.valorOutrasDespesasTotal,
        a.valorAdicFreteMarinhaMerTotal,
        a.valorDespesasAduaneirasTotal,
        a.valorIRRF,
        a.valorINSS,
        a.valorRetPIS,
        a.valorRetCOFINS,
        a.valorRetCSLL,
        a.valorII,
        a.valorIOF,
        a.valorIPI,
        a.valorIPIDevolucao,
        a.valorPIS,
        a.valorPISST,
        a.valorCOFINS,
        a.valorCOFINSST,
        a.valorCreditoSimplesNacional,
        a.valorICMS,
        a.valorICMSST,
        a.valorImpostosSomaPagamento,
        a.valorImpostosDiminuiPagamento,
        a.valorLiquidoItem,
        a.valorDescontoCustoOpItem,
        a.valorDescontoCustoOpGeral,
        a.valorDescontoCustoOpTotal,
        a.valorAcrescimoCustoOpItem,
        a.valorAcrescimoCustoOpGeral,
        a.valorAcrescimoCustoOpTotal,
        a.precoCustoOperacao,
        a.valorCustoOperacao,
        a.precoCMV,
        a.valorCMV,
        a.quantidadeExtemporanea,
        a.acrescimoUnitarioExtemporaneo,
        a.valorAcrescimoExtempSubtotal,
        a.valorAcrescimoExtempItem,
        a.valorAcrescimoExtempGeral,
        a.valorAcrescimoExtempTotal,
        CASE WHEN p_modDoc_habilitaControleEntr = 0 OR EXISTS(SELECT 1 FROM MOPREDOCUMXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemPreDocumento = a.idItemPreDocumento AND contr.habilitaFrete = 1) THEN 1 ELSE 0 END rateioFrete,
        CASE WHEN a.precoSugestaoAPrazo <> a.precoSugestaoAVista AND a.usarPrecoAVista = 1 THEN 1 ELSE 0 END aVista,
        CASE WHEN EXISTS(SELECT 1 FROM MOPREDOCUMXPROMOCOES promo WHERE promo.idItemPreDocumento = a.idItemPreDocumento) THEN 1 ELSE 0 END promocao,
        COALESCE((SELECT SUM(promo.valorDesconto) FROM MOPREDOCUMXPROMOCOES promo WHERE promo.idItemPreDocumento = a.idItemPreDocumento AND promo.cabecalhoItemPagamento ='C'),0) valorDescontoPromocaoGeral,
        COALESCE((SELECT SUM(promo.valorDesconto) FROM MOPREDOCUMXPROMOCOES promo WHERE promo.idItemPreDocumento = a.idItemPreDocumento AND promo.cabecalhoItemPagamento ='P'),0) valorDescontoPromocaoPagamento
      FROM MOPREDOCUMXITENS a
      WHERE a.preDocumento = p_cab_preDocumento
      AND a.cancelado = 0
      ORDER BY a.sequencia;
BEGIN
  r_cab_valorProdutos            := 0;
  r_cab_valorServicos            := 0;
  r_cab_valorBasePagamento       := 0;
  r_cab_valorAVistaMinimo        := 0;
  r_cab_valorFreteTotal          := 0;
  r_cab_valorSeguroTotal         := 0;
  r_cab_valorDescontoTotal       := 0;
  r_cab_valorOutrasDespesasTotal := 0;
  r_cab_valorAdicFreteMarinTotal := 0;
  r_cab_valorDespesasAduanTotal  := 0;
  r_cab_valorImpSomaPagamento    := 0;
  r_cab_valorImpDiminuiPagamento := 0;
  r_cab_valorLiquidoItem         := 0;
  r_cab_valorDescCustoOpTotal    := 0;
  r_cab_valorAcrescCustoOpTotal  := 0;
  r_cab_valorCustoOperacao       := 0;
  r_cab_valorCMV                 := 0;
  r_cab_valorAcrescExtempTotal   := 0;
  r_calcularImpostosItem         := 0;
  v_saldoRatFreteGeral           := p_cab_valorFreteGeral;
  v_saldoRatSeguroGeral          := p_cab_valorSeguroGeral;
  v_saldoRatDescontoGeral        := p_cab_valorDescontoGeral;
  v_saldoRatOutrasDespesasGeral  := p_cab_valorOutrasDespesasGeral;
  v_saldoRatAdicFreteMarinGeral  := p_cab_valorAdicFreteMarinGeral;
  v_saldoRatDespesasAduanGeral   := p_cab_valorDespesasAduanGeral;
  v_saldoRatDescontoPagamento    := p_cab_valorDescontoPagamento;
  v_saldoRatOutrasDespPagamento  := p_cab_valorOutrasDespPagamento;
  v_saldoRatJurosPagamento       := p_cab_valorJurosPagamento;
  v_saldoRatDescCustoOpGeral     := p_cab_valorDescCustoOpGeral;
  v_saldoRatAcrescCustoOpGeral   := p_cab_valorAcrescCustoOpGeral;
  v_saldoRatAcrescExtempGeral    := p_cab_valorAcrescExtempGeral;
  v_residuoFreteGeral            := 0;
  v_residuoSeguroGeral           := 0;
  v_residuoDescontoGeral         := 0;
  v_residuoOutrasDespesasGeral   := 0;
  v_residuoAdicFreteMarinGeral   := 0;
  v_residuoDespesasAduanGeral    := 0;
  v_residuoDescontoPagamento     := 0;
  v_residuoOutrasDespPagamento   := 0;
  v_residuoJurosPagamento        := 0;
  v_residuoDescCustoOpGeral      := 0;
  v_residuoAcrescCustoOpGeral    := 0;
  v_residuoAcrescExtempGeral     := 0;
  v_idItemPreDocUltimoItem       := 0;
  v_idItemPreDocRateioFrete      := 0;
  -- v_valorDescontoPromocaoGeral
  IF p_cab_valorDescontoGeral > 0 THEN
    SELECT COALESCE(SUM(promo.valorDesconto),0)
    INTO v_valorDescontoPromocaoGeral
    FROM MOPREDOCUMXITENS a
    JOIN MOPREDOCUMXPROMOCOES promo ON promo.idItemPreDocumento = a.idItemPreDocumento
    WHERE a.preDocumento = p_cab_preDocumento
    AND a.cancelado = 0
    AND promo.cabecalhoItemPagamento ='C';
  ELSE
    v_valorDescontoPromocaoGeral := 0;
  END IF;
  -- v_valorDescontoPromocaoPagamen
  IF p_cab_valorDescontoPagamento > 0 THEN
    SELECT COALESCE(SUM(promo.valorDesconto),0)
    INTO v_valorDescontoPromocaoPagamen
    FROM MOPREDOCUMXITENS a
    JOIN MOPREDOCUMXPROMOCOES promo ON promo.idItemPreDocumento = a.idItemPreDocumento
    WHERE a.preDocumento = p_cab_preDocumento
    AND a.cancelado = 0
    AND promo.cabecalhoItemPagamento ='P';
  ELSE
    v_valorDescontoPromocaoPagamen := 0;
  END IF;
  IF p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral OR p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen THEN
    -- v_rateioDescontofiltrarSemProm
    SELECT
      CASE
        WHEN COALESCE ((
          SELECT SUM (a.valorProdutoServicoBruto - a.valorDescontoItem + a.valorAcrescimoItem)
          FROM MOPREDOCUMXITENS a
          JOIN MOPREDOCUMXPROMOCOES b ON b.idItemPreDocumento = a.idItemPreDocumento
          WHERE a.preDocumento = p_cab_preDocumento
          AND a.cancelado = 0),0) > (
            CASE
              WHEN p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral
              THEN p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral
              ELSE 0
            END +
            CASE
              WHEN p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen
              THEN p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen
              ELSE 0
            END)
          AND EXISTS (
            SELECT 1
            FROM MOPREDOCUMXITENS a
            WHERE a.preDocumento = p_cab_preDocumento
            AND a.cancelado = 0
            AND NOT (EXISTS(
              SELECT 1
              FROM MOPREDOCUMXPROMOCOES b
              WHERE b.idItemPreDocumento = a.idItemPreDocumento)))
        THEN 1
        ELSE 0
      END
    INTO v_rateioDescontofiltrarSemProm
    FROM DUAL;
    -- v_rateioDescontofiltrarAPrazo
    SELECT
      CASE
        WHEN COALESCE ((
          SELECT SUM (a.valorProdutoServicoBruto - a.valorDescontoItem + a.valorAcrescimoItem)
          FROM MOPREDOCUMXITENS a
          WHERE a.preDocumento = p_cab_preDocumento
          AND a.cancelado = 0
          AND a.precoSugestaoAPrazo <> a.precoSugestaoAVista
          AND a.usarPrecoAVista = 1
          AND (v_rateioDescontofiltrarSemProm = 0
            OR NOT(EXISTS(
              SELECT 1
              FROM MOPREDOCUMXPROMOCOES promo
              WHERE promo.idItemPreDocumento = a.idItemPreDocumento)))),0) > (
            CASE
              WHEN p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral
              THEN p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral
              ELSE 0
            END +
            CASE
              WHEN p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen
              THEN p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen
              ELSE 0
            END)
          AND EXISTS (
            SELECT 1
            FROM MOPREDOCUMXITENS a
            WHERE a.preDocumento = p_cab_preDocumento
            AND a.cancelado = 0
            AND (a.precoSugestaoAPrazo = a.precoSugestaoAVista
              OR a.usarPrecoAVista = 0)
            AND (v_rateioDescontofiltrarSemProm = 0
              OR NOT(EXISTS(
                SELECT 1
                FROM MOPREDOCUMXPROMOCOES promo
                WHERE promo.idItemPreDocumento = a.idItemPreDocumento))))
        THEN 1
        ELSE 0
      END
    INTO v_rateioDescontofiltrarAPrazo
    FROM DUAL;
  ELSE
    v_rateioDescontofiltrarSemProm := 0;
    v_rateioDescontofiltrarAPrazo  := 0;
  END IF;
  -- Bases Rateio
  SELECT
    MAX(COALESCE((CASE WHEN p_modDoc_habilitaControleEntr = 0 OR EXISTS(SELECT 1 FROM MOPREDOCUMXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemPreDocumento = a.idItemPreDocumento AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1) THEN 1 ELSE 0 END),0)),
    COALESCE(SUM(a.valorProdutoServicoBruto - a.valorDescontoItem + a.valorAcrescimoItem),0),
    COALESCE(SUM(CASE WHEN p_modDoc_habilitaControleEntr = 0 OR EXISTS(SELECT 1 FROM MOPREDOCUMXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemPreDocumento = a.idItemPreDocumento AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1) THEN a.valorProdutoServicoBruto - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 THEN a.valorProdutoServicoBruto - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 AND (p_modDoc_habilitaControleEntr = 0 OR EXISTS(SELECT 1 FROM MOPREDOCUMXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemPreDocumento = a.idItemPreDocumento AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1)) THEN a.valorProdutoServicoBruto - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN (v_rateioDescontofiltrarAPrazo = 0 OR a.precoSugestaoAPrazo = a.precoSugestaoAVista OR a.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MOPREDOCUMXPROMOCOES promo WHERE promo.idItemPreDocumento = a.idItemPreDocumento))) THEN a.valorProdutoServicoBruto - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0)
  INTO
    v_rateioFretePorControleEntr,
    v_valorBaseRateio,
    v_valorBaseRateioFrete,
    v_valorBaseRateioFinanceiro,
    v_valorBaseRateioFinancFrete,
    v_valorBaseRateioDesconto
  FROM MOPREDOCUMXITENS a
  WHERE a.preDocumento = p_cab_preDocumento
  AND a.cancelado = 0;
  -- Efetua rateio
  FOR item IN c_item LOOP
    v_idItemPreDocUltimoItem       := item.idItemPreDocumento;
    v_acrescimoUnitarioComposicao  := item.acrescimoUnitarioComposicao;
    v_precoUnitario                := item.precoUnitario;
    v_precoUnitarioConvertido      := item.precoUnitarioConvertido;
    v_valorProdutoServico          := item.valorProdutoServico;
    v_valorBasePagamento           := item.valorBasePagamento;
    v_valorFreteTotal              := item.valorFreteTotal;
    v_valorSeguroTotal             := item.valorSeguroTotal;
    v_valorDescontoTotal           := item.valorDescontoTotal;
    v_valorOutrasDespesasTotal     := item.valorOutrasDespesasTotal;
    v_valorAdicFreteMarinMerTotal  := item.valorAdicFreteMarinhaMerTotal;
    v_valorDespesasAduaneirasTotal := item.valorDespesasAduaneirasTotal;
    v_valorImpSomaPagamento        := item.valorImpostosSomaPagamento;
    v_valorImpDiminuiPagamento     := item.valorImpostosDiminuiPagamento;
    v_valorLiquidoItem             := item.valorLiquidoItem;
    v_valorDescontoCustoOpTotal    := item.valorDescontoCustoOpTotal;
    v_valorAcrescimoCustoOpTotal   := item.valorAcrescimoCustoOpTotal;
    v_precoCustoOperacao           := item.precoCustoOperacao;
    v_valorCustoOperacao           := item.valorCustoOperacao;
    v_precoCMV                     := item.precoCMV;
    v_valorCMV                     := item.valorCMV;
    v_valorAcrescimoExtempSubtotal := item.valorAcrescimoExtempSubtotal;
    v_valorAcrescimoExtempTotal    := item.valorAcrescimoExtempTotal;
    IF CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFinancFrete ELSE v_valorBaseRateioFinanceiro END > 0 THEN
      IF item.geraFinanceiro = 1 AND (v_rateioFretePorControleEntr = 0 OR item.rateioFrete = 1) THEN
        v_idItemPreDocRateioFrete := item.idItemPreDocumento;
        -- v_valorFreteGeral
        v_auxNumber :=
          CASE
            WHEN CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFinancFrete ELSE v_valorBaseRateioFinanceiro END = 0
            THEN 0
            ELSE p_cab_valorFreteGeral
              * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
              / CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFinancFrete ELSE v_valorBaseRateioFinanceiro END
              + v_residuoFreteGeral
          END;
        v_valorFreteGeral := ROUND (v_auxNumber,2);
        v_residuoFreteGeral := v_auxNumber - v_valorFreteGeral;
        v_saldoRatFreteGeral := v_saldoRatFreteGeral - v_valorFreteGeral;
        -- v_valorSeguroGeral
        v_auxNumber :=
          CASE
            WHEN CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFinancFrete ELSE v_valorBaseRateioFinanceiro END = 0
            THEN 0
            ELSE p_cab_valorSeguroGeral
              * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
              / CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFinancFrete ELSE v_valorBaseRateioFinanceiro END
              + v_residuoSeguroGeral
          END;
        v_valorSeguroGeral := ROUND (v_auxNumber,2);
        v_residuoSeguroGeral := v_auxNumber - v_valorSeguroGeral;
        v_saldoRatSeguroGeral := v_saldoRatSeguroGeral - v_valorSeguroGeral;
      ELSE
        v_valorFreteGeral := 0;
        v_valorSeguroGeral := 0;
      END IF;
    ELSE
      IF v_rateioFretePorControleEntr = 0 OR item.rateioFrete = 1 THEN
        v_idItemPreDocRateioFrete := item.idItemPreDocumento;
        -- v_valorFreteGeral
        v_auxNumber :=
          CASE
            WHEN CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFrete ELSE v_valorBaseRateio END = 0
            THEN 0
            ELSE p_cab_valorFreteGeral
              * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
              / CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFrete ELSE v_valorBaseRateio END
              + v_residuoFreteGeral
          END;
        v_valorFreteGeral := ROUND (v_auxNumber,2);
        v_residuoFreteGeral := v_auxNumber - v_valorFreteGeral;
        v_saldoRatFreteGeral := v_saldoRatFreteGeral - v_valorFreteGeral;
        -- v_valorSeguroGeral
        v_auxNumber :=
          CASE
            WHEN CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFrete ELSE v_valorBaseRateio END = 0
            THEN 0
            ELSE p_cab_valorSeguroGeral
              * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
              / CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFrete ELSE v_valorBaseRateio END
              + v_residuoSeguroGeral
          END;
        v_valorSeguroGeral := ROUND (v_auxNumber,2);
        v_residuoSeguroGeral := v_auxNumber - v_valorSeguroGeral;
        v_saldoRatSeguroGeral := v_saldoRatSeguroGeral - v_valorSeguroGeral;
      ELSE
        v_valorFreteGeral := 0;
        v_valorSeguroGeral := 0;
      END IF;
    END IF;
    IF v_valorBaseRateioFinanceiro > 0 THEN
      IF item.geraFinanceiro = 1 THEN
        -- v_valorAdicFreteMarinMerGeral
        v_auxNumber :=
          p_cab_valorAdicFreteMarinGeral
          * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioFinanceiro
          + v_residuoAdicFreteMarinGeral;
        v_valorAdicFreteMarinMerGeral := ROUND (v_auxNumber,2);
        v_residuoAdicFreteMarinGeral := v_auxNumber - v_valorAdicFreteMarinMerGeral;
        v_saldoRatAdicFreteMarinGeral := v_saldoRatAdicFreteMarinGeral - v_valorAdicFreteMarinMerGeral;
        -- v_valorDespesasAduaneirasGeral
        v_auxNumber :=
          p_cab_valorDespesasAduanGeral
          * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioFinanceiro
          + v_residuoDespesasAduanGeral;
        v_valorDespesasAduaneirasGeral := ROUND (v_auxNumber,2);
        v_residuoDespesasAduanGeral := v_auxNumber - v_valorDespesasAduaneirasGeral;
        v_saldoRatDespesasAduanGeral := v_saldoRatDespesasAduanGeral - v_valorDespesasAduaneirasGeral;
        -- v_valorOutrasDespesasGeral
        v_auxNumber :=
          p_cab_valorOutrasDespesasGeral
          * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioFinanceiro
          + v_residuoOutrasDespesasGeral;
        v_valorOutrasDespesasGeral := ROUND (v_auxNumber,2);
        v_residuoOutrasDespesasGeral := v_auxNumber - v_valorOutrasDespesasGeral;
        v_saldoRatOutrasDespesasGeral := v_saldoRatOutrasDespesasGeral - v_valorOutrasDespesasGeral;
        -- v_valorOutrasDespesasPagamento
        v_auxNumber :=
          p_cab_valorOutrasDespPagamento
          * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioFinanceiro
          + v_residuoOutrasDespPagamento;
        v_valorOutrasDespesasPagamento := ROUND (v_auxNumber,2);
        v_residuoOutrasDespPagamento := v_auxNumber - v_valorOutrasDespesasPagamento;
        v_saldoRatOutrasDespPagamento := v_saldoRatOutrasDespPagamento - v_valorOutrasDespesasPagamento;
        -- v_valorJurosPagamento
        v_auxNumber :=
          p_cab_valorJurosPagamento
          * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioFinanceiro
          + v_residuoJurosPagamento;
        v_valorJurosPagamento := ROUND (v_auxNumber,2);
        v_residuoJurosPagamento := v_auxNumber - v_valorJurosPagamento;
        v_saldoRatJurosPagamento := v_saldoRatJurosPagamento - v_valorJurosPagamento;
        -- v_valorDescontoCustoOpGeral
        v_auxNumber :=
          p_cab_valorDescCustoOpGeral
          * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioFinanceiro
          + v_residuoDescCustoOpGeral;
        v_valorDescontoCustoOpGeral := ROUND (v_auxNumber,2);
        v_residuoDescCustoOpGeral := v_auxNumber - v_valorDescontoCustoOpGeral;
        v_saldoRatDescCustoOpGeral := v_saldoRatDescCustoOpGeral - v_valorDescontoCustoOpGeral;
        -- v_valorAcrescimoCustoOpGeral
        v_auxNumber :=
          p_cab_valorAcrescCustoOpGeral
          * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioFinanceiro
          + v_residuoAcrescCustoOpGeral;
        v_valorAcrescimoCustoOpGeral := ROUND (v_auxNumber,2);
        v_residuoAcrescCustoOpGeral := v_auxNumber - v_valorAcrescimoCustoOpGeral;
        v_saldoRatAcrescCustoOpGeral := v_saldoRatAcrescCustoOpGeral - v_valorAcrescimoCustoOpGeral;
        -- v_valorAcrescimoExtempGeral
        v_auxNumber :=
          p_cab_valorAcrescExtempGeral
          * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioFinanceiro
          + v_residuoAcrescExtempGeral;
        v_valorAcrescimoExtempGeral := ROUND (v_auxNumber,2);
        v_residuoAcrescExtempGeral := v_auxNumber - v_valorAcrescimoExtempGeral;
        v_saldoRatAcrescExtempGeral := v_saldoRatAcrescExtempGeral - v_valorAcrescimoExtempGeral;
      ELSE
        v_valorAdicFreteMarinMerGeral  := 0;
        v_valorDespesasAduaneirasGeral := 0;
        v_valorOutrasDespesasGeral     := 0;
        v_valorOutrasDespesasPagamento := 0;
        v_valorJurosPagamento          := 0;
        v_valorDescontoCustoOpGeral    := 0;
        v_valorAcrescimoCustoOpGeral   := 0;
        v_valorAcrescimoExtempGeral    := 0;
      END IF;
    ELSIF v_valorBaseRateio > 0 THEN
      -- v_valorAdicFreteMarinMerGeral
      v_auxNumber :=
        p_cab_valorAdicFreteMarinGeral
        * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
        / v_valorBaseRateio
        + v_residuoAdicFreteMarinGeral;
      v_valorAdicFreteMarinMerGeral := ROUND (v_auxNumber,2);
      v_residuoAdicFreteMarinGeral  := v_auxNumber - v_valorAdicFreteMarinMerGeral;
      v_saldoRatAdicFreteMarinGeral := v_saldoRatAdicFreteMarinGeral - v_valorAdicFreteMarinMerGeral;
      -- v_valorDespesasAduaneirasGeral
      v_auxNumber :=
        p_cab_valorDespesasAduanGeral
        * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
        / v_valorBaseRateio
        + v_residuoDespesasAduanGeral;
      v_valorDespesasAduaneirasGeral := ROUND (v_auxNumber,2);
      v_residuoDespesasAduanGeral    := v_auxNumber - v_valorDespesasAduaneirasGeral;
      v_saldoRatDespesasAduanGeral   := v_saldoRatDespesasAduanGeral - v_valorDespesasAduaneirasGeral;
      -- v_valorOutrasDespesasGeral
      v_auxNumber :=
        p_cab_valorOutrasDespesasGeral
        * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
        / v_valorBaseRateio
        + v_residuoOutrasDespesasGeral;
      v_valorOutrasDespesasGeral    := ROUND (v_auxNumber,2);
      v_residuoOutrasDespesasGeral  := v_auxNumber - v_valorOutrasDespesasGeral;
      v_saldoRatOutrasDespesasGeral := v_saldoRatOutrasDespesasGeral - v_valorOutrasDespesasGeral;
      -- v_valorOutrasDespesasPagamento
      v_auxNumber :=
        p_cab_valorOutrasDespPagamento
        * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
        / v_valorBaseRateio
        + v_residuoOutrasDespPagamento;
      v_valorOutrasDespesasPagamento := ROUND (v_auxNumber,2);
      v_residuoOutrasDespPagamento   := v_auxNumber - v_valorOutrasDespesasPagamento;
      v_saldoRatOutrasDespPagamento  := v_saldoRatOutrasDespPagamento - v_valorOutrasDespesasPagamento;
      -- v_valorJurosPagamento
      v_auxNumber :=
        p_cab_valorJurosPagamento
        * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
        / v_valorBaseRateio
        + v_residuoJurosPagamento;
      v_valorJurosPagamento    := ROUND (v_auxNumber,2);
      v_residuoJurosPagamento  := v_auxNumber - v_valorJurosPagamento;
      v_saldoRatJurosPagamento := v_saldoRatJurosPagamento - v_valorJurosPagamento;
      -- v_valorDescontoCustoOpGeral
      v_auxNumber :=
        p_cab_valorDescCustoOpGeral
        * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
        / v_valorBaseRateio
        + v_residuoDescCustoOpGeral;
      v_valorDescontoCustoOpGeral := ROUND (v_auxNumber,2);
      v_residuoDescCustoOpGeral   := v_auxNumber - v_valorDescontoCustoOpGeral;
      v_saldoRatDescCustoOpGeral  := v_saldoRatDescCustoOpGeral - v_valorDescontoCustoOpGeral;
      -- v_valorAcrescimoCustoOpGeral
      v_auxNumber :=
        p_cab_valorAcrescCustoOpGeral
        * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
        / v_valorBaseRateio
        + v_residuoAcrescCustoOpGeral;
      v_valorAcrescimoCustoOpGeral := ROUND (v_auxNumber,2);
      v_residuoAcrescCustoOpGeral  := v_auxNumber - v_valorAcrescimoCustoOpGeral;
      v_saldoRatAcrescCustoOpGeral := v_saldoRatAcrescCustoOpGeral - v_valorAcrescimoCustoOpGeral;
      -- v_valorAcrescimoExtempGeral
      v_auxNumber :=
        p_cab_valorAcrescExtempGeral
        * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
        / v_valorBaseRateio
        + v_residuoAcrescExtempGeral;
      v_valorAcrescimoExtempGeral := ROUND (v_auxNumber,2);
      v_residuoAcrescExtempGeral  := v_auxNumber - v_valorAcrescimoExtempGeral;
      v_saldoRatAcrescExtempGeral := v_saldoRatAcrescExtempGeral - v_valorAcrescimoExtempGeral;
    ELSE
      v_valorAdicFreteMarinMerGeral  := 0;
      v_valorDespesasAduaneirasGeral := 0;
      v_valorOutrasDespesasGeral     := 0;
      v_valorOutrasDespesasPagamento := 0;
      v_valorJurosPagamento          := 0;
      v_valorDescontoCustoOpGeral    := 0;
      v_valorAcrescimoCustoOpGeral   := 0;
      v_valorAcrescimoExtempGeral    := 0;
    END IF;
    -- v_valorDescontoGeral
    v_auxNumber :=
      CASE
        WHEN v_valorBaseRateioDesconto = 0
          OR p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral <= 0
          OR v_rateioDescontofiltrarAPrazo = 1 AND item.aVista = 1
          OR v_rateioDescontofiltrarSemProm = 1 AND item.promocao = 1
        THEN 0
        ELSE (p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral)
          * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioDesconto
      END
      + CASE
          WHEN p_cab_valorDescontoGeral = 0 OR v_valorDescontoPromocaoGeral = 0 OR item.valorDescontoPromocaoGeral = 0
          THEN 0
          WHEN p_cab_valorDescontoGeral < v_valorDescontoPromocaoGeral
          THEN item.valorDescontoPromocaoGeral * p_cab_valorDescontoGeral / v_valorDescontoPromocaoGeral
          ELSE item.valorDescontoPromocaoGeral
        END
      + v_residuoDescontoGeral;
    IF ROUND (v_auxNumber,2) >= v_saldoRatDescontoGeral THEN
      v_valorDescontoGeral := v_saldoRatDescontoGeral;
      v_residuoDescontoGeral := 0;
    ELSE
      v_valorDescontoGeral := ROUND (v_auxNumber,2);
      v_residuoDescontoGeral := v_auxNumber - v_valorDescontoGeral;
    END IF;
    v_saldoRatDescontoGeral := v_saldoRatDescontoGeral - v_valorDescontoGeral;
    -- v_valorDescontoPagamento
    v_auxNumber :=
      CASE
        WHEN v_valorBaseRateioDesconto = 0
          OR p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen <= 0
          OR v_rateioDescontofiltrarAPrazo = 1 AND item.aVista = 1
          OR v_rateioDescontofiltrarSemProm = 1 AND item.promocao = 1
        THEN 0
        ELSE (p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen)
          * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioDesconto
      END
      + CASE
          WHEN p_cab_valorDescontoPagamento = 0 OR v_valorDescontoPromocaoPagamen = 0 OR item.valorDescontoPromocaoPagamento = 0
          THEN 0
          WHEN p_cab_valorDescontoPagamento < v_valorDescontoPromocaoPagamen
          THEN item.valorDescontoPromocaoPagamento * p_cab_valorDescontoPagamento / v_valorDescontoPromocaoPagamen
          ELSE item.valorDescontoPromocaoPagamento
        END
      + v_residuoDescontoPagamento;
    IF ROUND (v_auxNumber,2) >= v_saldoRatDescontoPagamento THEN
      v_valorDescontoPagamento := v_saldoRatDescontoPagamento;
      v_residuoDescontoPagamento := 0;
    ELSE
      v_valorDescontoPagamento := ROUND (v_auxNumber,2);
      v_residuoDescontoPagamento := v_auxNumber - v_valorDescontoPagamento;
    END IF;
    v_saldoRatDescontoPagamento := v_saldoRatDescontoPagamento - v_valorDescontoPagamento;
    -- Recalcula Valores
    ADD_CALCULA_TOTAIS_ITEM(
      ' ',
      ' ',
      0,
      0,
      0,
      0,
      'P',
      p_cab_entradaSaida,
      p_cab_devolucaoAnulacaoRetorno,
      p_a_cab_tipoPagamentoFrete,
      p_cab_tipoPagamentoFrete,
      p_cab_impostosEditados,
      p_modDoc_diminuiDescontoPrUnit,
      p_modDoc_somaAcrescimosPrUnit,
      p_modDoc_somaFreteSeguroPrUnit,
      item.idItemPreDocumento,
      item.quantidade,
      item.quantidadeConvertida,
      item.precoUnitarioBruto,
      v_precoUnitario,
      item.valorProdutoServicoBruto,
      v_valorProdutoServico,
      item.valorDescontoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      v_valorFreteGeral,
      v_valorSeguroGeral,
      v_valorDescontoGeral,
      v_valorOutrasDespesasGeral,
      v_valorAdicFreteMarinMerGeral,
      v_valorDespesasAduaneirasGeral,
      v_valorDescontoPagamento,
      v_valorOutrasDespesasPagamento,
      v_valorJurosPagamento,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal,
      item.quantidadeExtemporanea,
      item.acrescimoUnitarioExtemporaneo,
      item.valorAcrescimoExtempItem,
      v_valorAcrescimoExtempGeral,
      r_calcularImpostosItem,
      /* Retornos */
      v_acrescimoUnitarioComposicao,
      v_auxNumber,
      v_precoUnitario,
      v_auxNumber,
      v_precoUnitarioConvertido,
      v_auxNumber,
      v_valorProdutoServico,
      v_auxNumber,
      v_auxNumber,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal,
      v_valorAcrescimoExtempSubtotal,
      v_valorAcrescimoExtempTotal,
      r_calcularImpostosItem);
    ADD_CALCULA_VALOR_LIQUIDO (
      0,
      p_cab_tipoPagamentoFrete,
      item.geraFinanceiro,
      v_valorProdutoServico,
      v_valorDescontoPagamento,
      v_valorOutrasDespesasPagamento,
      v_valorJurosPagamento,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      item.valorIRRF,
      item.valorINSS,
      item.valorRetPIS,
      item.valorRetCOFINS,
      item.valorRetCSLL,
      item.valorII,
      item.valorIOF,
      item.valorIPI,
      item.valorIPIDevolucao,
      item.valorICMSST,
      0,
      0,
      v_valorAcrescimoExtempTotal,
      /* Retornos */
      v_valorBasePagamento,
      v_valorImpSomaPagamento,
      v_valorImpDiminuiPagamento,
      v_valorLiquidoItem);
    ADD_CALCULA_CUSTO_CMV (
      p_cab_modeloDocumento,
      p_cab_atualizaCustoMedio,
      0,
      item.quantidade,
      item.valorII,
      item.valorIOF,
      item.valorIPI,
      item.valorIPIDevolucao,
      item.valorPIS,
      item.valorPISST,
      item.valorCOFINS,
      item.valorCOFINSST,
      item.valorCreditoSimplesNacional,
      item.valorICMS,
      item.valorICMSST,
      0,
      v_valorLiquidoItem,
      item.valorDescontoCustoOpItem,
      v_valorDescontoCustoOpGeral,
      item.valorAcrescimoCustoOpItem,
      v_valorAcrescimoCustoOpGeral,
      v_valorAcrescimoExtempTotal,
      /* Retornos */
      v_valorDescontoCustoOpTotal,
      v_valorAcrescimoCustoOpTotal,
      v_precoCustoOperacao,
      v_valorCustoOperacao,
      v_precoCMV,
      v_valorCMV);
    -- Atualiza Item
    UPDATE MOPREDOCUMXITENS SET
      acrescimoUnitarioComposicao   = v_acrescimoUnitarioComposicao,
      precoUnitario                 = v_precoUnitario,
      precoUnitarioConvertido       = v_precoUnitarioConvertido,
      valorProdutoServico           = v_valorProdutoServico,
      valorFreteGeral               = v_valorFreteGeral,
      valorSeguroGeral              = v_valorSeguroGeral,
      valorDescontoGeral            = v_valorDescontoGeral,
      valorOutrasDespesasGeral      = v_valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral = v_valorAdicFreteMarinMerGeral,
      valorDespesasAduaneirasGeral  = v_valorDespesasAduaneirasGeral,
      valorBasePagamento            = v_valorBasePagamento,
      valorDescontoPagamento        = v_valorDescontoPagamento,
      valorOutrasDespesasPagamento  = v_valorOutrasDespesasPagamento,
      valorJurosPagamento           = v_valorJurosPagamento,
      valorFreteTotal               = v_valorFreteTotal,
      valorSeguroTotal              = v_valorSeguroTotal,
      valorDescontoTotal            = v_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
      valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
      valorImpostosSomaPagamento    = v_valorImpSomaPagamento,
      valorImpostosDiminuiPagamento = v_valorImpDiminuiPagamento,
      valorLiquidoItem              = v_valorLiquidoItem,
      valorDescontoCustoOpGeral     = v_valorDescontoCustoOpGeral,
      valorDescontoCustoOpTotal     = v_valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpGeral    = v_valorAcrescimoCustoOpGeral,
      valorAcrescimoCustoOpTotal    = v_valorAcrescimoCustoOpTotal,
      precoCustoOperacao            = v_precoCustoOperacao,
      valorCustoOperacao            = v_valorCustoOperacao,
      precoCMV                      = v_precoCMV,
      valorCMV                      = v_valorCMV,
      valorAcrescimoExtempSubtotal  = v_valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempGeral     = v_valorAcrescimoExtempGeral,
      valorAcrescimoExtempTotal     = v_valorAcrescimoExtempTotal
    WHERE idItemPreDocumento        = item.idItemPreDocumento;
    IF item.servico = 1 THEN
      r_cab_valorServicos            := r_cab_valorServicos + v_valorProdutoServico;
    ELSE
      r_cab_valorProdutos            := r_cab_valorProdutos + v_valorProdutoServico;
    END IF;
    r_cab_valorBasePagamento       := r_cab_valorBasePagamento + v_valorBasePagamento;
    IF item.usarPrecoAVista = 1 AND item.geraFinanceiro = 1 THEN
      r_cab_valorAVistaMinimo        := r_cab_valorAVistaMinimo + v_valorProdutoServico + v_valorDescontoPagamento - v_valorOutrasDespesasPagamento - v_valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
    END IF;
    r_cab_valorFreteTotal          := r_cab_valorFreteTotal + v_valorFreteTotal;
    r_cab_valorSeguroTotal         := r_cab_valorSeguroTotal + v_valorSeguroTotal;
    r_cab_valorDescontoTotal       := r_cab_valorDescontoTotal + v_valorDescontoTotal;
    r_cab_valorOutrasDespesasTotal := r_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
    r_cab_valorAdicFreteMarinTotal := r_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
    r_cab_valorDespesasAduanTotal  := r_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
    r_cab_valorImpSomaPagamento    := r_cab_valorImpSomaPagamento + v_valorImpSomaPagamento;
    r_cab_valorImpDiminuiPagamento := r_cab_valorImpDiminuiPagamento + v_valorImpDiminuiPagamento;
    r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem + v_valorLiquidoItem;
    r_cab_valorDescCustoOpTotal    := r_cab_valorDescCustoOpTotal + v_valorDescontoCustoOpTotal;
    r_cab_valorAcrescCustoOpTotal  := r_cab_valorAcrescCustoOpTotal + v_valorAcrescimoCustoOpTotal;
    r_cab_valorCustoOperacao       := r_cab_valorCustoOperacao + v_valorCustoOperacao;
    r_cab_valorCMV                 := r_cab_valorCMV + v_valorCMV;
    r_cab_valorAcrescExtempTotal   := r_cab_valorAcrescExtempTotal + v_valorAcrescimoExtempTotal;
  END LOOP;
  IF v_idItemPreDocUltimoItem <> 0 AND (v_saldoRatDescontoGeral <> 0 OR v_saldoRatOutrasDespesasGeral <> 0 OR v_saldoRatDescontoPagamento <> 0 OR v_saldoRatOutrasDespPagamento <> 0 OR v_saldoRatJurosPagamento <> 0 OR v_saldoRatFreteGeral <> 0 OR v_saldoRatSeguroGeral <> 0 OR v_saldoRatAdicFreteMarinGeral <> 0 OR v_saldoRatDespesasAduanGeral <> 0) THEN
    ADD_PRE_DOC_CALC_IMP_RESIDUO (
      p_cab_modeloDocumento,
      p_cab_entradaSaida,
      p_cab_devolucaoAnulacaoRetorno,
      p_cab_atualizaCustoMedio,
      p_a_cab_tipoPagamentoFrete,
      p_cab_tipoPagamentoFrete,
      r_cab_valorProdutos,
      r_cab_valorServicos,
      r_cab_valorBasePagamento,
      r_cab_valorAVistaMinimo,
      r_cab_valorFreteTotal,
      r_cab_valorSeguroTotal,
      r_cab_valorDescontoTotal,
      r_cab_valorOutrasDespesasTotal,
      r_cab_valorAdicFreteMarinTotal,
      r_cab_valorDespesasAduanTotal,
      p_cab_impostosEditados,
      r_cab_valorImpSomaPagamento,
      r_cab_valorImpDiminuiPagamento,
      r_cab_valorLiquidoItem,
      r_cab_valorDescCustoOpTotal,
      r_cab_valorAcrescCustoOpTotal,
      r_cab_valorCustoOperacao,
      r_cab_valorCMV,
      r_cab_valorAcrescExtempTotal,
      p_modDoc_diminuiDescontoPrUnit,
      p_modDoc_somaAcrescimosPrUnit,
      p_modDoc_somaFreteSeguroPrUnit,
      CASE WHEN v_idItemPreDocRateioFrete = 0 THEN v_idItemPreDocUltimoItem ELSE v_idItemPreDocRateioFrete END,
      v_saldoRatFreteGeral,
      v_saldoRatSeguroGeral,
      v_saldoRatDescontoGeral,
      v_saldoRatOutrasDespesasGeral,
      v_saldoRatAdicFreteMarinGeral,
      v_saldoRatDespesasAduanGeral,
      v_saldoRatDescontoPagamento,
      v_saldoRatOutrasDespPagamento,
      v_saldoRatJurosPagamento,
      v_saldoRatDescCustoOpGeral,
      v_saldoRatAcrescCustoOpGeral,
      v_saldoRatAcrescExtempGeral,
      r_calcularImpostosItem,
      /* Retornos */
      r_cab_valorProdutos,
      r_cab_valorServicos,
      r_cab_valorBasePagamento,
      r_cab_valorAVistaMinimo,
      r_cab_valorFreteTotal,
      r_cab_valorSeguroTotal,
      r_cab_valorDescontoTotal,
      r_cab_valorOutrasDespesasTotal,
      r_cab_valorAdicFreteMarinTotal,
      r_cab_valorDespesasAduanTotal,
      r_cab_valorImpSomaPagamento,
      r_cab_valorImpDiminuiPagamento,
      r_cab_valorLiquidoItem,
      r_cab_valorDescCustoOpTotal,
      r_cab_valorAcrescCustoOpTotal,
      r_cab_valorCustoOperacao,
      r_cab_valorCMV,
      r_cab_valorAcrescExtempTotal,
      r_calcularImpostosItem);
  END IF;
END ADD_PRE_DOC_CALC_IMP_RATEIO;

/

create or replace PROCEDURE ADD_DOC_FISC_CALC_IMP_RATEIO (
    p_cab_idDocumentoFiscal        IN NUMBER,
    p_cab_modeloDocumento          IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_devolucaoAnulacaoRetorno IN NUMBER,
    p_cab_atualizaCustoMedio       IN NUMBER,
    p_cab_nfFornecedor             IN NUMBER,
    p_a_cab_tipoPagamentoFrete     IN CHAR,
    p_cab_tipoPagamentoFrete       IN CHAR,
    p_cab_valorFreteGeral          IN NUMBER,
    p_cab_valorSeguroGeral         IN NUMBER,
    p_cab_valorDescontoGeral       IN NUMBER,
    p_cab_valorOutrasDespesasGeral IN NUMBER,
    p_cab_valorAdicFreteMarinGeral IN NUMBER,
    p_cab_valorDespesasAduanGeral  IN NUMBER,
    p_cab_valorDescontoPagamento   IN NUMBER,
    p_cab_valorOutrasDespPagamento IN NUMBER,
    p_cab_valorJurosPagamento      IN NUMBER,
    p_cab_impostosEditados         IN NUMBER,
    p_cab_valorDescCustoOpGeral    IN NUMBER,
    p_cab_valorAcrescCustoOpGeral  IN NUMBER,
    p_cab_valorAcrescExtempGeral   IN NUMBER,
    p_modDoc_diminuiDescontoPrUnit IN NUMBER,
    p_modDoc_somaAcrescimosPrUnit  IN NUMBER,
    p_modDoc_somaFreteSeguroPrUnit IN NUMBER,
    p_modDoc_habilitaControleEntr  IN NUMBER,
    /* Retornos */
    r_cab_valorProdutos            OUT NUMBER,
    r_cab_valorServicos            OUT NUMBER,
    r_cab_valorBasePagamento       OUT NUMBER,
    r_cab_valorAVistaMinimo        OUT NUMBER,
    r_cab_valorFreteTotal          OUT NUMBER,
    r_cab_valorSeguroTotal         OUT NUMBER,
    r_cab_valorDescontoTotal       OUT NUMBER,
    r_cab_valorOutrasDespesasTotal OUT NUMBER,
    r_cab_valorAdicFreteMarinTotal OUT NUMBER,
    r_cab_valorDespesasAduanTotal  OUT NUMBER,
    r_cab_valorImpSomaPagamento    OUT NUMBER,
    r_cab_valorImpDiminuiPagamento OUT NUMBER,
    r_cab_valorLiquidoItem         OUT NUMBER,
    r_cab_valorDescCustoOpTotal    OUT NUMBER,
    r_cab_valorAcrescCustoOpTotal  OUT NUMBER,
    r_cab_valorCustoOperacao       OUT NUMBER,
    r_cab_valorCMV                 OUT NUMBER,
    r_cab_valorAcrescExtempTotal   OUT NUMBER,
    r_calcularImpostosItem         OUT NUMBER)
IS
    v_auxNumber                    NUMBER;
    v_valorDescontoPromocaoGeral   NUMBER;
    v_valorDescontoPromocaoPagamen NUMBER;
    v_rateioDescontofiltrarSemProm NUMBER;
    v_rateioDescontofiltrarAPrazo  NUMBER;
    v_rateioFretePorControleEntr   NUMBER;
    v_valorBaseRateio              NUMBER;
    v_valorBaseRateioFrete         NUMBER;
    v_valorBaseRateioFinanceiro    NUMBER;
    v_valorBaseRateioFinancFrete   NUMBER;
    v_valorBaseRateioDesconto      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_acrescimoUnitarioComposicao  NUMBER;
    v_precoUnitario                NUMBER;
    v_precoUnitarioConvertido      NUMBER;
    v_valorProdutoServico          NUMBER;
    v_valorFreteGeral              NUMBER;
    v_valorSeguroGeral             NUMBER;
    v_valorDescontoGeral           NUMBER;
    v_valorOutrasDespesasGeral     NUMBER;
    v_valorAdicFreteMarinMerGeral  NUMBER;
    v_valorDespesasAduaneirasGeral NUMBER;
    v_valorBasePagamento           NUMBER;
    v_valorDescontoPagamento       NUMBER;
    v_valorOutrasDespesasPagamento NUMBER;
    v_valorJurosPagamento          NUMBER;
    v_valorFreteTotal              NUMBER;
    v_valorSeguroTotal             NUMBER;
    v_valorDescontoTotal           NUMBER;
    v_valorOutrasDespesasTotal     NUMBER;
    v_valorAdicFreteMarinMerTotal  NUMBER;
    v_valorDespesasAduaneirasTotal NUMBER;
    v_valorImpSomaPagamento        NUMBER;
    v_valorImpDiminuiPagamento     NUMBER;
    v_valorLiquidoItem             NUMBER;
    v_valorDescontoCustoOpGeral    NUMBER;
    v_valorDescontoCustoOpTotal    NUMBER;
    v_valorAcrescimoCustoOpGeral   NUMBER;
    v_valorAcrescimoCustoOpTotal   NUMBER;
    v_precoCustoOperacao           NUMBER;
    v_valorCustoOperacao           NUMBER;
    v_precoCMV                     NUMBER;
    v_valorCMV                     NUMBER;
    v_valorAcrescimoExtempSubtotal NUMBER;
    v_valorAcrescimoExtempGeral    NUMBER;
    v_valorAcrescimoExtempTotal    NUMBER;
    v_calculoImpostosPendenteItem  NUMBER;
    CURSOR c_item IS
      SELECT
        a.idItemDocFiscal,
        a.servico,
        a.geraFinanceiro,
        a.quantidade,
        a.quantidadeConvertida,
        a.usarPrecoAVista,
        a.precoUnitarioBruto,
        a.acrescimoUnitarioComposicao,
        a.precoUnitario,
        a.precoUnitarioConvertido,
        a.valorProdutoServicoBruto,
        a.valorProdutoServico,
        a.valorDescontoItem,
        a.valorAcrescimoItem,
        a.valorFreteItem,
        a.valorSeguroItem,
        a.valorAdicFreteMarinhaMerItem,
        a.valorDespesasAduaneirasItem,
        a.valorFreteGeral,
        a.valorSeguroGeral,
        a.valorDescontoGeral,
        a.valorOutrasDespesasGeral,
        a.valorAdicFreteMarinhaMerGeral,
        a.valorDespesasAduaneirasGeral,
        a.valorBasePagamento,
        a.valorDescontoPagamento,
        a.valorOutrasDespesasPagamento,
        a.valorJurosPagamento,
        a.valorFreteTotal,
        a.valorSeguroTotal,
        a.valorDescontoTotal,
        a.valorOutrasDespesasTotal,
        a.valorAdicFreteMarinhaMerTotal,
        a.valorDespesasAduaneirasTotal,
        a.valorIRRF,
        a.valorINSS,
        a.valorRetPIS,
        a.valorRetCOFINS,
        a.valorRetCSLL,
        a.valorII,
        a.valorIOF,
        a.valorIPI,
        a.valorIPIDevolucao,
        a.valorPIS,
        a.valorPISST,
        a.valorCOFINS,
        a.valorCOFINSST,
        a.valorCreditoSimplesNacional,
        a.valorICMS,
        a.valorICMSST,
        a.valorICMSSTEscrituracao,
        a.somarICMSST,
        a.valorImpostosSomaPagamento,
        a.valorImpostosDiminuiPagamento,
        a.valorLiquidoItem,
        a.valorDescontoCustoOpItem,
        a.valorDescontoCustoOpGeral,
        a.valorDescontoCustoOpTotal,
        a.valorAcrescimoCustoOpItem,
        a.valorAcrescimoCustoOpGeral,
        a.valorAcrescimoCustoOpTotal,
        a.precoCustoOperacao,
        a.valorCustoOperacao,
        a.precoCMV,
        a.valorCMV,
        a.quantidadeExtemporanea,
        a.acrescimoUnitarioExtemporaneo,
        a.valorAcrescimoExtempSubtotal,
        a.valorAcrescimoExtempItem,
        a.valorAcrescimoExtempGeral,
        a.valorAcrescimoExtempTotal,
        CASE WHEN p_modDoc_habilitaControleEntr = 0 OR EXISTS(SELECT 1 FROM MODOCFISCALXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemDocFiscal = a.idItemDocFiscal AND contr.habilitaFrete = 1) THEN 1 ELSE 0 END rateioFrete,
        CASE WHEN a.precoSugestaoAPrazo <> a.precoSugestaoAVista AND a.usarPrecoAVista = 1 THEN 1 ELSE 0 END aVista,
        CASE WHEN EXISTS(SELECT 1 FROM MODOCFISCALXPROMOCOES promo WHERE promo.idItemDocFiscal = a.idItemDocFiscal) THEN 1 ELSE 0 END promocao,
        COALESCE((SELECT SUM(promo.valorDesconto) FROM MODOCFISCALXPROMOCOES promo WHERE promo.idItemDocFiscal = a.idItemDocFiscal AND promo.cabecalhoItemPagamento ='C'),0) valorDescontoPromocaoGeral,
        COALESCE((SELECT SUM(promo.valorDesconto) FROM MODOCFISCALXPROMOCOES promo WHERE promo.idItemDocFiscal = a.idItemDocFiscal AND promo.cabecalhoItemPagamento ='P'),0) valorDescontoPromocaoPagamento
      FROM MODOCFISCALXITENS a
      WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
      AND a.cancelado = 0
      ORDER BY a.sequencia;
BEGIN
  r_cab_valorProdutos            := 0;
  r_cab_valorServicos            := 0;
  r_cab_valorBasePagamento       := 0;
  r_cab_valorAVistaMinimo        := 0;
  r_cab_valorFreteTotal          := 0;
  r_cab_valorSeguroTotal         := 0;
  r_cab_valorDescontoTotal       := 0;
  r_cab_valorOutrasDespesasTotal := 0;
  r_cab_valorAdicFreteMarinTotal := 0;
  r_cab_valorDespesasAduanTotal  := 0;
  r_cab_valorImpSomaPagamento    := 0;
  r_cab_valorImpDiminuiPagamento := 0;
  r_cab_valorLiquidoItem         := 0;
  r_cab_valorDescCustoOpTotal    := 0;
  r_cab_valorAcrescCustoOpTotal  := 0;
  r_cab_valorCustoOperacao       := 0;
  r_cab_valorCMV                 := 0;
  r_cab_valorAcrescExtempTotal   := 0;
  r_calcularImpostosItem         := 0;
  v_saldoRatFreteGeral           := p_cab_valorFreteGeral;
  v_saldoRatSeguroGeral          := p_cab_valorSeguroGeral;
  v_saldoRatDescontoGeral        := p_cab_valorDescontoGeral;
  v_saldoRatOutrasDespesasGeral  := p_cab_valorOutrasDespesasGeral;
  v_saldoRatAdicFreteMarinGeral  := p_cab_valorAdicFreteMarinGeral;
  v_saldoRatDespesasAduanGeral   := p_cab_valorDespesasAduanGeral;
  v_saldoRatDescontoPagamento    := p_cab_valorDescontoPagamento;
  v_saldoRatOutrasDespPagamento  := p_cab_valorOutrasDespPagamento;
  v_saldoRatJurosPagamento       := p_cab_valorJurosPagamento;
  v_saldoRatDescCustoOpGeral     := p_cab_valorDescCustoOpGeral;
  v_saldoRatAcrescCustoOpGeral   := p_cab_valorAcrescCustoOpGeral;
  v_saldoRatAcrescExtempGeral    := p_cab_valorAcrescExtempGeral;
  v_residuoFreteGeral            := 0;
  v_residuoSeguroGeral           := 0;
  v_residuoDescontoGeral         := 0;
  v_residuoOutrasDespesasGeral   := 0;
  v_residuoAdicFreteMarinGeral   := 0;
  v_residuoDespesasAduanGeral    := 0;
  v_residuoDescontoPagamento     := 0;
  v_residuoOutrasDespPagamento   := 0;
  v_residuoJurosPagamento        := 0;
  v_residuoDescCustoOpGeral      := 0;
  v_residuoAcrescCustoOpGeral    := 0;
  v_residuoAcrescExtempGeral     := 0;
  v_idItemDocFiscalUltimoItem    := 0;
  v_idItemDocFiscalRateioFrete   := 0;
  -- v_valorDescontoPromocaoGeral
  IF p_cab_valorDescontoGeral > 0 THEN
    SELECT COALESCE(SUM(promo.valorDesconto),0)
    INTO v_valorDescontoPromocaoGeral
    FROM MODOCFISCALXITENS a
    JOIN MODOCFISCALXPROMOCOES promo ON promo.idDocumentoFiscal = a.idDocumentoFiscal
    WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
    AND a.cancelado = 0
    AND promo.cabecalhoItemPagamento ='C';
  ELSE
    v_valorDescontoPromocaoGeral := 0;
  END IF;
  -- v_valorDescontoPromocaoPagamen
  IF p_cab_valorDescontoPagamento > 0 THEN
    SELECT COALESCE(SUM(promo.valorDesconto),0)
    INTO v_valorDescontoPromocaoPagamen
    FROM MODOCFISCALXITENS a
    JOIN MODOCFISCALXPROMOCOES promo ON promo.idDocumentoFiscal = a.idDocumentoFiscal
    WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
    AND a.cancelado = 0
    AND promo.cabecalhoItemPagamento ='P';
  ELSE
    v_valorDescontoPromocaoPagamen := 0;
  END IF;
  IF p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral OR p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen THEN
    -- v_rateioDescontofiltrarSemProm
    SELECT
      CASE
        WHEN COALESCE ((
          SELECT SUM (a.valorProdutoServicoBruto - a.valorDescontoItem + a.valorAcrescimoItem)
          FROM MODOCFISCALXITENS a
          JOIN MODOCFISCALXPROMOCOES b ON b.idDocumentoFiscal = a.idDocumentoFiscal
          WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
          AND a.cancelado = 0),0) > (
            CASE
              WHEN p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral
              THEN p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral
              ELSE 0
            END +
            CASE
              WHEN p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen
              THEN p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen
              ELSE 0
            END)
          AND EXISTS (
            SELECT 1
            FROM MODOCFISCALXITENS a
            WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
            AND a.cancelado = 0
            AND NOT (EXISTS(
              SELECT 1
              FROM MODOCFISCALXPROMOCOES b
              WHERE b.idDocumentoFiscal = a.idDocumentoFiscal)))
        THEN 1
        ELSE 0
      END
    INTO v_rateioDescontofiltrarSemProm
    FROM DUAL;
    -- v_rateioDescontofiltrarAPrazo
    SELECT
      CASE
        WHEN COALESCE ((
          SELECT SUM (a.valorProdutoServicoBruto - a.valorDescontoItem + a.valorAcrescimoItem)
          FROM MODOCFISCALXITENS a
          WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
          AND a.cancelado = 0
          AND a.precoSugestaoAPrazo <> a.precoSugestaoAVista
          AND a.usarPrecoAVista = 1
          AND (v_rateioDescontofiltrarSemProm = 0
            OR NOT(EXISTS(
              SELECT 1
              FROM MODOCFISCALXPROMOCOES promo
              WHERE promo.idDocumentoFiscal = a.idDocumentoFiscal)))),0) > (
            CASE
              WHEN p_cab_valorDescontoGeral > v_valorDescontoPromocaoGeral
              THEN p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral
              ELSE 0
            END +
            CASE
              WHEN p_cab_valorDescontoPagamento > v_valorDescontoPromocaoPagamen
              THEN p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen
              ELSE 0
            END)
          AND EXISTS (
            SELECT 1
            FROM MODOCFISCALXITENS a
            WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
            AND a.cancelado = 0
            AND (a.precoSugestaoAPrazo = a.precoSugestaoAVista
              OR a.usarPrecoAVista = 0)
            AND (v_rateioDescontofiltrarSemProm = 0
              OR NOT(EXISTS(
                SELECT 1
                FROM MODOCFISCALXPROMOCOES promo
                WHERE promo.idDocumentoFiscal = a.idDocumentoFiscal))))
        THEN 1
        ELSE 0
      END
    INTO v_rateioDescontofiltrarAPrazo
    FROM DUAL;
  ELSE
    v_rateioDescontofiltrarSemProm := 0;
    v_rateioDescontofiltrarAPrazo  := 0;
  END IF;
  -- Bases Rateio
  SELECT
    MAX(COALESCE((CASE WHEN p_modDoc_habilitaControleEntr = 0 OR EXISTS(SELECT 1 FROM MODOCFISCALXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemDocFiscal = a.idItemDocFiscal AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1) THEN 1 ELSE 0 END),0)),
    COALESCE(SUM(a.valorProdutoServicoBruto - a.valorDescontoItem + a.valorAcrescimoItem),0),
    COALESCE(SUM(CASE WHEN p_modDoc_habilitaControleEntr = 0 OR EXISTS(SELECT 1 FROM MODOCFISCALXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemDocFiscal = a.idItemDocFiscal AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1) THEN a.valorProdutoServicoBruto - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 THEN a.valorProdutoServicoBruto - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN a.geraFinanceiro = 1 AND (p_modDoc_habilitaControleEntr = 0 OR EXISTS(SELECT 1 FROM MODOCFISCALXORCAMENTOITEM docXorc JOIN MOORCAMENTOXITENS itemOrc ON itemOrc.idItemOrcamento = docXorc.idItemOrcamento JOIN PACONTROLESENTREGA contr ON contr.controleEntrega = itemOrc.controleEntrega WHERE docXorc.idItemDocFiscal = a.idItemDocFiscal AND itemOrc.controleEntrega > 0 AND contr.habilitaFrete = 1)) THEN a.valorProdutoServicoBruto - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0),
    COALESCE(SUM(CASE WHEN (v_rateioDescontofiltrarAPrazo = 0 OR a.precoSugestaoAPrazo = a.precoSugestaoAVista OR a.usarPrecoAVista = 0) AND (v_rateioDescontofiltrarSemProm = 0 OR NOT(EXISTS(SELECT 1 FROM MODOCFISCALXPROMOCOES promo WHERE promo.idDocumentoFiscal = a.idDocumentoFiscal))) THEN a.valorProdutoServicoBruto - a.valorDescontoItem + a.valorAcrescimoItem ELSE 0 END),0)
  INTO
    v_rateioFretePorControleEntr,
    v_valorBaseRateio,
    v_valorBaseRateioFrete,
    v_valorBaseRateioFinanceiro,
    v_valorBaseRateioFinancFrete,
    v_valorBaseRateioDesconto
  FROM MODOCFISCALXITENS a
  WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal
  AND a.cancelado = 0;
  -- Efetua rateio
  FOR item IN c_item LOOP
    v_idItemDocFiscalUltimoItem    := item.idItemDocFiscal;
    v_acrescimoUnitarioComposicao  := item.acrescimoUnitarioComposicao;
    v_precoUnitario                := item.precoUnitario;
    v_precoUnitarioConvertido      := item.precoUnitarioConvertido;
    v_valorProdutoServico          := item.valorProdutoServico;
    v_valorBasePagamento           := item.valorBasePagamento;
    v_valorFreteTotal              := item.valorFreteTotal;
    v_valorSeguroTotal             := item.valorSeguroTotal;
    v_valorDescontoTotal           := item.valorDescontoTotal;
    v_valorOutrasDespesasTotal     := item.valorOutrasDespesasTotal;
    v_valorAdicFreteMarinMerTotal  := item.valorAdicFreteMarinhaMerTotal;
    v_valorDespesasAduaneirasTotal := item.valorDespesasAduaneirasTotal;
    v_valorImpSomaPagamento        := item.valorImpostosSomaPagamento;
    v_valorImpDiminuiPagamento     := item.valorImpostosDiminuiPagamento;
    v_valorLiquidoItem             := item.valorLiquidoItem;
    v_valorDescontoCustoOpTotal    := item.valorDescontoCustoOpTotal;
    v_valorAcrescimoCustoOpTotal   := item.valorAcrescimoCustoOpTotal;
    v_precoCustoOperacao           := item.precoCustoOperacao;
    v_valorCustoOperacao           := item.valorCustoOperacao;
    v_precoCMV                     := item.precoCMV;
    v_valorCMV                     := item.valorCMV;
    v_valorAcrescimoExtempSubtotal := item.valorAcrescimoExtempSubtotal;
    v_valorAcrescimoExtempTotal    := item.valorAcrescimoExtempTotal;
    IF CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFinancFrete ELSE v_valorBaseRateioFinanceiro END > 0 THEN
      IF item.geraFinanceiro = 1 AND (v_rateioFretePorControleEntr = 0 OR item.rateioFrete = 1) THEN
        v_idItemDocFiscalRateioFrete := item.idItemDocFiscal;
        -- v_valorFreteGeral
        v_auxNumber :=
          CASE
            WHEN CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFinancFrete ELSE v_valorBaseRateioFinanceiro END = 0
            THEN 0
            ELSE p_cab_valorFreteGeral
              * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
              / CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFinancFrete ELSE v_valorBaseRateioFinanceiro END
              + v_residuoFreteGeral
          END;
        v_valorFreteGeral := ROUND (v_auxNumber,2);
        v_residuoFreteGeral := v_auxNumber - v_valorFreteGeral;
        v_saldoRatFreteGeral := v_saldoRatFreteGeral - v_valorFreteGeral;
        -- v_valorSeguroGeral
        v_auxNumber :=
          CASE
            WHEN CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFinancFrete ELSE v_valorBaseRateioFinanceiro END = 0
            THEN 0
            ELSE p_cab_valorSeguroGeral
              * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
              / CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFinancFrete ELSE v_valorBaseRateioFinanceiro END
              + v_residuoSeguroGeral
          END;
        v_valorSeguroGeral := ROUND (v_auxNumber,2);
        v_residuoSeguroGeral := v_auxNumber - v_valorSeguroGeral;
        v_saldoRatSeguroGeral := v_saldoRatSeguroGeral - v_valorSeguroGeral;
      ELSE
        v_valorFreteGeral := 0;
        v_valorSeguroGeral := 0;
      END IF;
    ELSE
      IF v_rateioFretePorControleEntr = 0 OR item.rateioFrete = 1 THEN
        v_idItemDocFiscalRateioFrete := item.idItemDocFiscal;
        -- v_valorFreteGeral
        v_auxNumber :=
          CASE
            WHEN CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFrete ELSE v_valorBaseRateio END = 0
            THEN 0
            ELSE p_cab_valorFreteGeral
              * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
              / CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFrete ELSE v_valorBaseRateio END
              + v_residuoFreteGeral
          END;
        v_valorFreteGeral := ROUND (v_auxNumber,2);
        v_residuoFreteGeral := v_auxNumber - v_valorFreteGeral;
        v_saldoRatFreteGeral := v_saldoRatFreteGeral - v_valorFreteGeral;
        -- v_valorSeguroGeral
        v_auxNumber :=
          CASE
            WHEN CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFrete ELSE v_valorBaseRateio END = 0
            THEN 0
            ELSE p_cab_valorSeguroGeral
              * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
              / CASE WHEN v_rateioFretePorControleEntr = 1 THEN v_valorBaseRateioFrete ELSE v_valorBaseRateio END
              + v_residuoSeguroGeral
          END;
        v_valorSeguroGeral := ROUND (v_auxNumber,2);
        v_residuoSeguroGeral := v_auxNumber - v_valorSeguroGeral;
        v_saldoRatSeguroGeral := v_saldoRatSeguroGeral - v_valorSeguroGeral;
      ELSE
        v_valorFreteGeral := 0;
        v_valorSeguroGeral := 0;
      END IF;
    END IF;
    IF v_valorBaseRateioFinanceiro > 0 THEN
      IF item.geraFinanceiro = 1 THEN
        -- v_valorAdicFreteMarinMerGeral
        v_auxNumber :=
          p_cab_valorAdicFreteMarinGeral
          * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioFinanceiro
          + v_residuoAdicFreteMarinGeral;
        v_valorAdicFreteMarinMerGeral := ROUND (v_auxNumber,2);
        v_residuoAdicFreteMarinGeral := v_auxNumber - v_valorAdicFreteMarinMerGeral;
        v_saldoRatAdicFreteMarinGeral := v_saldoRatAdicFreteMarinGeral - v_valorAdicFreteMarinMerGeral;
        -- v_valorDespesasAduaneirasGeral
        v_auxNumber :=
          p_cab_valorDespesasAduanGeral
          * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioFinanceiro
          + v_residuoDespesasAduanGeral;
        v_valorDespesasAduaneirasGeral := ROUND (v_auxNumber,2);
        v_residuoDespesasAduanGeral := v_auxNumber - v_valorDespesasAduaneirasGeral;
        v_saldoRatDespesasAduanGeral := v_saldoRatDespesasAduanGeral - v_valorDespesasAduaneirasGeral;
        -- v_valorOutrasDespesasGeral
        v_auxNumber :=
          p_cab_valorOutrasDespesasGeral
          * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioFinanceiro
          + v_residuoOutrasDespesasGeral;
        v_valorOutrasDespesasGeral := ROUND (v_auxNumber,2);
        v_residuoOutrasDespesasGeral := v_auxNumber - v_valorOutrasDespesasGeral;
        v_saldoRatOutrasDespesasGeral := v_saldoRatOutrasDespesasGeral - v_valorOutrasDespesasGeral;
        -- v_valorOutrasDespesasPagamento
        v_auxNumber :=
          p_cab_valorOutrasDespPagamento
          * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioFinanceiro
          + v_residuoOutrasDespPagamento;
        v_valorOutrasDespesasPagamento := ROUND (v_auxNumber,2);
        v_residuoOutrasDespPagamento := v_auxNumber - v_valorOutrasDespesasPagamento;
        v_saldoRatOutrasDespPagamento := v_saldoRatOutrasDespPagamento - v_valorOutrasDespesasPagamento;
        -- v_valorJurosPagamento
        v_auxNumber :=
          p_cab_valorJurosPagamento
          * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioFinanceiro
          + v_residuoJurosPagamento;
        v_valorJurosPagamento := ROUND (v_auxNumber,2);
        v_residuoJurosPagamento := v_auxNumber - v_valorJurosPagamento;
        v_saldoRatJurosPagamento := v_saldoRatJurosPagamento - v_valorJurosPagamento;
        -- v_valorDescontoCustoOpGeral
        v_auxNumber :=
          p_cab_valorDescCustoOpGeral
          * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioFinanceiro
          + v_residuoDescCustoOpGeral;
        v_valorDescontoCustoOpGeral := ROUND (v_auxNumber,2);
        v_residuoDescCustoOpGeral := v_auxNumber - v_valorDescontoCustoOpGeral;
        v_saldoRatDescCustoOpGeral := v_saldoRatDescCustoOpGeral - v_valorDescontoCustoOpGeral;
        -- v_valorAcrescimoCustoOpGeral
        v_auxNumber :=
          p_cab_valorAcrescCustoOpGeral
          * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioFinanceiro
          + v_residuoAcrescCustoOpGeral;
        v_valorAcrescimoCustoOpGeral := ROUND (v_auxNumber,2);
        v_residuoAcrescCustoOpGeral := v_auxNumber - v_valorAcrescimoCustoOpGeral;
        v_saldoRatAcrescCustoOpGeral := v_saldoRatAcrescCustoOpGeral - v_valorAcrescimoCustoOpGeral;
        -- v_valorAcrescimoExtempGeral
        v_auxNumber :=
          p_cab_valorAcrescExtempGeral
          * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioFinanceiro
          + v_residuoAcrescExtempGeral;
        v_valorAcrescimoExtempGeral := ROUND (v_auxNumber,2);
        v_residuoAcrescExtempGeral := v_auxNumber - v_valorAcrescimoExtempGeral;
        v_saldoRatAcrescExtempGeral := v_saldoRatAcrescExtempGeral - v_valorAcrescimoExtempGeral;
      ELSE
        v_valorAdicFreteMarinMerGeral  := 0;
        v_valorDespesasAduaneirasGeral := 0;
        v_valorOutrasDespesasGeral     := 0;
        v_valorOutrasDespesasPagamento := 0;
        v_valorJurosPagamento          := 0;
        v_valorDescontoCustoOpGeral    := 0;
        v_valorAcrescimoCustoOpGeral   := 0;
        v_valorAcrescimoExtempGeral    := 0;
      END IF;
    ELSIF v_valorBaseRateio > 0 THEN
      -- v_valorAdicFreteMarinMerGeral
      v_auxNumber :=
        p_cab_valorAdicFreteMarinGeral
        * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
        / v_valorBaseRateio
        + v_residuoAdicFreteMarinGeral;
      v_valorAdicFreteMarinMerGeral := ROUND (v_auxNumber,2);
      v_residuoAdicFreteMarinGeral := v_auxNumber - v_valorAdicFreteMarinMerGeral;
      v_saldoRatAdicFreteMarinGeral := v_saldoRatAdicFreteMarinGeral - v_valorAdicFreteMarinMerGeral;
      -- v_valorDespesasAduaneirasGeral
      v_auxNumber :=
        p_cab_valorDespesasAduanGeral
        * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
        / v_valorBaseRateio
        + v_residuoDespesasAduanGeral;
      v_valorDespesasAduaneirasGeral := ROUND (v_auxNumber,2);
      v_residuoDespesasAduanGeral := v_auxNumber - v_valorDespesasAduaneirasGeral;
      v_saldoRatDespesasAduanGeral := v_saldoRatDespesasAduanGeral - v_valorDespesasAduaneirasGeral;
      -- v_valorOutrasDespesasGeral
      v_auxNumber :=
        p_cab_valorOutrasDespesasGeral
        * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
        / v_valorBaseRateio
        + v_residuoOutrasDespesasGeral;
      v_valorOutrasDespesasGeral := ROUND (v_auxNumber,2);
      v_residuoOutrasDespesasGeral := v_auxNumber - v_valorOutrasDespesasGeral;
      v_saldoRatOutrasDespesasGeral := v_saldoRatOutrasDespesasGeral - v_valorOutrasDespesasGeral;
      -- v_valorOutrasDespesasPagamento
      v_auxNumber :=
        p_cab_valorOutrasDespPagamento
        * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
        / v_valorBaseRateio
        + v_residuoOutrasDespPagamento;
      v_valorOutrasDespesasPagamento := ROUND (v_auxNumber,2);
      v_residuoOutrasDespPagamento := v_auxNumber - v_valorOutrasDespesasPagamento;
      v_saldoRatOutrasDespPagamento := v_saldoRatOutrasDespPagamento - v_valorOutrasDespesasPagamento;
      -- v_valorJurosPagamento
      v_auxNumber :=
        p_cab_valorJurosPagamento
        * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
        / v_valorBaseRateio
        + v_residuoJurosPagamento;
      v_valorJurosPagamento := ROUND (v_auxNumber,2);
      v_residuoJurosPagamento := v_auxNumber - v_valorJurosPagamento;
      v_saldoRatJurosPagamento := v_saldoRatJurosPagamento - v_valorJurosPagamento;
      -- v_valorDescontoCustoOpGeral
      v_auxNumber :=
        p_cab_valorDescCustoOpGeral
        * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
        / v_valorBaseRateio
        + v_residuoDescCustoOpGeral;
      v_valorDescontoCustoOpGeral := ROUND (v_auxNumber,2);
      v_residuoDescCustoOpGeral := v_auxNumber - v_valorDescontoCustoOpGeral;
      v_saldoRatDescCustoOpGeral := v_saldoRatDescCustoOpGeral - v_valorDescontoCustoOpGeral;
      -- v_valorAcrescimoCustoOpGeral
      v_auxNumber :=
        p_cab_valorAcrescCustoOpGeral
        * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
        / v_valorBaseRateio
        + v_residuoAcrescCustoOpGeral;
      v_valorAcrescimoCustoOpGeral := ROUND (v_auxNumber,2);
      v_residuoAcrescCustoOpGeral := v_auxNumber - v_valorAcrescimoCustoOpGeral;
      v_saldoRatAcrescCustoOpGeral := v_saldoRatAcrescCustoOpGeral - v_valorAcrescimoCustoOpGeral;
      -- v_valorAcrescimoExtempGeral
      v_auxNumber :=
        p_cab_valorAcrescExtempGeral
        * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
        / v_valorBaseRateio
        + v_residuoAcrescExtempGeral;
      v_valorAcrescimoExtempGeral := ROUND (v_auxNumber,2);
      v_residuoAcrescExtempGeral := v_auxNumber - v_valorAcrescimoExtempGeral;
      v_saldoRatAcrescExtempGeral := v_saldoRatAcrescExtempGeral - v_valorAcrescimoExtempGeral;
    ELSE
      v_valorAdicFreteMarinMerGeral  := 0;
      v_valorDespesasAduaneirasGeral := 0;
      v_valorOutrasDespesasGeral     := 0;
      v_valorOutrasDespesasPagamento := 0;
      v_valorJurosPagamento          := 0;
      v_valorDescontoCustoOpGeral    := 0;
      v_valorAcrescimoCustoOpGeral   := 0;
      v_valorAcrescimoExtempGeral    := 0;
    END IF;
    -- v_valorDescontoGeral
    v_auxNumber :=
      CASE
        WHEN v_valorBaseRateioDesconto = 0
          OR p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral <= 0
          OR v_rateioDescontofiltrarAPrazo = 1 AND item.aVista = 1
          OR v_rateioDescontofiltrarSemProm = 1 AND item.promocao = 1
        THEN 0
        ELSE (p_cab_valorDescontoGeral - v_valorDescontoPromocaoGeral)
          * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioDesconto
      END
      + CASE
          WHEN p_cab_valorDescontoGeral = 0 OR v_valorDescontoPromocaoGeral = 0 OR item.valorDescontoPromocaoGeral = 0
          THEN 0
          WHEN p_cab_valorDescontoGeral < v_valorDescontoPromocaoGeral
          THEN item.valorDescontoPromocaoGeral * p_cab_valorDescontoGeral / v_valorDescontoPromocaoGeral
          ELSE item.valorDescontoPromocaoGeral
        END
      + v_residuoDescontoGeral;
    IF ROUND (v_auxNumber,2) >= v_saldoRatDescontoGeral THEN
      v_valorDescontoGeral := v_saldoRatDescontoGeral;
      v_residuoDescontoGeral := 0;
    ELSE
      v_valorDescontoGeral := ROUND (v_auxNumber,2);
      v_residuoDescontoGeral := v_auxNumber - v_valorDescontoGeral;
    END IF;
    v_saldoRatDescontoGeral := v_saldoRatDescontoGeral - v_valorDescontoGeral;
    -- v_valorDescontoPagamento
    v_auxNumber :=
      CASE
        WHEN v_valorBaseRateioDesconto = 0
          OR p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen <= 0
          OR v_rateioDescontofiltrarAPrazo = 1 AND item.aVista = 1
          OR v_rateioDescontofiltrarSemProm = 1 AND item.promocao = 1
        THEN 0
        ELSE (p_cab_valorDescontoPagamento - v_valorDescontoPromocaoPagamen)
          * (item.valorProdutoServicoBruto - item.valorDescontoItem + item.valorAcrescimoItem)
          / v_valorBaseRateioDesconto
      END
      + CASE
          WHEN p_cab_valorDescontoPagamento = 0 OR v_valorDescontoPromocaoPagamen = 0 OR item.valorDescontoPromocaoPagamento = 0
          THEN 0
          WHEN p_cab_valorDescontoPagamento < v_valorDescontoPromocaoPagamen
          THEN item.valorDescontoPromocaoPagamento * p_cab_valorDescontoPagamento / v_valorDescontoPromocaoPagamen
          ELSE item.valorDescontoPromocaoPagamento
        END
      + v_residuoDescontoPagamento;
    IF ROUND (v_auxNumber,2) >= v_saldoRatDescontoPagamento THEN
      v_valorDescontoPagamento := v_saldoRatDescontoPagamento;
      v_residuoDescontoPagamento := 0;
    ELSE
      v_valorDescontoPagamento := ROUND (v_auxNumber,2);
      v_residuoDescontoPagamento := v_auxNumber - v_valorDescontoPagamento;
    END IF;
    v_saldoRatDescontoPagamento := v_saldoRatDescontoPagamento - v_valorDescontoPagamento;
    -- Recalcula Valores
    ADD_CALCULA_TOTAIS_ITEM(
      ' ',
      ' ',
      0,
      0,
      0,
      0,
      'D',
      p_cab_entradaSaida,
      p_cab_devolucaoAnulacaoRetorno,
      p_a_cab_tipoPagamentoFrete,
      p_cab_tipoPagamentoFrete,
      p_cab_impostosEditados,
      p_modDoc_diminuiDescontoPrUnit,
      p_modDoc_somaAcrescimosPrUnit,
      p_modDoc_somaFreteSeguroPrUnit,
      CASE WHEN v_idItemDocFiscalRateioFrete = 0 THEN item.idItemDocFiscal ELSE v_idItemDocFiscalRateioFrete END,
      item.quantidade,
      item.quantidadeConvertida,
      item.precoUnitarioBruto,
      v_precoUnitario,
      item.valorProdutoServicoBruto,
      v_valorProdutoServico,
      item.valorDescontoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      v_valorFreteGeral,
      v_valorSeguroGeral,
      v_valorDescontoGeral,
      v_valorOutrasDespesasGeral,
      v_valorAdicFreteMarinMerGeral,
      v_valorDespesasAduaneirasGeral,
      v_valorDescontoPagamento,
      v_valorOutrasDespesasPagamento,
      v_valorJurosPagamento,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal,
      item.quantidadeExtemporanea,
      item.acrescimoUnitarioExtemporaneo,
      item.valorAcrescimoExtempItem,
      v_valorAcrescimoExtempGeral,
      r_calcularImpostosItem,
      /* Retornos */
      v_acrescimoUnitarioComposicao,
      v_auxNumber,
      v_precoUnitario,
      v_auxNumber,
      v_precoUnitarioConvertido,
      v_auxNumber,
      v_valorProdutoServico,
      v_auxNumber,
      v_auxNumber,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal,
      v_valorAcrescimoExtempSubtotal,
      v_valorAcrescimoExtempTotal,
      r_calcularImpostosItem);
    ADD_CALCULA_VALOR_LIQUIDO (
      p_cab_nfFornecedor,
      p_cab_tipoPagamentoFrete,
      item.geraFinanceiro,
      v_valorProdutoServico,
      v_valorDescontoPagamento,
      v_valorOutrasDespesasPagamento,
      v_valorJurosPagamento,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      item.valorIRRF,
      item.valorINSS,
      item.valorRetPIS,
      item.valorRetCOFINS,
      item.valorRetCSLL,
      item.valorII,
      item.valorIOF,
      item.valorIPI,
      item.valorIPIDevolucao,
      item.valorICMSST,
      item.valorICMSSTEscrituracao,
      item.somarICMSST,
      v_valorAcrescimoExtempTotal,
      /* Retornos */
      v_valorBasePagamento,
      v_valorImpSomaPagamento,
      v_valorImpDiminuiPagamento,
      v_valorLiquidoItem);
    ADD_CALCULA_CUSTO_CMV (
      p_cab_modeloDocumento,
      p_cab_atualizaCustoMedio,
      p_cab_nfFornecedor,
      item.quantidade,
      item.valorII,
      item.valorIOF,
      item.valorIPI,
      item.valorIPIDevolucao,
      item.valorPIS,
      item.valorPISST,
      item.valorCOFINS,
      item.valorCOFINSST,
      item.valorCreditoSimplesNacional,
      item.valorICMS,
      item.valorICMSST,
      item.valorICMSSTEscrituracao,
      v_valorLiquidoItem,
      item.valorDescontoCustoOpItem,
      v_valorDescontoCustoOpGeral,
      item.valorAcrescimoCustoOpItem,
      v_valorAcrescimoCustoOpGeral,
      v_valorAcrescimoExtempTotal,
      /* Retornos */
      v_valorDescontoCustoOpTotal,
      v_valorAcrescimoCustoOpTotal,
      v_precoCustoOperacao,
      v_valorCustoOperacao,
      v_precoCMV,
      v_valorCMV);
    -- Atualiza Item
    UPDATE MODOCFISCALXITENS SET
      acrescimoUnitarioComposicao   = v_acrescimoUnitarioComposicao,
      precoUnitario                 = v_precoUnitario,
      precoUnitarioConvertido       = v_precoUnitarioConvertido,
      valorProdutoServico           = v_valorProdutoServico,
      valorFreteGeral               = v_valorFreteGeral,
      valorSeguroGeral              = v_valorSeguroGeral,
      valorDescontoGeral            = v_valorDescontoGeral,
      valorOutrasDespesasGeral      = v_valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral = v_valorAdicFreteMarinMerGeral,
      valorDespesasAduaneirasGeral  = v_valorDespesasAduaneirasGeral,
      valorBasePagamento            = v_valorBasePagamento,
      valorDescontoPagamento        = v_valorDescontoPagamento,
      valorOutrasDespesasPagamento  = v_valorOutrasDespesasPagamento,
      valorJurosPagamento           = v_valorJurosPagamento,
      valorFreteTotal               = v_valorFreteTotal,
      valorSeguroTotal              = v_valorSeguroTotal,
      valorDescontoTotal            = v_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
      valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
      valorImpostosSomaPagamento    = v_valorImpSomaPagamento,
      valorImpostosDiminuiPagamento = v_valorImpDiminuiPagamento,
      valorLiquidoItem              = v_valorLiquidoItem,
      valorDescontoCustoOpGeral     = v_valorDescontoCustoOpGeral,
      valorDescontoCustoOpTotal     = v_valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpGeral    = v_valorAcrescimoCustoOpGeral,
      valorAcrescimoCustoOpTotal    = v_valorAcrescimoCustoOpTotal,
      precoCustoOperacao            = v_precoCustoOperacao,
      valorCustoOperacao            = v_valorCustoOperacao,
      precoCMV                      = v_precoCMV,
      valorCMV                      = v_valorCMV,
      valorAcrescimoExtempSubtotal  = v_valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempGeral     = v_valorAcrescimoExtempGeral,
      valorAcrescimoExtempTotal     = v_valorAcrescimoExtempTotal
    WHERE idItemDocFiscal           = item.idItemDocFiscal;
    IF item.servico = 1 THEN
      r_cab_valorServicos            := r_cab_valorServicos + v_valorProdutoServico;
    ELSE
      r_cab_valorProdutos            := r_cab_valorProdutos + v_valorProdutoServico;
    END IF;
    r_cab_valorBasePagamento       := r_cab_valorBasePagamento + v_valorBasePagamento;
    IF item.usarPrecoAVista = 1 AND item.geraFinanceiro = 1 THEN
      r_cab_valorAVistaMinimo        := r_cab_valorAVistaMinimo + v_valorProdutoServico + v_valorDescontoPagamento - v_valorOutrasDespesasPagamento - v_valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
    END IF;
    r_cab_valorFreteTotal          := r_cab_valorFreteTotal + v_valorFreteTotal;
    r_cab_valorSeguroTotal         := r_cab_valorSeguroTotal + v_valorSeguroTotal;
    r_cab_valorDescontoTotal       := r_cab_valorDescontoTotal + v_valorDescontoTotal;
    r_cab_valorOutrasDespesasTotal := r_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
    r_cab_valorAdicFreteMarinTotal := r_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
    r_cab_valorDespesasAduanTotal  := r_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
    r_cab_valorImpSomaPagamento    := r_cab_valorImpSomaPagamento + v_valorImpSomaPagamento;
    r_cab_valorImpDiminuiPagamento := r_cab_valorImpDiminuiPagamento + v_valorImpDiminuiPagamento;
    r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem + v_valorLiquidoItem;
    r_cab_valorDescCustoOpTotal    := r_cab_valorDescCustoOpTotal + v_valorDescontoCustoOpTotal;
    r_cab_valorAcrescCustoOpTotal  := r_cab_valorAcrescCustoOpTotal + v_valorAcrescimoCustoOpTotal;
    r_cab_valorCustoOperacao       := r_cab_valorCustoOperacao + v_valorCustoOperacao;
    r_cab_valorCMV                 := r_cab_valorCMV + v_valorCMV;
    r_cab_valorAcrescExtempTotal   := r_cab_valorAcrescExtempTotal + v_valorAcrescimoExtempTotal;
  END LOOP;
  IF v_idItemDocFiscalUltimoItem <> 0 AND (v_saldoRatDescontoGeral <> 0 OR v_saldoRatOutrasDespesasGeral <> 0 OR v_saldoRatDescontoPagamento <> 0 OR v_saldoRatOutrasDespPagamento <> 0 OR v_saldoRatJurosPagamento <> 0 OR v_saldoRatFreteGeral <> 0 OR v_saldoRatSeguroGeral <> 0 OR v_saldoRatAdicFreteMarinGeral <> 0 OR v_saldoRatDespesasAduanGeral <> 0) THEN
    ADD_DOC_FISC_CALC_IMP_RESIDUO (
      p_cab_modeloDocumento,
      p_cab_entradaSaida,
      p_cab_devolucaoAnulacaoRetorno,
      p_cab_atualizaCustoMedio,
      p_cab_nfFornecedor,
      p_a_cab_tipoPagamentoFrete,
      p_cab_tipoPagamentoFrete,
      r_cab_valorProdutos,
      r_cab_valorServicos,
      r_cab_valorBasePagamento,
      r_cab_valorAVistaMinimo,
      r_cab_valorFreteTotal,
      r_cab_valorSeguroTotal,
      r_cab_valorDescontoTotal,
      r_cab_valorOutrasDespesasTotal,
      r_cab_valorAdicFreteMarinTotal,
      r_cab_valorDespesasAduanTotal,
      p_cab_impostosEditados,
      r_cab_valorImpSomaPagamento,
      r_cab_valorImpDiminuiPagamento,
      r_cab_valorLiquidoItem,
      r_cab_valorDescCustoOpTotal,
      r_cab_valorAcrescCustoOpTotal,
      r_cab_valorCustoOperacao,
      r_cab_valorCMV,
      r_cab_valorAcrescExtempTotal,
      p_modDoc_diminuiDescontoPrUnit,
      p_modDoc_somaAcrescimosPrUnit,
      p_modDoc_somaFreteSeguroPrUnit,
      v_idItemDocFiscalUltimoItem,
      v_saldoRatFreteGeral,
      v_saldoRatSeguroGeral,
      v_saldoRatDescontoGeral,
      v_saldoRatOutrasDespesasGeral,
      v_saldoRatAdicFreteMarinGeral,
      v_saldoRatDespesasAduanGeral,
      v_saldoRatDescontoPagamento,
      v_saldoRatOutrasDespPagamento,
      v_saldoRatJurosPagamento,
      v_saldoRatDescCustoOpGeral,
      v_saldoRatAcrescCustoOpGeral,
      v_saldoRatAcrescExtempGeral,
      r_calcularImpostosItem,
      /* Retornos */
      r_cab_valorProdutos,
      r_cab_valorServicos,
      r_cab_valorBasePagamento,
      r_cab_valorAVistaMinimo,
      r_cab_valorFreteTotal,
      r_cab_valorSeguroTotal,
      r_cab_valorDescontoTotal,
      r_cab_valorOutrasDespesasTotal,
      r_cab_valorAdicFreteMarinTotal,
      r_cab_valorDespesasAduanTotal,
      r_cab_valorImpSomaPagamento,
      r_cab_valorImpDiminuiPagamento,
      r_cab_valorLiquidoItem,
      r_cab_valorDescCustoOpTotal,
      r_cab_valorAcrescCustoOpTotal,
      r_cab_valorCustoOperacao,
      r_cab_valorCMV,
      r_cab_valorAcrescExtempTotal,
      r_calcularImpostosItem);
  END IF;
END ADD_DOC_FISC_CALC_IMP_RATEIO;

/

CREATE TABLE PACARTEIRASFINANCEIRAS_2202 AS SELECT * FROM PACARTEIRASFINANCEIRAS;

ALTER TABLE PACARTFINANCXESTABELECIM DROP CONSTRAINT PACARTFINANCXESTABELECIM_FK1;
ALTER TABLE PACARTFINANCXESTABELECIM DROP CONSTRAINT PACARTFINANCXESTABELECIM_FK5;
ALTER TABLE PACARTFINANCXPAGAMENTOS DROP CONSTRAINT PACARTFINANCXPAGAMENTOS_FK1;
ALTER TABLE PACARTFINANCXCONCCARTOES DROP CONSTRAINT PACARTFINANCXCONCCARTOES_FK1;
ALTER TABLE PACONDICOESPAGAMENTO DROP CONSTRAINT PACONDICOESPAGAMENTO_FK4;
ALTER TABLE PAMODELOSFINANCEIRO DROP CONSTRAINT PAMODELOSFINANCEIRO_FK6;
ALTER TABLE PAMODELOSFINANCEIRO DROP CONSTRAINT PAMODELOSFINANCEIRO_FK13;
ALTER TABLE PACARTEIRASFINPERMITIDAS DROP CONSTRAINT PACARTEIRASFINPERMITIDAS_FK1;
ALTER TABLE PALISTACOBRANCAXCARTEIRAS DROP CONSTRAINT PALISTACOBRANCAXCARTEIRAS_FK2;
ALTER TABLE MOFINANCEIROS DROP CONSTRAINT MOFINANCEIROS_FK13;
ALTER TABLE MOFINANCEIROXBAIXAS DROP CONSTRAINT MOFINANCEIROXBAIXAS_FK10;
ALTER TABLE MOPREVISOESFINANCEIRAS DROP CONSTRAINT MOPREVISOESFINANCEIRAS_FK10;

DROP TABLE PACARTEIRASFINANCEIRAS;

-- PACARTEIRASFINANCEIRAS
CREATE TABLE PACARTEIRASFINANCEIRAS
  (
    carteiraFinanceira   NUMERIC (4,0) DEFAULT 0 NOT NULL,
    descricao            VARCHAR (256) DEFAULT ' ' NOT NULL,
    ativo                NUMERIC (1,0) DEFAULT 0 NOT NULL,
    ordenacao            NUMERIC (11,0) DEFAULT 0 NOT NULL,
    validoParaFluxoCaixa NUMERIC (1,0) DEFAULT 0 NOT NULL,
    geraRestricao        NUMERIC (1,0) DEFAULT 0 NOT NULL,
    observacoes          VARCHAR (4000) DEFAULT ' ' NOT NULL
  );
ALTER TABLE PACARTEIRASFINANCEIRAS ADD CONSTRAINT PACARTEIRASFINANCEIRAS_PK1 PRIMARY KEY (carteiraFinanceira);
CREATE INDEX PACARTEIRASFINANCEIRAS_K2 ON PACARTEIRASFINANCEIRAS (descricao);
CREATE INDEX PACARTEIRASFINANCEIRAS_K3 ON PACARTEIRASFINANCEIRAS (ordenacao, carteiraFinanceira);

INSERT INTO PACARTEIRASFINANCEIRAS (carteiraFinanceira, descricao, ativo, ordenacao, validoParaFluxoCaixa, geraRestricao, observacoes) VALUES (0, 'SELECIONE', 1, 0, 0, 0, ' ');
INSERT INTO PACARTEIRASFINANCEIRAS (carteiraFinanceira, descricao, ativo, ordenacao, validoParaFluxoCaixa, geraRestricao, observacoes) SELECT carteiraFinanceira, descricao, ativo, ordenacao, validoParaFluxoCaixa, 0, observacoes FROM PACARTEIRASFINANCEIRAS_2202 WHERE carteiraFinanceira <> 0;

COMMIT;

ALTER TABLE PACARTFINANCXESTABELECIM ADD CONSTRAINT PACARTFINANCXESTABELECIM_FK1 FOREIGN KEY (carteiraFinanceira) REFERENCES PACARTEIRASFINANCEIRAS (carteiraFinanceira);
ALTER TABLE PACARTFINANCXESTABELECIM ADD CONSTRAINT PACARTFINANCXESTABELECIM_FK5 FOREIGN KEY (carteiraFinanceiraProtesto) REFERENCES PACARTEIRASFINANCEIRAS (carteiraFinanceira);
ALTER TABLE PACARTFINANCXPAGAMENTOS ADD CONSTRAINT PACARTFINANCXPAGAMENTOS_FK1 FOREIGN KEY (carteiraFinanceira) REFERENCES PACARTEIRASFINANCEIRAS (carteiraFinanceira);
ALTER TABLE PACARTFINANCXCONCCARTOES ADD CONSTRAINT PACARTFINANCXCONCCARTOES_FK1 FOREIGN KEY (carteiraFinanceira) REFERENCES PACARTEIRASFINANCEIRAS (carteiraFinanceira);
ALTER TABLE PACONDICOESPAGAMENTO ADD CONSTRAINT PACONDICOESPAGAMENTO_FK4 FOREIGN KEY (carteiraFinanceira) REFERENCES PACARTEIRASFINANCEIRAS (carteiraFinanceira);
ALTER TABLE PAMODELOSFINANCEIRO ADD CONSTRAINT PAMODELOSFINANCEIRO_FK6 FOREIGN KEY (carteiraFinanceira) REFERENCES PACARTEIRASFINANCEIRAS (carteiraFinanceira);
ALTER TABLE PAMODELOSFINANCEIRO ADD CONSTRAINT PAMODELOSFINANCEIRO_FK13 FOREIGN KEY (transfCarteiraFinanceira) REFERENCES PACARTEIRASFINANCEIRAS (carteiraFinanceira);
ALTER TABLE PACARTEIRASFINPERMITIDAS ADD CONSTRAINT PACARTEIRASFINPERMITIDAS_FK1 FOREIGN KEY (carteiraFinanceira) REFERENCES PACARTEIRASFINANCEIRAS (carteiraFinanceira);
ALTER TABLE PALISTACOBRANCAXCARTEIRAS ADD CONSTRAINT PALISTACOBRANCAXCARTEIRAS_FK2 FOREIGN KEY (carteiraFinanceira) REFERENCES PACARTEIRASFINANCEIRAS (carteiraFinanceira);
ALTER TABLE MOFINANCEIROS ADD CONSTRAINT MOFINANCEIROS_FK13 FOREIGN KEY (carteiraFinanceira) REFERENCES PACARTEIRASFINANCEIRAS (carteiraFinanceira);
ALTER TABLE MOFINANCEIROXBAIXAS ADD CONSTRAINT MOFINANCEIROXBAIXAS_FK10 FOREIGN KEY (carteiraFinanceira) REFERENCES PACARTEIRASFINANCEIRAS (carteiraFinanceira);
ALTER TABLE MOPREVISOESFINANCEIRAS ADD CONSTRAINT MOPREVISOESFINANCEIRAS_FK10 FOREIGN KEY (carteiraFinanceira) REFERENCES PACARTEIRASFINANCEIRAS (carteiraFinanceira);

DROP TABLE TEMPRECEBIMENTO;

-- TEMPRECEBIMENTO
CREATE GLOBAL TEMPORARY TABLE TEMPRECEBIMENTO
  (
    uniqueMachineID               VARCHAR (18) DEFAULT ' ' NOT NULL,
    contadorSessao                NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idFinanceiro                  NUMERIC (14,0) DEFAULT 0 NOT NULL,
    idBaixaFinanceiro             NUMERIC (14,0) DEFAULT 0 NOT NULL,
    ordenacao                     VARCHAR (256) DEFAULT ' ' NOT NULL,
    quebra                        VARCHAR (256) DEFAULT ' ' NOT NULL,
    selecionado                   NUMERIC (1,0) DEFAULT 0 NOT NULL,
    legenda                       NUMERIC (3,0) DEFAULT 0 NOT NULL,
    documento                     VARCHAR (60) DEFAULT ' ' NOT NULL,
    carteiraFinanceira            NUMERIC (4,0) DEFAULT 0 NOT NULL,
    carteiraFinanceiraDescricao   VARCHAR (256) DEFAULT ' ' NOT NULL,
    meioPagamento                 NUMERIC (2,0) DEFAULT 0 NOT NULL,
    meioPagamentoDescricao        VARCHAR (60) DEFAULT ' ' NOT NULL,
    bandeiraCartaoDebCred         NUMERIC (2,0) DEFAULT 0 NOT NULL,
    bandeiraCartaoDebCrDescricao  VARCHAR (120) DEFAULT ' ' NOT NULL,
    pagamentoRecebimento          CHAR (1) DEFAULT ' ' NOT NULL,
    cotacao                       NUMERIC (12,4) DEFAULT 0 NOT NULL,
    valor                         NUMERIC (15,2) DEFAULT 0 NOT NULL,
    saldo                         NUMERIC (15,2) DEFAULT 0 NOT NULL,
    saldoIndexado                 NUMERIC (15,6) DEFAULT 0 NOT NULL,
    valorVariacaoIndexador        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDescontoAteVencimento    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorDescontoAntecipado       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorJurosDeMora              NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorMulta                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    tarifaCartao                  NUMERIC (15,8) DEFAULT 0 NOT NULL,
    valorTarifaCartao             NUMERIC (15,2) DEFAULT 0 NOT NULL,
    valorLiquido                  NUMERIC (15,2) DEFAULT 0 NOT NULL,
    saldoVariacaoIndexador        NUMERIC (15,2) DEFAULT 0 NOT NULL,
    saldoDescontoAteVencimento    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    saldoDescontoAntecipado       NUMERIC (15,2) DEFAULT 0 NOT NULL,
    saldoJurosDeMora              NUMERIC (15,2) DEFAULT 0 NOT NULL,
    saldoMulta                    NUMERIC (15,2) DEFAULT 0 NOT NULL,
    saldoTarifaCartao             NUMERIC (15,2) DEFAULT 0 NOT NULL,
    saldoLiquido                  NUMERIC (15,2) DEFAULT 0 NOT NULL
  ) ON COMMIT PRESERVE ROWS;
CREATE UNIQUE INDEX TEMPRECEBIMENTO_PK1 ON TEMPRECEBIMENTO (uniqueMachineID, contadorSessao, idFinanceiro, idBaixaFinanceiro);
CREATE INDEX TEMPRECEBIMENTO_K2 ON TEMPRECEBIMENTO (uniqueMachineID, contadorSessao, ordenacao);
CREATE INDEX TEMPRECEBIMENTO_K3 ON TEMPRECEBIMENTO (uniqueMachineID, contadorSessao, documento);

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

COMMIT;

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

/*
*/