@wondai/n8n-nodes-nucleo 0.5.5 → 0.5.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/dist/nodes/Nucleo/Nucleo.node.js +24 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -56,6 +56,11 @@ Exemplo de item configurável:
|
|
|
56
56
|
O node não interpreta essas regras: ele encaminha o JSON sem alteração. A validação e o snapshot
|
|
57
57
|
imutável do contrato aplicado pertencem à API do Núcleo (ADR-035).
|
|
58
58
|
|
|
59
|
+
A partir da v0.5.6, `Pedido Criar` falha antes da requisição quando `itens` está vazio ou quando
|
|
60
|
+
alguma linha não traz `produto_id`/`alias` e `quantidade` positiva. É uma proteção de integração:
|
|
61
|
+
o Núcleo continua sendo a autoridade final das regras, mas o workflow não envia pedido vazio por
|
|
62
|
+
erro de tool schema.
|
|
63
|
+
|
|
59
64
|
**Disponibilidade na Rede** ("tem na outra loja?") é exposta como **tool** do AI Agent, mas com regra
|
|
60
65
|
estrita no prompt: **usar SÓ quando o cliente pedir explicitamente outra unidade**. Passe o `produto_id`
|
|
61
66
|
já resolvido (ou uma `consulta` curta). A loja que pergunta vem do **vínculo do token** (a IA não
|
|
@@ -86,6 +86,29 @@ function asArray(value) {
|
|
|
86
86
|
}
|
|
87
87
|
return [];
|
|
88
88
|
}
|
|
89
|
+
function hasPedidoItemIdentifier(item) {
|
|
90
|
+
const produtoId = String(item.produto_id ?? "").trim();
|
|
91
|
+
const alias = String(item.alias ?? "").trim();
|
|
92
|
+
return Boolean(produtoId || alias);
|
|
93
|
+
}
|
|
94
|
+
function hasPositiveQuantidade(item) {
|
|
95
|
+
const quantidade = Number(item.quantidade);
|
|
96
|
+
return Number.isFinite(quantidade) && quantidade > 0;
|
|
97
|
+
}
|
|
98
|
+
function assertPedidoCriarItens(itens) {
|
|
99
|
+
if (!Array.isArray(itens) || itens.length === 0) {
|
|
100
|
+
throw new Error("Pedido Criar bloqueado: o campo itens precisa ser um array JSON não vazio com produto_id ou alias e quantidade. Resolva o catálogo e envie os itens estruturados antes de criar o pedido.");
|
|
101
|
+
}
|
|
102
|
+
const invalidIndex = itens.findIndex((item) => {
|
|
103
|
+
if (!item || typeof item !== "object" || Array.isArray(item))
|
|
104
|
+
return true;
|
|
105
|
+
const itemObject = item;
|
|
106
|
+
return !hasPedidoItemIdentifier(itemObject) || !hasPositiveQuantidade(itemObject);
|
|
107
|
+
});
|
|
108
|
+
if (invalidIndex >= 0) {
|
|
109
|
+
throw new Error(`Pedido Criar bloqueado: itens[${invalidIndex}] precisa ter produto_id ou alias e quantidade positiva.`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
89
112
|
/** Lê um parâmetro JSON (string ou objeto) como objeto simples. Vazio → null. */
|
|
90
113
|
function asObject(value) {
|
|
91
114
|
if (value && typeof value === "object" && !Array.isArray(value))
|
|
@@ -884,6 +907,7 @@ class Nucleo {
|
|
|
884
907
|
const telefone = this.getNodeParameter("telefone", i).trim();
|
|
885
908
|
const nomeCliente = this.getNodeParameter("nomeCliente", i, "").trim();
|
|
886
909
|
const itens = asArray(this.getNodeParameter("itens", i));
|
|
910
|
+
assertPedidoCriarItens(itens);
|
|
887
911
|
const tipoEntrega = this.getNodeParameter("tipoEntrega", i);
|
|
888
912
|
const observacoes = this.getNodeParameter("observacoes", i, "").trim();
|
|
889
913
|
const agendadoPara = this.getNodeParameter("agendadoPara", i, "").trim();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wondai/n8n-nodes-nucleo",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.6",
|
|
4
4
|
"description": "Node n8n para o Núcleo Wondai — atendimento de IA (gate liga/desliga, cliente, catálogo fuzzy, disponibilidade em rede, pedidos, contexto operacional, telemetria) com assinatura HMAC v1. Tenant vem do token (a parede, ADR-013).",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"n8n-community-node-package",
|