Files
MP-Manager/n8n/_apply_phase1_fix_phone_refs.py
2026-05-30 14:31:19 -06:00

85 lines
2.7 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Fase 1 FIX: el nodo `Buscar Contacto Objetivo - MARCA (phone)` referenciaba
`$json['Token/API']` y `$json['Location ID']` asumiendo que el input previo era
`Datos API Cuenta objetivo - MARCA`. Tras la Fase 1, el input proviene del IF
nuevo (que solo trae `contacts` y `total`). Cambiamos las refs a explícitas.
Idempotente.
"""
import argparse
import json
import os
import sys
ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, ROOT)
sys.path.insert(0, os.path.join(ROOT, "scripts"))
from n8n_workflow_lib import load_credentials, N8NClient # noqa: E402
WID = "x4DqZ5FtSc43tdzB"
TARGET_NODE = "Buscar Contacto Objetivo - MARCA (phone)"
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--apply", action="store_true")
args = parser.parse_args()
if hasattr(sys.stdout, "reconfigure"):
sys.stdout.reconfigure(encoding="utf-8")
client = N8NClient(*load_credentials())
wf, backup_path = client.backup_workflow(WID, label="fase1_fix_phone_refs")
print(f"backup: {backup_path}")
prev = wf.get("versionId")
node = client.find_node(wf, TARGET_NODE)
if not node:
raise SystemExit(f"nodo {TARGET_NODE!r} no encontrado")
p = node["parameters"]
# Cambiar Authorization header
for h in p.get("headerParameters", {}).get("parameters", []):
if h.get("name") == "Authorization":
old = h["value"]
new = old.replace(
"$json['Token/API']",
"$('Datos API Cuenta objetivo - MARCA').item.json['Token/API']"
)
if old != new:
h["value"] = new
print(f" Authorization: actualizado")
else:
print(f" Authorization: ya tenía referencia explícita (skip)")
# Cambiar jsonBody locationId
body = p.get("jsonBody") or ""
new_body = body.replace(
"$json['Location ID']",
"$('Datos API Cuenta objetivo - MARCA').item.json['Location ID']"
)
if new_body != body:
p["jsonBody"] = new_body
print(f" jsonBody locationId: actualizado")
else:
print(f" jsonBody locationId: ya tenía referencia explícita (skip)")
# Dry-run / apply
if not args.apply:
res = client.put_workflow(WID, wf, dry_run=True)
print(f"DRY-RUN. path: {res['path']}")
return
client.put_workflow(WID, wf, dry_run=False)
wf2 = client.verify_post(WID, expected_node_names=[TARGET_NODE], prev_version_id=prev)
print(f"versionId nuevo: {wf2.get('versionId')}")
print(f"active: {wf2.get('active')}")
if not wf2.get("active"):
client.activate(WID)
print("activado.")
print("OK")
if __name__ == "__main__":
main()