Fórmulas de validações personalizadas
Complementa o artigo Validações personalizadas com padrões de fórmula que aparecem com frequência na prática, para casos que o critério de execução simples (atributo, operador e valor) não resolve.
Validar só na criação, nunca na edição
Algumas regras só fazem sentido quando o documento está sendo criado, não quando um documento existente está sendo editado. Para isso, verifique se o id ainda não existe:
{ "==": [{ "attr": "invoice.id" }, null] }
Resultado: true apenas durante a criação (o id ainda não foi atribuído); false em qualquer edição posterior.
Pular a validação em uma etapa específica
Útil quando uma etapa tem uma dinâmica diferente do resto do fluxo, por exemplo, uma etapa alimentada por importação automática, onde os dados ainda não estão completos. Combine com o Critério de execução com fórmula:
{
"if": [
{ "==": [{ "attr": "purchase.purchaselane_id" }, ID_DA_ETAPA] },
true,
SUA_REGRA_NORMAL
]
}
Resultado: true (a validação sempre passa) na etapa indicada; nas demais etapas, roda a regra normal.
Troque ID_DA_ETAPA pelo id da etapa a ser ignorada (aparece na URL do kanban ao passar o mouse sobre a etapa) e SUA_REGRA_NORMAL pela validação que já roda nas outras etapas.
Pular a validação em notas de estorno
Notas de estorno são sempre geradas sem parcela. Se sua validação de venda exige ao menos uma parcela (ou depende de outro dado do financeiro), ela também vai barrar a gravação de qualquer estorno. Para pular a validação nesse caso, combine com uma checagem de reversed_invoice_id, que só vem preenchido em notas de estorno:
{
"if": [
{ "is_filled": [{ "attr": "invoice.reversed_invoice_id" }] },
true,
SUA_REGRA_NORMAL
]
}
Resultado: true (a validação sempre passa) em notas de estorno; nas demais vendas, roda SUA_REGRA_NORMAL.
Condicionar por dia da semana
Quando uma regra só deve valer em um dia específico, por exemplo, uma rotina de fechamento aos sábados, combine strftime com o critério de execução:
{
"if": [
{ "==": [{ "strftime": [{ "time.now": [] }, "%A"] }, "Saturday"] },
SUA_REGRA,
true
]
}
Resultado: roda SUA_REGRA apenas aos sábados; nos demais dias, devolve true e a validação sempre passa.
Os dias da semana são em inglês: "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday".
Condicionar por um atributo do próprio documento
Quando uma regra só deve valer para uma parte dos documentos, por exemplo, exigir vendedor apenas quando a venda realmente totaliza como venda (não em orçamentos), combine a regra com uma checagem do atributo que diferencia os dois casos:
{
"if": [
{ "==": [{ "attr": "invoice.totalize_as_sale" }, true] },
{ "is_filled": [{ "attr": "invoice.seller_id" }] },
true
]
}
Resultado: true quando a venda não totaliza como venda (a checagem é pulada) ou quando totaliza e o vendedor está preenchido; false quando totaliza como venda e o vendedor está vazio.
Substitua invoice.totalize_as_sale e a regra interna pelo atributo e pela condição do seu caso. O padrão geral é sempre "se [atributo que diferencia os casos], então [regra]; senão, passa".