@wondai/n8n-nodes-nucleo 0.2.3 → 0.2.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.
@@ -214,7 +214,7 @@ class Nucleo {
214
214
  name: "Alterar",
215
215
  value: "alterar",
216
216
  action: "Alterar pedido",
217
- description: "Altera data/observações/itens (adicionar, remover, mudar quantidade)",
217
+ description: "Altera data/observações/itens. Itens por PRODUTO (adicionar soma, ajustar +/-, definir, remover produto) ou por id de item (compat).",
218
218
  },
219
219
  {
220
220
  name: "Cancelar",
@@ -351,8 +351,8 @@ class Nucleo {
351
351
  name: "idempotencyKey",
352
352
  type: "string",
353
353
  default: "",
354
- description: "Opcional. Vazio = gerada automaticamente. Use a MESMA chave num retry para não duplicar o pedido.",
355
- displayOptions: { show: { resource: ["pedido"], operation: ["criar"] } },
354
+ description: "Opcional. Para criar: vazio = gerada automaticamente. Para alterar/cancelar: use a MESMA chave (ex.: messageID do WhatsApp) num retry para não reaplicar a operação.",
355
+ displayOptions: { show: { resource: ["pedido"], operation: ["criar", "alterar", "cancelar"] } },
356
356
  },
357
357
  // ----------------------------------------------------------------- pedido:alterar / cancelar
358
358
  {
@@ -404,6 +404,30 @@ class Nucleo {
404
404
  description: 'Muda a quantidade de itens já existentes: [{"item_id":"...","quantidade":4}]. Os IDs vêm do Detalhar. Trocar item = remover + adicionar. Vazio = não altera.',
405
405
  displayOptions: { show: { resource: ["pedido"], operation: ["alterar"] } },
406
406
  },
407
+ {
408
+ displayName: "Ajustar Itens por Produto (JSON)",
409
+ name: "ajustarItens",
410
+ type: "json",
411
+ default: "[]",
412
+ description: 'Ajuste relativo POR PRODUTO (o cliente não sabe id de item): [{"produto_id":"...","quantidade_delta":7}] soma; -5 subtrai; resultado ≤ 0 remove a linha. produto_id vem do Catálogo Resolver. Vazio = não ajusta.',
413
+ displayOptions: { show: { resource: ["pedido"], operation: ["alterar"] } },
414
+ },
415
+ {
416
+ displayName: "Definir Itens por Produto (JSON)",
417
+ name: "definirItens",
418
+ type: "json",
419
+ default: "[]",
420
+ description: 'Quantidade absoluta POR PRODUTO: [{"produto_id":"...","quantidade":5}] deixa a linha com 5; 0 remove. produto_id vem do Catálogo Resolver. Vazio = não define.',
421
+ displayOptions: { show: { resource: ["pedido"], operation: ["alterar"] } },
422
+ },
423
+ {
424
+ displayName: "Remover Produtos (produto_ids)",
425
+ name: "removerProdutoIds",
426
+ type: "string",
427
+ default: "",
428
+ description: "produto_ids a remover do pedido (todas as linhas do produto), separados por vírgula ou JSON array. Use para 'tirar os X' e para a troca. produto_id vem do Catálogo Resolver.",
429
+ displayOptions: { show: { resource: ["pedido"], operation: ["alterar"] } },
430
+ },
407
431
  {
408
432
  displayName: "Motivo",
409
433
  name: "motivo",
@@ -453,6 +477,14 @@ class Nucleo {
453
477
  description: "Opcional. UUID de pedido gerado na conversa (validado contra o tenant).",
454
478
  displayOptions: { show: { resource: ["conversa"], operation: ["registrar"] } },
455
479
  },
480
+ {
481
+ displayName: "Idempotency Key",
482
+ name: "convIdempotencyKey",
483
+ type: "string",
484
+ default: "",
485
+ description: "Opcional. Use a MESMA chave (ex.: messageID do WhatsApp) num retry para não registrar a conversa duas vezes.",
486
+ displayOptions: { show: { resource: ["conversa"], operation: ["registrar"] } },
487
+ },
456
488
  ],
457
489
  };
458
490
  }
@@ -523,6 +555,9 @@ class Nucleo {
523
555
  const adicionar = asArray(this.getNodeParameter("adicionarItens", i, "[]"));
524
556
  const remover = parseIds(this.getNodeParameter("removerItemIds", i, ""));
525
557
  const alterar = asArray(this.getNodeParameter("alterarItens", i, "[]"));
558
+ const ajustar = asArray(this.getNodeParameter("ajustarItens", i, "[]"));
559
+ const definir = asArray(this.getNodeParameter("definirItens", i, "[]"));
560
+ const removerProdutos = parseIds(this.getNodeParameter("removerProdutoIds", i, ""));
526
561
  const b = {};
527
562
  if (observacoes.trim())
528
563
  b.observacoes = observacoes.trim();
@@ -534,6 +569,15 @@ class Nucleo {
534
569
  b.remover_item_ids = remover;
535
570
  if (alterar.length)
536
571
  b.alterar_itens = alterar;
572
+ if (ajustar.length)
573
+ b.ajustar_itens = ajustar;
574
+ if (definir.length)
575
+ b.definir_itens = definir;
576
+ if (removerProdutos.length)
577
+ b.remover_produto_ids = removerProdutos;
578
+ // Idempotência (opcional): mesma chave num retry → backend não reaplica a alteração.
579
+ idempotencyKey =
580
+ this.getNodeParameter("idempotencyKey", i, "").trim() || undefined;
537
581
  method = "PATCH";
538
582
  path = `/api/v1/agent/pedido/${encodeURIComponent(pedidoId)}`;
539
583
  bodyObj = b;
@@ -541,6 +585,8 @@ class Nucleo {
541
585
  else if (resource === "pedido" && operation === "cancelar") {
542
586
  const pedidoId = this.getNodeParameter("pedidoId", i).trim();
543
587
  const motivo = this.getNodeParameter("motivo", i, "").trim();
588
+ idempotencyKey =
589
+ this.getNodeParameter("idempotencyKey", i, "").trim() || undefined;
544
590
  method = "POST";
545
591
  path = `/api/v1/agent/pedido/${encodeURIComponent(pedidoId)}/cancelar`;
546
592
  bodyObj = motivo ? { motivo } : {};
@@ -555,6 +601,8 @@ class Nucleo {
555
601
  b.telefone = convTelefone;
556
602
  if (convPedidoId)
557
603
  b.pedido_id = convPedidoId;
604
+ idempotencyKey =
605
+ this.getNodeParameter("convIdempotencyKey", i, "").trim() || undefined;
558
606
  method = "POST";
559
607
  path = "/api/v1/agent/conversa/fechar";
560
608
  bodyObj = b;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wondai/n8n-nodes-nucleo",
3
- "version": "0.2.3",
3
+ "version": "0.2.5",
4
4
  "description": "Node n8n para o Núcleo Wondai — atendimento de IA (cliente, catálogo fuzzy, pedidos) com assinatura HMAC v1. Tenant vem do token (a parede, ADR-013).",
5
5
  "keywords": [
6
6
  "n8n-community-node-package",