SET DEFINE OFF;

DROP TABLE PACARTEIRASFINANCEIRAS_2202;

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

COMMIT;


DROP FUNCTION FUNC_ADD_OBS_COMP_PR_DOC_FISC;
DROP FUNCTION FUNC_ADD_OBS_COMP_PR_ORCAMENTO;
DROP FUNCTION FUNC_ADD_OBS_COMP_PR_PRE_DOC;
DROP FUNCTION FUNC_ADD_OBS_COMP_PR_TEMP;
DROP FUNCTION FUNC_ADD_OBS_NSERIE_DOC_FISC;
DROP FUNCTION FUNC_ADD_OBS_NSERIE_ORCAMENTO;
DROP FUNCTION FUNC_ADD_OBS_NSERIE_PRE_DOC;
DROP FUNCTION FUNC_ADD_OBS_NSERIE_SEPARACAO;
DROP FUNCTION FUNC_ADD_OBS_NSERIE_TRANSF;

create or replace FUNCTION FUNC_ADD_MONTA_OBSERVACAO_ITEM (
    p_uniqueMachineID              IN VARCHAR2,
    p_config_198_obs_add_referenc  IN NUMBER,
    p_config_199_obs_add_caractA   IN NUMBER,
    p_config_200_obs_add_caractB   IN NUMBER,
    p_config_201_obs_add_caractC   IN NUMBER,
    p_config_202_obs_add_caractD   IN NUMBER,
    p_config_203_obs_add_caractE   IN NUMBER,
    p_tempComp_nomeTempComposicao  IN VARCHAR2,
    p_tempComp_sequencia           IN NUMBER,
    p_Doc_Orc_Pre_Sep_Transf       IN CHAR,
    p_item_id                      IN NUMBER,
    p_item_gradeProduto            IN NUMBER,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_item_idLoteEstoque           IN NUMBER,
    p_item_controleQuantidade      IN NUMBER,
    p_item_loteMultiplo            IN NUMBER,
    p_item_altura                  IN NUMBER,
    p_item_largura                 IN NUMBER,
    p_item_comprimento             IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_item_observacoesDigitadas    IN VARCHAR2)
  RETURN VARCHAR2
IS
  v_prod_caracteristicaA NUMBER;
  v_prod_caracteristicaB NUMBER;
  v_prod_caracteristicaC NUMBER;
  v_prod_caracteristicaD NUMBER;
  v_prod_caracteristicaE NUMBER;
  v_prod_referencia      VARCHAR2(60);
  v_observacoes          VARCHAR2(4000);
  v_aux_observacoes      VARCHAR2(4000);
BEGIN
  v_observacoes := '';
  IF p_config_198_obs_add_referenc  = 1
    OR p_config_199_obs_add_caractA = 1
    OR p_config_200_obs_add_caractB = 1
    OR p_config_201_obs_add_caractC = 1
    OR p_config_202_obs_add_caractD = 1
    OR p_config_203_obs_add_caractE = 1 THEN
    SELECT
      prod.caracteristicaA,
      prod.caracteristicaB,
      prod.caracteristicaC,
      prod.caracteristicaD,
      prod.caracteristicaE,
      prod.referencia
    INTO
      v_prod_caracteristicaA,
      v_prod_caracteristicaB,
      v_prod_caracteristicaC,
      v_prod_caracteristicaD,
      v_prod_caracteristicaE,
      v_prod_referencia
    FROM CAGRADESPRODUTO gradProd
    JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
    WHERE gradProd.gradeProduto = p_item_gradeProduto;
    -- Referência Produto
    IF p_config_198_obs_add_referenc = 1 AND NOT(v_prod_referencia IS NULL) AND v_prod_referencia <> ' ' THEN
      v_observacoes := RTRIM(SUBSTR(CASE WHEN v_observacoes <> ' ' THEN v_observacoes || ' ' ELSE '' END || 'Ref.: ' || v_prod_referencia,1,4000));
    END IF;
    -- Caracteristica A
    IF p_config_199_obs_add_caractA = 1 AND v_prod_caracteristicaA <> 0 THEN
      SELECT descricao
      INTO v_aux_observacoes
      FROM PACARACTERISTICASA
      WHERE caracteristicaA = v_prod_caracteristicaA;
      IF NOT(v_aux_observacoes IS NULL) AND v_aux_observacoes <> ' ' THEN
        v_observacoes := RTRIM(SUBSTR(CASE WHEN v_observacoes <> ' ' THEN v_observacoes || ' ' ELSE '' END || v_aux_observacoes,1,4000));
      END IF;
    END IF;
    -- Caracteristica B
    IF p_config_200_obs_add_caractB = 1 AND v_prod_caracteristicaB <> 0 THEN
      SELECT descricao
      INTO v_aux_observacoes
      FROM PACARACTERISTICASB
      WHERE caracteristicaB = v_prod_caracteristicaB;
      IF NOT(v_aux_observacoes IS NULL) AND v_aux_observacoes <> ' ' THEN
        v_observacoes := RTRIM(SUBSTR(CASE WHEN v_observacoes <> ' ' THEN v_observacoes || ' ' ELSE '' END || v_aux_observacoes,1,4000));
      END IF;
    END IF;
    -- Caracteristica C
    IF p_config_201_obs_add_caractC = 1 AND v_prod_caracteristicaC <> 0 THEN
      SELECT descricao
      INTO v_aux_observacoes
      FROM PACARACTERISTICASC
      WHERE caracteristicaC = v_prod_caracteristicaC;
      IF NOT(v_aux_observacoes IS NULL) AND v_aux_observacoes <> ' ' THEN
        v_observacoes := RTRIM(SUBSTR(CASE WHEN v_observacoes <> ' ' THEN v_observacoes || ' ' ELSE '' END || v_aux_observacoes,1,4000));
      END IF;
    END IF;
    -- Caracteristica D
    IF p_config_202_obs_add_caractD = 1 AND v_prod_caracteristicaD <> 0 THEN
      SELECT descricao
      INTO v_aux_observacoes
      FROM PACARACTERISTICASD
      WHERE caracteristicaD = v_prod_caracteristicaD;
      IF NOT(v_aux_observacoes IS NULL) AND v_aux_observacoes <> ' ' THEN
        v_observacoes := RTRIM(SUBSTR(CASE WHEN v_observacoes <> ' ' THEN v_observacoes || ' ' ELSE '' END || v_aux_observacoes,1,4000));
      END IF;
    END IF;
    -- Caracteristica E
    IF p_config_203_obs_add_caractE = 1 AND v_prod_caracteristicaE <> 0 THEN
      SELECT descricao
      INTO v_aux_observacoes
      FROM PACARACTERISTICASE
      WHERE caracteristicaE = v_prod_caracteristicaE;
      IF NOT(v_aux_observacoes IS NULL) AND v_aux_observacoes <> ' ' THEN
        v_observacoes := RTRIM(SUBSTR(CASE WHEN v_observacoes <> ' ' THEN v_observacoes || ' ' ELSE '' END || v_aux_observacoes,1,4000));
      END IF;
    END IF;
  END IF;
  -- Formula Tinta
  IF p_item_idFormulaTinta <> 0 THEN
    SELECT TRIM (UPPER (marcTint.descricao))
      || ' ' || TRIM (formTint.descricaoCor)
      || CASE WHEN formTint.descricaoCor = formTint.descricaoNomeCor THEN '' ELSE ' ' || TRIM (formTint.descricaoNomeCor) END
      || ' Base: ' || TRIM (baseTint.baseTinta)
      || ' Emb.: ' || TRIM (embTint.descricao) 
    INTO v_aux_observacoes
    FROM CAFORMULASTINTAS formTint
    JOIN SIMARCASTINTAS marcTint ON marcTint.marcaTinta = formTint.marcaTinta
    JOIN CABASESTINTAS baseTint ON baseTint.idBaseTinta = formTint.idBaseTinta
    JOIN SIEMBALAGENSTINTAS embTint ON embTint.embalagemTinta = baseTint.embalagemTinta
    WHERE formTint.idFormulaTinta = p_item_idFormulaTinta;
    IF NOT(v_aux_observacoes IS NULL) AND v_aux_observacoes <> ' ' THEN
      v_observacoes := RTRIM(SUBSTR(CASE WHEN v_observacoes <> ' ' THEN v_observacoes || ' ' ELSE '' END || v_aux_observacoes,1,4000));
    END IF;
  END IF;
  -- Personalização
  IF p_item_personalizacao <> 0 THEN
    SELECT descricao
    INTO v_aux_observacoes
    FROM PAPERSONALIZACOES
    WHERE personalizacao = p_item_personalizacao;
    IF NOT(v_aux_observacoes IS NULL) AND v_aux_observacoes <> ' ' THEN
      v_observacoes := RTRIM(SUBSTR(CASE WHEN v_observacoes <> ' ' THEN v_observacoes || ' ' ELSE '' END || v_aux_observacoes,1,4000));
    END IF;
  END IF;
  -- Lote
  IF p_item_idLoteEstoque <> 0 THEN
    SELECT 'Lote: ' || loteEstoque
    INTO v_aux_observacoes
    FROM CAGRADEPRODUTOXLOTESESTOQ
    WHERE idLoteEstoque = p_item_idLoteEstoque;
    IF NOT(v_aux_observacoes IS NULL) AND v_aux_observacoes <> ' ' THEN
      v_observacoes := RTRIM(SUBSTR(CASE WHEN v_observacoes <> ' ' THEN v_observacoes || ' ' ELSE '' END || v_aux_observacoes,1,4000));
    END IF;
  END IF;
  -- Espessura / Largura / Comprimento
  IF p_item_controleQuantidade BETWEEN 2 AND 3 THEN
    v_observacoes := RTRIM(SUBSTR(CASE WHEN v_observacoes <> ' ' THEN v_observacoes || ' ' ELSE '' END
      || 'Espessura ' || RTRIM (TO_CHAR (p_item_altura, 'FM999G999G999G999G999G990D999999999999999999'), TO_CHAR (0, 'D')) || ' CM'
      || ' X Largura ' || RTRIM (TO_CHAR (p_item_largura, 'FM999G999G999G999G999G990D999999999999999999'), TO_CHAR (0, 'D')) || ' CM',1,4000));
    IF p_item_controleQuantidade = 3 THEN
      v_observacoes := RTRIM(SUBSTR(v_observacoes || ' X Comprimento ' || RTRIM (TO_CHAR (p_item_comprimento, 'FM999G999G999G999G999G990D999999999999999999'), TO_CHAR (0, 'D')) || ' MT',1,4000));
    END IF;
  END IF;
  -- Volumes
  IF p_item_loteMultiplo <> 0 THEN
    v_observacoes := RTRIM(SUBSTR(CASE WHEN v_observacoes <> ' ' THEN v_observacoes || ' ' ELSE '' END || 'Volumes: ' || RTRIM (TO_CHAR (( p_item_quantidade / p_item_loteMultiplo), 'FM999G999G999G999G999G990')),1,4000));
  END IF;
  -- Composição preço
  IF p_tempComp_nomeTempComposicao IS NOT NULL AND p_tempComp_nomeTempComposicao <> ' ' THEN
    SELECT COALESCE(LISTAGG((RTRIM (comp.descricao) || CASE WHEN comp.informaQuantidade = 1 THEN ' ' || RTRIM (TO_CHAR (temp.quantidade, 'FM999G999G999G999G999G990D999999999999999999'), TO_CHAR (0, 'D')) ELSE '' END), ' ') WITHIN GROUP (ORDER BY comp.sequencia),' ') numeros
    INTO v_aux_observacoes
    FROM TEMPCOMPOSICAOPRECO temp
    JOIN CAPRODUTOXCOMPOSICOESPREC comp ON comp.composicaoPreco = temp.composicaoPreco
    WHERE temp.uniqueMachineID = p_uniqueMachineID
    AND temp.nomeTempComposicao = p_tempComp_nomeTempComposicao
    AND temp.sequencia = p_tempComp_sequencia
    AND temp.selecionado = 1;
  ELSIF p_Doc_Orc_Pre_Sep_Transf = 'D' AND p_item_id <> 0 THEN
    SELECT COALESCE(LISTAGG((RTRIM (comp.descricao) || CASE WHEN comp.informaQuantidade = 1 THEN ' ' || RTRIM (TO_CHAR (compDoc.quantidade, 'FM999G999G999G999G999G990D999999999999999999'), TO_CHAR (0, 'D')) ELSE '' END), ' ') WITHIN GROUP (ORDER BY comp.sequencia, compDoc.id),' ') numeros
    INTO v_aux_observacoes
    FROM MODOCFISCALXCOMPOSICOESPR compDoc
    JOIN CAPRODUTOXCOMPOSICOESPREC comp ON comp.composicaoPreco = compDoc.composicaoPreco
    WHERE compDoc.idItemDocFiscal = p_item_id
    AND compDoc.selecionado = 1;
  ELSIF p_Doc_Orc_Pre_Sep_Transf = 'O' AND p_item_id <> 0 THEN
    SELECT COALESCE(LISTAGG((RTRIM (comp.descricao) || CASE WHEN comp.informaQuantidade = 1 THEN ' ' || RTRIM (TO_CHAR (compDoc.quantidade, 'FM999G999G999G999G999G990D999999999999999999'), TO_CHAR (0, 'D')) ELSE '' END), ' ') WITHIN GROUP (ORDER BY comp.sequencia, compDoc.id),' ') numeros
    INTO v_aux_observacoes
    FROM MOORCAMENTOXCOMPOSICOESPR compDoc
    JOIN CAPRODUTOXCOMPOSICOESPREC comp ON comp.composicaoPreco = compDoc.composicaoPreco
    WHERE compDoc.idItemOrcamento = p_item_id
    AND compDoc.selecionado = 1;
  ELSIF p_Doc_Orc_Pre_Sep_Transf = 'P' AND p_item_id <> 0 THEN
    SELECT COALESCE(LISTAGG((RTRIM (comp.descricao) || CASE WHEN comp.informaQuantidade = 1 THEN ' ' || RTRIM (TO_CHAR (compDoc.quantidade, 'FM999G999G999G999G999G990D999999999999999999'), TO_CHAR (0, 'D')) ELSE '' END), ' ') WITHIN GROUP (ORDER BY comp.sequencia, compDoc.id),' ') numeros
    INTO v_aux_observacoes
    FROM MOPREDOCUMXCOMPOSICOESPR compDoc
    JOIN CAPRODUTOXCOMPOSICOESPREC comp ON comp.composicaoPreco = compDoc.composicaoPreco
    WHERE compDoc.idItemPreDocumento = p_item_id
    AND compDoc.selecionado = 1;
  ELSE
    v_aux_observacoes := ' ';
  END IF;
  IF NOT(v_aux_observacoes IS NULL) AND v_aux_observacoes <> ' ' THEN
    v_observacoes := RTRIM(SUBSTR(CASE WHEN v_observacoes <> ' ' THEN v_observacoes || ' ' ELSE '' END || v_aux_observacoes,1,4000));
  END IF;
  -- Observações Digitadas
  IF NOT(p_item_observacoesDigitadas IS NULL) AND p_item_observacoesDigitadas <> ' ' THEN
    v_observacoes := RTRIM(SUBSTR(CASE WHEN v_observacoes <> ' ' THEN v_observacoes || ' ' ELSE '' END || p_item_observacoesDigitadas,1,4000));
  END IF;
  -- Números Série
  IF p_item_id <> 0 THEN
    IF p_Doc_Orc_Pre_Sep_Transf = 'D' THEN
      SELECT COALESCE(LISTAGG(ns.numeroSerie, ' ') WITHIN GROUP (ORDER BY ns.numeroSerie),' ')
      INTO v_aux_observacoes
      FROM MODOCFISCALXNUMEROSSERIE nsDoc
      JOIN CAGRADEPRODUTOXNUMEROSSER ns ON ns.idNumeroSerie = nsDoc.idNumeroSerie
      WHERE nsDoc.idItemDocFiscal = p_item_id;
    ELSIF p_Doc_Orc_Pre_Sep_Transf = 'O' THEN
      SELECT COALESCE(LISTAGG(ns.numeroSerie, ' ') WITHIN GROUP (ORDER BY ns.numeroSerie),' ')
      INTO v_aux_observacoes
      FROM MOORCAMENTOXNUMEROSSERIE nsDoc
      JOIN CAGRADEPRODUTOXNUMEROSSER ns ON ns.idNumeroSerie = nsDoc.idNumeroSerie
      WHERE nsDoc.idItemOrcamento = p_item_id;
    ELSIF p_Doc_Orc_Pre_Sep_Transf = 'P' THEN
      SELECT COALESCE(LISTAGG(ns.numeroSerie, ' ') WITHIN GROUP (ORDER BY ns.numeroSerie),' ')
      INTO v_aux_observacoes
      FROM MOPREDOCUMXNUMEROSSERIE nsDoc
      JOIN CAGRADEPRODUTOXNUMEROSSER ns ON ns.idNumeroSerie = nsDoc.idNumeroSerie
      WHERE nsDoc.idItemPreDocumento = p_item_id;
    ELSIF p_Doc_Orc_Pre_Sep_Transf = 'S' THEN
      SELECT COALESCE(LISTAGG(ns.numeroSerie, ' ') WITHIN GROUP (ORDER BY ns.numeroSerie),' ')
      INTO v_aux_observacoes
      FROM MOSEPARACAOXNUMEROSSERIE nsDoc
      JOIN CAGRADEPRODUTOXNUMEROSSER ns ON ns.idNumeroSerie = nsDoc.idNumeroSerie
      WHERE nsDoc.idItemSeparacao = p_item_id;
    ELSIF p_Doc_Orc_Pre_Sep_Transf = 'T' THEN
      SELECT COALESCE(LISTAGG(ns.numeroSerie, ' ') WITHIN GROUP (ORDER BY ns.numeroSerie),' ')
      INTO v_aux_observacoes
      FROM MODOCTRANSFXNUMEROSSERIE nsDoc
      JOIN CAGRADEPRODUTOXNUMEROSSER ns ON ns.idNumeroSerie = nsDoc.idNumeroSerie
      WHERE nsDoc.idItemDocTransferencia = p_item_id;
    ELSE
      v_aux_observacoes := ' ';
    END IF;
    IF NOT(v_aux_observacoes IS NULL) AND v_aux_observacoes <> ' ' THEN
      v_observacoes := RTRIM(SUBSTR(CASE WHEN v_observacoes <> ' ' THEN v_observacoes || ' ' ELSE '' END || 'Seriais: ' || v_aux_observacoes,1,4000));
    END IF;
  END IF;
  IF v_observacoes IS NULL OR v_observacoes = ' ' THEN
    v_observacoes := ' ';
  END IF;
  RETURN v_observacoes;
END;

/

create or replace PROCEDURE ADD_CALCULA_TOTAIS_ITEM (
    p_cab_tipoPagamentoFrete       IN CHAR,
    p_modDoc_diminuiDescontoPrUnit IN NUMBER,
    p_modDoc_somaAcrescimosPrUnit  IN NUMBER,
    p_modDoc_somaFreteSeguroPrUnit IN NUMBER,
    p_item_quantidade              IN NUMBER,
    p_item_quantidadeConvertida    IN NUMBER,
    p_item_precoUnitarioBruto      IN NUMBER,
    p_item_acrescimoUnitarioCompos IN NUMBER,
    p_item_precoUnitario           IN NUMBER,
    p_item_valorDescontoItem       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_valorDescontoPagamento  IN NUMBER,
    p_item_valorOutrasDespPagam    IN NUMBER,
    p_item_valorJurosPagamento     IN NUMBER,
    p_item_quantidadeExtemporanea  IN NUMBER,
    p_item_acrescimoUnitarioExtemp IN NUMBER,
    p_item_valorAcrescExtempItem   IN NUMBER,
    p_item_valorAcrescExtempGeral  IN NUMBER,
    /* Retornos */
    r_item_precoUnitario           OUT NUMBER,
    r_item_precoUnitarioConvertido OUT NUMBER,
    r_item_valorProdutoServico     OUT NUMBER,
    r_item_precoUnitarioLiqConvert OUT NUMBER,
    r_item_valorTotalItem          OUT NUMBER,
    r_item_valorFreteTotal         OUT NUMBER,
    r_item_valorSeguroTotal        OUT NUMBER,
    r_item_valorDescontoTotal      OUT NUMBER,
    r_item_valorOutrasDespTotal    OUT NUMBER,
    r_item_valorAdicFreteMarTotal  OUT NUMBER,
    r_item_valorDespesasAduanTotal OUT NUMBER,
    r_item_valorAcrescExtempSubtot OUT NUMBER,
    r_item_valorAcrescExtempTotal  OUT NUMBER)
