nexusflex-mcp 3.68.0 → 3.69.0

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.
Files changed (3) hide show
  1. package/docs.mjs +12 -4
  2. package/package.json +1 -1
  3. package/server.mjs +4 -3
package/docs.mjs CHANGED
@@ -410,10 +410,18 @@ const CONTROL_POR_FOTO = [
410
410
  " → [si pasás `grupo`, ej. 'Bonorino': En camino, con su integrante] → Entregado. Cada estado",
411
411
  " queda registrado con QUIÉN lo hizo (vos, el usuario MCP) — es la vía rápida del clearing;",
412
412
  " • `autoRutear: true`: además, manda el paquete al nodo/mensajero responsable de su zona.",
413
- " • `nodoEntrega` (con `grupo`): el nodo del grupo que RECIBIÓ y entregó el paquete (ej.",
414
- " 'FastCorreo'). Es lo que hace que el envío entre al CIERRE SEMANAL entre nodos (origen =",
415
- " nodo del cliente → entrega = este nodo). Sin esto solo entra si autoRutear encuentra UN",
416
- " responsable de zona. Decilo siempre que sepas quién lo entregó;",
413
+ " • `nodoEntrega`: el nodo que RECIBIÓ y entregó el paquete (ej. 'FastCorreo'). Es lo que hace",
414
+ " que el envío entre al CIERRE SEMANAL entre nodos (origen = nodo del cliente → entrega =",
415
+ " este nodo). Sin `grupo` se deduce: cliente del mismo nodo = paquete propio (sin traspaso);",
416
+ " de otro nodo = el grupo que comparten. Decilo siempre que sepas quién lo entregó;",
417
+ "",
418
+ "TANDA DE UN CADETE (lo más común: una carpeta por día y por cadete, con paquetes propios y",
419
+ " de otros nodos mezclados): por cada foto → mlQr crudo (+ destino leído de la etiqueta),",
420
+ " reusarEtiqueta:true, fecha:<el día>, avanzarA:'entregado', mensajero:<el cadete>,",
421
+ " nodoEntrega:<nuestro nodo>. El vendedor y su nodo salen del QR; si ya estaba cargado no se",
422
+ " duplica (se completa y se avanza). Si contesta que no conoce la cuenta de ML, PREGUNTÁ de",
423
+ " qué nodo/cliente es y repetí con `cliente` — no adivines. Al final: conteo propios vs. de",
424
+ " cada nodo, los que no se reconocieron y las advertencias.",
417
425
  " • PLANILLA ATRASADA: `fecha` = el día real (dd/mm/aaaa). Ej.: 5 envíos de un cliente de",
418
426
  " Envíos Frank que entregó FastCorreo el lunes 14 → cliente, fecha:'14/09/2026',",
419
427
  " avanzarA:'entregado', grupo:'Portela', nodoEntrega:'FastCorreo'. Si esa semana ya",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nexusflex-mcp",
3
- "version": "3.68.0",
3
+ "version": "3.69.0",
4
4
  "description": "MCP de Nexus Flex: operá tu nodo/cuenta desde un asistente de IA (altas de clientes, stock, KPIs). Login por autorización web (device-flow). NO toca dinero.",
5
5
  "type": "module",
6
6
  "license": "MIT",
package/server.mjs CHANGED
@@ -54,8 +54,9 @@ const truthy = (v) => /^(1|true|yes|si|sí)$/i.test(v ?? "");
54
54
  const ALLOW_WRITE = truthy(process.env.NEXUSFLEX_MCP_ALLOW_WRITE);
55
55
  const ALLOW_PRECIOS = truthy(process.env.NEXUSFLEX_MCP_ALLOW_PRECIOS);
56
56
 
57
- const MCP_VERSION = "3.68.0"; // bumpear junto con package.json + backend/services/mcp-remote.ts
57
+ const MCP_VERSION = "3.69.0"; // bumpear junto con package.json + backend/services/mcp-remote.ts
58
58
  const NOVEDADES = [
59
+ "3.69.0 — Control por foto de la TANDA DE UN CADETE (propios + de otros nodos mezclados): en `envio_desde_etiqueta_ml` alcanza con el `mlQr` crudo — de ahí sale el número de ML y el vendedor, y el vendedor se reconoce igual que en el escáner (cuenta vinculada O cuenta aprendida en juntadas/escaneos; antes solo la vinculada). `nodoEntrega` ya no necesita `grupo`: si el cliente es del mismo nodo que entrega es un paquete propio (sin traspaso) y si es de otro nodo se usa el grupo que comparten. Si no conoce al vendedor, contesta 404 con el senderId para que preguntes de qué nodo/cliente es. Si el envío ya existía, no lo duplica: lo completa y lo avanza. No mueve dinero.",
59
60
  "3.68.0 — Control por foto: `envio_desde_etiqueta_ml` acepta `nodoEntrega` (nombre o id de un nodo del `grupo`) = el nodo que RECIBIÓ y entregó el paquete. Con `fecha` + `grupo` + `nodoEntrega` una planilla atrasada entra al CIERRE SEMANAL entre nodos en su día real (ej. 5 envíos de un cliente de Envíos Frank que entregó FastCorreo el lunes 14: fecha 14/09, grupo Portela, nodoEntrega FastCorreo). Antes solo se ponía con `autoRutear` y si la zona tenía un único responsable; si no, quedaba fuera del cierre. Si el envío ya tenía OTRO nodo que entrega no se pisa (avisa). Si la semana ya cerró, entra en el cierre siguiente marcado como tarde, con su fecha real. No mueve dinero.",
60
61
  "3.67.0 — TARIFA de grupo de una: `grupo_tarifa_set` fija la tarifa de clearing por zona (cercana/media/lejana/muyLejana) de TODO un grupo — el default del grupo y el precio de cada nodo miembro — en una sola llamada, sin ir nodo por nodo (ej. dejar un grupo nuevo en 2700 los 4 tramos). Con `soloDef` toca solo el default. Solo la comisión (admin) del grupo o el admin global. Es config del clearing, no mueve dinero.",
61
62
  "3.66.0 — COMPOSICIÓN de zonas de grupo: `zona_mover_metazona` reclasifica una metazona/localidad de una zona de grupo a otra del mismo grupo sin tocar el nodo responsable (ej. 'El Palomar' mal puesto en Morón → Tres de Febrero). `zona_componer_grupo` crea/edita una zona de grupo agregando/quitando metazonas y sumándole un nodo responsable — sirve para armar las zonas de un grupo NUEVO con su composición completa (el ruteo matchea por metazona exacta, así que una zona de CABA necesita 'CABA · Barrio' y 'Barrio'). Solo la comisión (admin) del grupo o el admin global.",
@@ -860,14 +861,14 @@ if (ALLOW_WRITE) {
860
861
  cliente: zStr().describe("Vendedor por nombre/id (si no mandás mlSenderId)"),
861
862
  mlSenderId: zStr().describe("sender_id del vendedor en ML (mapea a su cuenta vinculada)"),
862
863
  mlShipmentId: zStr().describe("id de envío/tracking de ML leído de la etiqueta (se limpian espacios OCR)"),
863
- mlQr: zStr().describe("Contenido CRUDO del QR de ML (para reimprimir la etiqueta idéntica)"),
864
+ mlQr: zStr().describe("Contenido CRUDO del QR de ML (el JSON {id, sender_id, hash_code…}). Alcanza solo: de ahí salen el número de envío y el vendedor, y sirve para reimprimir la etiqueta idéntica. Mandalo SIEMPRE que lo leas."),
864
865
  destinatario: zStr(), telefono: zStr(),
865
866
  direccion: zStr().describe("Dirección; si un dígito de la altura no se lee, poné '*' por cada uno (ej. 'Julian Aguirre 31**'), NO lo inventes"),
866
867
  localidad: zStr(), cp: zStr(), zona: zStr(), barrio: zStr(),
867
868
  avanzarA: z.enum(["colectado", "procesado", "entregado"]).optional().describe("Control por foto: avanza el envío EN UN PASO registrando CADA estado intermedio (atribuido a vos, el usuario MCP). 'colectado' / 'procesado' (En centro) / 'entregado' (recorre A retirar→Colectado→En centro→[grupo=En camino]→Entregado). 'entregado' es la vía rápida para el clearing entre nodos."),
868
869
  autoRutear: z.boolean().optional().describe("Planilla: asigna automáticamente el NODO y/o MENSAJERO responsable de la ZONA de reparto del destino. Configurá antes los responsables con `asignar_nodo_zona`/`asignar_mensajero_zona`."),
869
870
  grupo: zStr().describe("Control por foto: nombre o id de un GRUPO logístico tuyo (ej. 'Bonorino') — despacha por ese grupo (queda 'En camino', su mensajero es el integrante del grupo)."),
870
- nodoEntrega: zStr().describe("Solo staff, va con `grupo`: nodo (nombre o id) del grupo que RECIBIÓ y entregó el paquete (ej. 'FastCorreo'). Es el que cobra el traspaso en el cierre semanal entre nodos; sin esto el envío solo entra al cierre si `autoRutear` encuentra UN responsable de zona. Si el envío ya tenía otro nodo que entrega, no se pisa."),
871
+ nodoEntrega: zStr().describe("Solo staff: nodo (nombre o id) que RECIBIÓ y entregó el paquete (ej. 'FastCorreo'). Es el que cobra el traspaso en el cierre semanal entre nodos. Sin `grupo` se deduce: si el cliente es de ese mismo nodo es un paquete propio (sin traspaso); si es de otro nodo, el grupo que comparten (si comparten varios, pedí `grupo`). Si el envío ya tenía otro nodo que entrega, no se pisa."),
871
872
  fotoRuta: zStr().describe("RUTA LOCAL de la foto de la etiqueta en tu compu (ej. 'C:\\\\Users\\\\...\\\\Desktop\\\\etiquetas\\\\ml_123.jpg') — NO la imagen, solo la ruta, para reencontrar la foto. Mandala SIEMPRE que la dirección tenga '*'."),
872
873
  montoCobro: zNum(), mensajero: zStr().describe("Mensajero que hizo el paquete (de tu nodo)"),
873
874
  reusarEtiqueta: z.boolean().optional().describe("ML MANUAL (no vinculado): true = REUSA el mismo tracking/QR/etiqueta de ML que ya viene impreso (NO genera uno nuevo), lo marca 'ml_manual' y es idempotente. Usalo cuando el paquete YA está etiquetado por ML pero no está vinculado a una cuenta."),