{
 "name": "Nácar · reseñas de Google",
 "nodes": [
  {
   "id": "eed0ab73-1334-4a20-acd9-9c556b2579a3",
   "name": "Nota ce59",
   "type": "n8n-nodes-base.stickyNote",
   "typeVersion": 1,
   "position": [
    -40,
    -340
   ],
   "parameters": {
    "content": "## Reseñas de Google con IA\nCada reseña nueva del perfil de Google: la IA detecta el tono, los temas y si menciona algo delicado, y redacta la respuesta. Las positivas se responden solas; las negativas o delicadas le llegan al dueño por Telegram con el borrador, para que responda él.\n(En producción Google avisa por Pub/Sub; acá la reseña llega con sus datos.)",
    "width": 580,
    "height": 210,
    "color": 3
   }
  },
  {
   "id": "21e880b6-fb75-436c-be8d-6701fdd49d5d",
   "name": "Reseña nueva",
   "type": "n8n-nodes-base.webhook",
   "typeVersion": 2.1,
   "position": [
    0,
    0
   ],
   "parameters": {
    "httpMethod": "POST",
    "path": "resenas-nacar",
    "responseMode": "onReceived",
    "options": {}
   },
   "webhookId": "410a8330-94b0-4349-8449-351e8e8c9582"
  },
  {
   "id": "b8152b76-e78a-47a7-82d4-dd466284e09b",
   "name": "Configuración",
   "type": "n8n-nodes-base.set",
   "typeVersion": 3.4,
   "position": [
    240,
    0
   ],
   "parameters": {
    "assignments": {
     "assignments": [
      {
       "id": "885e1874-0ed5-4f7c-a395-1c47306d86ea",
       "name": "googleApi",
       "value": "https://mybusiness.googleapis.com",
       "type": "string"
      },
      {
       "id": "360bb461-0d45-4fd4-98c3-9f59ef92d5b2",
       "name": "ubicacion",
       "value": "accounts/demo/locations/nacar",
       "type": "string"
      }
     ]
    },
    "includeOtherFields": true,
    "options": {}
   }
  },
  {
   "id": "67a87f9b-6c0e-4f90-9ef5-5558cae68f9b",
   "name": "La IA lee la reseña",
   "type": "@n8n/n8n-nodes-langchain.informationExtractor",
   "typeVersion": 1.2,
   "position": [
    480,
    0
   ],
   "parameters": {
    "text": "={{ 'Estrellas: ' + $('Reseña nueva').item.json.body.estrellas + '\\nReseña de ' + $('Reseña nueva').item.json.body.autor + ': ' + $('Reseña nueva').item.json.body.texto }}",
    "schemaType": "fromAttributes",
    "attributes": {
     "attributes": [
      {
       "name": "sentimiento",
       "type": "string",
       "description": "Uno de: positivo, neutro, negativo",
       "required": true
      },
      {
       "name": "temas",
       "type": "string",
       "description": "De qué habla, separado por comas (ej. café, atención, demora, precio, limpieza)",
       "required": true
      },
      {
       "name": "delicada",
       "type": "boolean",
       "description": "true si menciona salud, intoxicación, alergia, maltrato, discriminación o pide que lo contacten",
       "required": true
      },
      {
       "name": "respuesta",
       "type": "string",
       "description": "Respuesta pública del negocio, en español neutro, cálida y breve (máximo 450 caracteres). Agradece por el nombre, retoma lo que dice y no promete nada que no esté en la reseña. Firma «Equipo Nácar».",
       "required": true
      }
     ]
    },
    "options": {
     "systemPromptTemplate": "Lees reseñas de Google de Nácar, una casa de café y té de autor. Respondes como el negocio: sin excusas largas, sin inventar datos y sin pedir datos personales."
    }
   }
  },
  {
   "id": "182cebce-b20d-4202-9beb-9c4edef5252d",
   "name": "Claude",
   "type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
   "typeVersion": 1.6,
   "position": [
    500,
    220
   ],
   "parameters": {
    "model": {
     "__rl": true,
     "mode": "id",
     "value": "claude-sonnet-5-5"
    },
    "options": {
     "maxTokensToSample": 1200,
     "thinkingMode": "adaptive",
     "effort": "low"
    }
   },
   "credentials": {
    "anthropicApi": {
     "id": "",
     "name": "Claude (demos)"
    }
   }
  },
  {
   "id": "53b99b8f-0eea-4bdc-a63a-f3b51c584e54",
   "name": "Decidir qué hacer",
   "type": "n8n-nodes-base.code",
   "typeVersion": 2,
   "position": [
    740,
    0
   ],
   "parameters": {
    "mode": "runOnceForEachItem",
    "jsCode": "\n// Junta la reseña con lo que leyó la IA y decide: 4-5 estrellas sin nada delicado se responde sola; el resto, al dueño.\nconst r = $('Reseña nueva').first().json.body || {};\nconst d = $json.output || {};\nconst estrellas = Math.max(1, Math.min(5, Math.round(Number(r.estrellas) || 0)));\nconst delicada = d.delicada === true || String(d.delicada).toLowerCase() === 'true';\nconst publicar = estrellas >= 4 && d.sentimiento === 'positivo' && !delicada;\nreturn { resena_id: r.resena_id, autor: r.autor, estrellas, texto: r.texto, sentimiento: d.sentimiento, temas: d.temas, delicada,\n  respuesta: d.respuesta, publicar, motivo: publicar ? 'positiva: se responde sola' : delicada ? 'menciona algo delicado' : estrellas <= 2 ? 'reseña negativa' : 'reseña con críticas' };\n"
   }
  },
  {
   "id": "c5a15680-2255-4436-a7fa-f2ea221aa529",
   "name": "Registro de reseñas",
   "type": "n8n-nodes-base.dataTable",
   "typeVersion": 1.1,
   "position": [
    980,
    0
   ],
   "parameters": {
    "resource": "row",
    "operation": "insert",
    "dataTableId": {
     "__rl": true,
     "mode": "id",
     "value": ""
    },
    "columns": {
     "mappingMode": "defineBelow",
     "value": {
      "fecha": "={{ $now.toISODate() }}",
      "autor": "={{ $json.autor }}",
      "estrellas": "={{ $json.estrellas }}",
      "texto": "={{ $json.texto }}",
      "sentimiento": "={{ $json.sentimiento }}",
      "temas": "={{ $json.temas }}",
      "respuesta": "={{ $json.respuesta }}",
      "estado": "={{ $json.publicar ? 'respondida' : 'para revisar' }}"
     },
     "matchingColumns": [],
     "schema": [
      {
       "id": "fecha",
       "displayName": "fecha",
       "required": false,
       "defaultMatch": false,
       "display": true,
       "type": "string",
       "canBeUsedToMatch": true
      },
      {
       "id": "autor",
       "displayName": "autor",
       "required": false,
       "defaultMatch": false,
       "display": true,
       "type": "string",
       "canBeUsedToMatch": true
      },
      {
       "id": "estrellas",
       "displayName": "estrellas",
       "required": false,
       "defaultMatch": false,
       "display": true,
       "type": "number",
       "canBeUsedToMatch": true
      },
      {
       "id": "texto",
       "displayName": "texto",
       "required": false,
       "defaultMatch": false,
       "display": true,
       "type": "string",
       "canBeUsedToMatch": true
      },
      {
       "id": "sentimiento",
       "displayName": "sentimiento",
       "required": false,
       "defaultMatch": false,
       "display": true,
       "type": "string",
       "canBeUsedToMatch": true
      },
      {
       "id": "temas",
       "displayName": "temas",
       "required": false,
       "defaultMatch": false,
       "display": true,
       "type": "string",
       "canBeUsedToMatch": true
      },
      {
       "id": "respuesta",
       "displayName": "respuesta",
       "required": false,
       "defaultMatch": false,
       "display": true,
       "type": "string",
       "canBeUsedToMatch": true
      },
      {
       "id": "estado",
       "displayName": "estado",
       "required": false,
       "defaultMatch": false,
       "display": true,
       "type": "string",
       "canBeUsedToMatch": true
      }
     ]
    },
    "options": {}
   }
  },
  {
   "id": "bfc941a0-9132-4745-8d8e-2aac16aca79c",
   "name": "¿Se responde sola?",
   "type": "n8n-nodes-base.if",
   "typeVersion": 2.3,
   "position": [
    1220,
    0
   ],
   "parameters": {
    "conditions": {
     "options": {
      "caseSensitive": true,
      "leftValue": "",
      "typeValidation": "loose",
      "version": 2
     },
     "conditions": [
      {
       "id": "32f488b7-d66e-48d0-8460-da7fa2c287e8",
       "leftValue": "={{ $('Decidir qué hacer').item.json.publicar }}",
       "rightValue": "",
       "operator": {
        "type": "boolean",
        "operation": "true"
       }
      }
     ],
     "combinator": "and"
    },
    "options": {}
   }
  },
  {
   "id": "24020087-b853-451d-8e82-5b09126ed2f8",
   "name": "Responder en Google",
   "type": "n8n-nodes-base.httpRequest",
   "typeVersion": 4.2,
   "position": [
    1460,
    -100
   ],
   "parameters": {
    "method": "PUT",
    "url": "={{ $('Configuración').first().json.googleApi }}/v4/{{ $('Configuración').first().json.ubicacion }}/reviews/{{ $('Decidir qué hacer').item.json.resena_id }}/reply",
    "sendBody": true,
    "specifyBody": "json",
    "jsonBody": "={{ JSON.stringify({ comment: $('Decidir qué hacer').item.json.respuesta }) }}",
    "options": {},
    "authentication": "predefinedCredentialType",
    "nodeCredentialType": "googleBusinessProfileOAuth2Api"
   }
  },
  {
   "id": "01e7b8d4-6f99-4460-b765-8e040bc44c2c",
   "name": "Aviso al dueño por Telegram",
   "type": "n8n-nodes-base.telegram",
   "typeVersion": 1.2,
   "position": [
    1460,
    120
   ],
   "parameters": {
    "resource": "message",
    "operation": "sendMessage",
    "chatId": "5550200",
    "text": "={{ '<b>' + '★'.repeat($('Decidir qué hacer').item.json.estrellas) + ' ' + $('Decidir qué hacer').item.json.autor + '</b> · ' + $('Decidir qué hacer').item.json.motivo + '\\n«' + $('Decidir qué hacer').item.json.texto + '»\\n\\n<b>Borrador:</b> ' + $('Decidir qué hacer').item.json.respuesta }}",
    "additionalFields": {
     "parse_mode": "HTML",
     "appendAttribution": false
    }
   },
   "credentials": {
    "telegramApi": {
     "id": "",
     "name": "Telegram (simulador)"
    }
   }
  }
 ],
 "connections": {
  "Reseña nueva": {
   "main": [
    [
     {
      "node": "Configuración",
      "type": "main",
      "index": 0
     }
    ]
   ]
  },
  "Configuración": {
   "main": [
    [
     {
      "node": "La IA lee la reseña",
      "type": "main",
      "index": 0
     }
    ]
   ]
  },
  "Claude": {
   "ai_languageModel": [
    [
     {
      "node": "La IA lee la reseña",
      "type": "ai_languageModel",
      "index": 0
     }
    ]
   ]
  },
  "La IA lee la reseña": {
   "main": [
    [
     {
      "node": "Decidir qué hacer",
      "type": "main",
      "index": 0
     }
    ]
   ]
  },
  "Decidir qué hacer": {
   "main": [
    [
     {
      "node": "Registro de reseñas",
      "type": "main",
      "index": 0
     }
    ]
   ]
  },
  "Registro de reseñas": {
   "main": [
    [
     {
      "node": "¿Se responde sola?",
      "type": "main",
      "index": 0
     }
    ]
   ]
  },
  "¿Se responde sola?": {
   "main": [
    [
     {
      "node": "Responder en Google",
      "type": "main",
      "index": 0
     }
    ],
    [
     {
      "node": "Aviso al dueño por Telegram",
      "type": "main",
      "index": 0
     }
    ]
   ]
  }
 },
 "settings": {
  "executionOrder": "v1",
  "timezone": "America/Argentina/Buenos_Aires",
  "saveManualExecutions": true
 }
}