IS
BEGIN  
  IF p_modDoc_diminuiDescontoPrUnit   = 1
    OR p_modDoc_diminuiDescontoPrUnit = 1
    OR p_modDoc_somaAcrescimosPrUnit  = 1
    OR p_modDoc_somaFreteSeguroPrUnit = 1
    AND p_cab_tipoPagamentoFrete      <> 'V' THEN
    r_item_valorProdutoServico :=
      ROUND (p_item_quantidade * (p_item_precoUnitarioBruto + p_item_acrescimoUnitarioCompos),2)
      - CASE
          WHEN p_modDoc_diminuiDescontoPrUnit = 1
          THEN p_item_valorDescontoItem + p_item_valorDescontoGeral + p_item_valorDescontoPagamento
          ELSE 0
        END
      + CASE
          WHEN p_modDoc_somaAcrescimosPrUnit = 1
          THEN p_item_valorAcrescimoItem + p_item_valorOutrasDespGeral + p_item_valorOutrasDespPagam + p_item_valorJurosPagamento
          ELSE 0
        END
      + CASE
          WHEN p_modDoc_somaFreteSeguroPrUnit = 1 AND p_cab_tipoPagamentoFrete <> 'V'
          THEN p_item_valorFreteItem + p_item_valorFreteGeral + p_item_valorSeguroItem + p_item_valorSeguroGeral
          ELSE 0
        END;
    IF ROUND (p_item_quantidade * (p_item_precoUnitarioBruto + p_item_acrescimoUnitarioCompos),2) = r_item_valorProdutoServico THEN
      r_item_precoUnitario := p_item_precoUnitarioBruto + p_item_acrescimoUnitarioCompos;
    ELSE
      r_item_precoUnitario := ROUND (r_item_valorProdutoServico / CASE WHEN p_item_quantidade = 0 THEN 1 ELSE p_item_quantidade END, 7);
    END IF;
  ELSE
    r_item_precoUnitario           := p_item_precoUnitario;
    r_item_valorProdutoServico     := ROUND (p_item_quantidade * p_item_precoUnitario,2);
  END IF;
  r_item_valorDescontoTotal :=
    CASE
      WHEN p_modDoc_diminuiDescontoPrUnit = 1
      THEN 0
      ELSE p_item_valorDescontoItem + p_item_valorDescontoGeral + p_item_valorDescontoPagamento
    END;
  r_item_valorOutrasDespTotal :=
    CASE
      WHEN p_modDoc_somaAcrescimosPrUnit = 1
      THEN 0
      ELSE p_item_valorAcrescimoItem + p_item_valorOutrasDespGeral + p_item_valorOutrasDespPagam + p_item_valorJurosPagamento
    END;
  r_item_valorFreteTotal :=
    CASE
      WHEN p_modDoc_somaFreteSeguroPrUnit = 1 AND p_cab_tipoPagamentoFrete <> 'V'
      THEN 0
      ELSE p_item_valorFreteItem  + p_item_valorFreteGeral
    END;
  r_item_valorSeguroTotal :=
    CASE
      WHEN p_modDoc_somaFreteSeguroPrUnit = 1 AND p_cab_tipoPagamentoFrete <> 'V'
      THEN 0
      ELSE p_item_valorSeguroItem + p_item_valorSeguroGeral
    END;
  r_item_valorAdicFreteMarTotal  := p_item_valorAdicFreteMarItem + p_item_valorAdicFreteMarGeral;
  r_item_valorDespesasAduanTotal := p_item_valorDespesasAduanItem + p_item_valorDespesasAduanGeral;
  r_item_precoUnitarioConvertido :=
    CASE
      WHEN p_item_quantidadeConvertida <> 0 AND p_item_quantidadeConvertida <> p_item_quantidade
      THEN ROUND (r_item_valorProdutoServico / p_item_quantidadeConvertida,7)
      ELSE r_item_precoUnitario
    END;
  r_item_valorAcrescExtempSubtot := ROUND (
    (p_item_quantidade + p_item_quantidadeExtemporanea) * p_item_acrescimoUnitarioExtemp
    + p_item_quantidadeExtemporanea * r_item_precoUnitario,2);
  r_item_valorAcrescExtempTotal  := r_item_valorAcrescExtempSubtot + p_item_valorAcrescExtempItem + p_item_valorAcrescExtempGeral;
  r_item_valorTotalItem :=
    r_item_valorProdutoServico
    - CASE
        WHEN p_modDoc_diminuiDescontoPrUnit = 1
        THEN 0
        ELSE p_item_valorDescontoItem
      END
    + CASE
        WHEN p_modDoc_somaAcrescimosPrUnit = 1
        THEN 0
        ELSE p_item_valorAcrescimoItem
      END
    - CASE
        WHEN p_modDoc_somaFreteSeguroPrUnit = 1 AND p_cab_tipoPagamentoFrete <> 'V'
        THEN p_item_valorFreteItem + p_item_valorFreteGeral + p_item_valorSeguroItem + p_item_valorSeguroGeral
        ELSE 0
      END;
  r_item_precoUnitarioLiqConvert := ROUND (r_item_valorTotalItem / CASE WHEN p_item_quantidadeConvertida = 0 THEN 1 ELSE p_item_quantidadeConvertida END, 7);
END ADD_CALCULA_TOTAIS_ITEM;

/

create or replace PROCEDURE ADD_ORCAMENTO_ITEM_GRAVA (
    p_uniqueMachineID              IN VARCHAR2,
    p_estabelecimentoAtivo         IN NUMBER,
    p_config_198_obs_add_referenc  IN NUMBER,
    p_config_199_obs_add_caractA   IN NUMBER,
    p_config_200_obs_add_caractB   IN NUMBER,
    p_config_201_obs_add_caractC   IN NUMBER,
    p_config_202_obs_add_caractD   IN NUMBER,
    p_config_203_obs_add_caractE   IN NUMBER,
    p_tempComp_nomeTempComposicao  IN VARCHAR2,
    p_tempComp_sequencia           IN NUMBER,
    p_obrigaFinalizar              IN NUMBER,
    p_cab_orcamento                IN NUMBER,
    p_cab_modeloDocumento          IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEmissao              IN DATE,
    p_cab_dataEntrega              IN DATE,
    p_etOrc_situacaoOrcamento      IN NUMBER,
    p_item_idItemOrcamento         IN NUMBER,
    p_item_sequencia               IN NUMBER,
    p_a_item_cancelado             IN NUMBER,
    p_item_cancelado               IN NUMBER,
    p_item_vendedor                IN NUMBER,
    p_a_item_gradeProduto          IN NUMBER,
    p_item_gradeProduto            IN NUMBER,
    p_item_servico                 IN NUMBER,
    p_item_atividadeServico        IN NUMBER,
    p_item_statusAtividadeServico  IN CHAR,
    p_a_item_idFormulaTinta        IN NUMBER,
    p_item_idFormulaTinta          IN NUMBER,
    p_item_personalizacao          IN NUMBER,
    p_a_item_idLoteEstoque         IN NUMBER,
    p_item_idLoteEstoque           IN NUMBER,
    p_item_vinculoItemDocumento    IN NUMBER,
    p_item_operacaoFiscal          IN NUMBER,
    p_a_item_movimentaEstoque      IN NUMBER,
    p_item_movimentaEstoque        IN NUMBER,
    p_item_geraFinanceiro          IN NUMBER,
    p_a_item_localEstoque          IN NUMBER,
    p_item_localEstoque            IN NUMBER,
    p_a_item_pessoaParticipante    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_a_item_quantidadeSaldo       IN NUMBER,
    p_item_quantidadeSaldo         IN NUMBER,
    p_item_controleEntrega         IN NUMBER,
    p_item_situacaoEntrega         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_valorBasePagamento      IN NUMBER,
    p_item_valorDescontoPagamento  IN NUMBER,
    p_item_valorOutrasDespPag      IN NUMBER,
    p_item_valorJurosPagamento     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_cfop                    IN NUMBER,
    p_item_indicadorISSQN          IN CHAR,
    p_item_aliquotaISSQN           IN NUMBER,
    p_item_baseISSQN               IN NUMBER,
    p_item_valorISSQN              IN NUMBER,
    p_item_aliquotaIRRF            IN NUMBER,
    p_item_baseIRRF                IN NUMBER,
    p_item_valorIRRF               IN NUMBER,
    p_item_aliquotaINSS            IN NUMBER,
    p_item_baseINSS                IN NUMBER,
    p_item_valorINSS               IN NUMBER,
    p_item_retencaoPIS             IN NUMBER,
    p_item_baseRetPIS              IN NUMBER,
    p_item_valorRetPIS             IN NUMBER,
    p_item_retencaoCOFINS          IN NUMBER,
    p_item_baseRetCOFINS           IN NUMBER,
    p_item_valorRetCOFINS          IN NUMBER,
    p_item_retencaoCSLL            IN NUMBER,
    p_item_baseRetCSLL             IN NUMBER,
    p_item_valorRetCSLL            IN NUMBER,
    p_item_aliquotaII              IN NUMBER,
    p_item_baseII                  IN NUMBER,
    p_item_valorII                 IN NUMBER,
    p_item_aliquotaIOF             IN NUMBER,
    p_item_baseIOF                 IN NUMBER,
    p_item_valorIOF                IN NUMBER,
    p_item_codigoEnquadramentoIPI  IN NUMBER,
    p_item_stIPI                   IN CHAR,
    p_item_aliquotaIPI             IN NUMBER,
    p_item_valorAliquotaIPI        IN NUMBER,
    p_item_baseIPI                 IN NUMBER,
    p_item_valorIPI                IN NUMBER,
    p_item_stPIS                   IN CHAR,
    p_item_aliquotaPIS             IN NUMBER,
    p_item_valorAliquotaPIS        IN NUMBER,
    p_item_basePIS                 IN NUMBER,
    p_item_valorPIS                IN NUMBER,
    p_item_aliquotaPISST           IN NUMBER,
    p_item_valorAliquotaPISST      IN NUMBER,
    p_item_basePISST               IN NUMBER,
    p_item_valorPISST              IN NUMBER,
    p_item_stCOFINS                IN CHAR,
    p_item_aliquotaCOFINS          IN NUMBER,
    p_item_valorAliquotaCOFINS     IN NUMBER,
    p_item_baseCOFINS              IN NUMBER,
    p_item_valorCOFINS             IN NUMBER,
    p_item_aliquotaCOFINSST        IN NUMBER,
    p_item_valorAliquotaCOFINSST   IN NUMBER,
    p_item_baseCOFINSST            IN NUMBER,
    p_item_valorCOFINSST           IN NUMBER,
    p_item_stSimplesNacional       IN CHAR,
    p_item_creditoSimplesNacional  IN NUMBER,
    p_item_baseCreditoSimplesNac   IN NUMBER,
    p_item_valorCreditoSimplesNac  IN NUMBER,
    p_item_stICMS                  IN CHAR,
    p_item_modalBaseCalcICMS       IN CHAR,
    p_item_reducaoBaseICMS         IN NUMBER,
    p_item_aliquotaICMS            IN NUMBER,
    p_item_diferimentoICMS         IN NUMBER,
    p_item_motivoDesoneracaoICMS   IN CHAR,
    p_item_baseICMS                IN NUMBER,
    p_item_valorICMSOperacao       IN NUMBER,
    p_item_valorICMSDiferido       IN NUMBER,
    p_item_valorICMS               IN NUMBER,
    p_item_valorICMSDesoneracao    IN NUMBER,
    p_item_modalBaseCalcICMSST     IN CHAR,
    p_item_margemValorAdicionadoST IN NUMBER,
    p_item_reducaoBaseST           IN NUMBER,
    p_item_aliquotaICMSST          IN NUMBER,
    p_item_aliquotaSTSuportConsFin IN NUMBER,
    p_item_baseICMSST              IN NUMBER,
    p_item_valorICMSST             IN NUMBER,
    p_item_baseICMSSTAnteriormente IN NUMBER,
    p_item_valorICMSSTAnteriorm    IN NUMBER,
    p_item_valorICMSProprioSubstit IN NUMBER,
    p_item_reducaoBaseICMSEfetivo  IN NUMBER,
    p_item_aliquotaICMSEfetivo     IN NUMBER,
    p_item_baseICMSEfetivo         IN NUMBER,
    p_item_valorICMSEfetivo        IN NUMBER,
    p_item_aliquotaICMSUFDestinat  IN NUMBER,
    p_item_aliquotaICMSInterestad  IN NUMBER,
    p_item_partilhaICMSInterestad  IN NUMBER,
    p_item_baseICMSUFDestinatario  IN NUMBER,
    p_item_valorICMSUFDestinatario IN NUMBER,
    p_item_baseICMSUFRemetente     IN NUMBER,
    p_item_valorICMSUFRemetente    IN NUMBER,
    p_item_aliquotaFCP             IN NUMBER,
    p_item_baseFCP                 IN NUMBER,
    p_item_valorFCP                IN NUMBER,
    p_item_aliquotaFCPST           IN NUMBER,
    p_item_baseFCPST               IN NUMBER,
    p_item_valorFCPST              IN NUMBER,
    p_item_aliquotaFCPSTAnteriorm  IN NUMBER,
    p_item_baseFCPSTAnteriormente  IN NUMBER,
    p_item_valorFCPSTAnteriormente IN NUMBER,
    p_item_aliquotaFCPUFDestinat   IN NUMBER,
    p_item_baseFCPUFDestinatario   IN NUMBER,
    p_item_valorFCPUFDestinatario  IN NUMBER,
    p_item_aliquotaEstImpFederais  IN NUMBER,
    p_item_aliquotaEstImpEstaduais IN NUMBER,
    p_item_aliquotaEstImpMunicipai IN NUMBER,
    p_item_baseEstimadaImpostos    IN NUMBER,
    p_item_valorEstImpFederais     IN NUMBER,
    p_item_valorEstImpEstaduais    IN NUMBER,
    p_item_valorEstImpMunicipais   IN NUMBER,
    p_item_valorImpostosSomaPag    IN NUMBER,
    p_item_valorImpostosDiminuiPag IN NUMBER,
    p_item_valorLiquidoItem        IN NUMBER,
    p_item_observacoesDigitadas    IN VARCHAR2,
    /* Retornos */
    r_obrigaFinalizar              OUT NUMBER,
    r_item_idItemOrcamento         OUT NUMBER)
IS
    v_item_observacoes             VARCHAR2 (4000);
    v_auxVarchar                   VARCHAR2 (32000);
