@wondai/n8n-nodes-nucleo 0.6.3 → 0.6.5

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 CHANGED
@@ -66,6 +66,11 @@ alguma linha não traz `produto_id`/`alias` e `quantidade` positiva. É uma prot
66
66
  o Núcleo continua sendo a autoridade final das regras, mas o workflow não envia pedido vazio por
67
67
  erro de tool schema.
68
68
 
69
+ A partir da v0.6.4, `Pedido Criar` e `Pedido Alterar` aceitam `Cobranças Comerciais (JSON)`.
70
+ Use para adicionais pagos vindos de `Contexto -> commercial_rules`, por exemplo
71
+ `[{"tipo":"paid_addon","nome":"Confetes","valor":35,"origem":"commercial_rules"}]`.
72
+ Essas linhas entram no valor a cobrar, mas nao viram produto de catalogo nem pagamento.
73
+
69
74
  **Disponibilidade na Rede** ("tem na outra loja?") é exposta como **tool** do AI Agent, mas com regra
70
75
  estrita no prompt: **usar SÓ quando o cliente pedir explicitamente outra unidade**. Passe o `produto_id`
71
76
  já resolvido (ou uma `consulta` curta). A loja que pergunta vem do **vínculo do token** (a IA não
@@ -75,6 +80,11 @@ telefone/endereço (allowlist) e distância opcional. **Disponibilidade NÃO é
75
80
  declarou e oferece o contato para o cliente confirmar. Este endpoint **não** entra no contexto fixo do
76
81
  gate; é chamado sob demanda. Tenant/unidade vêm do token — nunca do prompt.
77
82
 
83
+ A partir da v0.6.5, `Pedido Detalhar` aceita `Telefone do Cliente` opcional. Quando preenchido, o
84
+ Nucleo so devolve o pedido se o telefone do cliente do pedido bater com esse valor. Use este campo no
85
+ WhatsApp para perguntas como "meu pedido 61", evitando que o agente consulte pedido de outro cliente
86
+ por numero curto.
87
+
78
88
  **Contexto -> Consultar por Escopo** deve ser usado como **AI Tool** dentro do agente, sob demanda.
79
89
  Passe `escopos` para buscar apenas o necessario:
80
90
 
@@ -502,6 +502,15 @@ class Nucleo {
502
502
  description: "Número curto (ex: 64) ou UUID do pedido. Devolve o pedido com itens e seus IDs. Pedido de outra padaria → 404.",
503
503
  displayOptions: { show: { resource: ["pedido"], operation: ["detalhar"] } },
504
504
  },
505
+ {
506
+ displayName: "Telefone do Cliente",
507
+ name: "pedidoTelefoneCliente",
508
+ type: "string",
509
+ default: "",
510
+ placeholder: "555199999999",
511
+ description: "Opcional. Quando informado, o Nucleo so devolve o pedido se ele pertencer ao cliente desse telefone. Use no WhatsApp para perguntas como 'meu pedido 61'.",
512
+ displayOptions: { show: { resource: ["pedido"], operation: ["detalhar"] } },
513
+ },
505
514
  // ----------------------------------------------------------------- pedido:criar
506
515
  {
507
516
  displayName: "Telefone",
@@ -603,6 +612,14 @@ class Nucleo {
603
612
  description: "Opcional. Desconto concedido em reais (ex.: 5). Abate do valor a cobrar e do troco. 0/vazio = sem desconto.",
604
613
  displayOptions: { show: { resource: ["pedido"], operation: ["criar"] } },
605
614
  },
615
+ {
616
+ displayName: "Cobranças Comerciais (JSON)",
617
+ name: "cobrancas",
618
+ type: "json",
619
+ default: "[]",
620
+ description: 'Opcional. Array de cobranças comerciais que entram no valor a cobrar sem virar produto: [{"tipo":"paid_addon","nome":"Confetes","valor":35,"origem":"commercial_rules","operational_config_revision_id":"...","snapshot":{"label":"Confetes - R$35,00"}}]. Use quando vier de Contexto Loja/commercial_rules.',
621
+ displayOptions: { show: { resource: ["pedido"], operation: ["criar"] } },
622
+ },
606
623
  {
607
624
  displayName: "Loja (unit_id)",
608
625
  name: "unitId",
@@ -754,6 +771,14 @@ class Nucleo {
754
771
  description: "Redefine o desconto (recalcula o valor a cobrar e o pagamento pendente). Ex.: 5. Vazio = não altera o desconto. Use 0 para zerar.",
755
772
  displayOptions: { show: { resource: ["pedido"], operation: ["alterar"] } },
756
773
  },
774
+ {
775
+ displayName: "Cobranças Comerciais (JSON)",
776
+ name: "cobrancasNovo",
777
+ type: "json",
778
+ default: "[]",
779
+ description: 'Opcional. Substitui as cobranças comerciais do pedido. Envie [] para limpar. Ex.: [{"tipo":"paid_addon","nome":"Confetes","valor":35,"origem":"commercial_rules"}].',
780
+ displayOptions: { show: { resource: ["pedido"], operation: ["alterar"] } },
781
+ },
757
782
  {
758
783
  displayName: "Motivo",
759
784
  name: "motivo",
@@ -1278,8 +1303,12 @@ class Nucleo {
1278
1303
  }
1279
1304
  else if (resource === "pedido" && operation === "detalhar") {
1280
1305
  const ref = this.getNodeParameter("ref", i).trim();
1306
+ const telefoneCliente = this.getNodeParameter("pedidoTelefoneCliente", i, "").trim();
1281
1307
  method = "GET";
1282
1308
  path = `/api/v1/agent/pedido/${encodeURIComponent(ref)}`;
1309
+ if (telefoneCliente) {
1310
+ path += `?telefone_cliente=${encodeURIComponent(telefoneCliente)}`;
1311
+ }
1283
1312
  }
1284
1313
  else if (resource === "pedido" && operation === "criar") {
1285
1314
  const telefone = this.getNodeParameter("telefone", i).trim();
@@ -1294,6 +1323,7 @@ class Nucleo {
1294
1323
  const trocoPara = Number(this.getNodeParameter("trocoPara", i, 0));
1295
1324
  const taxaEntrega = Number(this.getNodeParameter("taxaEntrega", i, 0));
1296
1325
  const desconto = Number(this.getNodeParameter("desconto", i, 0));
1326
+ const cobrancas = asArray(this.getNodeParameter("cobrancas", i, "[]"));
1297
1327
  const unitId = this.getNodeParameter("unitId", i, "").trim();
1298
1328
  idempotencyKey =
1299
1329
  this.getNodeParameter("idempotencyKey", i, "").trim() || (0, node_crypto_1.randomUUID)();
@@ -1320,6 +1350,8 @@ class Nucleo {
1320
1350
  b.taxa_entrega = taxaEntrega;
1321
1351
  if (Number.isFinite(desconto) && desconto > 0)
1322
1352
  b.desconto = desconto;
1353
+ if (cobrancas.length)
1354
+ b.cobrancas = cobrancas;
1323
1355
  if (unitId)
1324
1356
  b.unit_id = unitId;
1325
1357
  method = "POST";
@@ -1342,6 +1374,7 @@ class Nucleo {
1342
1374
  const trocoParaNovo = Number(this.getNodeParameter("trocoParaNovo", i, 0));
1343
1375
  const taxaEntregaNova = this.getNodeParameter("taxaEntregaNova", i, "").trim();
1344
1376
  const descontoNovo = this.getNodeParameter("descontoNovo", i, "").trim();
1377
+ const cobrancasNovo = asArray(this.getNodeParameter("cobrancasNovo", i, "[]"));
1345
1378
  const b = {};
1346
1379
  if (observacoes.trim())
1347
1380
  b.observacoes = observacoes.trim();
@@ -1377,6 +1410,8 @@ class Nucleo {
1377
1410
  if (descontoNovo !== "" && Number.isFinite(Number(descontoNovo))) {
1378
1411
  b.desconto = Number(descontoNovo);
1379
1412
  }
1413
+ if (cobrancasNovo.length)
1414
+ b.cobrancas = cobrancasNovo;
1380
1415
  // Idempotência (opcional): mesma chave num retry → backend não reaplica a alteração.
1381
1416
  idempotencyKey =
1382
1417
  this.getNodeParameter("idempotencyKey", i, "").trim() || undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wondai/n8n-nodes-nucleo",
3
- "version": "0.6.3",
3
+ "version": "0.6.5",
4
4
  "description": "Node n8n para o Núcleo Wondai — atendimento de IA multi-vertical (gate liga/desliga, cliente/paciente, catálogo fuzzy, pedidos [padaria], procedimento/agenda/agendamento [odonto], contexto operacional, telemetria) com assinatura HMAC v1. Tenant e vertical vêm do token (a parede, ADR-013/038).",
5
5
  "keywords": [
6
6
  "n8n-community-node-package",