Radar
Revenue Cloud
Relevância
85
alta

Cotação não salva: "Lifecycle hook 'postContextCommit' failed" e o getTags() nulo

Um erro interno do serviço de contexto, em inglês, no meio de uma mensagem em português. No meu caso, a causa não estava no procedimento nem na definição de contexto: era a própria cotação, travada numa gravação que tinha falhado antes.

Por Guilherme Dornelas06 de outubro de 20266 min de leitura
// Compartilhar
Guia · Parte 9 de 9
Erros e soluções no Agentforce Revenue Management
Ver guia
Cotação não salva: "Lifecycle hook 'postContextCommit' failed" e o getTags() nulo

Ao salvar linhas no editor da cotação, a org devolve um ContextBuilderException com getTags() nulo. Como isolei o problema em quatro chamadas de API, por que a cotação ficou travada em Saving, a pista falsa das tags extras e o que fazer.

// Apresentação · 6 slides
← → para navegar · F para tela cheia
●Erros e soluções no ARM · 9
Cotação não salva

postContextCommit e o getTags() nulo

Guilherme Dornelas
Solution Architect · Salesforce MVP
GD · Guilherme Dornelas · Solution Architect · Salesforce MVP01 / 06
1 / 6
  1. Cotação não salva · Erros e soluções no ARM · 9
  2. Uma variável por vez · Diagnóstico: Cotação antiga, com preço: erro; Cotação antiga, sem preço: erro; Cotação nova, sem preço: salvou; Cotação nova, com preço: salvou
  3. A cotação travada · CalculationStatus = Saving
  4. O que fazer · Solução: Consultar CalculationStatus; Conferir as tags do nó SalesTransaction; Testar numa cotação nova; Recriar a cotação
  5. A cotação nova salva · Mesma configuração
  6. Configuração primeiro, cotação de teste depois: Cotação de teste é descartável; Gravação falhou no ajuste? Crie outra

Você abre a cotação, adiciona a licença pela janela do catálogo, clica em Salvar cotação e a org responde com um erro interno do serviço de contexto, em inglês, no meio de uma frase em português.

A mensagem

Sua cotação não foi atualizada. industries.context.api.service.exception.ContextBuilderException: Lifecycle hook 'postContextCommit' failed in strict mode: Cannot invoke "industries.context.api.service.model.runtime.schema.impl.defaultimpl.DefaultContextRuntimeEntityAttribute.getTags()" because the return value of "java.util.Map.get(Object)" is null

Pela API Place Sales Transaction, que é o que o editor usa por baixo, a resposta vem assim:

{
  "errorResponse": [
    {
      "errorCode": "INVALID_API_INPUT",
      "message": "...ContextBuilderException: Lifecycle hook 'postContextCommit' failed in strict mode: Cannot invoke ...getTags() because the return value of java.util.Map.get(Object) is null",
      "referenceId": "refQuote"
    }
  ],
  "isSuccess": false
}

Onde aparece

Ao salvar linhas de cotação no Transaction Line Editor e ao adicionar linhas pela API /connect/rev/sales-transaction/actions/place. No meu caso, sempre na mesma cotação, a da Metalúrgica Boa Vista no caso Órbita.

Como isolei a causa

Em vez de mexer na configuração a cada tentativa, fiz quatro chamadas à API, mudando uma variável por vez:

ChamadaResultado
Cotação antiga, nova linha, com precificaçãoErro
Cotação antiga, nova linha, sem precificação (pricingPref: Skip)Erro. O procedimento de precificação está fora da história
Cotação nova, mesma linha, sem precificaçãoSalvou, status CompletedWithoutPricing
Cotação nova, mesma linha, com precificaçãoSalvou: 30 licenças a R$ 162 líquido, R$ 4.860, status CompletedWithPricing

A configuração estava certa. O problema era a cotação. Uma consulta ao campo de status de cálculo mostrou o motivo:

SELECT Name, CalculationStatus FROM Quote