BEGIN
  r_obrigaFinalizar      := p_obrigaFinalizar;
  r_item_idItemOrcamento := p_item_idItemOrcamento;
  IF r_item_idItemOrcamento = 0 THEN
    r_item_idItemOrcamento := FUNC_BUSCA_PROXIMO_ID ('MOORCAMENTOXITENS', p_estabelecimentoAtivo, NULL);
  END IF;
  v_item_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
    p_uniqueMachineID,
    p_config_198_obs_add_referenc,
    p_config_199_obs_add_caractA,
    p_config_200_obs_add_caractB,
    p_config_201_obs_add_caractC,
    p_config_202_obs_add_caractD,
    p_config_203_obs_add_caractE,
    p_tempComp_nomeTempComposicao,
    p_tempComp_sequencia,
    'O',
    r_item_idItemOrcamento,
    p_item_gradeProduto,
    p_item_idFormulaTinta,
    p_item_personalizacao,
    p_item_idLoteEstoque,
    p_item_controleQuantidade,
    p_item_loteMultiplo,
    p_item_altura,
    p_item_largura,
    p_item_comprimento,
    p_item_quantidade,
    p_item_observacoesDigitadas);
  MERGE INTO MOORCAMENTOXITENS a USING (
    SELECT
      r_item_idItemOrcamento         idItemOrcamento,
      p_cab_orcamento                orcamento,
      p_item_sequencia               sequencia,
      p_item_cancelado               cancelado,
      p_item_vendedor                vendedor,
      p_item_gradeProduto            gradeProduto,
      p_item_servico                 servico,
      p_item_atividadeServico        atividadeServico,
      p_item_statusAtividadeServico  statusAtividadeServico,
      p_item_idFormulaTinta          idFormulaTinta,
      p_item_personalizacao          personalizacao,
      p_item_idLoteEstoque           idLoteEstoque,
      p_item_vinculoItemDocumento    vinculoItemDocumento,
      p_item_operacaoFiscal          operacaoFiscal,
      p_item_movimentaEstoque        movimentaEstoque,
      p_item_geraFinanceiro          geraFinanceiro,
      p_item_localEstoque            localEstoque,
      p_item_pessoaParticipante      pessoaParticipante,
      p_item_dataEntrega             dataEntrega,
      p_item_controleQuantidade      controleQuantidade,
      p_item_unidadeMedidaConversao  unidadeMedidaConversao,
      p_item_conversorQuantidade     conversorQuantidade,
      p_item_loteMinimo              loteMinimo,
      p_item_loteMultiplo            loteMultiplo,
      p_item_altura                  altura,
      p_item_largura                 largura,
      p_item_comprimento             comprimento,
      p_item_pecas                   pecas,
      p_item_quantidade              quantidade,
      p_item_quantidadeConvertida    quantidadeConvertida,
      p_item_quantidadeSaldo         quantidadeSaldo,
      p_item_controleEntrega         controleEntrega,
      p_item_situacaoEntrega         situacaoEntrega,
      p_item_pesoLiquido             pesoLiquido,
      p_item_pesoBruto               pesoBruto,
      p_item_tipoPreco               tipoPreco,
      p_item_tabelaPreco             tabelaPreco,
      p_item_precoSugestaoAPrazo     precoSugestaoAPrazo,
      p_item_precoSugestaoAVista     precoSugestaoAVista,
      p_item_precoDesconto           precoDesconto,
      p_item_precoMinimo             precoMinimo,
      p_item_usarPrecoAVista         usarPrecoAVista,
      p_item_precoPautaTabelado      precoPautaTabelado,
      p_item_precoUnitarioBruto      precoUnitarioBruto,
      p_item_acrescimoUnitarioCompos acrescimoUnitarioComposicao,
      p_item_precoUnitario           precoUnitario,
      p_item_precoUnitarioConvertido precoUnitarioConvertido,
      p_item_valorProdutoServicoBrut valorProdutoServicoBruto,
      p_item_valorProdutoServico     valorProdutoServico,
      p_item_percDescontoItem        percDescontoItem,
      p_item_valorDescontoItem       valorDescontoItem,
      p_item_percAcrescimoItem       percAcrescimoItem,
      p_item_valorAcrescimoItem      valorAcrescimoItem,
      p_item_valorFreteItem          valorFreteItem,
      p_item_valorSeguroItem         valorSeguroItem,
      p_item_valorAdicFreteMarItem   valorAdicFreteMarinhaMerItem,
      p_item_valorDespesasAduanItem  valorDespesasAduaneirasItem,
      p_item_valorFreteGeral         valorFreteGeral,
      p_item_valorSeguroGeral        valorSeguroGeral,
      p_item_valorDescontoGeral      valorDescontoGeral,
      p_item_valorOutrasDespGeral    valorOutrasDespesasGeral,
      p_item_valorAdicFreteMarGeral  valorAdicFreteMarinhaMerGeral,
      p_item_valorDespesasAduanGeral valorDespesasAduaneirasGeral,
      p_item_valorBasePagamento      valorBasePagamento,
      p_item_valorDescontoPagamento  valorDescontoPagamento,
      p_item_valorOutrasDespPag      valorOutrasDespesasPagamento,
      p_item_valorJurosPagamento     valorJurosPagamento,
      p_item_valorFreteTotal         valorFreteTotal,
      p_item_valorSeguroTotal        valorSeguroTotal,
      p_item_valorDescontoTotal      valorDescontoTotal,
      p_item_valorOutrasDespTotal    valorOutrasDespesasTotal,
      p_item_valorAdicFreteMarTotal  valorAdicFreteMarinhaMerTotal,
      p_item_valorDespesasAduanTotal valorDespesasAduaneirasTotal,
      p_item_cfop                    cfop,
      p_item_indicadorISSQN          indicadorISSQN,
      p_item_aliquotaISSQN           aliquotaISSQN,
      p_item_baseISSQN               baseISSQN,
      p_item_valorISSQN              valorISSQN,
      p_item_aliquotaIRRF            aliquotaIRRF,
      p_item_baseIRRF                baseIRRF,
      p_item_valorIRRF               valorIRRF,
      p_item_aliquotaINSS            aliquotaINSS,
      p_item_baseINSS                baseINSS,
      p_item_valorINSS               valorINSS,
      p_item_retencaoPIS             retencaoPIS,
      p_item_baseRetPIS              baseRetPIS,
      p_item_valorRetPIS             valorRetPIS,
      p_item_retencaoCOFINS          retencaoCOFINS,
      p_item_baseRetCOFINS           baseRetCOFINS,
      p_item_valorRetCOFINS          valorRetCOFINS,
      p_item_retencaoCSLL            retencaoCSLL,
      p_item_baseRetCSLL             baseRetCSLL,
      p_item_valorRetCSLL            valorRetCSLL,
      p_item_aliquotaII              aliquotaII,
      p_item_baseII                  baseII,
      p_item_valorII                 valorII,
      p_item_aliquotaIOF             aliquotaIOF,
      p_item_baseIOF                 baseIOF,
      p_item_valorIOF                valorIOF,
      p_item_codigoEnquadramentoIPI  codigoEnquadramentoIPI,
      p_item_stIPI                   stIPI,
      p_item_aliquotaIPI             aliquotaIPI,
      p_item_valorAliquotaIPI        valorAliquotaIPI,
      p_item_baseIPI                 baseIPI,
      p_item_valorIPI                valorIPI,
      p_item_stPIS                   stPIS,
      p_item_aliquotaPIS             aliquotaPIS,
      p_item_valorAliquotaPIS        valorAliquotaPIS,
      p_item_basePIS                 basePIS,
      p_item_valorPIS                valorPIS,
      p_item_aliquotaPISST           aliquotaPISST,
      p_item_valorAliquotaPISST      valorAliquotaPISST,
      p_item_basePISST               basePISST,
      p_item_valorPISST              valorPISST,
      p_item_stCOFINS                stCOFINS,
      p_item_aliquotaCOFINS          aliquotaCOFINS,
      p_item_valorAliquotaCOFINS     valorAliquotaCOFINS,
      p_item_baseCOFINS              baseCOFINS,
      p_item_valorCOFINS             valorCOFINS,
      p_item_aliquotaCOFINSST        aliquotaCOFINSST,
      p_item_valorAliquotaCOFINSST   valorAliquotaCOFINSST,
      p_item_baseCOFINSST            baseCOFINSST,
      p_item_valorCOFINSST           valorCOFINSST,
      p_item_stSimplesNacional       stSimplesNacional,
      p_item_creditoSimplesNacional  creditoSimplesNacional,
      p_item_baseCreditoSimplesNac   baseCreditoSimplesNacional,
      p_item_valorCreditoSimplesNac  valorCreditoSimplesNacional,
      p_item_stICMS                  stICMS,
      p_item_modalBaseCalcICMS       modalidadeBaseCalcICMS,
      p_item_reducaoBaseICMS         reducaoBaseICMS,
      p_item_aliquotaICMS            aliquotaICMS,
      p_item_diferimentoICMS         diferimentoICMS,
      p_item_motivoDesoneracaoICMS   motivoDesoneracaoICMS,
      p_item_baseICMS                baseICMS,
      p_item_valorICMSOperacao       valorICMSOperacao,
      p_item_valorICMSDiferido       valorICMSDiferido,
      p_item_valorICMS               valorICMS,
      p_item_valorICMSDesoneracao    valorICMSDesoneracao,
      p_item_modalBaseCalcICMSST     modalidadeBaseCalcICMSST,
      p_item_margemValorAdicionadoST margemValorAdicionadoST,
      p_item_reducaoBaseST           reducaoBaseST,
      p_item_aliquotaICMSST          aliquotaICMSST,
      p_item_aliquotaSTSuportConsFin aliquotaSTSuportConsFinal,
      p_item_baseICMSST              baseICMSST,
      p_item_valorICMSST             valorICMSST,
      p_item_baseICMSSTAnteriormente baseICMSSTAnteriormente,
      p_item_valorICMSSTAnteriorm    valorICMSSTAnteriormente,
      p_item_valorICMSProprioSubstit valorICMSProprioSubstituto,
      p_item_reducaoBaseICMSEfetivo  reducaoBaseICMSEfetivo,
      p_item_aliquotaICMSEfetivo     aliquotaICMSEfetivo,
      p_item_baseICMSEfetivo         baseICMSEfetivo,
      p_item_valorICMSEfetivo        valorICMSEfetivo,
      p_item_aliquotaICMSUFDestinat  aliquotaICMSUFDestinatario,
      p_item_aliquotaICMSInterestad  aliquotaICMSInterestadual,
      p_item_partilhaICMSInterestad  partilhaICMSInterestadual,
      p_item_baseICMSUFDestinatario  baseICMSUFDestinatario,
      p_item_valorICMSUFDestinatario valorICMSUFDestinatario,
      p_item_baseICMSUFRemetente     baseICMSUFRemetente,
      p_item_valorICMSUFRemetente    valorICMSUFRemetente,
      p_item_aliquotaFCP             aliquotaFCP,
      p_item_baseFCP                 baseFCP,
      p_item_valorFCP                valorFCP,
      p_item_aliquotaFCPST           aliquotaFCPST,
      p_item_baseFCPST               baseFCPST,
      p_item_valorFCPST              valorFCPST,
      p_item_aliquotaFCPSTAnteriorm  aliquotaFCPSTAnteriormente,
      p_item_baseFCPSTAnteriormente  baseFCPSTAnteriormente,
      p_item_valorFCPSTAnteriormente valorFCPSTAnteriormente,
      p_item_aliquotaFCPUFDestinat   aliquotaFCPUFDestinatario,
      p_item_baseFCPUFDestinatario   baseFCPUFDestinatario,
      p_item_valorFCPUFDestinatario  valorFCPUFDestinatario,
      p_item_aliquotaEstImpFederais  aliquotaEstimadaImpFederais,
      p_item_aliquotaEstImpEstaduais aliquotaEstimadaImpEstaduais,
      p_item_aliquotaEstImpMunicipai aliquotaEstimadaImpMunicipais,
      p_item_baseEstimadaImpostos    baseEstimadaImpostos,
      p_item_valorEstImpFederais     valorEstimadoImpFederais,
      p_item_valorEstImpEstaduais    valorEstimadoImpEstaduais,
      p_item_valorEstImpMunicipais   valorEstimadoImpMunicipais,
      p_item_valorImpostosSomaPag    valorImpostosSomaPagamento,
      p_item_valorImpostosDiminuiPag valorImpostosDiminuiPagamento,
      p_item_valorLiquidoItem        valorLiquidoItem,
      p_item_observacoesDigitadas    observacoesDigitadas,
      v_item_observacoes             observacoes
    FROM DUAL) b ON (a.idItemOrcamento = b.idItemOrcamento)
  WHEN MATCHED THEN UPDATE SET
    a.orcamento                     = b.orcamento,
    a.sequencia                     = b.sequencia,
    a.cancelado                     = b.cancelado,
    a.vendedor                      = b.vendedor,
    a.gradeProduto                  = b.gradeProduto,
    a.servico                       = b.servico,
    a.atividadeServico              = b.atividadeServico,
    a.statusAtividadeServico        = b.statusAtividadeServico,
    a.idFormulaTinta                = b.idFormulaTinta,
    a.personalizacao                = b.personalizacao,
    a.idLoteEstoque                 = b.idLoteEstoque,
    a.vinculoItemDocumento          = b.vinculoItemDocumento,
    a.operacaoFiscal                = b.operacaoFiscal,
    a.movimentaEstoque              = b.movimentaEstoque,
    a.geraFinanceiro                = b.geraFinanceiro,
    a.localEstoque                  = b.localEstoque,
    a.pessoaParticipante            = b.pessoaParticipante,
    a.dataEntrega                   = b.dataEntrega,
    a.controleQuantidade            = b.controleQuantidade,
    a.unidadeMedidaConversao        = b.unidadeMedidaConversao,
    a.conversorQuantidade           = b.conversorQuantidade,
    a.loteMinimo                    = b.loteMinimo,
    a.loteMultiplo                  = b.loteMultiplo,
    a.altura                        = b.altura,
    a.largura                       = b.largura,
    a.comprimento                   = b.comprimento,
    a.pecas                         = b.pecas,
    a.quantidade                    = b.quantidade,
    a.quantidadeConvertida          = b.quantidadeConvertida,
    a.quantidadeSaldo               = b.quantidadeSaldo,
    a.controleEntrega               = b.controleEntrega,
    a.situacaoEntrega               = b.situacaoEntrega,
    a.pesoLiquido                   = b.pesoLiquido,
    a.pesoBruto                     = b.pesoBruto,
    a.tipoPreco                     = b.tipoPreco,
    a.tabelaPreco                   = b.tabelaPreco,
    a.precoSugestaoAPrazo           = b.precoSugestaoAPrazo,
    a.precoSugestaoAVista           = b.precoSugestaoAVista,
    a.precoDesconto                 = b.precoDesconto,
    a.precoMinimo                   = b.precoMinimo,
    a.usarPrecoAVista               = b.usarPrecoAVista,
    a.precoPautaTabelado            = b.precoPautaTabelado,
    a.precoUnitarioBruto            = b.precoUnitarioBruto,
    a.acrescimoUnitarioComposicao   = b.acrescimoUnitarioComposicao,
    a.precoUnitario                 = b.precoUnitario,
    a.precoUnitarioConvertido       = b.precounitarioConvertido,
    a.valorProdutoServicoBruto      = b.valorProdutoServicoBruto,
    a.valorProdutoServico           = b.valorProdutoServico,
    a.percDescontoItem              = b.percDescontoItem,
    a.valorDescontoItem             = b.valorDescontoItem,
    a.percAcrescimoItem             = b.percAcrescimoItem,
    a.valorAcrescimoItem            = b.valorAcrescimoItem,
    a.valorFreteItem                = b.valorFreteItem,
    a.valorSeguroItem               = b.valorSeguroItem,
    a.valorAdicFreteMarinhaMerItem  = b.valorAdicFreteMarinhaMerItem,
    a.valorDespesasAduaneirasItem   = b.valorDespesasAduaneirasItem,
    a.valorFreteGeral               = b.valorFreteGeral,
    a.valorSeguroGeral              = b.valorSeguroGeral,
    a.valorDescontoGeral            = b.valorDescontoGeral,
    a.valorOutrasDespesasGeral      = b.valorOutrasDespesasGeral,
    a.valorAdicFreteMarinhaMerGeral = b.valorAdicFreteMarinhaMerGeral,
    a.valorDespesasAduaneirasGeral  = b.valorDespesasAduaneirasGeral,
    a.valorBasePagamento            = b.valorBasePagamento,
    a.valorDescontoPagamento        = b.valorDescontoPagamento,
    a.valorOutrasDespesasPagamento  = b.valorOutrasDespesasPagamento,
    a.valorJurosPagamento           = b.valorJurosPagamento,
    a.valorFreteTotal               = b.valorFreteTotal,
    a.valorSeguroTotal              = b.valorSeguroTotal,
    a.valorDescontoTotal            = b.valorDescontoTotal,
    a.valorOutrasDespesasTotal      = b.valorOutrasDespesasTotal,
    a.valorAdicFreteMarinhaMerTotal = b.valorAdicFreteMarinhaMerTotal,
    a.valorDespesasAduaneirasTotal  = b.valorDespesasAduaneirasTotal,
    a.cfop                          = b.cfop,
    a.indicadorISSQN                = b.indicadorISSQN,
    a.aliquotaISSQN                 = b.aliquotaISSQN,
    a.baseISSQN                     = b.baseISSQN,
    a.valorISSQN                    = b.valorISSQN,
    a.aliquotaIRRF                  = b.aliquotaIRRF,
    a.baseIRRF                      = b.baseIRRF,
    a.valorIRRF                     = b.valorIRRF,
    a.aliquotaINSS                  = b.aliquotaINSS,
    a.baseINSS                      = b.baseINSS,
    a.valorINSS                     = b.valorINSS,
    a.retencaoPIS                   = b.retencaoPIS,
    a.baseRetPIS                    = b.baseRetPIS,
    a.valorRetPIS                   = b.valorRetPIS,
    a.retencaoCOFINS                = b.retencaoCOFINS,
    a.baseRetCOFINS                 = b.baseRetCOFINS,
    a.valorRetCOFINS                = b.valorRetCOFINS,
    a.retencaoCSLL                  = b.retencaoCSLL,
    a.baseRetCSLL                   = b.baseRetCSLL,
    a.valorRetCSLL                  = b.valorRetCSLL,
    a.aliquotaII                    = b.aliquotaII,
    a.baseII                        = b.baseII,
    a.valorII                       = b.valorII,
    a.aliquotaIOF                   = b.aliquotaIOF,
    a.baseIOF                       = b.baseIOF,
    a.valorIOF                      = b.valorIOF,
    a.codigoEnquadramentoIPI        = b.codigoEnquadramentoIPI,
    a.stIPI                         = b.stIPI,
    a.aliquotaIPI                   = b.aliquotaIPI,
    a.valorAliquotaIPI              = b.valorAliquotaIPI,
    a.baseIPI                       = b.baseIPI,
    a.valorIPI                      = b.valorIPI,
    a.stPIS                         = b.stPIS,
    a.aliquotaPIS                   = b.aliquotaPIS,
    a.valorAliquotaPIS              = b.valorAliquotaPIS,
    a.basePIS                       = b.basePIS,
    a.valorPIS                      = b.valorPIS,
    a.aliquotaPISST                 = b.aliquotaPISST,
    a.valorAliquotaPISST            = b.valorAliquotaPISST,
    a.basePISST                     = b.basePISST,
    a.valorPISST                    = b.valorPISST,
    a.stCOFINS                      = b.stCOFINS,
    a.aliquotaCOFINS                = b.aliquotaCOFINS,
    a.valorAliquotaCOFINS           = b.valorAliquotaCOFINS,
    a.baseCOFINS                    = b.baseCOFINS,
    a.valorCOFINS                   = b.valorCOFINS,
    a.aliquotaCOFINSST              = b.aliquotaCOFINSST,
    a.valorAliquotaCOFINSST         = b.valorAliquotaCOFINSST,
    a.baseCOFINSST                  = b.baseCOFINSST,
    a.valorCOFINSST                 = b.valorCOFINSST,
    a.stSimplesNacional             = b.stSimplesNacional,
    a.creditoSimplesNacional        = b.creditoSimplesNacional,
    a.baseCreditoSimplesNacional    = b.baseCreditoSimplesNacional,
    a.valorCreditoSimplesNacional   = b.valorCreditoSimplesNacional,
    a.stICMS                        = b.stICMS,
    a.modalidadeBaseCalcICMS        = b.modalidadeBaseCalcICMS,
    a.reducaoBaseICMS               = b.reducaoBaseICMS,
    a.aliquotaICMS                  = b.aliquotaICMS,
    a.diferimentoICMS               = b.diferimentoICMS,
    a.motivoDesoneracaoICMS         = b.motivoDesoneracaoICMS,
    a.baseICMS                      = b.baseICMS,
    a.valorICMSoperacao             = b.valorICMSoperacao,
    a.valorICMSdiferido             = b.valorICMSdiferido,
    a.valorICMS                     = b.valorICMS,
    a.valorICMSdesoneracao          = b.valorICMSdesoneracao,
    a.modalidadeBaseCalcICMSST      = b.modalidadeBaseCalcICMSST,
    a.margemValorAdicionadoST       = b.margemValorAdicionadoST,
    a.reducaoBaseST                 = b.reducaoBaseST,
    a.aliquotaICMSST                = b.aliquotaICMSST,
    a.aliquotaSTSuportConsFinal     = b.aliquotaSTSuportConsFinal,
    a.baseICMSST                    = b.baseICMSST,
    a.valorICMSST                   = b.valorICMSST,
    a.baseICMSSTAnteriormente       = b.baseICMSSTAnteriormente,
    a.valorICMSSTAnteriormente      = b.valorICMSSTAnteriormente,
    a.valorICMSProprioSubstituto    = b.valorICMSProprioSubstituto,
    a.reducaoBaseICMSEfetivo        = b.reducaoBaseICMSEfetivo,
    a.aliquotaICMSEfetivo           = b.aliquotaICMSEfetivo,
    a.baseICMSEfetivo               = b.baseICMSEfetivo,
    a.valorICMSEfetivo              = b.valorICMSEfetivo,
    a.aliquotaICMSUFDestinatario    = b.aliquotaICMSUFDestinatario,
    a.aliquotaICMSInterestadual     = b.aliquotaICMSInterestadual,
    a.partilhaICMSInterestadual     = b.partilhaICMSInterestadual,
    a.baseICMSUFDestinatario        = b.baseICMSUFDestinatario,
    a.valorICMSUFDestinatario       = b.valorICMSUFDestinatario,
    a.baseICMSUFRemetente           = b.baseICMSUFRemetente,
    a.valorICMSUFRemetente          = b.valorICMSUFRemetente,
    a.aliquotaFCP                   = b.aliquotaFCP,
    a.baseFCP                       = b.baseFCP,
    a.valorFCP                      = b.valorFCP,
    a.aliquotaFCPST                 = b.aliquotaFCPST,
    a.baseFCPST                     = b.baseFCPST,
    a.valorFCPST                    = b.valorFCPST,
    a.aliquotaFCPSTAnteriormente    = b.aliquotaFCPSTAnteriormente,
    a.baseFCPSTAnteriormente        = b.baseFCPSTAnteriormente,
    a.valorFCPSTAnteriormente       = b.valorFCPSTAnteriormente,
    a.aliquotaFCPUFDestinatario     = b.aliquotaFCPUFDestinatario,
    a.baseFCPUFDestinatario         = b.baseFCPUFDestinatario,
    a.valorFCPUFDestinatario        = b.valorFCPUFDestinatario,
    a.aliquotaestimadaimpfederais   = b.aliquotaestimadaimpfederais,
    a.aliquotaestimadaimpestaduais  = b.aliquotaestimadaimpestaduais,
    a.aliquotaestimadaimpmunicipais = b.aliquotaestimadaimpmunicipais,
    a.baseestimadaimpostos          = b.baseestimadaimpostos,
    a.valorestimadoimpfederais      = b.valorestimadoimpfederais,
    a.valorEstimadoImpEstaduais     = b.valorEstimadoImpEstaduais,
    a.valorEstimadoImpMunicipais    = b.valorEstimadoImpMunicipais,
    a.valorImpostosSomaPagamento    = b.valorImpostosSomaPagamento,
    a.valorImpostosDiminuiPagamento = b.valorImpostosDiminuiPagamento,
    a.valorLiquidoItem              = b.valorLiquidoItem,
    a.observacoesDigitadas          = b.observacoesDigitadas,
    a.observacoes                   = b.observacoes
  WHEN NOT MATCHED THEN INSERT (
    idItemOrcamento,
    orcamento,
    sequencia,
    cancelado,
    vendedor,
    gradeProduto,
    servico,
    atividadeServico,
    statusAtividadeServico,
    idFormulaTinta,
    personalizacao,
    idLoteEstoque,
    vinculoItemDocumento,
    operacaoFiscal,
    movimentaEstoque,
    geraFinanceiro,
    localEstoque,
    pessoaParticipante,
    dataEntrega,
    controleQuantidade,
    unidadeMedidaConversao,
    conversorQuantidade,
    loteMinimo,
    loteMultiplo,
    altura,
    largura,
    comprimento,
    pecas,
    quantidade,
    quantidadeConvertida,
    quantidadeSaldo,
    controleEntrega,
    situacaoEntrega,
    pesoLiquido,
    pesoBruto,
    tipoPreco,
    tabelaPreco,
    precoSugestaoAPrazo,
    precoSugestaoAVista,
    precoDesconto,
    precoMinimo,
    usarPrecoAVista,
    precoPautaTabelado,
    precoUnitarioBruto,
    acrescimoUnitarioComposicao,
    precoUnitario,
    precoUnitarioConvertido,
    valorProdutoServicoBruto,
    valorProdutoServico,
    percDescontoItem,
    valorDescontoItem,
    percAcrescimoItem,
    valorAcrescimoItem,
    valorFreteItem,
    valorSeguroItem,
    valorAdicFreteMarinhaMerItem,
    valorDespesasAduaneirasItem,
    valorFreteGeral,
    valorSeguroGeral,
    valorDescontoGeral,
    valorOutrasDespesasGeral,
    valorAdicFreteMarinhaMerGeral,
    valorDespesasAduaneirasGeral,
    valorBasePagamento,
    valorDescontoPagamento,
    valorOutrasDespesasPagamento,
    valorJurosPagamento,
    valorFreteTotal,
    valorSeguroTotal,
    valorDescontoTotal,
    valorOutrasDespesasTotal,
    valorAdicFreteMarinhaMerTotal,
    valorDespesasAduaneirasTotal,
    cfop,
    indicadorISSQN,
    aliquotaISSQN,
    baseISSQN,
    valorISSQN,
    aliquotaIRRF,
    baseIRRF,
    valorIRRF,
    aliquotaINSS,
    baseINSS,
    valorINSS,
    retencaoPIS,
    baseRetPIS,
    valorRetPIS,
    retencaoCOFINS,
    baseRetCOFINS,
    valorRetCOFINS,
    retencaoCSLL,
    baseRetCSLL,
    valorRetCSLL,
    aliquotaII,
    baseII,
    valorII,
    aliquotaIOF,
    baseIOF,
    valorIOF,
    codigoEnquadramentoIPI,
    stIPI,
    aliquotaIPI,
    valorAliquotaIPI,
    baseIPI,
    valorIPI,
    stPIS,
    aliquotaPIS,
    valorAliquotaPIS,
    basePIS,
    valorPIS,
    aliquotaPISST,
    valorAliquotaPISST,
    basePISST,
    valorPISST,
    stCOFINS,
    aliquotaCOFINS,
    valorAliquotaCOFINS,
    baseCOFINS,
    valorCOFINS,
    aliquotaCOFINSST,
    valorAliquotaCOFINSST,
    baseCOFINSST,
    valorCOFINSST,
    stSimplesNacional,
    creditoSimplesNacional,
    baseCreditoSimplesNacional,
    valorCreditoSimplesNacional,
    stICMS,
    modalidadeBaseCalcICMS,
    reducaoBaseICMS,
    aliquotaICMS,
    diferimentoICMS,
    motivoDesoneracaoICMS,
    baseICMS,
    valorICMSOperacao,
    valorICMSDiferido,
    valorICMS,
    valorICMSDesoneracao,
    modalidadeBaseCalcICMSST,
    margemValorAdicionadoST,
    reducaoBaseST,
    aliquotaICMSST,
    aliquotaSTSuportConsFinal,
    baseICMSST,
    valorICMSST,
    baseICMSSTAnteriormente,
    valorICMSSTAnteriormente,
    valorICMSProprioSubstituto,
    reducaoBaseICMSEfetivo,
    aliquotaICMSEfetivo,
    baseICMSEfetivo,
    valorICMSEfetivo,
    aliquotaICMSUFDestinatario,
    aliquotaICMSInterestadual,
    partilhaICMSInterestadual,
    baseICMSUFDestinatario,
    valorICMSUFDestinatario,
    baseICMSUFRemetente,
    valorICMSUFRemetente,
    aliquotaFCP,
    baseFCP,
    valorFCP,
    aliquotaFCPST,
    baseFCPST,
    valorFCPST,
    aliquotaFCPSTAnteriormente,
    baseFCPSTAnteriormente,
    valorFCPSTAnteriormente,
    aliquotaFCPUFDestinatario,
    baseFCPUFDestinatario,
    valorFCPUFDestinatario,
    aliquotaEstimadaImpFederais,
    aliquotaEstimadaImpEstaduais,
    aliquotaEstimadaImpMunicipais,
    baseEstimadaImpostos,
    valorEstimadoImpFederais,
    valorEstimadoImpEstaduais,
    valorEstimadoImpMunicipais,
    valorImpostosSomaPagamento,
    valorImpostosDiminuiPagamento,
    valorLiquidoItem,
    observacoesDigitadas,
    observacoes)
  VALUES (
    b.idItemOrcamento,
    b.orcamento,
    b.sequencia,
    b.cancelado,
    b.vendedor,
    b.gradeProduto,
    b.servico,
    b.atividadeServico,
    b.statusAtividadeServico,
    b.idFormulaTinta,
    b.personalizacao,
    b.idLoteEstoque,
    b.vinculoItemDocumento,
    b.operacaoFiscal,
    b.movimentaEstoque,
    b.geraFinanceiro,
    b.localEstoque,
    b.pessoaParticipante,
    b.dataEntrega,
    b.controleQuantidade,
    b.unidadeMedidaConversao,
    b.conversorQuantidade,
    b.loteMinimo,
    b.loteMultiplo,
    b.altura,
    b.largura,
    b.comprimento,
    b.pecas,
    b.quantidade,
    b.quantidadeConvertida,
    b.quantidadeSaldo,
    b.controleEntrega,
    b.situacaoEntrega,
    b.pesoLiquido,
    b.pesoBruto,
    b.tipoPreco,
    b.tabelaPreco,
    b.precoSugestaoAPrazo,
    b.precoSugestaoAVista,
    b.precoDesconto,
    b.precoMinimo,
    b.usarPrecoAVista,
    b.precoPautaTabelado,
    b.precoUnitarioBruto,
    b.acrescimoUnitarioComposicao,
    b.precoUnitario,
    b.precoUnitarioConvertido,
    b.valorProdutoServicoBruto,
    b.valorProdutoServico,
    b.percDescontoItem,
    b.valorDescontoItem,
    b.percAcrescimoItem,
    b.valorAcrescimoItem,
    b.valorFreteItem,
    b.valorSeguroItem,
    b.valorAdicFreteMarinhaMerItem,
    b.valorDespesasAduaneirasItem,
    b.valorFreteGeral,
    b.valorSeguroGeral,
    b.valorDescontoGeral,
    b.valorOutrasDespesasGeral,
    b.valorAdicFreteMarinhaMerGeral,
    b.valorDespesasAduaneirasGeral,
    b.valorBasePagamento,
    b.valorDescontoPagamento,
    b.valorOutrasDespesasPagamento,
    b.valorJurosPagamento,
    b.valorFreteTotal,
    b.valorSeguroTotal,
    b.valorDescontoTotal,
    b.valorOutrasDespesasTotal,
    b.valorAdicFreteMarinhaMerTotal,
    b.valorDespesasAduaneirasTotal,
    b.cfop,
    b.indicadorISSQN,
    b.aliquotaISSQN,
    b.baseISSQN,
    b.valorISSQN,
    b.aliquotaIRRF,
    b.baseIRRF,
    b.valorIRRF,
    b.aliquotaINSS,
    b.baseINSS,
    b.valorINSS,
    b.retencaoPIS,
    b.baseRetPIS,
    b.valorRetPIS,
    b.retencaoCOFINS,
    b.baseRetCOFINS,
    b.valorRetCOFINS,
    b.retencaoCSLL,
    b.baseRetCSLL,
    b.valorRetCSLL,
    b.aliquotaII,
    b.baseII,
    b.valorII,
    b.aliquotaIOF,
    b.baseIOF,
    b.valorIOF,
    b.codigoEnquadramentoIPI,
    b.stIPI,
    b.aliquotaIPI,
    b.valorAliquotaIPI,
    b.baseIPI,
    b.valorIPI,
    b.stPIS,
    b.aliquotaPIS,
    b.valorAliquotaPIS,
    b.basePIS,
    b.valorPIS,
    b.aliquotaPISST,
    b.valorAliquotaPISST,
    b.basePISST,
    b.valorPISST,
    b.stCOFINS,
    b.aliquotaCOFINS,
    b.valorAliquotaCOFINS,
    b.baseCOFINS,
    b.valorCOFINS,
    b.aliquotaCOFINSST,
    b.valorAliquotaCOFINSST,
    b.baseCOFINSST,
    b.valorCOFINSST,
    b.stSimplesNacional,
    b.creditoSimplesNacional,
    b.baseCreditoSimplesNacional,
    b.valorCreditoSimplesNacional,
    b.stICMS,
    b.modalidadeBaseCalcICMS,
    b.reducaoBaseICMS,
    b.aliquotaICMS,
    b.diferimentoICMS,
    b.motivoDesoneracaoICMS,
    b.baseICMS,
    b.valorICMSOperacao,
    b.valorICMSDiferido,
    b.valorICMS,
    b.valorICMSDesoneracao,
    b.modalidadeBaseCalcICMSST,
    b.margemValorAdicionadoST,
    b.reducaoBaseST,
    b.aliquotaICMSST,
    b.aliquotaSTSuportConsFinal,
    b.baseICMSST,
    b.valorICMSST,
    b.baseICMSSTAnteriormente,
    b.valorICMSSTAnteriormente,
    b.valorICMSProprioSubstituto,
    b.reducaoBaseICMSEfetivo,
    b.aliquotaICMSEfetivo,
    b.baseICMSEfetivo,
    b.valorICMSEfetivo,
    b.aliquotaICMSUFDestinatario,
    b.aliquotaICMSInterestadual,
    b.partilhaICMSInterestadual,
    b.baseICMSUFDestinatario,
    b.valorICMSUFDestinatario,
    b.baseICMSUFRemetente,
    b.valorICMSUFRemetente,
    b.aliquotaFCP,
    b.baseFCP,
    b.valorFCP,
    b.aliquotaFCPST,
    b.baseFCPST,
    b.valorFCPST,
    b.aliquotaFCPSTAnteriormente,
    b.baseFCPSTAnteriormente,
    b.valorFCPSTAnteriormente,
    b.aliquotaFCPUFDestinatario,
    b.baseFCPUFDestinatario,
    b.valorFCPUFDestinatario,
    b.aliquotaEstimadaImpFederais,
    b.aliquotaEstimadaImpEstaduais,
    b.aliquotaEstimadaImpMunicipais,
    b.baseEstimadaImpostos,
    b.valorEstimadoImpFederais,
    b.valorEstimadoImpEstaduais,
    b.valorEstimadoImpMunicipais,
    b.valorImpostosSomaPagamento,
    b.valorImpostosDiminuiPagamento,
    b.valorLiquidoItem,
    b.observacoesDigitadas,
    b.observacoes);
  IF (p_item_idItemOrcamento <> 0
      OR p_item_movimentaEstoque = 1
      AND p_item_cancelado = 0)
    AND (p_etOrc_situacaoOrcamento BETWEEN 41 AND 63
      OR p_etOrc_situacaoOrcamento BETWEEN 64 AND 89
      AND p_item_controleEntrega > 0)
    AND (p_item_idItemOrcamento = 0
      OR p_a_item_movimentaEstoque   <> p_item_movimentaEstoque
      OR p_a_item_cancelado          <> p_item_cancelado
      OR p_a_item_gradeProduto       <> p_item_gradeProduto
      OR p_a_item_idFormulaTinta     <> p_item_idFormulaTinta
      OR p_a_item_idLoteEstoque      <> p_item_idLoteEstoque
      OR p_a_item_localEstoque       <> p_item_localEstoque
      OR p_a_item_pessoaParticipante <> p_item_pessoaParticipante
      OR p_a_item_quantidadeSaldo    <> p_item_quantidadeSaldo)
    OR p_item_movimentaEstoque = 0
    OR p_item_cancelado = 1
    THEN
    ADD_ORCAMENTO_ITEM_RES_ITEM (
      ' ',
      p_estabelecimentoAtivo,
      p_cab_modeloDocumento,
      p_cab_entradaSaida,
      p_cab_estabelecimento,
      p_cab_dataEmissao,
      p_cab_dataEntrega,
      p_etOrc_situacaoOrcamento,
      r_item_idItemOrcamento,
      p_item_cancelado,
      p_item_gradeProduto,
      p_item_idFormulaTinta,
      p_item_personalizacao,
      p_item_idLoteEstoque,
      p_item_movimentaEstoque,
      p_item_localEstoque,
      p_item_pessoaParticipante,
      p_item_quantidadeSaldo,
      p_item_controleEntrega,
      v_item_observacoes,
      /* Retornos */
      v_auxVarchar);
    r_obrigaFinalizar := 1;
  END IF;
END ADD_ORCAMENTO_ITEM_GRAVA;

/

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_198_obs_add_referenc  IN NUMBER,
    p_config_199_obs_add_caractA   IN NUMBER,
    p_config_200_obs_add_caractB   IN NUMBER,
    p_config_201_obs_add_caractC   IN NUMBER,
    p_config_202_obs_add_caractD   IN NUMBER,
    p_config_203_obs_add_caractE   IN NUMBER,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_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_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_198_obs_add_referenc,
        p_config_199_obs_add_caractA,
        p_config_200_obs_add_caractB,
        p_config_201_obs_add_caractC,
        p_config_202_obs_add_caractD,
        p_config_203_obs_add_caractE,
        p_config_209_filtrarGrupoEcon,
        p_config_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);      
      ADD_CALCULA_TOTAIS_ITEM (
        p_cab_tipoPagamentoFrete,
        p_modDoc_diminuiDescontoPrUnit,
        p_modDoc_somaAcrescimosPrUnit,
        p_modDoc_somaFreteSeguroPrUnit,
        v_item_quantidade,
        v_item_quantidadeConvertida,
        v_item_precoUnitarioBruto,
        0,
        v_item_precoUnitario,
        v_item_valorDescontoItem,
        v_item_valorAcrescimoItem,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        /* Retornos */
        v_item_precoUnitario,
        v_item_precoUnitarioConvertido,
        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);
      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_uniqueMachineID,
        p_estabelecimentoAtivo,
        p_config_198_obs_add_referenc,
        p_config_199_obs_add_caractA,
        p_config_200_obs_add_caractB,
        p_config_201_obs_add_caractC,
        p_config_202_obs_add_caractD,
        p_config_203_obs_add_caractE,
        '',
        0,
        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,
        /* 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,
          ' ',
          /* 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_198_obs_add_referenc  IN NUMBER,
    p_config_199_obs_add_caractA   IN NUMBER,
    p_config_200_obs_add_caractB   IN NUMBER,
    p_config_201_obs_add_caractC   IN NUMBER,
    p_config_202_obs_add_caractD   IN NUMBER,
    p_config_203_obs_add_caractE   IN NUMBER,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_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;
  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_item_observacoes := FUNC_ADD_MONTA_OBSERVACAO_ITEM (
      p_uniqueMachineID,
      p_config_198_obs_add_referenc,
      p_config_199_obs_add_caractA,
      p_config_200_obs_add_caractB,
      p_config_201_obs_add_caractC,
      p_config_202_obs_add_caractD,
      p_config_203_obs_add_caractE,
      ' ',
      0,
      'O',
      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);
    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_198_obs_add_referenc,
      p_config_199_obs_add_caractA,
      p_config_200_obs_add_caractB,
      p_config_201_obs_add_caractC,
      p_config_202_obs_add_caractD,
      p_config_203_obs_add_caractE,
      p_config_209_filtrarGrupoEcon,
      p_config_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 (
        v_cab_tipoPagamentoFrete,
        v_modDoc_diminuiDescontoPrUnit,
        v_modDoc_somaAcrescimosPrUnit,
        v_modDoc_somaFreteSeguroPrUnit,
        p_item_quantidade,
        p_item_quantidadeConvertida,
        p_item_precoUnitarioBruto,
        p_item_precoUnitario,
        p_item_valorDescontoItem,
        p_item_valorAcrescimoItem,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        0,
        /* Retornos */
        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);
    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 (
          v_cab_tipoPagamentoFrete,
          v_modDoc_diminuiDescontoPrUnit,
          v_modDoc_somaAcrescimosPrUnit,
          v_modDoc_somaFreteSeguroPrUnit,
          v_aj_quantidade,
          v_aj_quantidadeConvertida,
          v_aj_precoUnitarioBruto,
          v_aj_acrescimoUnitarioCompos,
          v_aj_precoUnitario,
          v_aj_valorDescontoItem,
          v_aj_valorAcrescimoItem,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          /* Retornos */
          v_aj_precoUnitario,
          v_aj_precoUnitarioConvertido,
          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_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 (
          v_cab_tipoPagamentoFrete,
          v_modDoc_diminuiDescontoPrUnit,
          v_modDoc_somaAcrescimosPrUnit,
          v_modDoc_somaFreteSeguroPrUnit,
          v_aj_quantidade,
          v_aj_quantidadeConvertida,
          v_aj_precoUnitarioBruto,
          v_aj_acrescimoUnitarioCompos,
          v_aj_precoUnitario,
          v_aj_valorDescontoItem,
          v_aj_valorAcrescimoItem,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          /* Retornos */
          v_aj_precoUnitario,
          v_aj_precoUnitarioConvertido,
          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);
        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_uniqueMachineID,
      p_estabelecimentoAtivo,
      p_config_198_obs_add_referenc,
      p_config_199_obs_add_caractA,
      p_config_200_obs_add_caractB,
      p_config_201_obs_add_caractC,
      p_config_202_obs_add_caractD,
      p_config_203_obs_add_caractE,
      '',
      0,
      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,
      /* 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_DOC_FISC_CALC_IMP_RESIDUO (
    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_valorProdutos            IN NUMBER,
    p_cab_valorServicos            IN NUMBER,
    p_cab_valorBasePagamento       IN NUMBER,
    p_cab_valorAVistaMinimo        IN NUMBER,
    p_cab_valorFreteTotal          IN NUMBER,
    p_cab_valorSeguroTotal         IN NUMBER,
    p_cab_valorDescontoTotal       IN NUMBER,
    p_cab_valorOutrasDespesasTotal IN NUMBER,
    p_cab_valorAdicFreteMarinTotal IN NUMBER,
    p_cab_valorDespesasAduanTotal  IN NUMBER,
    p_cab_impostosEditados         IN NUMBER,
    p_cab_valorImpSomaPagamento    IN NUMBER,
    p_cab_valorImpDiminuiPagamento IN NUMBER,
    p_cab_valorLiquidoItem         IN NUMBER,
    p_cab_valorDescCustoOpTotal    IN NUMBER,
    p_cab_valorAcrescCustoOpTotal  IN NUMBER,
    p_cab_valorCustoOperacao       IN NUMBER,
    p_cab_valorCMV                 IN NUMBER,
    p_cab_valorAcrescExtempTotal   IN NUMBER,
    p_modDoc_diminuiDescontoPrUnit IN NUMBER,
    p_modDoc_somaAcrescimosPrUnit  IN NUMBER,
    p_modDoc_somaFreteSeguroPrUnit IN NUMBER,
    p_item_idItemDocFiscal         IN NUMBER,
    p_saldoRatFreteGeral           IN NUMBER,
    p_saldoRatSeguroGeral          IN NUMBER,
    p_saldoRatDescontoGeral        IN NUMBER,
    p_saldoRatOutrasDespesasGeral  IN NUMBER,
    p_saldoRatAdicFreteMarinGeral  IN NUMBER,
    p_saldoRatDespesasAduanGeral   IN NUMBER,
    p_saldoRatDescontoPagamento    IN NUMBER,
    p_saldoRatOutrasDespPagamento  IN NUMBER,
    p_saldoRatJurosPagamento       IN NUMBER,
    p_saldoRatDescCustoOpGeral     IN NUMBER,
    p_saldoRatAcrescCustoOpGeral   IN NUMBER,
    p_saldoRatAcrescExtempGeral    IN NUMBER,
    p_calcularImpostosItem         IN NUMBER,
    /* Retornos */
    r_cab_valorProdutos            OUT NUMBER,
    r_cab_valorServicos            OUT NUMBER,
    r_cab_valorBasePagamento       OUT NUMBER,
    r_cab_valorAVistaMinimo        OUT NUMBER,
    r_cab_valorFreteTotal          OUT NUMBER,
    r_cab_valorSeguroTotal         OUT NUMBER,
    r_cab_valorDescontoTotal       OUT NUMBER,
    r_cab_valorOutrasDespesasTotal OUT NUMBER,
    r_cab_valorAdicFreteMarinTotal OUT NUMBER,
    r_cab_valorDespesasAduanTotal  OUT NUMBER,
    r_cab_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_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.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
      FROM MODOCFISCALXITENS a
      WHERE a.idItemDocFiscal = p_item_idItemDocFiscal
      ORDER BY a.sequencia;
BEGIN
  r_cab_valorProdutos            := p_cab_valorProdutos;
  r_cab_valorServicos            := p_cab_valorServicos;
  r_cab_valorBasePagamento       := p_cab_valorBasePagamento;
  r_cab_valorAVistaMinimo        := p_cab_valorAVistaMinimo;
  r_cab_valorFreteTotal          := p_cab_valorFreteTotal;
  r_cab_valorSeguroTotal         := p_cab_valorSeguroTotal;
  r_cab_valorDescontoTotal       := p_cab_valorDescontoTotal;
  r_cab_valorOutrasDespesasTotal := p_cab_valorOutrasDespesasTotal;
  r_cab_valorAdicFreteMarinTotal := p_cab_valorAdicFreteMarinTotal;
  r_cab_valorDespesasAduanTotal  := p_cab_valorDespesasAduanTotal;
  r_cab_valorImpSomaPagamento    := p_cab_valorImpSomaPagamento;
  r_cab_valorImpDiminuiPagamento := p_cab_valorImpDiminuiPagamento;
  r_cab_valorLiquidoItem         := p_cab_valorLiquidoItem;
  r_cab_valorDescCustoOpTotal    := p_cab_valorDescCustoOpTotal;
  r_cab_valorAcrescCustoOpTotal  := p_cab_valorAcrescCustoOpTotal;
  r_cab_valorCustoOperacao       := p_cab_valorCustoOperacao;
  r_cab_valorCMV                 := p_cab_valorCMV;
  r_cab_valorAcrescExtempTotal   := p_cab_valorAcrescExtempTotal;
  FOR item IN c_item LOOP
    v_precoUnitario                := item.precoUnitario;
    v_precoUnitarioConvertido      := item.precoUnitarioConvertido;
    v_valorProdutoServico          := item.valorProdutoServico;
    v_valorFreteGeral              := item.valorFreteGeral;
    v_valorSeguroGeral             := item.valorSeguroGeral;
    v_valorDescontoGeral           := item.valorDescontoGeral;
    v_valorOutrasDespesasGeral     := item.valorOutrasDespesasGeral;
    v_valorAdicFreteMarinMerGeral  := item.valorAdicFreteMarinhaMerGeral;
    v_valorDespesasAduaneirasGeral := item.valorDespesasAduaneirasGeral;
    v_valorBasePagamento           := item.valorBasePagamento;
    v_valorDescontoPagamento       := item.valorDescontoPagamento;
    v_valorOutrasDespesasPagamento := item.valorOutrasDespesasPagamento;
    v_valorJurosPagamento          := item.valorJurosPagamento;
    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_valorDescontoCustoOpGeral    := item.valorDescontoCustoOpGeral;
    v_valorDescontoCustoOpTotal    := item.valorDescontoCustoOpTotal;
    v_valorAcrescimoCustoOpGeral   := item.valorAcrescimoCustoOpGeral;
    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_valorAcrescimoExtempGeral    := item.valorAcrescimoExtempGeral;
    v_valorAcrescimoExtempTotal    := item.valorAcrescimoExtempTotal;    
    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;
    v_valorFreteGeral              := v_valorFreteGeral + p_saldoRatFreteGeral;
    v_valorSeguroGeral             := v_valorSeguroGeral + p_saldoRatSeguroGeral;
    v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral + p_saldoRatAdicFreteMarinGeral;
    v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + p_saldoRatDespesasAduanGeral;
    v_valorDescontoGeral           := v_valorDescontoGeral + p_saldoRatDescontoGeral;
    v_valorOutrasDespesasGeral     := v_valorDespesasAduaneirasGeral + p_saldoRatOutrasDespesasGeral;
    v_valorDescontoPagamento       := v_valorDescontoPagamento + p_saldoRatDescontoPagamento;
    v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + p_saldoRatOutrasDespPagamento;
    v_valorJurosPagamento          := v_valorJurosPagamento + p_saldoRatJurosPagamento;
    v_valorDescontoCustoOpGeral    := v_valorDescontoCustoOpGeral + p_saldoRatDescCustoOpGeral;
    v_valorAcrescimoCustoOpGeral   := v_valorAcrescimoCustoOpGeral + p_saldoRatAcrescCustoOpGeral;
    v_valorAcrescimoExtempGeral    := v_valorAcrescimoExtempGeral + p_saldoRatAcrescExtempGeral;
    ADD_CALCULA_TOTAIS_ITEM(
      p_cab_tipoPagamentoFrete,
      p_modDoc_diminuiDescontoPrUnit,
      p_modDoc_somaAcrescimosPrUnit,
      p_modDoc_somaFreteSeguroPrUnit,
      item.quantidade,
      item.quantidadeConvertida,
      item.precoUnitarioBruto,
      item.acrescimoUnitarioComposicao,
      item.precoUnitario,
      item.valorDescontoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      v_valorFreteGeral,
      v_valorSeguroGeral,
      v_valorDescontoGeral,
      v_valorOutrasDespesasGeral,
      v_valorAdicFreteMarinMerGeral,
      v_valorDespesasAduaneirasGeral,
      v_valorDescontoPagamento,
      v_valorOutrasDespesasPagamento,
      v_valorJurosPagamento,
      item.quantidadeExtemporanea,
      item.acrescimoUnitarioExtemporaneo,
      item.valorAcrescimoExtempItem,
      v_valorAcrescimoExtempGeral,
      /* Retornos */
      v_precoUnitario,
      v_precoUnitarioConvertido,
      v_valorProdutoServico,
      v_auxNumber,
      v_auxNumber,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal,
      v_valorAcrescimoExtempSubtotal,
      v_valorAcrescimoExtempTotal);
    IF p_cab_impostosEditados = 0 
        OR v_valorProdutoServico <> item.valorProdutoServico
        OR CASE WHEN p_cab_tipoPagamentoFrete   = 'V' THEN 0 ELSE v_valorFreteTotal END
        <> CASE WHEN p_a_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE item.valorFreteTotal END
        OR CASE WHEN p_cab_tipoPagamentoFrete   = 'V' THEN 0 ELSE v_valorSeguroTotal END
        <> CASE WHEN p_a_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE item.valorSeguroTotal END
        OR v_valorDescontoTotal <> item.valorDescontoTotal
        OR v_valorOutrasDespesasTotal <> item.valorOutrasDespesasTotal
        OR v_valorAdicFreteMarinMerTotal <> item.valorAdicFreteMarinhaMerTotal
        OR v_valorDespesasAduaneirasTotal <> item.valorDespesasAduaneirasTotal
        OR v_precoUnitario <> item.precoUnitario
        OR v_valorProdutoServico <> item.valorProdutoServico
    THEN
      r_calcularImpostosItem := 1;
    END IF;
    ADD_CALCULA_VALOR_LIQUIDO (
      p_cab_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);
    UPDATE MODOCFISCALXITENS SET
      precoUnitario                 = v_precoUnitario,
      precoUnitarioConvertido       = v_precoUnitarioConvertido,
      valorProdutoServico           = v_valorProdutoServico,
      valorFreteGeral               = v_valorFreteGeral,
      valorSeguroGeral              = v_valorSeguroGeral,
      valorDescontoGeral            = v_valorDescontoGeral,
      valorOutrasDespesasGeral      = v_valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral = v_valorAdicFreteMarinMerGeral,
      valorDespesasAduaneirasGeral  = v_valorDespesasAduaneirasGeral,
      valorBasePagamento            = v_valorBasePagamento,
      valorDescontoPagamento        = v_valorDescontoPagamento,
      valorOutrasDespesasPagamento  = v_valorOutrasDespesasPagamento,
      valorJurosPagamento           = v_valorJurosPagamento,
      valorFreteTotal               = v_valorFreteTotal,
      valorSeguroTotal              = v_valorSeguroTotal,
      valorDescontoTotal            = v_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
      valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
      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           = p_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;
END ADD_DOC_FISC_CALC_IMP_RESIDUO;

/

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

/

create or replace PROCEDURE ADD_DOC_FISC_CALC_IMP_CAB (
    p_uniqueMachineID              IN VARCHAR2,
    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_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_bloqPercMargemCab    IN NUMBER,
    p_regMarg_exibPercMargemItem   IN NUMBER,
    p_regMarg_exibImagemMargemItem IN NUMBER,
    p_regMarg_regraImagemItem      IN NUMBER,
    p_regMarg_exibDetMargemItem    IN NUMBER,
    p_regMarg_bloqPercMargemItem   IN NUMBER,
    p_calcularMargemContribuicao   IN NUMBER,
    p_cab_idDocumentoFiscal        IN NUMBER,
    p_a_cab_tipoPagamentoFrete     IN CHAR,
    /* Retornos */
    r_cab_valorProdutos            OUT NUMBER,
    r_cab_valorServicos            OUT NUMBER,
    r_cab_valorBasePagamento       OUT NUMBER,
    r_cab_valorAVistaMinimo        OUT NUMBER,
    r_cab_valorFreteTotal          OUT NUMBER,
    r_cab_valorSeguroTotal         OUT NUMBER,
    r_cab_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_valorAcrescExtempTotal   OUT NUMBER,
    r_cab_valorTarifaCartao        OUT NUMBER,
    r_cab_valorMargem              OUT NUMBER,
    r_cab_percentualMargem         OUT NUMBER,
    r_cab_imagemMargem             OUT VARCHAR2)    
IS
    v_cab_valorDescontoTotal       NUMBER;
    v_cab_valorOutrasDespesasTotal NUMBER;
    v_cab_valorCustoOperacao       NUMBER;
    v_cab_valorCMV                 NUMBER;
    v_cab_valorDescCustoOpTotal    NUMBER;
    v_cab_valorAcrescCustoOpTotal  NUMBER;
    v_calcularImpostosItem         NUMBER;
    CURSOR c_cab IS
      SELECT a.*,
        modDoc.diminuiDescontoPrUnit,
        modDoc.somaAcrescimosPrUnit,
        modDoc.somaFreteSeguroPrUnit,
        modDoc.habilitaControleEntrega,
        pess.indicadorInscricaoEstadual,
        COALESCE((
          SELECT MIN(munEndEst.uf)
          FROM PAESTABELECIMENTOS est
          JOIN CAENDERECOSPESSOA endEst ON endEst.pessoa = est.pessoaEstabelecimento
          JOIN SIMUNICIPIOS munEndEst on munEndEst.municipio = endEst.municipio
          WHERE est.estabelecimento = a.estabelecimento
          AND endEst.ativo = 1
          AND endEst.principal = 1
          ),'  ') munEndEst_uf
      FROM MODOCUMENTOSFISCAIS a
      JOIN PAMODELOSDOCUMENTO modDoc ON modDoc.modeloDocumento = a.modeloDocumento
      JOIN CAPESSOAS pess ON pess.pessoa = a.pessoa
      WHERE a.idDocumentoFiscal = p_cab_idDocumentoFiscal;
BEGIN
  FOR cab IN c_cab LOOP
    r_cab_valorProdutos            := cab.valorProdutos;
    r_cab_valorServicos            := cab.valorServicos;
    r_cab_valorBasePagamento       := cab.valorBasePagamento;
    r_cab_valorAVistaMinimo        := cab.valorAVistaMinimo;
    r_cab_valorFreteTotal          := cab.valorFreteTotal;
    r_cab_valorSeguroTotal         := cab.valorSeguroTotal;
    v_cab_valorDescontoTotal       := cab.valorDescontoTotal;
    v_cab_valorOutrasDespesasTotal := cab.valorOutrasDespesasTotal;
    r_cab_valorAdicFreteMarinTotal := cab.valorAdicFreteMarinhaMerTotal;
    r_cab_valorDespesasAduanTotal  := cab.valorDespesasAduaneirasTotal;
    r_cab_valorImpSomaPagamento    := cab.valorImpostosSomaPagamento;
    r_cab_valorImpDiminuiPagamento := cab.valorImpostosDiminuiPagamento;
    r_cab_valorLiquidoItem         := cab.valorLiquidoItem;
    v_cab_valorDescCustoOpTotal    := cab.valorDescontoCustoOpTotal;
    v_cab_valorAcrescCustoOpTotal  := cab.valorAcrescimoCustoOpTotal;
    v_cab_valorCustoOperacao       := cab.valorCustoOperacao;
    v_cab_valorCMV                 := cab.valorCMV;
    r_cab_valorAcrescExtempTotal   := cab.valorAcrescimoExtempTotal;    
    r_cab_valorTarifaCartao        := 0;
    r_cab_valorMargem              := 0;
    r_cab_percentualMargem         := 0;
    r_cab_imagemMargem             := ' ';
    v_calcularImpostosItem         := 0;
    ADD_DOC_FISC_CALC_IMP_RATEIO (
      cab.idDocumentoFiscal,
      cab.modeloDocumento,
      cab.entradaSaida,
      cab.devolucaoAnulacaoRetorno,
      cab.atualizaCustoMedio,
      cab.nfFornecedor,
      p_a_cab_tipoPagamentoFrete,
      cab.tipoPagamentoFrete,
      cab.valorFreteGeral,
      cab.valorSeguroGeral,
      cab.valorDescontoGeral,
      cab.valorOutrasDespesasGeral,
      cab.valorAdicFreteMarinhaMerGeral,
      cab.valorDespesasAduaneirasGeral,
      cab.valorDescontoPagamento,
      cab.valorOutrasDespesasPagamento,
      cab.valorJurosPagamento,
      cab.impostosEditados,
      cab.valorDescontoCustoOpGeral,
      cab.valorAcrescimoCustoOpGeral,
      cab.valorAcrescimoExtempGeral,
      cab.diminuiDescontoPrUnit,
      cab.somaAcrescimosPrUnit,
      cab.somaFreteSeguroPrUnit,
      cab.habilitaControleEntrega,
      /* Retornos */
      r_cab_valorProdutos,
      r_cab_valorServicos,
      r_cab_valorBasePagamento,
      r_cab_valorAVistaMinimo,
      r_cab_valorFreteTotal,
      r_cab_valorSeguroTotal,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespesasTotal,
      r_cab_valorAdicFreteMarinTotal,
      r_cab_valorDespesasAduanTotal,
      r_cab_valorImpSomaPagamento,
      r_cab_valorImpDiminuiPagamento,
      r_cab_valorLiquidoItem,
      v_cab_valorDescCustoOpTotal,
      v_cab_valorAcrescCustoOpTotal,
      v_cab_valorCustoOperacao,
      v_cab_valorCMV,
      r_cab_valorAcrescExtempTotal,
      v_calcularImpostosItem);
    IF v_calcularImpostosItem = 1 THEN
      ADD_DOC_FISC_CALC_IMP_ITENS(
        p_config_64_casasDecSaidas,
        p_config_209_filtrarGrupoEcon,
        p_config_330_redIcmsBasePisCof,
        p_config_362_calcCustoPorGrade,
        cab.idDocumentoFiscal,
        cab.modeloDocumento,
        cab.entradaSaida,
        cab.devolucaoAnulacaoRetorno,
        cab.atualizaCustoMedio,
        cab.estabelecimento,
        cab.nfFornecedor,
        cab.dataEntradaSaida,
        cab.pessoa,
        cab.localDestinoOperacao,
        cab.indicadorConsumidorFinal,
        p_a_cab_tipoPagamentoFrete,
        cab.tipoPagamentoFrete,
        cab.valorProdutosBruto,
        cab.valorDescontoProdutos,
        cab.valorAcrescimoProdutos,
        cab.valorServicosBruto,
        cab.valorDescontoServicos,
        cab.valorAcrescimoServicos,
        cab.valorFreteGeral,
        cab.valorSeguroGeral,
        cab.valorDescontoGeral,
        cab.valorOutrasDespesasGeral,
        cab.valorAdicFreteMarinhaMerGeral,
        cab.valorDespesasAduaneirasGeral,
        cab.valorDescontoPagamento,
        cab.valorOutrasDespesasPagamento,
        cab.valorJurosPagamento,
        cab.impostosEditados,
        cab.valorDescontoCustoOpGeral,
        cab.valorAcrescimoCustoOpGeral,
        cab.valorAcrescimoExtempGeral,
        cab.diminuiDescontoPrUnit,
        cab.somaAcrescimosPrUnit,
        cab.somaFreteSeguroPrUnit,
        cab.indicadorInscricaoEstadual,
        /* Retornos */
        r_cab_valorProdutos,
        r_cab_valorServicos,
        r_cab_valorBasePagamento,
        r_cab_valorAVistaMinimo,
        r_cab_valorFreteTotal,
        r_cab_valorSeguroTotal,
        v_cab_valorDescontoTotal,
        v_cab_valorOutrasDespesasTotal,
        r_cab_valorAdicFreteMarinTotal,
        r_cab_valorDespesasAduanTotal,
        r_cab_valorImpSomaPagamento,
        r_cab_valorImpDiminuiPagamento,
        r_cab_valorLiquidoItem,
        v_cab_valorDescCustoOpTotal,
        v_cab_valorAcrescCustoOpTotal,
        v_cab_valorCustoOperacao,
        v_cab_valorCMV,
        r_cab_valorAcrescExtempTotal);
    END IF;
    IF p_calcularMargemContribuicao = 1 AND (p_regMarg_exibPercMargemCab = 1 OR p_regMarg_exibImagemMargemCab = 1 OR p_regMarg_bloqPercMargemCab = 1 OR p_regMarg_exibPercMargemItem = 1 OR p_regMarg_exibImagemMargemItem = 1 OR p_regMarg_exibDetMargemItem = 1 OR p_regMarg_bloqPercMargemItem = 1) AND cab.tipoDocumento IN (101,102,301,501,503) THEN
      r_cab_valorTarifaCartao := FUNC_ADD_TARIFA_CART_DOC_FISC (cab.idDocumentoFiscal);
    END IF;
    IF p_calcularMargemContribuicao = 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 cab.tipoDocumento IN (101,102,301,501,503) THEN
      DELETE TEMPMARGEMCONTRIBUICAO
      WHERE uniqueMachineID = p_uniqueMachineID
      AND orcamentoPredocumentoDocumento = 'D'
      AND idCabecalho = cab.idDocumentoFiscal;
      ADD_DOC_FISC_GERA_TEMP_MARGEM(
        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,
        cab.idDocumentoFiscal,
        cab.estabelecimento,
        cab.dataEmissao,
        cab.prazoMedioPonderado,
        r_cab_valorFreteTotal,
        r_cab_valorSeguroTotal,
        r_cab_valorAdicFreteMarinTotal,
        r_cab_valorDespesasAduanTotal,
        r_cab_valorLiquidoItem,
        r_cab_valorTarifaCartao,
        cab.munEndEst_uf,
        /* Retornos */
        r_cab_valorMargem,
        r_cab_percentualMargem,
        r_cab_imagemMargem
      );
    END IF;
    UPDATE MODOCUMENTOSFISCAIS SET 
      valorProdutos                 = r_cab_valorProdutos,
      valorServicos                 = r_cab_valorServicos,
      valorBasePagamento            = r_cab_valorBasePagamento,
      valorAVistaMinimo             = r_cab_valorAVistaMinimo,
      valorFreteTotal               = r_cab_valorFreteTotal,
      valorSeguroTotal              = r_cab_valorSeguroTotal,
      valorDescontoTotal            = v_cab_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = r_cab_valorAdicFreteMarinTotal,
      valorDespesasAduaneirasTotal  = r_cab_valorDespesasAduanTotal,
      valorImpostosSomaPagamento    = r_cab_valorImpSomaPagamento,
      valorImpostosDiminuiPagamento = r_cab_valorImpDiminuiPagamento,
      valorLiquidoItem              = r_cab_valorLiquidoItem,
      valorDescontoCustoOpTotal     = v_cab_valorDescCustoOpTotal,
      valorAcrescimoCustoOpTotal    = v_cab_valorAcrescCustoOpTotal,
      valorCustoOperacao            = v_cab_valorCustoOperacao,
      valorCMV                      = v_cab_valorCMV,
      valorAcrescimoExtempTotal     = r_cab_valorAcrescExtempTotal
    WHERE idDocumentoFiscal         = cab.idDocumentoFiscal;
  END LOOP;
END ADD_DOC_FISC_CALC_IMP_CAB;

/

create or replace PROCEDURE ADD_PRE_DOC_CALC_IMP_RESIDUO (
    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_valorProdutos            IN NUMBER,
    p_cab_valorServicos            IN NUMBER,
    p_cab_valorBasePagamento       IN NUMBER,
    p_cab_valorAVistaMinimo        IN NUMBER,
    p_cab_valorFreteTotal          IN NUMBER,
    p_cab_valorSeguroTotal         IN NUMBER,
    p_cab_valorDescontoTotal       IN NUMBER,
    p_cab_valorOutrasDespesasTotal IN NUMBER,
    p_cab_valorAdicFreteMarinTotal IN NUMBER,
    p_cab_valorDespesasAduanTotal  IN NUMBER,
    p_cab_impostosEditados         IN NUMBER,
    p_cab_valorImpSomaPagamento    IN NUMBER,
    p_cab_valorImpDiminuiPagamento IN NUMBER,
    p_cab_valorLiquidoItem         IN NUMBER,
    p_cab_valorDescCustoOpTotal    IN NUMBER,
    p_cab_valorAcrescCustoOpTotal  IN NUMBER,
    p_cab_valorCustoOperacao       IN NUMBER,
    p_cab_valorCMV                 IN NUMBER,
    p_cab_valorAcrescExtempTotal   IN NUMBER,
    p_modDoc_diminuiDescontoPrUnit IN NUMBER,
    p_modDoc_somaAcrescimosPrUnit  IN NUMBER,
    p_modDoc_somaFreteSeguroPrUnit IN NUMBER,
    p_item_idItemPreDocumento      IN NUMBER,
    p_saldoRatFreteGeral           IN NUMBER,
    p_saldoRatSeguroGeral          IN NUMBER,
    p_saldoRatDescontoGeral        IN NUMBER,
    p_saldoRatOutrasDespesasGeral  IN NUMBER,
    p_saldoRatAdicFreteMarinGeral  IN NUMBER,
    p_saldoRatDespesasAduanGeral   IN NUMBER,
    p_saldoRatDescontoPagamento    IN NUMBER,
    p_saldoRatOutrasDespPagamento  IN NUMBER,
    p_saldoRatJurosPagamento       IN NUMBER,
    p_saldoRatDescCustoOpGeral     IN NUMBER,
    p_saldoRatAcrescCustoOpGeral   IN NUMBER,
    p_saldoRatAcrescExtempGeral    IN NUMBER,
    p_calcularImpostosItem         IN NUMBER,
    /* Retornos */
    r_cab_valorProdutos            OUT NUMBER,
    r_cab_valorServicos            OUT NUMBER,
    r_cab_valorBasePagamento       OUT NUMBER,
    r_cab_valorAVistaMinimo        OUT NUMBER,
    r_cab_valorFreteTotal          OUT NUMBER,
    r_cab_valorSeguroTotal         OUT NUMBER,
    r_cab_valorDescontoTotal       OUT NUMBER,
    r_cab_valorOutrasDespesasTotal OUT NUMBER,
    r_cab_valorAdicFreteMarinTotal OUT NUMBER,
    r_cab_valorDespesasAduanTotal  OUT NUMBER,
    r_cab_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_valorBaseRateio              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.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
      FROM MOPREDOCUMXITENS a
      WHERE a.idItemPreDocumento = p_item_idItemPreDocumento
      ORDER BY a.sequencia;
BEGIN
  r_cab_valorProdutos            := p_cab_valorProdutos;
  r_cab_valorServicos            := p_cab_valorServicos;
  r_cab_valorBasePagamento       := p_cab_valorBasePagamento;
  r_cab_valorAVistaMinimo        := p_cab_valorAVistaMinimo;
  r_cab_valorFreteTotal          := p_cab_valorFreteTotal;
  r_cab_valorSeguroTotal         := p_cab_valorSeguroTotal;
  r_cab_valorDescontoTotal       := p_cab_valorDescontoTotal;
  r_cab_valorOutrasDespesasTotal := p_cab_valorOutrasDespesasTotal;
  r_cab_valorAdicFreteMarinTotal := p_cab_valorAdicFreteMarinTotal;
  r_cab_valorDespesasAduanTotal  := p_cab_valorDespesasAduanTotal;
  r_cab_valorImpSomaPagamento    := p_cab_valorImpSomaPagamento;
  r_cab_valorImpDiminuiPagamento := p_cab_valorImpDiminuiPagamento;
  r_cab_valorLiquidoItem         := p_cab_valorLiquidoItem;
  r_cab_valorDescCustoOpTotal    := p_cab_valorDescCustoOpTotal;
  r_cab_valorAcrescCustoOpTotal  := p_cab_valorAcrescCustoOpTotal;
  r_cab_valorCustoOperacao       := p_cab_valorCustoOperacao;
  r_cab_valorCMV                 := p_cab_valorCMV;
  r_cab_valorAcrescExtempTotal   := p_cab_valorAcrescExtempTotal;
  FOR item IN c_item LOOP
    v_precoUnitario                := item.precoUnitario;
    v_precoUnitarioConvertido      := item.precoUnitarioConvertido;
    v_valorProdutoServico          := item.valorProdutoServico;
    v_valorFreteGeral              := item.valorFreteGeral;
    v_valorSeguroGeral             := item.valorSeguroGeral;
    v_valorDescontoGeral           := item.valorDescontoGeral;
    v_valorOutrasDespesasGeral     := item.valorOutrasDespesasGeral;
    v_valorAdicFreteMarinMerGeral  := item.valorAdicFreteMarinhaMerGeral;
    v_valorDespesasAduaneirasGeral := item.valorDespesasAduaneirasGeral;
    v_valorBasePagamento           := item.valorBasePagamento;
    v_valorDescontoPagamento       := item.valorDescontoPagamento;
    v_valorOutrasDespesasPagamento := item.valorOutrasDespesasPagamento;
    v_valorJurosPagamento          := item.valorJurosPagamento;
    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_valorDescontoCustoOpGeral    := item.valorDescontoCustoOpGeral;
    v_valorDescontoCustoOpTotal    := item.valorDescontoCustoOpTotal;
    v_valorAcrescimoCustoOpGeral   := item.valorAcrescimoCustoOpGeral;
    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_valorAcrescimoExtempGeral    := item.valorAcrescimoExtempGeral;
    v_valorAcrescimoExtempTotal    := item.valorAcrescimoExtempTotal;
    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;
    v_valorFreteGeral              := v_valorFreteGeral + p_saldoRatFreteGeral;
    v_valorSeguroGeral             := v_valorSeguroGeral + p_saldoRatSeguroGeral;
    v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral + p_saldoRatAdicFreteMarinGeral;
    v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + p_saldoRatDespesasAduanGeral;
    v_valorDescontoGeral           := v_valorDescontoGeral + p_saldoRatDescontoGeral;
    v_valorOutrasDespesasGeral     := v_valorDespesasAduaneirasGeral + p_saldoRatOutrasDespesasGeral;
    v_valorDescontoPagamento       := v_valorDescontoPagamento + p_saldoRatDescontoPagamento;
    v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + p_saldoRatOutrasDespPagamento;
    v_valorJurosPagamento          := v_valorJurosPagamento + p_saldoRatJurosPagamento;
    v_valorDescontoCustoOpGeral    := v_valorDescontoCustoOpGeral + p_saldoRatDescCustoOpGeral;
    v_valorAcrescimoCustoOpGeral   := v_valorAcrescimoCustoOpGeral + p_saldoRatAcrescCustoOpGeral;
    v_valorAcrescimoExtempGeral    := v_valorAcrescimoExtempGeral + p_saldoRatAcrescExtempGeral;
    ADD_CALCULA_TOTAIS_ITEM(
      p_cab_tipoPagamentoFrete,
      p_modDoc_diminuiDescontoPrUnit,
      p_modDoc_somaAcrescimosPrUnit,
      p_modDoc_somaFreteSeguroPrUnit,
      item.quantidade,
      item.quantidadeConvertida,
      item.precoUnitarioBruto,
      item.acrescimoUnitarioComposicao,
      item.precoUnitario,
      item.valorDescontoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      v_valorFreteGeral,
      v_valorSeguroGeral,
      v_valorDescontoGeral,
      v_valorOutrasDespesasGeral,
      v_valorAdicFreteMarinMerGeral,
      v_valorDespesasAduaneirasGeral,
      v_valorDescontoPagamento,
      v_valorOutrasDespesasPagamento,
      v_valorJurosPagamento,
      item.quantidadeExtemporanea,
      item.acrescimoUnitarioExtemporaneo,
      item.valorAcrescimoExtempItem,
      v_valorAcrescimoExtempGeral,
      /* Retornos */
      v_precoUnitario,
      v_precoUnitarioConvertido,
      v_valorProdutoServico,
      v_auxNumber,
      v_auxNumber,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal,
      v_valorAcrescimoExtempSubtotal,
      v_valorAcrescimoExtempTotal);
    IF p_cab_impostosEditados = 0 
        OR v_valorProdutoServico <> item.valorProdutoServico
        OR CASE WHEN p_cab_tipoPagamentoFrete   = 'V' THEN 0 ELSE v_valorFreteTotal END
        <> CASE WHEN p_a_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE item.valorFreteTotal END
        OR CASE WHEN p_cab_tipoPagamentoFrete   = 'V' THEN 0 ELSE v_valorSeguroTotal END
        <> CASE WHEN p_a_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE item.valorSeguroTotal END
        OR v_valorDescontoTotal <> item.valorDescontoTotal
        OR v_valorOutrasDespesasTotal <> item.valorOutrasDespesasTotal
        OR v_valorAdicFreteMarinMerTotal <> item.valorAdicFreteMarinhaMerTotal
        OR v_valorDespesasAduaneirasTotal <> item.valorDespesasAduaneirasTotal
        OR v_precoUnitario <> item.precoUnitario
        OR v_valorProdutoServico <> item.valorProdutoServico
    THEN
      r_calcularImpostosItem := 1;
    END IF;
    ADD_CALCULA_VALOR_LIQUIDO (
      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);
    UPDATE MOPREDOCUMXITENS SET
      precoUnitario                 = v_precoUnitario,
      precoUnitarioConvertido       = v_precoUnitarioConvertido,
      valorProdutoServico           = v_valorProdutoServico,
      valorFreteGeral               = v_valorFreteGeral,
      valorSeguroGeral              = v_valorSeguroGeral,
      valorDescontoGeral            = v_valorDescontoGeral,
      valorOutrasDespesasGeral      = v_valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral = v_valorAdicFreteMarinMerGeral,
      valorDespesasAduaneirasGeral  = v_valorDespesasAduaneirasGeral,
      valorBasePagamento            = v_valorBasePagamento,
      valorDescontoPagamento        = v_valorDescontoPagamento,
      valorOutrasDespesasPagamento  = v_valorOutrasDespesasPagamento,
      valorJurosPagamento           = v_valorJurosPagamento,
      valorFreteTotal               = v_valorFreteTotal,
      valorSeguroTotal              = v_valorSeguroTotal,
      valorDescontoTotal            = v_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
      valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
      valorImpostosSomaPagamento    = v_valorImpSomaPagamento,
      valorImpostosDiminuiPagamento = v_valorImpDiminuiPagamento,
      valorLiquidoItem              = v_valorLiquidoItem,
      valorDescontoCustoOpGeral     = v_valorDescontoCustoOpGeral,
      valorDescontoCustoOpTotal     = v_valorDescontoCustoOpTotal,
      valorAcrescimoCustoOpGeral    = v_valorAcrescimoCustoOpGeral,
      valorAcrescimoCustoOpTotal    = v_valorAcrescimoCustoOpTotal,
      precoCustoOperacao            = v_precoCustoOperacao,
      valorCustoOperacao            = v_valorCustoOperacao,
      precoCMV                      = v_precoCMV,
      valorCMV                      = v_valorCMV,
      valorAcrescimoExtempSubtotal  = v_valorAcrescimoExtempSubtotal,
      valorAcrescimoExtempGeral     = v_valorAcrescimoExtempGeral,
      valorAcrescimoExtempTotal     = v_valorAcrescimoExtempTotal
    WHERE idItemPreDocumento        = p_item_idItemPreDocumento;
    IF item.servico = 1 THEN
      r_cab_valorServicos          := r_cab_valorServicos + v_valorProdutoServico;
    ELSE
      r_cab_valorProdutos          := r_cab_valorProdutos + v_valorProdutoServico;
    END IF;
    r_cab_valorBasePagamento       := r_cab_valorBasePagamento + v_valorBasePagamento;
    IF item.usarPrecoAVista = 1 AND item.geraFinanceiro = 1 THEN
      r_cab_valorAVistaMinimo      := r_cab_valorAVistaMinimo + v_valorProdutoServico + v_valorDescontoPagamento - v_valorOutrasDespesasPagamento - v_valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
    END IF;
    r_cab_valorFreteTotal          := r_cab_valorFreteTotal + v_valorFreteTotal;
    r_cab_valorSeguroTotal         := r_cab_valorSeguroTotal + v_valorSeguroTotal;
    r_cab_valorDescontoTotal       := r_cab_valorDescontoTotal + v_valorDescontoTotal;
    r_cab_valorOutrasDespesasTotal := r_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
    r_cab_valorAdicFreteMarinTotal := r_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
    r_cab_valorDespesasAduanTotal  := r_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
    r_cab_valorDescCustoOpTotal    := r_cab_valorDescCustoOpTotal + v_valorDescontoCustoOpTotal;
    r_cab_valorImpSomaPagamento    := r_cab_valorImpSomaPagamento + v_valorImpSomaPagamento;
    r_cab_valorImpDiminuiPagamento := r_cab_valorImpDiminuiPagamento + v_valorImpDiminuiPagamento;
    r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem + v_valorLiquidoItem;
    r_cab_valorAcrescCustoOpTotal  := r_cab_valorAcrescCustoOpTotal + v_valorAcrescimoCustoOpTotal;
    r_cab_valorCustoOperacao       := r_cab_valorCustoOperacao + v_valorCustoOperacao;
    r_cab_valorCMV                 := r_cab_valorCMV + v_valorCMV;
    r_cab_valorAcrescExtempTotal   := r_cab_valorAcrescExtempTotal + v_valorAcrescimoExtempTotal;
  END LOOP;
END ADD_PRE_DOC_CALC_IMP_RESIDUO;

/

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

/

create or replace PROCEDURE ADD_PRE_DOC_CALC_IMP_CAB (
    p_uniqueMachineID              IN VARCHAR2,
    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_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_bloqPercMargemCab    IN NUMBER,
    p_regMarg_exibPercMargemItem   IN NUMBER,
    p_regMarg_exibImagemMargemItem IN NUMBER,
    p_regMarg_regraImagemItem      IN NUMBER,
    p_regMarg_exibDetMargemItem    IN NUMBER,
    p_regMarg_bloqPercMargemItem   IN NUMBER,
    p_calcularMargemContribuicao   IN NUMBER,
    p_cab_preDocumento             IN NUMBER,
    p_a_cab_tipoPagamentoFrete     IN CHAR,
    /* Retornos */
    r_cab_valorProdutos            OUT NUMBER,
    r_cab_valorServicos            OUT NUMBER,
    r_cab_valorBasePagamento       OUT NUMBER,
    r_cab_valorAVistaMinimo        OUT NUMBER,
    r_cab_valorFreteTotal          OUT NUMBER,
    r_cab_valorSeguroTotal         OUT NUMBER,
    r_cab_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_valorAcrescExtempTotal   OUT NUMBER,
    r_cab_valorTarifaCartao        OUT NUMBER,
    r_cab_valorMargem              OUT NUMBER,
    r_cab_percentualMargem         OUT NUMBER,
    r_cab_imagemMargem             OUT VARCHAR2)    
IS
    v_cab_valorDescontoTotal       NUMBER;
    v_cab_valorOutrasDespesasTotal NUMBER;
    v_cab_valorCustoOperacao       NUMBER;
    v_cab_valorCMV                 NUMBER;
    v_cab_valorDescCustoOpTotal    NUMBER;
    v_cab_valorAcrescCustoOpTotal  NUMBER;
    v_calcularImpostosItem         NUMBER;
    CURSOR c_cab IS
      SELECT a.*,
        modDoc.diminuiDescontoPrUnit,
        modDoc.somaAcrescimosPrUnit,
        modDoc.somaFreteSeguroPrUnit,
        modDoc.habilitaControleEntrega,
        pess.indicadorInscricaoEstadual,
        COALESCE((
          SELECT MIN(munEndEst.uf)
          FROM PAESTABELECIMENTOS est
          JOIN CAENDERECOSPESSOA endEst ON endEst.pessoa = est.pessoaEstabelecimento
          JOIN SIMUNICIPIOS munEndEst on munEndEst.municipio = endEst.municipio
          WHERE est.estabelecimento = a.estabelecimento
          AND endEst.ativo = 1
          AND endEst.principal = 1
          ),'  ') munEndEst_uf
      FROM MOPREDOCUMENTOS a
      JOIN PAMODELOSDOCUMENTO modDoc ON modDoc.modeloDocumento = a.modeloDocumento
      JOIN CAPESSOAS pess ON pess.pessoa = a.pessoa
      WHERE a.preDocumento = p_cab_preDocumento;
BEGIN
  FOR cab IN c_cab LOOP
    r_cab_valorProdutos            := cab.valorProdutos;
    r_cab_valorServicos            := cab.valorServicos;
    r_cab_valorBasePagamento       := cab.valorBasePagamento;
    r_cab_valorAVistaMinimo        := cab.valorAVistaMinimo;
    r_cab_valorFreteTotal          := cab.valorFreteTotal;
    r_cab_valorSeguroTotal         := cab.valorSeguroTotal;
    v_cab_valorDescontoTotal       := cab.valorDescontoTotal;
    v_cab_valorOutrasDespesasTotal := cab.valorOutrasDespesasTotal;
    r_cab_valorAdicFreteMarinTotal := cab.valorAdicFreteMarinhaMerTotal;
    r_cab_valorDespesasAduanTotal  := cab.valorDespesasAduaneirasTotal;
    r_cab_valorImpSomaPagamento    := cab.valorImpostosSomaPagamento;
    r_cab_valorImpDiminuiPagamento := cab.valorImpostosDiminuiPagamento;
    r_cab_valorLiquidoItem         := cab.valorLiquidoItem;
    v_cab_valorDescCustoOpTotal    := cab.valorDescontoCustoOpTotal;
    v_cab_valorAcrescCustoOpTotal  := cab.valorAcrescimoCustoOpTotal;
    v_cab_valorCustoOperacao       := cab.valorCustoOperacao;
    v_cab_valorCMV                 := cab.valorCMV;
    r_cab_valorAcrescExtempTotal   := cab.valorAcrescimoExtempTotal;    
    r_cab_valorTarifaCartao        := 0;
    r_cab_valorMargem              := 0;
    r_cab_percentualMargem         := 0;
    r_cab_imagemMargem             := ' ';
    v_calcularImpostosItem         := 0;
    ADD_PRE_DOC_CALC_IMP_RATEIO (
      cab.preDocumento,
      cab.modeloDocumento,
      cab.entradaSaida,
      cab.devolucaoAnulacaoRetorno,
      cab.atualizaCustoMedio,
      p_a_cab_tipoPagamentoFrete,
      cab.tipoPagamentoFrete,
      cab.valorFreteGeral,
      cab.valorSeguroGeral,
      cab.valorDescontoGeral,
      cab.valorOutrasDespesasGeral,
      cab.valorAdicFreteMarinhaMerGeral,
      cab.valorDespesasAduaneirasGeral,
      cab.valorDescontoPagamento,
      cab.valorOutrasDespesasPagamento,
      cab.valorJurosPagamento,
      cab.impostosEditados,
      cab.valorDescontoCustoOpGeral,
      cab.valorAcrescimoCustoOpGeral,
      cab.valorAcrescimoExtempGeral,
      cab.diminuiDescontoPrUnit,
      cab.somaAcrescimosPrUnit,
      cab.somaFreteSeguroPrUnit,
      cab.habilitaControleEntrega,
      /* Retornos */
      r_cab_valorProdutos,
      r_cab_valorServicos,
      r_cab_valorBasePagamento,
      r_cab_valorAVistaMinimo,
      r_cab_valorFreteTotal,
      r_cab_valorSeguroTotal,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespesasTotal,
      r_cab_valorAdicFreteMarinTotal,
      r_cab_valorDespesasAduanTotal,
      r_cab_valorImpSomaPagamento,
      r_cab_valorImpDiminuiPagamento,
      r_cab_valorLiquidoItem,
      v_cab_valorDescCustoOpTotal,
      v_cab_valorAcrescCustoOpTotal,
      v_cab_valorCustoOperacao,
      v_cab_valorCMV,
      r_cab_valorAcrescExtempTotal,
      v_calcularImpostosItem);
    IF v_calcularImpostosItem = 1 THEN
      ADD_PRE_DOC_CALC_IMP_ITENS(
        p_config_64_casasDecSaidas,
        p_config_209_filtrarGrupoEcon,
        p_config_330_redIcmsBasePisCof,
        p_config_362_calcCustoPorGrade,
        cab.preDocumento,
        cab.modeloDocumento,
        cab.entradaSaida,
        cab.devolucaoAnulacaoRetorno,
        cab.atualizaCustoMedio,
        cab.estabelecimento,
        cab.dataEntradaSaida,
        cab.pessoa,
        cab.localDestinoOperacao,
        cab.indicadorConsumidorFinal,
        p_a_cab_tipoPagamentoFrete,
        cab.tipoPagamentoFrete,
        cab.valorProdutosBruto,
        cab.valorDescontoProdutos,
        cab.valorAcrescimoProdutos,
        cab.valorServicosBruto,
        cab.valorDescontoServicos,
        cab.valorAcrescimoServicos,
        cab.valorFreteGeral,
        cab.valorSeguroGeral,
        cab.valorDescontoGeral,
        cab.valorOutrasDespesasGeral,
        cab.valorAdicFreteMarinhaMerGeral,
        cab.valorDespesasAduaneirasGeral,
        cab.valorDescontoPagamento,
        cab.valorOutrasDespesasPagamento,
        cab.valorJurosPagamento,
        cab.impostosEditados,
        cab.valorDescontoCustoOpGeral,
        cab.valorAcrescimoCustoOpGeral,
        cab.valorAcrescimoExtempGeral,
        cab.diminuiDescontoPrUnit,
        cab.somaAcrescimosPrUnit,
        cab.somaFreteSeguroPrUnit,
        cab.indicadorInscricaoEstadual,
        /* Retornos */
        r_cab_valorProdutos,
        r_cab_valorServicos,
        r_cab_valorBasePagamento,
        r_cab_valorAVistaMinimo,
        r_cab_valorFreteTotal,
        r_cab_valorSeguroTotal,
        v_cab_valorDescontoTotal,
        v_cab_valorOutrasDespesasTotal,
        r_cab_valorAdicFreteMarinTotal,
        r_cab_valorDespesasAduanTotal,
        r_cab_valorImpSomaPagamento,
        r_cab_valorImpDiminuiPagamento,
        r_cab_valorLiquidoItem,
        v_cab_valorDescCustoOpTotal,
        v_cab_valorAcrescCustoOpTotal,
        v_cab_valorCustoOperacao,
        v_cab_valorCMV,
        r_cab_valorAcrescExtempTotal);
    END IF;
    IF p_calcularMargemContribuicao = 1 AND (p_regMarg_exibPercMargemCab = 1 OR p_regMarg_exibImagemMargemCab = 1 OR p_regMarg_bloqPercMargemCab = 1 OR p_regMarg_exibPercMargemItem = 1 OR p_regMarg_exibImagemMargemItem = 1 OR p_regMarg_exibDetMargemItem = 1 OR p_regMarg_bloqPercMargemItem = 1) AND cab.tipoDocumento IN (101,102,301,501,503) THEN
      r_cab_valorTarifaCartao := FUNC_ADD_TARIFA_CART_PRE_DOC (cab.preDocumento);
    END IF;
    IF p_calcularMargemContribuicao = 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 cab.tipoDocumento IN (101,102,301,501,503) THEN
      EXECUTE IMMEDIATE '
        DELETE TEMPMARGEMCONTRIBUICAO
        WHERE uniqueMachineID = :1
        AND orcamentoPredocumentoDocumento = :2
        AND idCabecalho = :3'
        USING 
          p_uniqueMachineID,
          'P',
          cab.preDocumento;
      ADD_PRE_DOC_GERA_TEMP_MARGEM(
        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,
        cab.preDocumento,
        cab.estabelecimento,
        cab.dataEmissao,
        cab.prazoMedioPonderado,
        r_cab_valorFreteTotal,
        r_cab_valorSeguroTotal,
        r_cab_valorAdicFreteMarinTotal,
        r_cab_valorDespesasAduanTotal,
        r_cab_valorLiquidoItem,
        r_cab_valorTarifaCartao,
        cab.munEndEst_uf,
        /* Retornos */
        r_cab_valorMargem,
        r_cab_percentualMargem,
        r_cab_imagemMargem
      );
    END IF;
    UPDATE MOPREDOCUMENTOS SET 
      valorProdutos                 = r_cab_valorProdutos,
      valorServicos                 = r_cab_valorServicos,
      valorBasePagamento            = r_cab_valorBasePagamento,
      valorAVistaMinimo             = r_cab_valorAVistaMinimo,
      valorFreteTotal               = r_cab_valorFreteTotal,
      valorSeguroTotal              = r_cab_valorSeguroTotal,
      valorDescontoTotal            = v_cab_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = r_cab_valorAdicFreteMarinTotal,
      valorDespesasAduaneirasTotal  = r_cab_valorDespesasAduanTotal,
      valorImpostosSomaPagamento    = r_cab_valorImpSomaPagamento,
      valorImpostosDiminuiPagamento = r_cab_valorImpDiminuiPagamento,
      valorLiquidoItem              = r_cab_valorLiquidoItem,
      valorDescontoCustoOpTotal     = v_cab_valorDescCustoOpTotal,
      valorAcrescimoCustoOpTotal    = v_cab_valorAcrescCustoOpTotal,
      valorCustoOperacao            = v_cab_valorCustoOperacao,
      valorCMV                      = v_cab_valorCMV,
      valorAcrescimoExtempTotal     = r_cab_valorAcrescExtempTotal
    WHERE preDocumento              = cab.preDocumento;
  END LOOP;
END ADD_PRE_DOC_CALC_IMP_CAB;

/

create or replace PROCEDURE ADD_ORCAMENTO_CALC_IMP_RESIDUO (
    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_valorProdutos            IN NUMBER,
    p_cab_valorServicos            IN NUMBER,
    p_cab_valorBasePagamento       IN NUMBER,
    p_cab_valorAVistaMinimo        IN NUMBER,
    p_cab_valorFreteTotal          IN NUMBER,
    p_cab_valorSeguroTotal         IN NUMBER,
    p_cab_valorDescontoTotal       IN NUMBER,
    p_cab_valorOutrasDespesasTotal IN NUMBER,
    p_cab_valorAdicFreteMarinTotal IN NUMBER,
    p_cab_valorDespesasAduanTotal  IN NUMBER,
    p_cab_impostosEditados         IN NUMBER,
    p_cab_valorImpSomaPagamento    IN NUMBER,
    p_cab_valorImpDiminuiPagamento IN NUMBER,
    p_cab_valorLiquidoItem         IN NUMBER,
    p_modDoc_diminuiDescontoPrUnit IN NUMBER,
    p_modDoc_somaAcrescimosPrUnit  IN NUMBER,
    p_modDoc_somaFreteSeguroPrUnit IN NUMBER,
    p_item_idItemOrcamento         IN NUMBER,
    p_saldoRatFreteGeral           IN NUMBER,
    p_saldoRatSeguroGeral          IN NUMBER,
    p_saldoRatDescontoGeral        IN NUMBER,
    p_saldoRatOutrasDespesasGeral  IN NUMBER,
    p_saldoRatAdicFreteMarinGeral  IN NUMBER,
    p_saldoRatDespesasAduanGeral   IN NUMBER,
    p_saldoRatDescontoPagamento    IN NUMBER,
    p_saldoRatOutrasDespPagamento  IN NUMBER,
    p_saldoRatJurosPagamento       IN NUMBER,
    p_calcularImpostosItem         IN NUMBER,
    /* Retornos */
    r_cab_valorProdutos            OUT NUMBER,
    r_cab_valorServicos            OUT NUMBER,
    r_cab_valorBasePagamento       OUT NUMBER,
    r_cab_valorAVistaMinimo        OUT NUMBER,
    r_cab_valorFreteTotal          OUT NUMBER,
    r_cab_valorSeguroTotal         OUT NUMBER,
    r_cab_valorDescontoTotal       OUT NUMBER,
    r_cab_valorOutrasDespesasTotal OUT NUMBER,
    r_cab_valorAdicFreteMarinTotal OUT NUMBER,
    r_cab_valorDespesasAduanTotal  OUT NUMBER,
    r_cab_valorImpSomaPagamento    OUT NUMBER,
    r_cab_valorImpDiminuiPagamento OUT NUMBER,
    r_cab_valorLiquidoItem         OUT NUMBER,
    r_calcularImpostosItem         OUT NUMBER)
IS
    v_auxNumber                    NUMBER;
    v_precoUnitario                NUMBER;
    v_precoUnitarioConvertido      NUMBER;
    v_valorProdutoServico          NUMBER;
    v_valorFreteGeral              NUMBER;
    v_valorSeguroGeral             NUMBER;
    v_valorDescontoGeral           NUMBER;
    v_valorOutrasDespesasGeral     NUMBER;
    v_valorAdicFreteMarinMerGeral  NUMBER;
    v_valorDespesasAduaneirasGeral NUMBER;
    v_valorBasePagamento           NUMBER;
    v_valorDescontoPagamento       NUMBER;
    v_valorOutrasDespesasPagamento NUMBER;
    v_valorJurosPagamento          NUMBER;
    v_valorFreteTotal              NUMBER;
    v_valorSeguroTotal             NUMBER;
    v_valorDescontoTotal           NUMBER;
    v_valorOutrasDespesasTotal     NUMBER;
    v_valorAdicFreteMarinMerTotal  NUMBER;
    v_valorDespesasAduaneirasTotal NUMBER;
    v_valorImpSomaPagamento        NUMBER;
    v_valorImpDiminuiPagamento     NUMBER;
    v_valorLiquidoItem             NUMBER;
    CURSOR c_item IS
      SELECT
        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
      FROM MOORCAMENTOXITENS a
      WHERE a.idItemOrcamento = p_item_idItemOrcamento
      ORDER BY a.sequencia;
BEGIN
  r_cab_valorProdutos            := p_cab_valorProdutos;
  r_cab_valorServicos            := p_cab_valorServicos;
  r_cab_valorBasePagamento       := p_cab_valorBasePagamento;
  r_cab_valorAVistaMinimo        := p_cab_valorAVistaMinimo;
  r_cab_valorFreteTotal          := p_cab_valorFreteTotal;
  r_cab_valorSeguroTotal         := p_cab_valorSeguroTotal;
  r_cab_valorDescontoTotal       := p_cab_valorDescontoTotal;
  r_cab_valorOutrasDespesasTotal := p_cab_valorOutrasDespesasTotal;
  r_cab_valorAdicFreteMarinTotal := p_cab_valorAdicFreteMarinTotal;
  r_cab_valorDespesasAduanTotal  := p_cab_valorDespesasAduanTotal;
  r_cab_valorImpSomaPagamento    := p_cab_valorImpSomaPagamento;
  r_cab_valorImpDiminuiPagamento := p_cab_valorImpDiminuiPagamento;
  r_cab_valorLiquidoItem         := p_cab_valorLiquidoItem;
  FOR item IN c_item LOOP
    v_precoUnitario                := item.precoUnitario;
    v_precoUnitarioConvertido      := item.precoUnitarioConvertido;
    v_valorProdutoServico          := item.valorProdutoServico;
    v_valorFreteGeral              := item.valorFreteGeral;
    v_valorSeguroGeral             := item.valorSeguroGeral;
    v_valorDescontoGeral           := item.valorDescontoGeral;
    v_valorOutrasDespesasGeral     := item.valorOutrasDespesasGeral;
    v_valorAdicFreteMarinMerGeral  := item.valorAdicFreteMarinhaMerGeral;
    v_valorDespesasAduaneirasGeral := item.valorDespesasAduaneirasGeral;
    v_valorBasePagamento           := item.valorBasePagamento;
    v_valorDescontoPagamento       := item.valorDescontoPagamento;
    v_valorOutrasDespesasPagamento := item.valorOutrasDespesasPagamento;
    v_valorJurosPagamento          := item.valorJurosPagamento;
    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 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;
    v_valorFreteGeral              := v_valorFreteGeral + p_saldoRatFreteGeral;
    v_valorSeguroGeral             := v_valorSeguroGeral + p_saldoRatSeguroGeral;
    v_valorAdicFreteMarinMerGeral  := v_valorAdicFreteMarinMerGeral + p_saldoRatAdicFreteMarinGeral;
    v_valorDespesasAduaneirasGeral := v_valorDespesasAduaneirasGeral + p_saldoRatDespesasAduanGeral;
    v_valorDescontoGeral           := v_valorDescontoGeral + p_saldoRatDescontoGeral;
    v_valorOutrasDespesasGeral     := v_valorDespesasAduaneirasGeral + p_saldoRatOutrasDespesasGeral;
    v_valorDescontoPagamento       := v_valorDescontoPagamento + p_saldoRatDescontoPagamento;
    v_valorOutrasDespesasPagamento := v_valorOutrasDespesasPagamento + p_saldoRatOutrasDespPagamento;
    v_valorJurosPagamento          := v_valorJurosPagamento + p_saldoRatJurosPagamento;
    ADD_CALCULA_TOTAIS_ITEM(
      p_cab_tipoPagamentoFrete,
      p_modDoc_diminuiDescontoPrUnit,
      p_modDoc_somaAcrescimosPrUnit,
      p_modDoc_somaFreteSeguroPrUnit,
      item.quantidade,
      item.quantidadeConvertida,
      item.precoUnitarioBruto,
      item.acrescimoUnitarioComposicao,
      item.precoUnitario,
      item.valorDescontoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      v_valorFreteGeral,
      v_valorSeguroGeral,
      v_valorDescontoGeral,
      v_valorOutrasDespesasGeral,
      v_valorAdicFreteMarinMerGeral,
      v_valorDespesasAduaneirasGeral,
      v_valorDescontoPagamento,
      v_valorOutrasDespesasPagamento,
      v_valorJurosPagamento,
      0,
      0,
      0,
      0,
      /* Retornos */
      v_precoUnitario,
      v_precoUnitarioConvertido,
      v_valorProdutoServico,
      v_auxNumber,
      v_auxNumber,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal,
      v_auxNumber,
      v_auxNumber);
    IF p_cab_impostosEditados = 0 
        OR v_valorProdutoServico <> item.valorProdutoServico
        OR CASE WHEN p_cab_tipoPagamentoFrete   = 'V' THEN 0 ELSE v_valorFreteTotal END
        <> CASE WHEN p_a_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE item.valorFreteTotal END
        OR CASE WHEN p_cab_tipoPagamentoFrete   = 'V' THEN 0 ELSE v_valorSeguroTotal END
        <> CASE WHEN p_a_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE item.valorSeguroTotal END
        OR v_valorDescontoTotal <> item.valorDescontoTotal
        OR v_valorOutrasDespesasTotal <> item.valorOutrasDespesasTotal
        OR v_valorAdicFreteMarinMerTotal <> item.valorAdicFreteMarinhaMerTotal
        OR v_valorDespesasAduaneirasTotal <> item.valorDespesasAduaneirasTotal
        OR v_precoUnitario <> item.precoUnitario
        OR v_valorProdutoServico <> item.valorProdutoServico
    THEN
      r_calcularImpostosItem := 1;
    END IF;
    ADD_CALCULA_VALOR_LIQUIDO (
      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);
    UPDATE MOORCAMENTOXITENS SET
      precoUnitario                 = v_precoUnitario,
      precoUnitarioConvertido       = v_precoUnitarioConvertido,
      valorProdutoServico           = v_valorProdutoServico,
      valorFreteGeral               = v_valorFreteGeral,
      valorSeguroGeral              = v_valorSeguroGeral,
      valorDescontoGeral            = v_valorDescontoGeral,
      valorOutrasDespesasGeral      = v_valorOutrasDespesasGeral,
      valorAdicFreteMarinhaMerGeral = v_valorAdicFreteMarinMerGeral,
      valorDespesasAduaneirasGeral  = v_valorDespesasAduaneirasGeral,
      valorBasePagamento            = v_valorBasePagamento,
      valorDescontoPagamento        = v_valorDescontoPagamento,
      valorOutrasDespesasPagamento  = v_valorOutrasDespesasPagamento,
      valorJurosPagamento           = v_valorJurosPagamento,
      valorFreteTotal               = v_valorFreteTotal,
      valorSeguroTotal              = v_valorSeguroTotal,
      valorDescontoTotal            = v_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
      valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
      valorImpostosSomaPagamento    = v_valorImpSomaPagamento,
      valorImpostosDiminuiPagamento = v_valorImpDiminuiPagamento,
      valorLiquidoItem              = v_valorLiquidoItem
    WHERE idItemOrcamento           = p_item_idItemOrcamento;
    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;
END ADD_ORCAMENTO_CALC_IMP_RESIDUO;

/

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_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_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(
      p_cab_tipoPagamentoFrete,
      p_modDoc_diminuiDescontoPrUnit,
      p_modDoc_somaAcrescimosPrUnit,
      p_modDoc_somaFreteSeguroPrUnit,
      item.quantidade,
      item.quantidadeConvertida,
      item.precoUnitarioBruto,
      item.acrescimoUnitarioComposicao,
      item.precoUnitario,
      item.valorDescontoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      v_valorFreteGeral,
      v_valorSeguroGeral,
      v_valorDescontoGeral,
      v_valorOutrasDespesasGeral,
      v_valorAdicFreteMarinMerGeral,
      v_valorDespesasAduaneirasGeral,
      v_valorDescontoPagamento,
      v_valorOutrasDespesasPagamento,
      v_valorJurosPagamento,
      0,
      0,
      0,
      0,
      /* Retornos */
      v_precoUnitario,
      v_precoUnitarioConvertido,
      v_valorProdutoServico,
      v_auxNumber,
      v_auxNumber,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal,
      v_auxNumber,
      v_auxNumber);
    IF p_cab_impostosEditados = 0 
        OR v_valorProdutoServico <> item.valorProdutoServico
        OR CASE WHEN p_cab_tipoPagamentoFrete   = 'V' THEN 0 ELSE v_valorFreteTotal END
        <> CASE WHEN p_a_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE item.valorFreteTotal END
        OR CASE WHEN p_cab_tipoPagamentoFrete   = 'V' THEN 0 ELSE v_valorSeguroTotal END
        <> CASE WHEN p_a_cab_tipoPagamentoFrete = 'V' THEN 0 ELSE item.valorSeguroTotal END
        OR v_valorDescontoTotal <> item.valorDescontoTotal
        OR v_valorOutrasDespesasTotal <> item.valorOutrasDespesasTotal
        OR v_valorAdicFreteMarinMerTotal <> item.valorAdicFreteMarinhaMerTotal
        OR v_valorDespesasAduaneirasTotal <> item.valorDespesasAduaneirasTotal
        OR v_precoUnitario <> item.precoUnitario
        OR v_valorProdutoServico <> item.valorProdutoServico
    THEN
      r_calcularImpostosItem := 1;
    END IF;
    ADD_CALCULA_VALOR_LIQUIDO (
      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
      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_ORCAMENTO_CALC_IMP_ITENS (
    p_config_64_casasDecSaidas     IN CHAR,
    p_config_209_filtrarGrupoEcon  IN NUMBER,
    p_config_330_redIcmsBasePisCof IN NUMBER,
    p_config_362_calcCustoPorGrade IN NUMBER,
    p_cab_orcamento                IN NUMBER,
    p_cab_modeloDocumento          IN NUMBER,
    p_cab_entradaSaida             IN CHAR,
    p_cab_atualizaCustoMedio       IN NUMBER,
    p_cab_estabelecimento          IN NUMBER,
    p_cab_dataEntradaSaida         IN DATE,
    p_cab_pessoa                   IN NUMBER,
    p_cab_localDestinoOperacao     IN CHAR,
    p_cab_indicadorConsumidorFinal IN CHAR,
    p_a_cab_tipoPagamentoFrete     IN CHAR,
    p_cab_tipoPagamentoFrete       IN CHAR,
    p_cab_valorProdutosBruto       IN NUMBER,
    p_cab_valorDescontoProdutos    IN NUMBER,
    p_cab_valorAcrescimoProdutos   IN NUMBER,
    p_cab_valorServicosBruto       IN NUMBER,
    p_cab_valorDescontoServicos    IN NUMBER,
    p_cab_valorAcrescimoServicos   IN NUMBER,
    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_pess_indicadorInscricaoEstad IN CHAR,
    /* Retornos */
    r_cab_valorProdutos            OUT NUMBER,
    r_cab_valorServicos            OUT NUMBER,
    r_cab_valorBasePagamento       OUT NUMBER,
    r_cab_valorAVistaMinimo        OUT NUMBER,
    r_cab_valorFreteTotal          OUT NUMBER,
    r_cab_valorSeguroTotal         OUT NUMBER,
    r_cab_valorDescontoTotal       OUT NUMBER,
    r_cab_valorOutrasDespesasTotal OUT NUMBER,
    r_cab_valorAdicFreteMarinTotal OUT NUMBER,
    r_cab_valorDespesasAduanTotal  OUT NUMBER,
    r_cab_valorImpSomaPagamento    OUT NUMBER,
    r_cab_valorImpDiminuiPagamento OUT NUMBER,
    r_cab_valorLiquidoItem         OUT NUMBER)
IS
    v_auxNumber                    NUMBER;
    v_precoUnitario                NUMBER;
    v_precoUnitarioConvertido      NUMBER;
    v_valorProdutoServico          NUMBER;
    v_valorBasePagamento           NUMBER;
    v_valorFreteTotal              NUMBER;
    v_valorSeguroTotal             NUMBER;
    v_valorDescontoTotal           NUMBER;
    v_valorOutrasDespesasTotal     NUMBER;
    v_valorAdicFreteMarinMerTotal  NUMBER;
    v_valorDespesasAduaneirasTotal NUMBER;
    v_baseISSQN                    NUMBER;
    v_valorISSQN                   NUMBER;
    v_baseIRRF                     NUMBER;
    v_valorIRRF                    NUMBER;
    v_baseINSS                     NUMBER;
    v_valorINSS                    NUMBER;
    v_baseRetPIS                   NUMBER;
    v_valorRetPIS                  NUMBER;
    v_baseRetCOFINS                NUMBER;
    v_valorRetCOFINS               NUMBER;
    v_baseRetCSLL                  NUMBER;
    v_valorRetCSLL                 NUMBER;
    v_baseII                       NUMBER;
    v_valorII                      NUMBER;
    v_baseIOF                      NUMBER;
    v_valorIOF                     NUMBER;
    v_baseIPI                      NUMBER;
    v_valorIPI                     NUMBER;
    v_basePIS                      NUMBER;
    v_valorPIS                     NUMBER;
    v_basePISST                    NUMBER;
    v_valorPISST                   NUMBER;
    v_baseCOFINS                   NUMBER;
    v_valorCOFINS                  NUMBER;
    v_baseCOFINSST                 NUMBER;
    v_valorCOFINSST                NUMBER;
    v_baseCreditoSimplesNacional   NUMBER;
    v_valorCreditoSimplesNacional  NUMBER;
    v_baseICMS                     NUMBER;
    v_valorICMSOperacao            NUMBER;
    v_valorICMSDiferido            NUMBER;
    v_valorICMS                    NUMBER;
    v_valorICMSDesoneracao         NUMBER;
    v_baseICMSST                   NUMBER;
    v_valorICMSST                  NUMBER;
    v_baseICMSSTAnteriormente      NUMBER;
    v_valorICMSSTAnteriormente     NUMBER;
    v_valorICMSProprioSubstituto   NUMBER;
    v_baseICMSEfetivo              NUMBER;
    v_valorICMSEfetivo             NUMBER;
    v_baseICMSUFDestinatario       NUMBER;
    v_valorICMSUFDestinatario      NUMBER;
    v_baseICMSUFRemetente          NUMBER;
    v_valorICMSUFRemetente         NUMBER;
    v_baseFCP                      NUMBER;
    v_valorFCP                     NUMBER;
    v_baseFCPST                    NUMBER;
    v_valorFCPST                   NUMBER;
    v_baseFCPSTAnteriormente       NUMBER;
    v_valorFCPSTAnteriormente      NUMBER;
    v_baseFCPUFDestinatario        NUMBER;
    v_valorFCPUFDestinatario       NUMBER;
    v_baseEstimadaImpostos         NUMBER;
    v_valorEstimadoImpFederais     NUMBER;
    v_valorEstimadoImpEstaduais    NUMBER;
    v_valorEstimadoImpMunicipais   NUMBER;
    v_valorImpSomaPagamento        NUMBER;
    v_valorImpDiminuiPagamento     NUMBER;
    v_valorLiquidoItem             NUMBER;
    CURSOR c_item IS
      SELECT
        a.*,
        gradProd.produto,
        gradProd.cor,
        gradProd.tamanho,
        prod.controleEstoque,
        prod.tipoProduto
      FROM MOORCAMENTOXITENS a
      JOIN CAGRADESPRODUTO gradProd ON gradProd.gradeProduto = a.gradeProduto
      JOIN CAPRODUTOS prod ON prod.produto = gradProd.produto
      WHERE a.orcamento = p_cab_orcamento
      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;
  FOR item IN c_item LOOP
    v_precoUnitario                := item.precoUnitario;
    v_precoUnitarioConvertido      := item.precoUnitarioConvertido;
    v_valorProdutoServico          := item.valorProdutoServico;
    v_valorBasePagamento           := item.valorBasePagamento;
    v_valorFreteTotal              := item.valorFreteTotal;
    v_valorSeguroTotal             := item.valorSeguroTotal;
    v_valorDescontoTotal           := item.valorDescontoTotal;
    v_valorOutrasDespesasTotal     := item.valorOutrasDespesasTotal;
    v_valorAdicFreteMarinMerTotal  := item.valorAdicFreteMarinhaMerTotal;
    v_valorDespesasAduaneirasTotal := item.valorDespesasAduaneirasTotal;
    v_baseISSQN                    := item.baseISSQN;
    v_valorISSQN                   := item.valorISSQN;
    v_baseIRRF                     := item.baseIRRF;
    v_valorIRRF                    := item.valorIRRF;
    v_baseINSS                     := item.baseINSS;
    v_valorINSS                    := item.valorINSS;
    v_baseRetPIS                   := item.baseRetPIS;
    v_valorRetPIS                  := item.valorRetPIS;
    v_baseRetCOFINS                := item.baseRetCOFINS;
    v_valorRetCOFINS               := item.valorRetCOFINS;
    v_baseRetCSLL                  := item.baseRetCSLL;
    v_valorRetCSLL                 := item.valorRetCSLL;
    v_baseII                       := item.baseII;
    v_valorII                      := item.valorII;
    v_baseIOF                      := item.baseIOF;
    v_valorIOF                     := item.valorIOF;
    v_baseIPI                      := item.baseIPI;
    v_valorIPI                     := item.valorIPI;
    v_basePIS                      := item.basePIS;
    v_valorPIS                     := item.valorPIS;
    v_basePISST                    := item.basePISST;
    v_valorPISST                   := item.valorPISST;
    v_baseCOFINS                   := item.baseCOFINS;
    v_valorCOFINS                  := item.valorCOFINS;
    v_baseCOFINSST                 := item.baseCOFINSST;
    v_valorCOFINSST                := item.valorCOFINSST;
    v_baseCreditoSimplesNacional   := item.baseCreditoSimplesNacional;
    v_valorCreditoSimplesNacional  := item.valorCreditoSimplesNacional;
    v_baseICMS                     := item.baseICMS;
    v_valorICMSOperacao            := item.valorICMSOperacao;
    v_valorICMSDiferido            := item.valorICMSDiferido;
    v_valorICMS                    := item.valorICMS;
    v_valorICMSDesoneracao         := item.valorICMSDesoneracao;
    v_baseICMSST                   := item.baseICMSST;
    v_valorICMSST                  := item.valorICMSST;
    v_baseICMSSTAnteriormente      := item.baseICMSSTAnteriormente;
    v_valorICMSSTAnteriormente     := item.valorICMSSTAnteriormente;
    v_valorICMSProprioSubstituto   := item.valorICMSProprioSubstituto;
    v_baseICMSEfetivo              := item.baseICMSEfetivo;
    v_valorICMSEfetivo             := item.valorICMSEfetivo;
    v_baseICMSUFDestinatario       := item.baseICMSUFDestinatario;
    v_valorICMSUFDestinatario      := item.valorICMSUFDestinatario;
    v_baseICMSUFRemetente          := item.baseICMSUFRemetente;
    v_valorICMSUFRemetente         := item.valorICMSUFRemetente;
    v_baseFCP                      := item.baseFCP;
    v_valorFCP                     := item.valorFCP;
    v_baseFCPST                    := item.baseFCPST;
    v_valorFCPST                   := item.valorFCPST;
    v_baseFCPSTAnteriormente       := item.baseFCPSTAnteriormente;
    v_valorFCPSTAnteriormente      := item.valorFCPSTAnteriormente;
    v_baseFCPUFDestinatario        := item.baseFCPUFDestinatario;
    v_valorFCPUFDestinatario       := item.valorFCPUFDestinatario;
    v_baseEstimadaImpostos         := item.baseEstimadaImpostos;
    v_valorEstimadoImpFederais     := item.valorEstimadoImpFederais;
    v_valorEstimadoImpEstaduais    := item.valorEstimadoImpEstaduais;
    v_valorEstimadoImpMunicipais   := item.valorEstimadoImpMunicipais;
    v_valorImpSomaPagamento        := item.valorImpostosSomaPagamento;
    v_valorImpDiminuiPagamento     := item.valorImpostosDiminuiPagamento;
    v_valorLiquidoItem             := item.valorLiquidoItem;
    ADD_CALCULA_TOTAIS_ITEM(
      p_cab_tipoPagamentoFrete,
      p_modDoc_diminuiDescontoPrUnit,
      p_modDoc_somaAcrescimosPrUnit,
      p_modDoc_somaFreteSeguroPrUnit,
      item.quantidade,
      item.quantidadeConvertida,
      item.precoUnitarioBruto,
      item.acrescimoUnitarioComposicao,
      item.precoUnitario,
      item.valorDescontoItem,
      item.valorAcrescimoItem,
      item.valorFreteItem,
      item.valorSeguroItem,
      item.valorAdicFreteMarinhaMerItem,
      item.valorDespesasAduaneirasItem,
      item.valorFreteGeral,
      item.valorSeguroGeral,
      item.valorDescontoGeral,
      item.valorOutrasDespesasGeral,
      item.valorAdicFreteMarinhaMerGeral,
      item.valorDespesasAduaneirasGeral,
      item.valorDescontoPagamento,
      item.valorOutrasDespesasPagamento,
      item.valorJurosPagamento,
      0,
      0,
      0,
      0,
      /* Retornos */
      v_precoUnitario,
      v_precoUnitarioConvertido,
      v_valorProdutoServico,
      v_auxNumber,
      v_auxNumber,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal,
      v_auxNumber,
      v_auxNumber);
    ADD_CALCULA_IMPOSTOS_ITEM (
      p_config_64_casasDecSaidas,
      p_config_209_filtrarGrupoEcon,
      p_config_330_redIcmsBasePisCof,
      p_config_362_calcCustoPorGrade,
      p_cab_entradaSaida,
      0,
      p_cab_estabelecimento,
      0,
      p_cab_dataEntradaSaida,
      p_cab_pessoa,
      p_cab_localDestinoOperacao,
      p_cab_indicadorConsumidorFinal,
      p_cab_tipoPagamentoFrete,
      p_pess_indicadorInscricaoEstad,
      item.personalizacao,
      item.quantidade,
      item.precoPautaTabelado,
      v_valorProdutoServico,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorAdicFreteMarinMerTotal,
      v_valorDespesasAduaneirasTotal,
      item.cfop,
      1,
      item.indicadorISSQN,
      item.aliquotaISSQN,
      v_baseISSQN,
      v_valorISSQN,
      1,
      item.aliquotaIRRF,
      v_baseIRRF,
      v_valorIRRF,
      1,
      item.aliquotaINSS,
      v_baseINSS,
      v_valorINSS,
      1,
      item.retencaoPIS,
      v_baseRetPIS,
      v_valorRetPIS,
      1,
      item.retencaoCOFINS,
      v_baseRetCOFINS,
      v_valorRetCOFINS,
      1,
      item.retencaoCSLL,
      v_baseRetCSLL,
      v_valorRetCSLL,
      1,
      item.aliquotaII,
      v_baseII,
      v_valorII,
      1,
      item.aliquotaIOF,
      v_baseIOF,
      v_valorIOF,
      1,
      item.aliquotaIPI,
      item.valorAliquotaIPI,
      v_baseIPI,
      v_valorIPI,
      0,
      1,
      item.aliquotaPIS,
      item.valorAliquotaPIS,
      v_basePIS,
      v_valorPIS,
      1,
      item.aliquotaPISST,
      item.valorAliquotaPISST,
      v_basePISST,
      v_valorPISST,
      1,
      item.aliquotaCOFINS,
      item.valorAliquotaCOFINS,
      v_baseCOFINS,
      v_valorCOFINS,
      1,
      item.aliquotaCOFINSST,
      item.valorAliquotaCOFINSST,
      v_baseCOFINSST,
      v_valorCOFINSST,
      1,
      item.stSimplesNacional,
      item.creditoSimplesNacional,
      v_baseCreditoSimplesNacional,
      v_valorCreditoSimplesNacional,
      1,
      item.stICMS,
      item.modalidadeBaseCalcICMS,
      item.reducaoBaseICMS,
      item.aliquotaICMS,
      item.diferimentoICMS,
      v_baseICMS,
      v_valorICMSOperacao,
      v_valorICMSDiferido,
      v_valorICMS,
      v_valorICMSDesoneracao,
      1,
      item.modalidadeBaseCalcICMSST,
      item.margemValorAdicionadoST,
      item.reducaoBaseST,
      item.aliquotaICMSST,
      v_baseICMSST,
      v_valorICMSST,
      1,
      v_baseICMSSTAnteriormente,
      v_valorICMSSTAnteriormente,
      v_valorICMSProprioSubstituto,
      item.reducaoBaseICMSEfetivo,
      item.aliquotaICMSEfetivo,
      v_baseICMSEfetivo,
      v_valorICMSEfetivo,
      0,
      '  ',
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      1,
      item.aliquotaICMSUFDestinatario,
      item.aliquotaICMSInterestadual,
      item.partilhaICMSInterestadual,
      v_baseICMSUFDestinatario,
      v_valorICMSUFDestinatario,
      v_baseICMSUFRemetente,
      v_valorICMSUFRemetente,
      1,
      item.aliquotaFCP,
      v_baseFCP,
      v_valorFCP,
      item.aliquotaFCPST,
      v_baseFCPST,
      v_valorFCPST,
      item.aliquotaFCPSTAnteriormente,
      v_baseFCPSTAnteriormente,
      v_valorFCPSTAnteriormente,
      item.aliquotaFCPUFDestinatario,
      v_baseFCPUFDestinatario,
      v_valorFCPUFDestinatario,
      1,
      item.aliquotaEstimadaImpFederais,
      item.aliquotaEstimadaImpEstaduais,
      item.aliquotaEstimadaImpMunicipais,
      v_baseEstimadaImpostos,
      v_valorEstimadoImpFederais,
      v_valorEstimadoImpEstaduais,
      v_valorEstimadoImpMunicipais,
      item.produto,
      item.cor,
      item.tamanho,
      item.controleEstoque,
      item.tipoProduto,
      /* Retornos */
      v_baseISSQN,
      v_valorISSQN,
      v_baseIRRF,
      v_valorIRRF,
      v_baseINSS,
      v_valorINSS,
      v_baseRetPIS,
      v_valorRetPIS,
      v_baseRetCOFINS,
      v_valorRetCOFINS,
      v_baseRetCSLL,
      v_valorRetCSLL,
      v_baseII,
      v_valorII,
      v_baseIOF,
      v_valorIOF,
      v_baseIPI,
      v_valorIPI,
      v_basePIS,
      v_valorPIS,
      v_basePISST,
      v_valorPISST,
      v_baseCOFINS,
      v_valorCOFINS,
      v_baseCOFINSST,
      v_valorCOFINSST,
      v_baseCreditoSimplesNacional,
      v_valorCreditoSimplesNacional,
      v_baseICMS,
      v_valorICMSOperacao,
      v_valorICMSDiferido,
      v_valorICMS,
      v_valorICMSDesoneracao,
      v_baseICMSST,
      v_valorICMSST,
      v_baseICMSSTAnteriormente,
      v_valorICMSSTAnteriormente,
      v_valorICMSProprioSubstituto,
      v_baseICMSEfetivo,
      v_valorICMSEfetivo,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_auxNumber,
      v_baseICMSUFDestinatario,
      v_valorICMSUFDestinatario,
      v_baseICMSUFRemetente,
      v_valorICMSUFRemetente,
      v_baseFCP,
      v_valorFCP,
      v_baseFCPST,
      v_valorFCPST,
      v_baseFCPSTAnteriormente,
      v_valorFCPSTAnteriormente,
      v_baseFCPUFDestinatario,
      v_valorFCPUFDestinatario,
      v_baseEstimadaImpostos,
      v_valorEstimadoImpFederais,
      v_valorEstimadoImpEstaduais,
      v_valorEstimadoImpMunicipais);
    ADD_CALCULA_VALOR_LIQUIDO (
      0,
      p_cab_tipoPagamentoFrete,
      item.geraFinanceiro,
      v_valorProdutoServico,
      item.valorDescontoPagamento,
      item.valorOutrasDespesasPagamento,
      item.valorJurosPagamento,
      v_valorFreteTotal,
      v_valorSeguroTotal,
      v_valorDescontoTotal,
      v_valorOutrasDespesasTotal,
      v_valorIRRF,
      v_valorINSS,
      v_valorRetPIS,
      v_valorRetCOFINS,
      v_valorRetCSLL,
      v_valorII,
      v_valorIOF,
      v_valorIPI,
      0,
      v_valorICMSST,
      0,
      0,
      0,
      /* Retornos */
      v_valorBasePagamento,
      v_valorImpSomaPagamento,
      v_valorImpDiminuiPagamento,
      v_valorLiquidoItem);
    UPDATE MOORCAMENTOXITENS SET
      precoUnitario                 = v_precoUnitario,
      precoUnitarioConvertido       = v_precoUnitarioConvertido,
      valorProdutoServico           = v_valorProdutoServico,
      valorBasePagamento            = v_valorBasePagamento,
      valorFreteTotal               = v_valorFreteTotal,
      valorSeguroTotal              = v_valorSeguroTotal,
      valorDescontoTotal            = v_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = v_valorAdicFreteMarinMerTotal,
      valorDespesasAduaneirasTotal  = v_valorDespesasAduaneirasTotal,
      baseISSQN                     = v_baseISSQN,
      valorISSQN                    = v_valorISSQN,
      baseIRRF                      = v_baseIRRF,
      valorIRRF                     = v_valorIRRF,
      baseINSS                      = v_baseINSS,
      valorINSS                     = v_valorINSS,
      baseRetPIS                    = v_baseRetPIS,
      valorRetPIS                   = v_valorRetPIS,
      baseRetCOFINS                 = v_baseRetCOFINS,
      valorRetCOFINS                = v_valorRetCOFINS,
      baseRetCSLL                   = v_baseRetCSLL,
      valorRetCSLL                  = v_valorRetCSLL,
      baseII                        = v_baseII,
      valorII                       = v_valorII,
      baseIOF                       = v_baseIOF,
      valorIOF                      = v_valorIOF,
      baseIPI                       = v_baseIPI,
      valorIPI                      = v_valorIPI,
      basePIS                       = v_basePIS,
      valorPIS                      = v_valorPIS,
      basePISST                     = v_basePISST,
      valorPISST                    = v_valorPISST,
      baseCOFINS                    = v_baseCOFINS,
      valorCOFINS                   = v_valorCOFINS,
      baseCOFINSST                  = v_baseCOFINSST,
      valorCOFINSST                 = v_valorCOFINSST,
      baseCreditoSimplesNacional    = v_baseCreditoSimplesNacional,
      valorCreditoSimplesNacional   = v_valorCreditoSimplesNacional,
      baseICMS                      = v_baseICMS,
      valorICMSOperacao             = v_valorICMSOperacao,
      valorICMSDiferido             = v_valorICMSDiferido,
      valorICMS                     = v_valorICMS,
      valorICMSDesoneracao          = v_valorICMSDesoneracao,
      baseICMSST                    = v_baseICMSST,
      valorICMSST                   = v_valorICMSST,
      baseICMSSTAnteriormente       = v_baseICMSSTAnteriormente,
      valorICMSSTAnteriormente      = v_valorICMSSTAnteriormente,
      valorICMSProprioSubstituto    = v_valorICMSProprioSubstituto,
      baseICMSEfetivo               = v_baseICMSEfetivo,
      valorICMSEfetivo              = v_valorICMSEfetivo,
      baseICMSUFDestinatario        = v_baseICMSUFDestinatario,
      valorICMSUFDestinatario       = v_valorICMSUFDestinatario,
      baseICMSUFRemetente           = v_baseICMSUFRemetente,
      valorICMSUFRemetente          = v_valorICMSUFRemetente,
      baseFCP                       = v_baseFCP,
      valorFCP                      = v_valorFCP,
      baseFCPST                     = v_baseFCPST,
      valorFCPST                    = v_valorFCPST,
      baseFCPSTAnteriormente        = v_baseFCPSTAnteriormente,
      valorFCPSTAnteriormente       = v_valorFCPSTAnteriormente,
      baseFCPUFDestinatario         = v_baseFCPUFDestinatario,
      valorFCPUFDestinatario        = v_valorFCPUFDestinatario,
      baseEstimadaImpostos          = v_baseEstimadaImpostos,
      valorEstimadoImpFederais      = v_valorEstimadoImpFederais,
      valorEstimadoImpEstaduais     = v_valorEstimadoImpEstaduais,
      valorEstimadoImpMunicipais    = v_valorEstimadoImpMunicipais,
      valorImpostosSomaPagamento    = v_valorImpSomaPagamento,
      valorImpostosDiminuiPagamento = v_valorImpDiminuiPagamento,
      valorLiquidoItem              = v_valorLiquidoItem
    WHERE idItemOrcamento           = item.idItemOrcamento;
    IF item.servico = 1 THEN
      r_cab_valorServicos            := r_cab_valorServicos + v_valorProdutoServico;
    ELSE
      r_cab_valorProdutos            := r_cab_valorProdutos + v_valorProdutoServico;
    END IF;
    r_cab_valorBasePagamento       := r_cab_valorBasePagamento + v_valorBasePagamento;
    IF item.usarPrecoAVista = 1 AND item.geraFinanceiro = 1 THEN
      r_cab_valorAVistaMinimo        := r_cab_valorAVistaMinimo + v_valorProdutoServico + item.valorDescontoPagamento - item.valorOutrasDespesasPagamento - item.valorJurosPagamento - v_valorDescontoTotal + v_valorOutrasDespesasTotal;
    END IF;
    r_cab_valorFreteTotal          := r_cab_valorFreteTotal + v_valorFreteTotal;
    r_cab_valorSeguroTotal         := r_cab_valorSeguroTotal + v_valorSeguroTotal;
    r_cab_valorDescontoTotal       := r_cab_valorDescontoTotal + v_valorDescontoTotal;
    r_cab_valorOutrasDespesasTotal := r_cab_valorOutrasDespesasTotal + v_valorOutrasDespesasTotal;
    r_cab_valorAdicFreteMarinTotal := r_cab_valorAdicFreteMarinTotal + v_valorAdicFreteMarinMerTotal;
    r_cab_valorDespesasAduanTotal  := r_cab_valorDespesasAduanTotal + v_valorDespesasAduaneirasTotal;
    r_cab_valorImpSomaPagamento    := r_cab_valorImpSomaPagamento + v_valorImpSomaPagamento;
    r_cab_valorImpDiminuiPagamento := r_cab_valorImpDiminuiPagamento + v_valorImpDiminuiPagamento;
    r_cab_valorLiquidoItem         := r_cab_valorLiquidoItem + v_valorLiquidoItem;
  END LOOP;
END ADD_ORCAMENTO_CALC_IMP_ITENS;

/

create or replace PROCEDURE ADD_ORCAMENTO_CALC_IMP_CAB (
    p_uniqueMachineID              IN VARCHAR2,
    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_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_bloqPercMargemCab    IN NUMBER,
    p_regMarg_exibPercMargemItem   IN NUMBER,
    p_regMarg_exibImagemMargemItem IN NUMBER,
    p_regMarg_regraImagemItem      IN NUMBER,
    p_regMarg_exibDetMargemItem    IN NUMBER,
    p_regMarg_bloqPercMargemItem   IN NUMBER,
    p_calcularMargemContribuicao   IN NUMBER,
    p_cab_orcamento                IN NUMBER,
    p_a_cab_tipoPagamentoFrete     IN CHAR,
    /* Retornos */
    r_cab_valorProdutos            OUT NUMBER,
    r_cab_valorServicos            OUT NUMBER,
    r_cab_valorBasePagamento       OUT NUMBER,
    r_cab_valorAVistaMinimo        OUT NUMBER,
    r_cab_valorFreteTotal          OUT NUMBER,
    r_cab_valorSeguroTotal         OUT NUMBER,
    r_cab_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_valorTarifaCartao        OUT NUMBER,
    r_cab_valorMargem              OUT NUMBER,
    r_cab_percentualMargem         OUT NUMBER,
    r_cab_imagemMargem             OUT VARCHAR2)
IS
    v_cab_valorDescontoTotal       NUMBER;
    v_cab_valorOutrasDespesasTotal NUMBER;
    v_calcularImpostosItem         NUMBER;
    CURSOR c_cab IS
      SELECT a.*,
        modDoc.diminuiDescontoPrUnit,
        modDoc.somaAcrescimosPrUnit,
        modDoc.somaFreteSeguroPrUnit,
        modDoc.habilitaControleEntrega,
        pess.indicadorInscricaoEstadual,
        COALESCE((
          SELECT MIN(munEndEst.uf)
          FROM PAESTABELECIMENTOS est
          JOIN CAENDERECOSPESSOA endEst ON endEst.pessoa = est.pessoaEstabelecimento
          JOIN SIMUNICIPIOS munEndEst on munEndEst.municipio = endEst.municipio
          WHERE est.estabelecimento = a.estabelecimento
          AND endEst.ativo = 1
          AND endEst.principal = 1
          ),'  ') munEndEst_uf
      FROM MOORCAMENTOS a
      JOIN PAMODELOSDOCUMENTO modDoc ON modDoc.modeloDocumento = a.modeloDocumento
      JOIN CAPESSOAS pess ON pess.pessoa = a.pessoa
      WHERE a.orcamento = p_cab_orcamento;
BEGIN
  FOR cab IN c_cab LOOP
    r_cab_valorProdutos            := cab.valorProdutos;
    r_cab_valorServicos            := cab.valorServicos;
    r_cab_valorBasePagamento       := cab.valorBasePagamento;
    r_cab_valorAVistaMinimo        := cab.valorAVistaMinimo;
    r_cab_valorFreteTotal          := cab.valorFreteTotal;
    r_cab_valorSeguroTotal         := cab.valorSeguroTotal;
    v_cab_valorDescontoTotal       := cab.valorDescontoTotal;
    v_cab_valorOutrasDespesasTotal := cab.valorOutrasDespesasTotal;
    r_cab_valorAdicFreteMarinTotal := cab.valorAdicFreteMarinhaMerTotal;
    r_cab_valorDespesasAduanTotal  := cab.valorDespesasAduaneirasTotal;
    r_cab_valorImpSomaPagamento    := cab.valorImpostosSomaPagamento;
    r_cab_valorImpDiminuiPagamento := cab.valorImpostosDiminuiPagamento;
    r_cab_valorLiquidoItem         := cab.valorLiquidoItem;
    r_cab_valorTarifaCartao        := 0;
    r_cab_valorMargem              := 0;
    r_cab_percentualMargem         := 0;
    r_cab_imagemMargem             := ' ';
    v_calcularImpostosItem         := 0;
    ADD_ORCAMENTO_CALC_IMP_RATEIO (
      cab.orcamento,
      cab.modeloDocumento,
      cab.entradaSaida,
      cab.atualizaCustoMedio,
      p_a_cab_tipoPagamentoFrete,
      cab.tipoPagamentoFrete,
      cab.valorFreteGeral,
      cab.valorSeguroGeral,
      cab.valorDescontoGeral,
      cab.valorOutrasDespesasGeral,
      cab.valorAdicFreteMarinhaMerGeral,
      cab.valorDespesasAduaneirasGeral,
      cab.valorDescontoPagamento,
      cab.valorOutrasDespesasPagamento,
      cab.valorJurosPagamento,
      cab.impostosEditados,
      cab.diminuiDescontoPrUnit,
      cab.somaAcrescimosPrUnit,
      cab.somaFreteSeguroPrUnit,
      cab.habilitaControleEntrega,
      /* Retornos */
      r_cab_valorProdutos,
      r_cab_valorServicos,
      r_cab_valorBasePagamento,
      r_cab_valorAVistaMinimo,
      r_cab_valorFreteTotal,
      r_cab_valorSeguroTotal,
      v_cab_valorDescontoTotal,
      v_cab_valorOutrasDespesasTotal,
      r_cab_valorAdicFreteMarinTotal,
      r_cab_valorDespesasAduanTotal,
      r_cab_valorImpSomaPagamento,
      r_cab_valorImpDiminuiPagamento,
      r_cab_valorLiquidoItem,
      v_calcularImpostosItem);
    IF v_calcularImpostosItem = 1 THEN
      ADD_ORCAMENTO_CALC_IMP_ITENS(
        p_config_64_casasDecSaidas,
        p_config_209_filtrarGrupoEcon,
        p_config_330_redIcmsBasePisCof,
        p_config_362_calcCustoPorGrade,
        cab.orcamento,
        cab.modeloDocumento,
        cab.entradaSaida,
        cab.atualizaCustoMedio,
        cab.estabelecimento,
        cab.dataEmissao,
        cab.pessoa,
        cab.localDestinoOperacao,
        cab.indicadorConsumidorFinal,
        p_a_cab_tipoPagamentoFrete,
        cab.tipoPagamentoFrete,
        cab.valorProdutosBruto,
        cab.valorDescontoProdutos,
        cab.valorAcrescimoProdutos,
        cab.valorServicosBruto,
        cab.valorDescontoServicos,
        cab.valorAcrescimoServicos,
        cab.valorFreteGeral,
        cab.valorSeguroGeral,
        cab.valorDescontoGeral,
        cab.valorOutrasDespesasGeral,
        cab.valorAdicFreteMarinhaMerGeral,
        cab.valorDespesasAduaneirasGeral,
        cab.valorDescontoPagamento,
        cab.valorOutrasDespesasPagamento,
        cab.valorJurosPagamento,
        cab.impostosEditados,
        cab.diminuiDescontoPrUnit,
        cab.somaAcrescimosPrUnit,
        cab.somaFreteSeguroPrUnit,
        cab.indicadorInscricaoEstadual,
        /* Retornos */
        r_cab_valorProdutos,
        r_cab_valorServicos,
        r_cab_valorBasePagamento,
        r_cab_valorAVistaMinimo,
        r_cab_valorFreteTotal,
        r_cab_valorSeguroTotal,
        v_cab_valorDescontoTotal,
        v_cab_valorOutrasDespesasTotal,
        r_cab_valorAdicFreteMarinTotal,
        r_cab_valorDespesasAduanTotal,
        r_cab_valorImpSomaPagamento,
        r_cab_valorImpDiminuiPagamento,
        r_cab_valorLiquidoItem);
    END IF;
    IF p_calcularMargemContribuicao = 1 AND (p_regMarg_exibPercMargemCab = 1 OR p_regMarg_exibImagemMargemCab = 1 OR p_regMarg_bloqPercMargemCab = 1 OR p_regMarg_exibPercMargemItem = 1 OR p_regMarg_exibImagemMargemItem = 1 OR p_regMarg_exibDetMargemItem = 1 OR p_regMarg_bloqPercMargemItem = 1) AND cab.tipoDocumento IN (101,102,301,501,503) THEN
      r_cab_valorTarifaCartao := FUNC_ADD_TARIFA_CART_ORCAMENTO (cab.orcamento);
    END IF;
    IF p_calcularMargemContribuicao = 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 cab.tipoDocumento IN (101,102,301,501,503) THEN
      EXECUTE IMMEDIATE '
        DELETE TEMPMARGEMCONTRIBUICAO
        WHERE uniqueMachineID = :1
        AND orcamentoPredocumentoDocumento = :2
        AND idCabecalho = :3'
        USING 
          p_uniqueMachineID,
          'O',
          cab.orcamento;
      ADD_ORCAMENTO_GERA_TEMP_MARGEM(
        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,
        cab.orcamento,
        cab.estabelecimento,
        cab.dataEmissao,
        cab.prazoMedioPonderado,
        r_cab_valorFreteTotal,
        r_cab_valorSeguroTotal,
        r_cab_valorAdicFreteMarinTotal,
        r_cab_valorDespesasAduanTotal,
        r_cab_valorLiquidoItem,
        r_cab_valorTarifaCartao,
        cab.munEndEst_uf,
        /* Retornos */
        r_cab_valorMargem,
        r_cab_percentualMargem,
        r_cab_imagemMargem);
    END IF;
    UPDATE MOORCAMENTOS SET 
      valorProdutos                 = r_cab_valorProdutos,
      valorServicos                 = r_cab_valorServicos,
      valorBasePagamento            = r_cab_valorBasePagamento,
      valorAVistaMinimo             = r_cab_valorAVistaMinimo,
      valorFreteTotal               = r_cab_valorFreteTotal,
      valorSeguroTotal              = r_cab_valorSeguroTotal,
      valorDescontoTotal            = v_cab_valorDescontoTotal,
      valorOutrasDespesasTotal      = v_cab_valorOutrasDespesasTotal,
      valorAdicFreteMarinhaMerTotal = r_cab_valorAdicFreteMarinTotal,
      valorDespesasAduaneirasTotal  = r_cab_valorDespesasAduanTotal,
      valorImpostosSomaPagamento    = r_cab_valorImpSomaPagamento,
      valorImpostosDiminuiPagamento = r_cab_valorImpDiminuiPagamento,
      valorLiquidoItem              = r_cab_valorLiquidoItem
    WHERE orcamento                 = cab.orcamento;
  END LOOP;
END ADD_ORCAMENTO_CALC_IMP_CAB;

/

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

COMMIT;

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

/*
*/