Órbita CRM, Metalúrgica Boa Vista Saving Diagnóstico API, Órbita CompletedWithoutPricing Diagnóstico API com preço, Órbita CompletedWithPricing

A cotação antiga estava parada em Saving. A tela confirma: uma faixa avisa que a solicitação está sendo processada, os botões ficam desabilitados e sobra uma linha fantasma no editor.

Cotação com a faixa Sua solicitação está sendo processada, botões do editor desabilitados e uma linha vazia destacada
A cotação travada. (1) a faixa de processamento que não termina. (2) as ações do editor desabilitadas. (3) a linha fantasma, sem produto. Renomeei a cotação para travada depois do diagnóstico. Print próprio, org Winter '27.

Por que acontece

O guia de desenvolvedor descreve o comportamento da API: ela grava e confirma primeiro o cabeçalho da cotação e só depois processa configuração, preço e linhas. Se um passo posterior falha, o cabeçalho não volta atrás.

Nessa cotação, uma gravação falhou enquanto eu ainda ajustava o procedimento de precificação e a definição de contexto. O status de cálculo ficou em Saving e, daí em diante, toda gravação nela falhou no mesmo ponto, o commit do contexto. Não consigo afirmar qual ajuste causou a primeira falha: nesse intervalo mudei a data de vigência do contexto, as saídas do procedimento e o procedimento padrão. O que dá para afirmar é o que os testes mostram: com a configuração atual, cotação nova salva e a antiga não.

A pista falsa

Existe um artigo de conhecimento da Salesforce com uma mensagem parecida, sobre o retorno nulo de Map.get ao calcular a cotação. A causa ali é uma tag extra no nó SalesTransaction da definição de contexto, e a solução é removê-la. Vale conferir primeiro, porque é rápido: na guia de tags da definição, o nó SalesTransaction só pode ter a tag SalesTransaction. Na org do guia estava certo, e o erro continuava.

Como resolver

  1. Confira o status de cálculo. Rode SELECT Id, Name, CalculationStatus FROM Quote. Uma cotação parada em Saving, sem processamento em andamento, está travada.
  2. Descarte a pista das tags extras. Abra a definição de contexto e confira as tags do nó SalesTransaction.
  3. Teste numa cotação nova. Pela tela ou pela API, com a mesma linha. Se salvar, a configuração está certa.
  4. Recrie a cotação. Eu renomeei a antiga para identificar e segui com uma nova.

Na cotação nova, o mesmo caminho pela tela funcionou: 60 licenças pelo catálogo, preço calculado pelo procedimento da Órbita e cotação salva.

Cotação nova da Metalúrgica Boa Vista salva, com 60 licenças, preço unitário líquido de R$ 153 e total de R$ 9.180, desconto de 15%
A cotação nova salva. (1) total de R$ 9.180. (2) 60 licenças a R$ 180 de lista. (3) R$ 153 líquido, com o desconto por volume. (4) o resumo: subtotal R$ 10.800, desconto de 15%. Print próprio, org Winter '27.

Como evitar

Termine a configuração antes de criar a cotação de teste: procedimento ativo, simulação conferida, procedimento escolhido nas Configurações de receita e na descoberta de produtos. Enquanto você ajusta contexto e procedimento, cotação de teste é descartável. Se uma gravação falhar no meio do ajuste, não insista nela: crie outra.

A precificação usada nesse teste é a do laboratório de desconto por volume, e a definição de contexto estendida é a do laboratório 5 do guia Agentforce Revenue Management.

Fontes

Reproduzido numa scratch org Winter '27, API 68.0, em português.

Pergunte sobre este artigo

A resposta sai do que está publicado aqui. Se não estiver, ele diz que não sabe em vez de inventar.

// Radar Salesforce — Newsletter

Releases, Flow, Revenue Cloud e Agentforce — com leitura de arquiteto, direto no seu e-mail.

Curadoria editorial em PT-BR, sem repost de notícia. Você recebe contexto, “por que importa” e como aplicar — assinada por mim.

Sem spam. Cancele quando quiser, em 1 clique.

// Sem spam · cancele quando quiser