{ "$json": { "updatedAt": "2026-09-11T19:32:39.315Z", "createdAt": "2026-09-10T14:44:58.258Z", "id": "yYmp0SKgpWeooCYm", "name": "GLM DocAssist - Optimizado", "description": "Usa esta herramienta cuando el usuario solicite crear, generar, preparar, completar o corregir documentos de Recursos Humanos para un empleado utilizando las plantillas corporativas disponibles.\n\nEsta herramienta puede:\n\n* Buscar la plantilla correspondiente al documento solicitado.\n* Crear una copia nueva de la plantilla para cada solicitud.\n* Obtener automáticamente información del empleado.\n* Obtener salario base y salario variable cuando el documento lo requiera.\n* Detectar qué información falta y solicitarla al usuario antes de continuar.\n* Completar los campos o placeholders del documento.\n* Corregir documentos generados cuando el usuario indique que algún dato está incorrecto.\n* Generar varios documentos relacionados dentro de una misma solicitud.\n* Crear una carpeta específica para los documentos generados.\n* Compartir los archivos generados con el usuario solicitante.\n* Proporcionar enlaces a los documentos para revisión.\n* Solicitar confirmación del usuario antes de finalizar.\n* Subir los documentos generados al perfil del empleado en BambooHR cuando el usuario lo autorice.\n\nDebe utilizarse para solicitudes como:\n\"Créame una constancia laboral de Juan Pérez.\"\n\"Necesito una carta laboral para María García.\"\n\"Genera el visado temporal de Pedro.\"\n\"Prepárame los documentos de visado anual para Ana.\"\n\"Necesito la documentación de visado para Walmart Connect.\"\n\"Corrige el salario en el documento que acabamos de generar.\"\n\"Genera el documento de RRHH de este empleado.\"\n\"Necesito una carta/documento usando la plantilla de RRHH.\"\n\nEn solicitudes de visado, la herramienta gestiona conjuntamente los documentos asociados, incluyendo declaración, carta de responsabilidad y anexos. Debe conocerse el tipo de visado —temporal o anual— y el proyecto correspondiente —por ejemplo Walmart Connect u otro proyecto— antes de completar la solicitud.\n\nNO uses esta herramienta para:\n\n* Consultas generales de Recursos Humanos que no impliquen generar o modificar documentos.\n* Preguntas simples sobre datos de empleados cuando el usuario solamente quiera consultar información.\n* Consultas sobre políticas, procedimientos o normativas de RRHH.\n* Crear documentos que no estén relacionados con las plantillas corporativas gestionadas por DocAssist.\n* Subir archivos independientes a BambooHR cuando no formen parte del proceso de generación de documentos.\n\nSi la intención del usuario es generar, completar, preparar o corregir documentación corporativa de Recursos Humanos para un empleado, esta herramienta debe ser la opción principal.", "active": true, "isArchived": false, "nodes": [ { "parameters": { "httpMethod": "POST", "path": "doc-assist", "options": { "responseData": "{}", "responseHeaders": { "entries": [ { "name": "Content-Type", "value": "application/json" } ] } } }, "type": "n8n-nodes-base.webhook", "typeVersion": 2.1, "position": [ -2048, -16 ], "id": "55d73eb8-8648-4fce-a8ed-32353245b551", "name": "Webhook", "webhookId": "878f3a73-e8e4-4101-be15-cfba7b9a5832" }, { "parameters": { "promptType": "define", "text": "={{ $('Limpiar').item.json.mensaje }}", "options": { "systemMessage": "=Eres un asistente automatizado de Recursos Humanos encargado de generar documentos a partir de plantillas en Google Drive.\n\n## Reglas\n- Tus respuestas hacia el usuario deben ser no tecnicas, deben ser formales y friendly para usuarios no tecnicos.\n- La plataforma para subir archivos al empleado se llama BambooHR.\n- Cada solicitud de generacion de archivos debe crearse en una carpeta nueva, NO guardar los nuevos archivos en una carpeta vieja.\n\nHay archivos que van en conjunto con otros pero varia segun pais.\n## Reglas para archivos en conjunto para Guatemala:\n- Si el usuario pide un visado, el usuario debe especificar si el visado es temporal (Anexo 2) o anual (Anexo 2), y si aplica a Walmart Connect u otro proyecto. Si el usuario no lo especifica, debes pedírselo antes de continuar.\n- Si el visado es TEMPORAL (Anexo 2 temporal): debes editar el Anexo 2 temporal correspondiente (Walmart Connect u otro proyecto), junto con la carta de responsabilidad y la declaración.\n- Si el visado es ANUAL (Anexo 2 anual): debes editar únicamente el Anexo 2 anual correspondiente (Walmart Connect u otro proyecto). No se incluyen la carta de responsabilidad ni la declaración. Además, al ser anual, NO debes solicitar fechas al usuario para este tipo de documento.\n\nREGLAS AL INSERTAR DATOS:\n- Al insertar valores numericos, si en el campo especifica 'en letra' debes insertarlo asi, ejemplo: 'diecinueve', si especifica 'en numeros', pues lo insertas normal, ejemplo: '19'.\n\nSigue este procedimiento estricto paso a paso:\n\nPASO 1: BÚSQUEDA Y PREPARACIÓN DE PLANTILLA\n- Usa la herramienta `buscar_template_drive` para encontrar la plantilla correspondiente al tipo de documento que pide el usuario.\n- Usa la herramienta `preparar_documento_y_extraer_placeholders` pasándole el ID de la plantilla. Esta herramienta creará la copia de trabajo y te devolverá el `new_file_id` junto con los placeholders a llenar (ej: <>, <>, etc.).\n\nPASO 2: OBTENCIÓN DE DATOS\n- Usa la herramienta `buscar_empleado_supabase` buscando por el nombre o identificador indicado por el usuario para obtener los datos requeridos.\n- Compara los datos obtenidos en Supabase con los placeholders extraídos en el PASO 1.\n- Para buscar el salario y salario variable del empleado, debes usar la herramienta `Buscar salario y salario variable del empleado`, aqui recibiras varios campos (4045, 4626, payRate)\n\nEn 4626 aparece el salario variable pero a veces aparece como null, en este caso debes buscarlo en el comentario en 4045.\nEn 4045 puede haber un comentario o puede ser null, en el comentario tendras que detectar el salario variable.\nEn payRate aparece el salario base.\n\nPASO 3: VALIDACIÓN DE INFORMACIÓN FALTANTE\n- Si faltan datos obligatorios para completar los placeholders que NO se encontraron en Supabase:\n STOP. Responde al usuario de inmediato indicando qué datos específicos faltan para que los proporcione. No continúes al paso 4 hasta tener toda la información.\n\nPASO 4: REEMPLAZO Y FINALIZACIÓN\n- Una vez tengas el 100% de los datos para todos los placeholders, llama a la herramienta `reemplazar_datos_y_finalizar_doc` enviando el `new_file_id` y los pares clave-valor a reemplazar.\n- Al insertar salario/salario variable debes insertarlos sin simbolos y nombre de monedas. Y poner comas.\n- Al insertar fechas siempre debes analizar el tipo de documento para saber que fecha insertar, si es constancia laboral siempre debes usar la fecha de hoy ({{ $now.toFormat('dd-MM-yyyy') }}), si no estas seguro para cuando poner la fecha debes preguntarle al usuario.\n\nPASO 5: CREAR CARPETA, MOVER ARCHIVOS, COMPARTIR A RRHH\n- Despues de haber hecho el paso 4, debes usar la herramienta 'Compartir archivos con RRHH' para crear la carpeta como nombre debe contener maximo 4 palabras, los archivos que se copiaron y el nombre a quien se pidio los archivos, por ejemplo: VISADO - John Doe.\n- En dicha herramienta Tambien se movera los archivos a la carpeta creada y se compartira la carpeta a RRHH como confirmacion de edicion de los archivos.\n- Adentro de la herramienta 'Compartir archivos con RRHH' debes poner el valor del campo 'mensajeFinal' como false. Y en el campo file_id debes poner los id de los archivos editados como array, por ejemplo: [\"12i3hoihi456\", \"Xkhus98798Js\"].\n- Debes guardar el id de la carpeta creada en tu memoria para poder usarla en el paso 7.\n\nPASO 6: CONFIRMACION\n- Despues de haber finalizado el paso 5 los permisos owner de los archivos al usuario, debes pedir al usuario la confirmacion si todos los datos estan correctos con los links de los archivos editados adjuntados, si contesta \"Si\" puedes pasar al paso 6, si contesta \"No\" y te envia los datos a corregir, debes editar nuevamente el archivo que te especifique. Al terminar de hacer la correcion, debes preguntar otra vez si todo esta correcto. Si todo esta correcto puedes pasar al paso 6. \n\nPaso 7: CONVERTIR ARCHIVOS A PDF Y COMPARTIR CARPETA A RRHH\n- Despues de haber hecho el paso 6, si contestaron que la edicion estuvo bien, debes usar la herramienta 'Compartir archivos con RRHH' para compartir la carpeta a RRHH y convertir los archivos como PDF.\n- En la herramienta 'Compartir archivos con RRHH' el valor del campo 'mensajeFinal' debes poner true. Y en el campo folder_id debes poner el id de la carpeta creada en el paso 5.\n\nPASO 8: RESPUESTA FINAL\n- Devuelve un mensaje de confirmación al usuario en Google Chat informando que el documento ha sido creado exitosamente e incluye el enlace (URL) directamente hacia la carpeta generado en Google Drive.\n- En la respuesta no incluyas palabras tecnicas como Supabase.\n- Siempre debes preguntar al usuario si quiere subir el/los archivos editados al perfil de BambooHR del empleado. Debes poner un listado de los archivos editados para que el usuario pueda elegir especificamente cual subir. El usuario puede responer \"No\", \"Todos\" o especificar los archivos por el nombre.\n- Para hablar con el usuario debes usar el tool de Contestar.\n\nPASO 9: DESCARGAR ARCHIVO Y SUBIR ARCHIVO A BAMBOOHR\n- Luego de haber dado permisos owner al usuario que envio el mensaje, debes preguntarle al usuario si desea subir el/los archivos copiados al usuario que se hizo la solicitud en BambooHR. Si el usuario dice que \"Si\", debes enviar los datos a la herramienta 'Descargar archivo'. En esta herramienta se descargar el archivo y luego se envia a BambooHR. El nombre del archivo debe ser por ejemplo: NOMBRE_ARCHIVO.pdf (Reemplazar NOMBRE_ARCHIVO por el nombre real). No incluyas 'Copy of' en el nombre. En el campo employee_id debes poner el id del empleado al que se pidio el documento y en el campo file_id debes poner el id del archivo copiado. En el campo folder_name debes poner el nombre de la carpeta creada y en folder_id el id de la carpeta.\n- NO PASAR AL PASO 9 HASTA QUE EL USUARIO CONTESTE \"SI\" o \"NO\". Si el usuario contesta \"Si\", primer ejecutas la herramienta 'Descargar archivo' y luego el PASO 8, si el usuario contesta \"No\", no ejecutes la herramiente 'Descargar archivo' y pasa al PASO 8.\n\n## Archivos del pais {{ $('Limpiar').item.json.pais }}:\n{{ JSON.stringify($json.files) }}", "maxIterations": 70 } }, "type": "@n8n/n8n-nodes-langchain.agent", "typeVersion": 3.1, "position": [ -176, 0 ], "id": "83c431da-951a-4705-8f07-772f2a33f3e2", "name": "AI Agent", "onError": "continueErrorOutput" }, { "parameters": { "modelName": "models/gemini-3.1-pro-preview-customtools", "options": { "temperature": 0.1 } }, "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini", "typeVersion": 1.1, "position": [ -432, 208 ], "id": "42d67367-1511-44bd-b2fd-be7f7ba0fbf0", "name": "Google Gemini Chat Model", "credentials": { "googlePalmApi": { "id": "tFqBJras00HUi1hA", "name": "Eidan - Google Gemini(PaLM) Api account" } } }, { "parameters": { "sessionIdType": "customKey", "sessionKey": "={{ $('Limpiar').item.json.usuario }}" }, "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow", "typeVersion": 1.4, "position": [ -256, 208 ], "id": "018b5024-aed8-4cd7-b46a-6280c55e1e84", "name": "Simple Memory" }, { "parameters": { "descriptionType": "manual", "toolDescription": "Use this tool to copy the file the user specified in the prompt.", "operation": "copy", "fileId": { "__rl": true, "mode": "id", "value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('File', ``, 'string') }}" }, "name": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('File_Name', `El nombre del archivo debe ser el mismo que el original sin incluir 'Copy of'`, 'string') }}", "sameFolder": false, "driveId": { "__rl": true, "mode": "list", "value": "My Drive" }, "folderId": { "__rl": true, "value": "1PQRsZfuNGa_YTJPggbghn6h6dNRNfkEa", "mode": "list", "cachedResultName": "DocAssist - Documentos temporal", "cachedResultUrl": "https://drive.google.com/drive/folders/1PQRsZfuNGa_YTJPggbghn6h6dNRNfkEa" }, "options": {} }, "type": "n8n-nodes-base.googleDriveTool", "typeVersion": 3, "position": [ -400, 736 ], "id": "006c9822-f45e-4bb3-933a-22e27af1fbaa", "name": "Copiar archivo", "credentials": { "googleDriveOAuth2Api": { "id": "gL2ZTwJb6xojauac", "name": "Eidan - Google Drive account" } } }, { "parameters": { "descriptionType": "manual", "toolDescription": "Debes usar este tool para buscar los datos del empleado usando el nombre especificado en el prompt.", "operation": "getAll", "tableId": "empleados_glm", "returnAll": true, "filters": { "conditions": [ { "keyName": "name", "condition": "fullText", "searchFunction": "wfts", "keyValue": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('conditions0_Field_Value', `Aqui debes poner el nombre del empleado especificado en el prompt.`, 'string') }}" } ] } }, "type": "n8n-nodes-base.supabaseTool", "typeVersion": 1, "position": [ -304, 592 ], "id": "f4f75099-dd90-4713-bffc-5bc6ed89d935", "name": "Get many rows in Supabase", "credentials": { "supabaseApi": { "id": "2PlsR6rpK7rQTIEn", "name": "Sofia test - Supabase account" } } }, { "parameters": { "toolDescription": "Usa este tool para mandar mensajes al usuario.", "method": "POST", "url": "=https://chat.googleapis.com/v1/{{ $('Limpiar').item.json.espacio }}/messages", "authentication": "predefinedCredentialType", "nodeCredentialType": "googleApi", "sendBody": true, "specifyBody": "json", "jsonBody": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('JSON', `Para enviar el body con el mensaje debes usar un JSON con esta estructura:\n{\n \"text\": \"mensaje\"\n}`, 'json') }}", "options": {} }, "type": "n8n-nodes-base.httpRequestTool", "typeVersion": 4.4, "position": [ -32, 224 ], "id": "9a3901c7-44fc-45a8-9af9-fcff3e72c538", "name": "Contestar1", "credentials": { "googleApi": { "id": "KzKVIgSNE4alOH2z", "name": "Eidan bot docAssist - Google Service Account account" } } }, { "parameters": { "toolDescription": "Debes usar este tool para extraer el texto del archivo que el usuario quiere editar.", "url": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('URL', `En este campo debes poner esta URL:\nhttps://www.googleapis.com/drive/v3/files/FILE_ID/export\n\nDebes reemplazar FILE_ID por el archivo el id actual que el usuario quiere editar.`, 'string') }}", "authentication": "predefinedCredentialType", "nodeCredentialType": "googleDriveOAuth2Api", "sendQuery": true, "queryParameters": { "parameters": [ { "name": "mimeType", "value": "text/plain" } ] }, "options": { "response": { "response": { "responseFormat": "text" } } } }, "type": "n8n-nodes-base.httpRequestTool", "typeVersion": 4.4, "position": [ -128, 336 ], "id": "0f3e7395-0686-4dbf-a6bd-67442c8fc15d", "name": "Extraer texto1", "credentials": { "googleOAuth2Api": { "id": "0HsSRUm82KPsWdiJ", "name": "Eidan - Google account" }, "googleDriveOAuth2Api": { "id": "gL2ZTwJb6xojauac", "name": "Eidan - Google Drive account" } } }, { "parameters": { "descriptionType": "manual", "toolDescription": "Usa este tool para editar el archivo especificado por el usuario.", "operation": "update", "documentURL": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Doc_ID_or_URL', `Aqui debes poner el id del archivo que el usuario quiere editar.`, 'string') }}", "actionsUi": { "actionFields": [ { "action": "replaceAll", "text": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('actionFields0_Old_Text', `Aqui debes poner las palabras que estan adentro de estos simbolos <<>>`, 'string') }}", "replaceText": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('actionFields0_New_Text', `Aqui debes poner el texto nuevo`, 'string') }}" } ] } }, "type": "n8n-nodes-base.googleDocsTool", "typeVersion": 2, "position": [ 32, 336 ], "id": "3904ec16-a89a-4eec-a1ec-b9d6fabfb2a6", "name": "Update a document in Google Docs", "credentials": { "googleDocsOAuth2Api": { "id": "GYYiwIAhdCjK5OP3", "name": "Eidan - Google Docs account" } } }, { "parameters": { "toolDescription": "Debes usar este tool para buscar el salario y salario variable del empleado.", "url": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('URL', `Aqui debes poner esta URL: https://glm.bamboohr.com/api/v1/employees/EMPLEADO_ID?fields=4626,payRate,4045\n\nDebes reemplazar EMPLEADO_ID por el id de la persona especificada en el mensaje. Para encontrar el id debes usar el tool que conecta a Supabase.`, 'string') }}", "authentication": "genericCredentialType", "genericAuthType": "httpBasicAuth", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "accept", "value": "application/json" } ] }, "options": {} }, "type": "n8n-nodes-base.httpRequestTool", "typeVersion": 4.4, "position": [ -224, 448 ], "id": "9e6b1174-e5b9-4bfe-98b3-5dfe8fda9aa2", "name": "Buscar salario y salario variable del empleado", "credentials": { "httpBasicAuth": { "id": "vXrW3oJWVhNbzB07", "name": "GLM Credential" } } }, { "parameters": { "content": "## Carpeta de employee uploads: id 14" }, "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [ 800, 240 ], "id": "6e247bb3-cc65-458e-aceb-55f1cb031bce", "name": "Sticky Note" }, { "parameters": { "url": "=https://api.bamboohr.com/api/gateway.php/glm/v1/employees/50467/files/view", "authentication": "genericCredentialType", "genericAuthType": "httpBasicAuth", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "accept", "value": "application/json" } ] }, "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.4, "position": [ 528, 400 ], "id": "bac8fbd9-dbba-4cb5-be89-8c430c44cadc", "name": "Categoria", "retryOnFail": true, "waitBetweenTries": 2000, "credentials": { "httpBasicAuth": { "id": "vXrW3oJWVhNbzB07", "name": "GLM Credential" } } }, { "parameters": { "method": "DELETE", "url": "=https://api.bamboohr.com/api/gateway.php/glm/v1/employees/50467/files/106224", "authentication": "genericCredentialType", "genericAuthType": "httpBasicAuth", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "accept", "value": "application/json" } ] }, "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.4, "position": [ 720, 400 ], "id": "26f015da-0f2f-4f1a-aa16-e1dc18fc3fde", "name": "Borrar archivos de prueba", "retryOnFail": true, "waitBetweenTries": 2000, "credentials": { "httpBasicAuth": { "id": "vXrW3oJWVhNbzB07", "name": "GLM Credential" } } }, { "parameters": { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 3 }, "conditions": [ { "id": "d152472d-6ef1-4d5d-8081-cc8b7064af2e", "leftValue": "={{ $('Webhook').item.json.body.chat.messagePayload.space.displayName }}", "rightValue": "", "operator": { "type": "string", "operation": "exists", "singleValue": true } }, { "id": "2b3eb077-a373-4530-b1fb-e33d7c6871a8", "leftValue": "={{ $('Webhook').item.json.body.chat.messagePayload.message.argumentText }}", "rightValue": "", "operator": { "type": "string", "operation": "exists", "singleValue": true } } ], "combinator": "and" }, "options": {} }, "type": "n8n-nodes-base.if", "typeVersion": 2.3, "position": [ -576, -112 ], "id": "cadb4331-6cf5-4a91-a731-3e6c51733ea9", "name": "Mencion al bot?" }, { "parameters": { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 3 }, "conditions": [ { "id": "d152472d-6ef1-4d5d-8081-cc8b7064af2e", "leftValue": "={{ $('Webhook').item.json.body.chat.messagePayload.space.singleUserBotDm }}", "rightValue": "", "operator": { "type": "boolean", "operation": "notExists", "singleValue": true } } ], "combinator": "and" }, "options": {} }, "type": "n8n-nodes-base.if", "typeVersion": 2.3, "position": [ -784, 0 ], "id": "ffe0b334-5691-465b-bc25-84c5595f9378", "name": "Mensaje en un espacio?" }, { "parameters": { "jsCode": "const usuario = $('Webhook').first().json.body.chat.messagePayload.message.sender.name;\n\nconst mensaje = $('Webhook').first().json.body.chat.messagePayload.message.argumentText;\n\nconst space = $('Webhook').first().json.body.chat.messagePayload.space.name;\n\nconst fueMensajeDirecto = $('Webhook').first().json.body.chat.messagePayload.space.singleUserBotDm || false;\n\nconst email = $('Webhook').first().json.body.chat.messagePayload.message.sender.email;\n\nconst pais = $input.first().json.country;\n\nreturn {\n usuario: usuario,\n mensaje: mensaje,\n espacio: space,\n fueMensajeDirecto: fueMensajeDirecto,\n email: email,\n pais: pais\n};" }, "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ -1664, -16 ], "id": "249f2673-49e8-495e-9ecf-9bd52887de13", "name": "Limpiar" }, { "parameters": { "description": "Usa esta herramienta para descargar el archivo enviarlo a BambooHR.", "workflowId": { "__rl": true, "value": "j0PIxCiiNMt0hWmr", "mode": "list", "cachedResultUrl": "/workflow/j0PIxCiiNMt0hWmr", "cachedResultName": "DocAssist descargar y enviar archivo" }, "workflowInputs": { "mappingMode": "defineBelow", "value": { "employee_id": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('employee_id', `Aqui debes poner el id del empleado.`, 'number') }}", "file_id": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('file_id', `Aqui debes poner como lista el/los id del archivo copiado que el usuario quiera subir al perfil de BambooHR del empleado.`, 'json') }}", "file_name": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('file_name', `Aqui debes poner el nombre del archivo con la extension .pdf. Ejemplo: NOMBRE_ARCHIVO.pdf`, 'string') }}" }, "matchingColumns": [], "schema": [ { "id": "employee_id", "displayName": "employee_id", "required": false, "defaultMatch": false, "display": true, "canBeUsedToMatch": true, "type": "number" }, { "id": "file_id", "displayName": "file_id", "required": false, "defaultMatch": false, "display": true, "canBeUsedToMatch": true, "type": "array" }, { "id": "file_name", "displayName": "file_name", "required": false, "defaultMatch": false, "display": true, "canBeUsedToMatch": true, "type": "string" } ], "attemptToConvertTypes": false, "convertFieldsToString": false } }, "type": "@n8n/n8n-nodes-langchain.toolWorkflow", "typeVersion": 2.2, "position": [ 160, 400 ], "id": "1a7b1a66-cdbb-44fe-9215-3739ac583342", "name": "Descargar archivo" }, { "parameters": { "description": "Herramienta OBLIGATORIA para compartir la carpeta de archivos con RRHH. Debes usarla SIEMPRE, inmediatamente despues de editar los archivos, y ANTES de responder a RRHH o dar la solicitud por confirmacion. Nunca omitas esta llamada ni la reemplaces por otra accion. ", "workflowId": { "__rl": true, "value": "NZbFBiVEXuS7kjO0", "mode": "list", "cachedResultUrl": "/workflow/NZbFBiVEXuS7kjO0", "cachedResultName": "DocAssist compartir folder - Optimizado" }, "workflowInputs": { "mappingMode": "defineBelow", "value": { "file_id": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('file_id', `Aqui debes poner el/los id del archivo copiado como array.`, 'json') }}", "file_name": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('file_name', `Aqui debes poner el nombre del archivo con la extension .pdf. Ejemplo: NOMBRE_ARCHIVO.pdf`, 'string') }}", "folder_name": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('folder_name', `Aqui debes poner el nombre de la carpeta creada.`, 'string') }}", "folder_id": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('folder_id', `Aqui debes poner el id de la carpeta creada.`, 'string') }}", "googlechat_space_name": "={{ $('Limpiar').item.json.espacio }}", "fueMensajeDirecto": "={{ $('Limpiar').item.json.fueMensajeDirecto }}", "email": "={{ $('Limpiar').item.json.email }}", "mensajeFinal": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('mensajeFinal', `- Si vas a crear la carpeta y mover los archivos para mandar el mensaje de confirmacion debes poner este valor como false.\n- Si vas a mandar el mensaje final con todo ya confirmado debes poner este valor como true.`, 'boolean') }}" }, "matchingColumns": [], "schema": [ { "id": "file_id", "displayName": "file_id", "required": false, "defaultMatch": false, "display": true, "canBeUsedToMatch": true, "type": "array" }, { "id": "file_name", "displayName": "file_name", "required": false, "defaultMatch": false, "display": true, "canBeUsedToMatch": true, "type": "string" }, { "id": "folder_name", "displayName": "folder_name", "required": false, "defaultMatch": false, "display": true, "canBeUsedToMatch": true, "type": "string" }, { "id": "folder_id", "displayName": "folder_id", "required": false, "defaultMatch": false, "display": true, "canBeUsedToMatch": true, "type": "string" }, { "id": "googlechat_space_name", "displayName": "googlechat_space_name", "required": false, "defaultMatch": false, "display": true, "canBeUsedToMatch": true, "type": "string" }, { "id": "fueMensajeDirecto", "displayName": "fueMensajeDirecto", "required": false, "defaultMatch": false, "display": true, "canBeUsedToMatch": true, "type": "string" }, { "id": "email", "displayName": "email", "required": false, "defaultMatch": false, "display": true, "canBeUsedToMatch": true, "type": "string" }, { "id": "mensajeFinal", "displayName": "mensajeFinal", "required": false, "defaultMatch": false, "display": true, "canBeUsedToMatch": true, "type": "boolean", "removed": false } ], "attemptToConvertTypes": false, "convertFieldsToString": false } }, "type": "@n8n/n8n-nodes-langchain.toolWorkflow", "typeVersion": 2.2, "position": [ -240, 768 ], "id": "842557a5-925d-4f84-a38a-28c9ec31b38e", "name": "Compartir archivos con RRHH" }, { "parameters": { "method": "POST", "url": "=https://chat.googleapis.com/v1/{{ $('Limpiar').item.json.espacio }}/messages", "authentication": "predefinedCredentialType", "nodeCredentialType": "googleApi", "sendBody": true, "specifyBody": "json", "jsonBody": "{\n \"text\": \"Por favor, intente nuevamente en unos minutos. Si la falla persiste, le solicitamos comunicarse con el equipo de IT para asistirlos. Muchas gracias.\"\n}", "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.4, "position": [ 208, 48 ], "id": "e8d3cf08-f25c-485a-8869-3ff8e57e9c2c", "name": "Contestar", "credentials": { "googleApi": { "id": "KzKVIgSNE4alOH2z", "name": "Eidan bot docAssist - Google Service Account account" } } }, { "parameters": { "workflowInputs": { "values": [ { "name": "usuario" }, { "name": "mensaje" }, { "name": "espacio" }, { "name": "fueMensajeDirecto" }, { "name": "email" } ] } }, "type": "n8n-nodes-base.executeWorkflowTrigger", "typeVersion": 1.1, "position": [ -2048, -176 ], "id": "585c169e-ba2f-45a9-be98-afacae3a66f9", "name": "When Executed by Another Workflow" }, { "parameters": { "operation": "get", "tableId": "empleados_glm", "filters": { "conditions": [ { "keyName": "work_email", "keyValue": "={{ $json.body.chat.messagePayload.message.sender.email }}" } ] } }, "type": "n8n-nodes-base.supabase", "typeVersion": 1, "position": [ -1856, -16 ], "id": "50fa6a53-0eda-4ada-9b84-ff2ffd2ba3c7", "name": "Obtener pais", "credentials": { "supabaseApi": { "id": "2PlsR6rpK7rQTIEn", "name": "Sofia test - Supabase account" } } }, { "parameters": { "promptType": "define", "text": "={{ $json.mensaje }}", "options": { "systemMessage": "=Eres un asistente automatizado de Recursos Humanos encargado de generar documentos a partir de plantillas en Google Drive.\n\n## Reglas\n- Tus respuestas hacia el usuario deben ser no tecnicas, deben ser formales y friendly para usuarios no tecnicos.\n- La plataforma para subir archivos al empleado se llama BambooHR.\n- Cada solicitud de generacion de archivos debe crearse en una carpeta nueva, NO guardar los nuevos archivos en una carpeta vieja.\n- Debes usar los archivos del pais del usuario: {{ $json.pais }}\n\nHay archivos que van en conjunto con otros pero varia segun pais.\n## Reglas para archivos en conjunto para Guatemala:\n- Si el usuario pide un visado, el usuario debe especificar si el visado es temporal (Anexo 2) o anual (Anexo 2), y si aplica a Walmart Connect u otro proyecto. Si el usuario no lo especifica, debes pedírselo antes de continuar.\n- Si el visado es TEMPORAL (Anexo 2 temporal): debes editar el Anexo 2 temporal correspondiente (Walmart Connect u otro proyecto), junto con la carta de responsabilidad y la declaración.\n- Si el visado es ANUAL (Anexo W anual): debes editar únicamente el Anexo 2 anual correspondiente (Walmart Connect u otro proyecto). No se incluyen la carta de responsabilidad ni la declaración. Además, al ser anual, NO debes solicitar fechas al usuario para este tipo de documento.\n\nREGLAS AL INSERTAR DATOS:\n- Al insertar valores numericos, si en el campo especifica 'en letra' debes insertarlo asi, ejemplo: 'diecinueve', si especifica 'en numeros', pues lo insertas normal, ejemplo: '19'.\n\nSigue este procedimiento estricto paso a paso:\n\nPASO 1: BÚSQUEDA Y PREPARACIÓN DE PLANTILLA\n- Usa la herramienta `buscar_template_drive` para encontrar la plantilla correspondiente al tipo de documento que pide el usuario.\n- Usa la herramienta `preparar_documento_y_extraer_placeholders` pasándole el ID de la plantilla. Esta herramienta creará la copia de trabajo y te devolverá el `new_file_id` junto con los placeholders a llenar (ej: <>, <>, etc.).\n\nPASO 2: OBTENCIÓN DE DATOS\n- Usa la herramienta `buscar_empleado_supabase` buscando por el nombre o identificador indicado por el usuario para obtener los datos requeridos.\n- Compara los datos obtenidos en Supabase con los placeholders extraídos en el PASO 1.\n- Para buscar el salario y salario variable del empleado, debes usar la herramienta `Buscar salario y salario variable del empleado`, aqui recibiras varios campos (4045, 4626, payRate)\n\nEn 4626 aparece el salario variable pero a veces aparece como null, en este caso debes buscarlo en el comentario en 4045.\nEn 4045 puede haber un comentario o puede ser null, en el comentario tendras que detectar el salario variable.\nEn payRate aparece el salario base.\n\nPASO 3: VALIDACIÓN DE INFORMACIÓN FALTANTE\n- Si faltan datos obligatorios para completar los placeholders que NO se encontraron en Supabase:\n STOP. Responde al usuario de inmediato indicando qué datos específicos faltan para que los proporcione. No continúes al paso 4 hasta tener toda la información.\n\nPASO 4: REEMPLAZO Y FINALIZACIÓN\n- Una vez tengas el 100% de los datos para todos los placeholders, llama a la herramienta `reemplazar_datos_y_finalizar_doc` enviando el `new_file_id` y los pares clave-valor a reemplazar.\n- Al insertar salario/salario variable debes insertarlos sin simbolos y nombre de monedas. Y poner comas.\n- Al insertar fechas siempre debes analizar el tipo de documento para saber que fecha insertar, si es constancia laboral siempre debes usar la fecha de hoy ({{ $now.toFormat('dd-MM-yyyy') }}), si no estas seguro para cuando poner la fecha debes preguntarle al usuario.\n\nPASO 5: DAR PERMISOS OWNER AL USUARIO (Este paso siempre debe realizarse)\n- Despues de haber hecho el paso 4, debes usar la herramienta 'Compartir archivos con RRHH' para hacer que el usuario que envio el mensaje sea owner de la carpeta que contiene los archivos copiados.\n\nPASO 6: CONFIRMACION\n- Despues de haber finalizado la edicion de los archivos, debes pedir al usuario la confirmacion si todos los datos estan correctos con los links de los archivos editados adjuntados, si contesta \"Si\" puedes pasar al paso 6, si contesta \"No\" y te envia los datos a corregir, debes editar nuevamente el archivo que te especifique. Al terminar de hacer la correcion, debes preguntar otra vez si todo esta correcto. Si todo esta correcto puedes pasar al paso 6. \n\nPASO 7: CREAR CARPETA\n- Despues de finalizar la edicion de los archivos. Usando la herramienta 'Crear carpeta' debes crear una carpeta que contenga en maximo 3 palabras los archivos que se copiaron y el nombre a quien se pidio los archivos, por ejemplo: VISADO - John Doe\n- Despues de crear la carpeta, debes mover los archivos copiados en la carpeta creada usando la herramienta 'Mover archivo'.\n\nPASO 8: RESPUESTA FINAL\n- Devuelve un mensaje de confirmación al usuario en Google Chat informando que el documento ha sido creado exitosamente e incluye el enlace (URL) directamente hacia la carpeta generado en Google Drive.\n- En la respuesta no incluyas palabras tecnicas como Supabase.\n- Siempre debes preguntar al usuario si quiere subir el/los archivos editados al perfil de BambooHR del empleado. Debes poner un listado de los archivos editados para que el usuario pueda elegir especificamente cual subir. El usuario puede responer \"No\", \"Todos\" o especificar los archivos por el nombre.\n- Para hablar con el usuario debes usar el tool de Contestar.\n\nPASO 9: DESCARGAR ARCHIVO Y SUBIR ARCHIVO A BAMBOOHR\n- Luego de haber dado permisos owner al usuario que envio el mensaje, debes preguntarle al usuario si desea subir el/los archivos copiados al usuario que se hizo la solicitud en BambooHR. Si el usuario dice que \"Si\", debes enviar los datos a la herramienta 'Descargar archivo'. En esta herramienta se descargar el archivo y luego se envia a BambooHR. El nombre del archivo debe ser por ejemplo: NOMBRE_ARCHIVO.pdf (Reemplazar NOMBRE_ARCHIVO por el nombre real). No incluyas 'Copy of' en el nombre. En el campo employee_id debes poner el id del empleado al que se pidio el documento y en el campo file_id debes poner el id del archivo copiado. En el campo folder_name debes poner el nombre de la carpeta creada y en folder_id el id de la carpeta.\n- NO PASAR AL PASO 9 HASTA QUE EL USUARIO CONTESTE \"SI\" o \"NO\". Si el usuario contesta \"Si\", primer ejecutas la herramienta 'Descargar archivo' y luego el PASO 8, si el usuario contesta \"No\", no ejecutes la herramiente 'Descargar archivo' y pasa al PASO 8.\n\nPASO 10: ELIMINAR ARCHIVOS COPIADOS\n- Despues de haber dado los permisos, debes eliminar todos los archivos que han sido copiados usando la herramienta 'Eliminar archivo copiado'.", "maxIterations": 70 } }, "type": "@n8n/n8n-nodes-langchain.agent", "typeVersion": 3.1, "position": [ -16, -288 ], "id": "dcc482e8-ad87-4840-a003-bcf2c6ea15ea", "name": "AI Agent1", "onError": "continueErrorOutput" }, { "parameters": { "rules": { "values": [ { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 3 }, "conditions": [ { "leftValue": "={{ $json.pais }}", "rightValue": "Guatemala", "operator": { "type": "string", "operation": "equals" }, "id": "2ded6020-e787-48a3-adf8-bb0c2ca96532" } ], "combinator": "and" } }, { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 3 }, "conditions": [ { "id": "55b84a4e-47ad-4fed-bc10-1b82449659be", "leftValue": "={{ $json.pais }}", "rightValue": "El Salvador", "operator": { "type": "string", "operation": "equals", "name": "filter.operator.equals" } } ], "combinator": "and" } }, { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 3 }, "conditions": [ { "id": "781cc29c-6638-472d-a51d-f342d44a3b68", "leftValue": "={{ $json.pais }}", "rightValue": "Republica Dominicana", "operator": { "type": "string", "operation": "equals", "name": "filter.operator.equals" } } ], "combinator": "and" } } ] }, "options": {} }, "type": "n8n-nodes-base.switch", "typeVersion": 3.4, "position": [ -1472, -16 ], "id": "02607710-4a0b-4f0e-a188-075bdba24974", "name": "Switch" }, { "parameters": { "url": "https://www.googleapis.com/drive/v3/files", "authentication": "predefinedCredentialType", "nodeCredentialType": "googleDriveOAuth2Api", "sendQuery": true, "queryParameters": { "parameters": [ { "name": "q", "value": "'1WAlkzQMWlJ226-yUv8yalXtydQHQs0WJ' in parents and trashed = false" } ] }, "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.4, "position": [ -1232, -160 ], "id": "df8c9d9b-89dc-43d2-934d-b716f3022f17", "name": "Archivos Guatemala", "credentials": { "googleDriveOAuth2Api": { "id": "gL2ZTwJb6xojauac", "name": "Eidan - Google Drive account" } } }, { "parameters": { "url": "https://www.googleapis.com/drive/v3/files", "authentication": "predefinedCredentialType", "nodeCredentialType": "googleDriveOAuth2Api", "sendQuery": true, "queryParameters": { "parameters": [ { "name": "q", "value": "'1h2DO6ojQz1bzp5_yWz4mtgEZKexNwwic' in parents and trashed = false" } ] }, "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.4, "position": [ -1232, 0 ], "id": "81b01781-2d82-42e7-a2a5-4efddff5990f", "name": "Archivos El Salvador", "credentials": { "googleDriveOAuth2Api": { "id": "gL2ZTwJb6xojauac", "name": "Eidan - Google Drive account" } } }, { "parameters": { "url": "https://www.googleapis.com/drive/v3/files", "authentication": "predefinedCredentialType", "nodeCredentialType": "googleDriveOAuth2Api", "sendQuery": true, "queryParameters": { "parameters": [ { "name": "q", "value": "'1h_jDj8F0gCDPLDfuYobjC5hWFdcodIK5' in parents and trashed = false" } ] }, "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.4, "position": [ -1232, 160 ], "id": "bd3c9a6a-aa4e-47d6-a09d-20481ebf6e42", "name": "Archivos Republica Dominicana", "credentials": { "googleDriveOAuth2Api": { "id": "gL2ZTwJb6xojauac", "name": "Eidan - Google Drive account" } } }, { "parameters": { "jsCode": "const items = $input.all();\n\nconst files = items.flatMap(item =>\n (item.json.files ?? []).map(file => ({\n id: file.id,\n name: file.name\n }))\n);\n\nreturn [\n {\n json: {\n files\n }\n }\n];" }, "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ -976, 0 ], "id": "44a116b1-c2a8-43db-b089-a74f6a9dbe64", "name": "Limpiar lista archivos" }, { "parameters": { "httpMethod": "POST", "path": "doc-assist", "options": { "responseData": "{}", "responseHeaders": { "entries": [ { "name": "Content-Type", "value": "application/json" } ] } } }, "type": "n8n-nodes-base.webhook", "typeVersion": 2.1, "position": [ -2048, 144 ], "id": "67cb6321-1795-4f90-be0d-568637e14edb", "name": "Webhook1", "webhookId": "a4e58dc3-2006-4af9-9c85-8adbce3cf4b4", "disabled": true }, { "parameters": {}, "type": "n8n-nodes-base.manualTrigger", "typeVersion": 1, "position": [ -2000, 656 ], "id": "45ab19ad-1e86-4134-92d6-73b02b40bc3e", "name": "When clicking ‘Execute workflow’" }, { "parameters": { "method": "POST", "url": "=https://git.digitalcompass.agency/api/v1/repos/{{ $('Valores').item.json.user }}/{{ $('Valores').item.json.repo_name }}/contents/{{ $('Valores').item.json.file_name }}.json", "authentication": "genericCredentialType", "genericAuthType": "httpHeaderAuth", "sendBody": true, "specifyBody": "json", "jsonBody": "={\n \"message\": \"{{ $json.message }}\",\n \"content\": \"{{ $json.content }}\",\n \"branch\": \"{{ $json.branch }}\"\n}", "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.4, "position": [ -1024, 768 ], "id": "13af15b0-94da-413d-b62b-18d5f9be8927", "name": "Subir archivo", "retryOnFail": false, "credentials": { "httpHeaderAuth": { "id": "R4tnNpYoEjhBYeUT", "name": "Eidan - gitea" } } }, { "parameters": { "url": "=https://git.digitalcompass.agency/api/v1/repos/{{ $json.user }}/{{ $json.repo_name }}/contents/{{ $json.file_name }}.json", "authentication": "genericCredentialType", "genericAuthType": "httpHeaderAuth", "sendHeaders": true, "headerParameters": { "parameters": [] }, "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.4, "position": [ -1632, 656 ], "id": "c6ac9918-e6f4-4eda-8388-6d05ec99b471", "name": "Obtener archivo", "credentials": { "httpHeaderAuth": { "id": "R4tnNpYoEjhBYeUT", "name": "Eidan - gitea" } }, "onError": "continueErrorOutput" }, { "parameters": { "method": "PUT", "url": "=https://git.digitalcompass.agency/api/v1/repos/{{ $('Valores').item.json.user }}/{{ $('Valores').item.json.repo_name }}/contents/{{ $('Valores').item.json.file_name }}.json", "authentication": "genericCredentialType", "genericAuthType": "httpHeaderAuth", "sendBody": true, "specifyBody": "json", "jsonBody": "={\n \"message\": \"{{ $json.message }}\",\n \"content\": \"{{ $json.content }}\",\n \"sha\": \"{{ $json.sha }}\",\n \"branch\": \"{{ $json.branch }}\"\n}", "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.4, "position": [ -1024, 560 ], "id": "653c7a9a-8cd3-49d7-8268-cfea26b95d60", "name": "Actualizar archivo", "credentials": { "httpHeaderAuth": { "id": "R4tnNpYoEjhBYeUT", "name": "Eidan - gitea" } } }, { "parameters": { "operation": "get", "workflowId": { "__rl": true, "value": "yYmp0SKgpWeooCYm", "mode": "list", "cachedResultName": "GLM DocAssist - Optimizado (#yYmp0SKgpWeooCYm)" }, "requestOptions": {} }, "type": "n8n-nodes-base.n8n", "typeVersion": 1, "position": [ -1376, 560 ], "id": "a90a70d4-08d1-4847-9ea8-e4776c180ee0", "name": "Get a workflow1", "credentials": { "n8nApi": { "id": "73Ydc9X8h5HXvFrt", "name": "Eidan - n8n account" } } }, { "parameters": { "operation": "get", "workflowId": { "__rl": true, "value": "yYmp0SKgpWeooCYm", "mode": "list", "cachedResultName": "GLM DocAssist - Optimizado (#yYmp0SKgpWeooCYm)" }, "requestOptions": {} }, "type": "n8n-nodes-base.n8n", "typeVersion": 1, "position": [ -1376, 768 ], "id": "e653fddd-6e0a-4864-909f-1f45c16a318b", "name": "Get a workflow2", "credentials": { "n8nApi": { "id": "73Ydc9X8h5HXvFrt", "name": "Eidan - n8n account" } } }, { "parameters": { "assignments": { "assignments": [ { "id": "31558805-f167-47c4-b0b4-46b8a80ca282", "name": "user", "value": "mgomez", "type": "string" }, { "id": "3519ad4c-6d66-4963-ab76-ee5517d88d67", "name": "repo_name", "value": "glm-doc-assist", "type": "string" }, { "id": "0df99f1e-1354-43b9-9d20-9f994cc82cf6", "name": "file_name", "value": "doc-assist-workflow", "type": "string" } ] }, "options": {} }, "type": "n8n-nodes-base.set", "typeVersion": 3.4, "position": [ -1808, 656 ], "id": "817953ea-d46e-498e-9e1a-3affb78aef51", "name": "Valores" }, { "parameters": { "jsCode": "const sha = $('Obtener archivo').first().json.sha;\nconst data = { $json };\n\nreturn [{\n json: {\n message: \"Update \" + $('Valores').first().json.file_name + \".json\",\n content: Buffer.from(JSON.stringify(data, null, 2)).toString(\"base64\"),\n sha: sha,\n branch: \"main\"\n }\n}];" }, "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ -1200, 560 ], "id": "dd638aac-5b28-48c4-9038-b734cc7215e2", "name": "Code in JavaScript2" }, { "parameters": { "jsCode": "const sha = $json.sha; // viene del GET anterior\nconst data = { $json };\n\nconst base64 = Buffer.from(JSON.stringify(data, null, 2)).toString(\"base64\");\n\nreturn [{\n json: {\n message: \"Create \" + $('Valores').first().json.file_name + \".json\",\n content: base64,\n sha: sha,\n branch: \"main\"\n }\n}];" }, "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ -1200, 768 ], "id": "033b9f56-3402-4846-b42b-b59a22c8400a", "name": "Code in JavaScript4" } ], "connections": { "Webhook": { "main": [ [ { "node": "Obtener pais", "type": "main", "index": 0 } ] ] }, "Google Gemini Chat Model": { "ai_languageModel": [ [ { "node": "AI Agent", "type": "ai_languageModel", "index": 0 } ] ] }, "AI Agent": { "main": [ [], [ { "node": "Contestar", "type": "main", "index": 0 } ] ] }, "Simple Memory": { "ai_memory": [ [ { "node": "AI Agent", "type": "ai_memory", "index": 0 } ] ] }, "Copiar archivo": { "ai_tool": [ [ { "node": "AI Agent", "type": "ai_tool", "index": 0 } ] ] }, "Get many rows in Supabase": { "ai_tool": [ [ { "node": "AI Agent", "type": "ai_tool", "index": 0 } ] ] }, "Contestar1": { "ai_tool": [ [ { "node": "AI Agent", "type": "ai_tool", "index": 0 } ] ] }, "Extraer texto1": { "ai_tool": [ [ { "node": "AI Agent", "type": "ai_tool", "index": 0 } ] ] }, "Update a document in Google Docs": { "ai_tool": [ [ { "node": "AI Agent", "type": "ai_tool", "index": 0 } ] ] }, "Buscar salario y salario variable del empleado": { "ai_tool": [ [ { "node": "AI Agent", "type": "ai_tool", "index": 0 } ] ] }, "Categoria": { "main": [ [ { "node": "Borrar archivos de prueba", "type": "main", "index": 0 } ] ] }, "Mencion al bot?": { "main": [ [ { "node": "AI Agent", "type": "main", "index": 0 } ] ] }, "Mensaje en un espacio?": { "main": [ [ { "node": "Mencion al bot?", "type": "main", "index": 0 } ], [ { "node": "AI Agent", "type": "main", "index": 0 } ] ] }, "Limpiar": { "main": [ [ { "node": "Switch", "type": "main", "index": 0 } ] ] }, "Descargar archivo": { "ai_tool": [ [ { "node": "AI Agent", "type": "ai_tool", "index": 0 } ] ] }, "Compartir archivos con RRHH": { "ai_tool": [ [ { "node": "AI Agent", "type": "ai_tool", "index": 0 } ] ] }, "When Executed by Another Workflow": { "main": [ [ { "node": "Limpiar", "type": "main", "index": 0 } ] ] }, "Obtener pais": { "main": [ [ { "node": "Limpiar", "type": "main", "index": 0 } ] ] }, "Switch": { "main": [ [ { "node": "Archivos Guatemala", "type": "main", "index": 0 } ], [ { "node": "Archivos El Salvador", "type": "main", "index": 0 } ], [ { "node": "Archivos Republica Dominicana", "type": "main", "index": 0 } ] ] }, "Archivos Guatemala": { "main": [ [ { "node": "Limpiar lista archivos", "type": "main", "index": 0 } ] ] }, "Archivos El Salvador": { "main": [ [ { "node": "Limpiar lista archivos", "type": "main", "index": 0 } ] ] }, "Archivos Republica Dominicana": { "main": [ [ { "node": "Limpiar lista archivos", "type": "main", "index": 0 } ] ] }, "Limpiar lista archivos": { "main": [ [ { "node": "Mensaje en un espacio?", "type": "main", "index": 0 } ] ] }, "Webhook1": { "main": [ [] ] }, "When clicking ‘Execute workflow’": { "main": [ [ { "node": "Valores", "type": "main", "index": 0 } ] ] }, "Obtener archivo": { "main": [ [ { "node": "Get a workflow1", "type": "main", "index": 0 } ], [ { "node": "Get a workflow2", "type": "main", "index": 0 } ] ] }, "Get a workflow1": { "main": [ [ { "node": "Code in JavaScript2", "type": "main", "index": 0 } ] ] }, "Get a workflow2": { "main": [ [ { "node": "Code in JavaScript4", "type": "main", "index": 0 } ] ] }, "Valores": { "main": [ [ { "node": "Obtener archivo", "type": "main", "index": 0 } ] ] }, "Code in JavaScript2": { "main": [ [ { "node": "Actualizar archivo", "type": "main", "index": 0 } ] ] }, "Code in JavaScript4": { "main": [ [ { "node": "Subir archivo", "type": "main", "index": 0 } ] ] } }, "settings": { "executionOrder": "v1", "binaryMode": "separate", "timeSavedMode": "fixed", "callerPolicy": "workflowsFromSameOwner", "availableInMCP": false }, "staticData": null, "meta": { "templateCredsSetupCompleted": true }, "pinData": { "Webhook1": [ { "json": { "headers": { "host": "agenteit.digitalcompass.agency", "user-agent": "Google-gsuiteaddons", "content-length": "4572", "accept": "application/json", "accept-encoding": "gzip, deflate, br", "authorization": "Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6ImYxMGY4NzQwNWE5NzljMWRmMzZkZjI2NjA2NzM0ZjMzY2Q4NWMyNzEiLCJ0eXAiOiJKV1QifQ.eyJhdWQiOiJodHRwczovL2FnZW50ZWl0LmRpZ2l0YWxjb21wYXNzLmFnZW5jeS93ZWJob29rL2RvYy1hc2lzc3QiLCJhenAiOiIxMDM4NTEwOTIyODU1ODUwMzYzMDMiLCJlbWFpbCI6InNlcnZpY2UtNjAwNjEwMzIyNzM5QGdjcC1zYS1nc3VpdGVhZGRvbnMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiZXhwIjoxNzg4OTkyMTg2LCJpYXQiOjE3ODg5ODg1ODYsImlzcyI6Imh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbSIsInN1YiI6IjEwMzg1MTA5MjI4NTU4NTAzNjMwMyJ9.FngVRQAsQW20xzXxvNTU4EfVV8H5aC_ujkIJn_GnFqU3_xUfdPQITjnmrc8ChbVV8wTM7lFBvavDuh4KWmvdrGcJylXNILrjldKt9qAzdJvr59xmUwSg7bY_rsDi6jENbk-757v6Z0YgNsqyo6iZmMzZvJuedYgUvdnDWG5hihZ7Sxsb0g-z_JzDzin3dT7iW_Fs9BkBlrVcbwJgKciXsyUCIPZuD34AOb2Ym3PLYlVwWx4O2bKshTpwecI2rhWZG2rXpg7HQlPh3mYeQYgFNs6VCD4Na_mIe6QjEFiofT4VmcGXap6jMduwcgvkg8IbeoyTlUeFxPJUx1vbr0489w", "content-type": "application/json; charset=utf-8", "x-forwarded-for": "74.125.213.13", "x-forwarded-host": "agenteit.digitalcompass.agency", "x-forwarded-port": "443", "x-forwarded-proto": "https", "x-forwarded-server": "07b4f09d2c65", "x-real-ip": "74.125.213.13" }, "params": {}, "query": {}, "body": { "commonEventObject": { "userLocale": "es-419", "hostApp": "CHAT", "platform": "WEB", "timeZone": { "id": "America/Guatemala", "offset": -21600000 } }, "authorizationEventObject": { "systemIdToken": "eyJhbGciOiJSUzI1NiIsImtpZCI6ImYxMGY4NzQwNWE5NzljMWRmMzZkZjI2NjA2NzM0ZjMzY2Q4NWMyNzEiLCJ0eXAiOiJKV1QifQ.eyJhdWQiOiJodHRwczovL2FnZW50ZWl0LmRpZ2l0YWxjb21wYXNzLmFnZW5jeS93ZWJob29rL2RvYy1hc2lzc3QiLCJhenAiOiIxMDM4NTEwOTIyODU1ODUwMzYzMDMiLCJlbWFpbCI6InNlcnZpY2UtNjAwNjEwMzIyNzM5QGdjcC1zYS1nc3VpdGVhZGRvbnMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiZXhwIjoxNzg4OTkyMTg2LCJpYXQiOjE3ODg5ODg1ODYsImlzcyI6Imh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbSIsInN1YiI6IjEwMzg1MTA5MjI4NTU4NTAzNjMwMyJ9.FngVRQAsQW20xzXxvNTU4EfVV8H5aC_ujkIJn_GnFqU3_xUfdPQITjnmrc8ChbVV8wTM7lFBvavDuh4KWmvdrGcJylXNILrjldKt9qAzdJvr59xmUwSg7bY_rsDi6jENbk-757v6Z0YgNsqyo6iZmMzZvJuedYgUvdnDWG5hihZ7Sxsb0g-z_JzDzin3dT7iW_Fs9BkBlrVcbwJgKciXsyUCIPZuD34AOb2Ym3PLYlVwWx4O2bKshTpwecI2rhWZG2rXpg7HQlPh3mYeQYgFNs6VCD4Na_mIe6QjEFiofT4VmcGXap6jMduwcgvkg8IbeoyTlUeFxPJUx1vbr0489w" }, "chat": { "user": { "name": "users/102850205567847595788", "displayName": "Pablo Gamboa Cú", "avatarUrl": "https://lh3.googleusercontent.com/a/ACg8ocJG1lFzVz6DHGfheAlFkYCHQ1C0-Sobp4F5SGVBioyCgaTSWNs=k-no", "email": "pgamboa@gomezleemarketing.com", "type": "HUMAN", "domainId": "29wkq2e" }, "eventTime": "2026-09-09T21:16:26.224063Z", "messagePayload": { "space": { "name": "spaces/AAQAxswLbbE", "type": "ROOM", "displayName": "DocAssist TEST", "spaceThreadingState": "THREADED_MESSAGES", "spaceType": "SPACE", "spaceHistoryState": "HISTORY_ON", "lastActiveTime": "2026-09-09T21:16:26.224063Z", "membershipCount": { "joinedDirectHumanUserCount": 3 }, "customer": "customers/C029wkq2e", "spaceUri": "https://chat.google.com/room/AAQAxswLbbE?cls=11" }, "message": { "name": "spaces/AAQAxswLbbE/messages/JnCvJzsaI5k.JnCvJzsaI5k", "sender": { "name": "users/102850205567847595788", "displayName": "Pablo Gamboa Cú", "avatarUrl": "https://lh3.googleusercontent.com/a/ACg8ocJG1lFzVz6DHGfheAlFkYCHQ1C0-Sobp4F5SGVBioyCgaTSWNs=k-no", "email": "pgamboa@gomezleemarketing.com", "type": "HUMAN", "domainId": "29wkq2e" }, "createTime": "2026-09-09T21:16:26.224063Z", "text": "@Bot DocAssist GLM si", "annotations": [ { "type": "USER_MENTION", "startIndex": 0, "length": 18, "userMention": { "user": { "name": "users/104522615141186228825", "displayName": "Bot DocAssist GLM", "avatarUrl": "https://lh5.googleusercontent.com/proxy/6Bn4fsZayjbqXgs5IeH43HHfcuw1e5PWc_I3oVjZbx6AaEjiBhyaWSHeqRi0eeeouDAa7Bf1BlPS53QgQ2PM_OVy-L2IxO9FaA8lKtGmcFhTKMIqZy4it6_iPCsxu27mkVud66k", "type": "BOT" }, "type": "MENTION" } } ], "thread": { "name": "spaces/AAQAxswLbbE/threads/JnCvJzsaI5k", "retentionSettings": { "state": "PERMANENT" } }, "space": { "name": "spaces/AAQAxswLbbE", "type": "ROOM", "displayName": "DocAssist TEST", "spaceThreadingState": "THREADED_MESSAGES", "spaceType": "SPACE", "spaceHistoryState": "HISTORY_ON", "lastActiveTime": "2026-09-09T21:16:26.224063Z", "membershipCount": { "joinedDirectHumanUserCount": 3 }, "customer": "customers/C029wkq2e", "spaceUri": "https://chat.google.com/room/AAQAxswLbbE?cls=11" }, "argumentText": " si", "retentionSettings": { "state": "PERMANENT" }, "messageHistoryState": "HISTORY_ON", "formattedText": "@Bot DocAssist GLM si", "markupSyntax": "MARKUP_SYNTAX_CHAT" }, "configCompleteRedirectUri": "https://chat.google.com/api/bot_config_complete?token=AHJs7kgh1dpENHy6Xv0cHbC5Hs12F2B63YxnoCdZiNMvQif4ty9N_X3qVRoTRwm9L-IWErV5DkfYs7ZILBggpZc-CRND0yHGxdzkaYZ40aFVP4C3rWkCuEfzBoHxAF1Walqn1hy-WwzVGw6jUbiPMChMSg%3D%3D" } } }, "webhookUrl": "https://agenteit.digitalcompass.agency/webhook/doc-asisst", "executionMode": "production" } } ], "Webhook": [ { "json": { "headers": { "host": "agenteit.digitalcompass.agency", "user-agent": "Google-gsuiteaddons", "content-length": "4362", "accept": "application/json", "accept-encoding": "gzip, deflate, br", "authorization": "Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6ImYxMGY4NzQwNWE5NzljMWRmMzZkZjI2NjA2NzM0ZjMzY2Q4NWMyNzEiLCJ0eXAiOiJKV1QifQ.eyJhdWQiOiJodHRwczovL2FnZW50ZWl0LmRpZ2l0YWxjb21wYXNzLmFnZW5jeS93ZWJob29rL2RvYy1hc3Npc3QiLCJhenAiOiIxMDM4NTEwOTIyODU1ODUwMzYzMDMiLCJlbWFpbCI6InNlcnZpY2UtNjAwNjEwMzIyNzM5QGdjcC1zYS1nc3VpdGVhZGRvbnMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiZXhwIjoxNzg5MDY4ODI3LCJpYXQiOjE3ODkwNjUyMjcsImlzcyI6Imh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbSIsInN1YiI6IjEwMzg1MTA5MjI4NTU4NTAzNjMwMyJ9.3W8JD0qF4Y_pgJ45lbheyDJYfBbxoUZyi4S4sle6b5lTkU8GBC8bHmkO0dZiOBKLxLWbmSAHZIQSqiRokVzHZco-ULiz8DxwALF4G-BpxSCjgWCgSanFDnGUbof8VaGLkRrMeM9_dzaCR9ZBjhm_gB6XtnQkcDOAlWt5q7qDWncNTeHCMhzhriC-CJqM1A70Qz8NaQnUaWDaqV70LFyK2KN756KZWZpWs42KseB4RVSP3UWmn4y5eQzyEn3TC_Lj-4mwfHn5RYmIrS25JzBNqLXJlJNz8cpSR39lpZ7_vLJkNj1AqeNyA1jouuGyd22_nOw9PA1t2Y0zaQsMlLdscA", "content-type": "application/json; charset=utf-8", "x-forwarded-for": "74.125.213.15", "x-forwarded-host": "agenteit.digitalcompass.agency", "x-forwarded-port": "443", "x-forwarded-proto": "https", "x-forwarded-server": "07b4f09d2c65", "x-real-ip": "74.125.213.15" }, "params": {}, "query": {}, "body": { "commonEventObject": { "userLocale": "es-419", "hostApp": "CHAT", "platform": "WEB", "timeZone": { "id": "America/Guatemala", "offset": -21600000 } }, "authorizationEventObject": { "systemIdToken": "eyJhbGciOiJSUzI1NiIsImtpZCI6ImYxMGY4NzQwNWE5NzljMWRmMzZkZjI2NjA2NzM0ZjMzY2Q4NWMyNzEiLCJ0eXAiOiJKV1QifQ.eyJhdWQiOiJodHRwczovL2FnZW50ZWl0LmRpZ2l0YWxjb21wYXNzLmFnZW5jeS93ZWJob29rL2RvYy1hc3Npc3QiLCJhenAiOiIxMDM4NTEwOTIyODU1ODUwMzYzMDMiLCJlbWFpbCI6InNlcnZpY2UtNjAwNjEwMzIyNzM5QGdjcC1zYS1nc3VpdGVhZGRvbnMuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiZXhwIjoxNzg5MDY4ODI3LCJpYXQiOjE3ODkwNjUyMjcsImlzcyI6Imh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbSIsInN1YiI6IjEwMzg1MTA5MjI4NTU4NTAzNjMwMyJ9.3W8JD0qF4Y_pgJ45lbheyDJYfBbxoUZyi4S4sle6b5lTkU8GBC8bHmkO0dZiOBKLxLWbmSAHZIQSqiRokVzHZco-ULiz8DxwALF4G-BpxSCjgWCgSanFDnGUbof8VaGLkRrMeM9_dzaCR9ZBjhm_gB6XtnQkcDOAlWt5q7qDWncNTeHCMhzhriC-CJqM1A70Qz8NaQnUaWDaqV70LFyK2KN756KZWZpWs42KseB4RVSP3UWmn4y5eQzyEn3TC_Lj-4mwfHn5RYmIrS25JzBNqLXJlJNz8cpSR39lpZ7_vLJkNj1AqeNyA1jouuGyd22_nOw9PA1t2Y0zaQsMlLdscA" }, "chat": { "user": { "name": "users/102850205567847595788", "displayName": "Pablo Gamboa Cú", "avatarUrl": "https://lh3.googleusercontent.com/a/ACg8ocJG1lFzVz6DHGfheAlFkYCHQ1C0-Sobp4F5SGVBioyCgaTSWNs=k-no", "email": "pgamboa@gomezleemarketing.com", "type": "HUMAN", "domainId": "29wkq2e" }, "eventTime": "2026-09-10T18:33:46.904079Z", "messagePayload": { "space": { "name": "spaces/AAQAxswLbbE", "type": "ROOM", "displayName": "DocAssist TEST", "spaceThreadingState": "THREADED_MESSAGES", "spaceType": "SPACE", "spaceHistoryState": "HISTORY_ON", "lastActiveTime": "2026-09-10T18:33:46.904079Z", "membershipCount": { "joinedDirectHumanUserCount": 3 }, "customer": "customers/C029wkq2e", "spaceUri": "https://chat.google.com/room/AAQAxswLbbE?cls=11" }, "message": { "name": "spaces/AAQAxswLbbE/messages/gq2Nid1zByM.gq2Nid1zByM", "sender": { "name": "users/102850205567847595788", "displayName": "Pablo Gamboa Cú", "avatarUrl": "https://lh3.googleusercontent.com/a/ACg8ocJG1lFzVz6DHGfheAlFkYCHQ1C0-Sobp4F5SGVBioyCgaTSWNs=k-no", "email": "pgamboa@gomezleemarketing.com", "type": "HUMAN", "domainId": "29wkq2e" }, "createTime": "2026-09-10T18:33:46.904079Z", "text": "@Bot DocAssist GLM si", "annotations": [ { "type": "USER_MENTION", "startIndex": 0, "length": 18, "userMention": { "user": { "name": "users/104522615141186228825", "displayName": "Bot DocAssist GLM", "avatarUrl": "https://lh5.googleusercontent.com/proxy/6Bn4fsZayjbqXgs5IeH43HHfcuw1e5PWc_I3oVjZbx6AaEjiBhyaWSHeqRi0eeeouDAa7Bf1BlPS53QgQ2PM_OVy-L2IxO9FaA8lKtGmcFhTKMIqZy4it6_iPCsxu27mkVud66k", "type": "BOT" }, "type": "MENTION" } } ], "thread": { "name": "spaces/AAQAxswLbbE/threads/gq2Nid1zByM", "retentionSettings": { "state": "PERMANENT" } }, "space": { "name": "spaces/AAQAxswLbbE", "type": "ROOM", "displayName": "DocAssist TEST", "spaceThreadingState": "THREADED_MESSAGES", "spaceType": "SPACE", "spaceHistoryState": "HISTORY_ON", "lastActiveTime": "2026-09-10T18:33:46.904079Z", "membershipCount": { "joinedDirectHumanUserCount": 3 }, "customer": "customers/C029wkq2e", "spaceUri": "https://chat.google.com/room/AAQAxswLbbE?cls=11" }, "argumentText": " si", "retentionSettings": { "state": "PERMANENT" }, "messageHistoryState": "HISTORY_ON", "formattedText": "@Bot DocAssist GLM si", "markupSyntax": "MARKUP_SYNTAX_CHAT" }, "configCompleteRedirectUri": "https://chat.google.com/api/bot_config_complete?token=ADpxn743N7fj5C1olzzFgPA_9daJlSScS5t01Fkd87pnaokzTUDMllLHa-dg1XmGRwhLm6KPXDDxEPDC6upHh80nFpF36D3M9ijJJhe3VgQaQtn2H0miheXTJu-TZZLrAxZRYocVrzd0lBGxgt6CoBSfhg%3D%3D" } } }, "webhookUrl": "https://agenteit.digitalcompass.agency/webhook/doc-assist", "executionMode": "production" }, "pairedItem": { "item": 0 } } ] }, "versionId": "e86bccda-7355-4785-873e-8f826af636ef", "activeVersionId": "e86bccda-7355-4785-873e-8f826af636ef", "versionCounter": 224, "triggerCount": 1, "shared": [ { "updatedAt": "2026-09-10T14:44:58.262Z", "createdAt": "2026-09-10T14:44:58.262Z", "role": "workflow:owner", "workflowId": "yYmp0SKgpWeooCYm", "projectId": "0bH6HfYEL8n6SDmr", "project": { "updatedAt": "2026-04-22T14:25:04.701Z", "createdAt": "2026-04-22T14:22:54.790Z", "id": "0bH6HfYEL8n6SDmr", "name": "Eidan Then ", "type": "personal", "icon": null, "description": null, "creatorId": "de14e7e5-491b-4983-abb2-f88af42e92fd" } } ], "tags": [], "activeVersion": { "updatedAt": "2026-09-11T19:32:45.000Z", "createdAt": "2026-09-11T19:32:39.320Z", "versionId": "e86bccda-7355-4785-873e-8f826af636ef", "workflowId": "yYmp0SKgpWeooCYm", "nodes": [ { "parameters": { "httpMethod": "POST", "path": "doc-assist", "options": { "responseData": "{}", "responseHeaders": { "entries": [ { "name": "Content-Type", "value": "application/json" } ] } } }, "type": "n8n-nodes-base.webhook", "typeVersion": 2.1, "position": [ -2048, -16 ], "id": "55d73eb8-8648-4fce-a8ed-32353245b551", "name": "Webhook", "webhookId": "878f3a73-e8e4-4101-be15-cfba7b9a5832" }, { "parameters": { "promptType": "define", "text": "={{ $('Limpiar').item.json.mensaje }}", "options": { "systemMessage": "=Eres un asistente automatizado de Recursos Humanos encargado de generar documentos a partir de plantillas en Google Drive.\n\n## Reglas\n- Tus respuestas hacia el usuario deben ser no tecnicas, deben ser formales y friendly para usuarios no tecnicos.\n- La plataforma para subir archivos al empleado se llama BambooHR.\n- Cada solicitud de generacion de archivos debe crearse en una carpeta nueva, NO guardar los nuevos archivos en una carpeta vieja.\n\nHay archivos que van en conjunto con otros pero varia segun pais.\n## Reglas para archivos en conjunto para Guatemala:\n- Si el usuario pide un visado, el usuario debe especificar si el visado es temporal (Anexo 2) o anual (Anexo 2), y si aplica a Walmart Connect u otro proyecto. Si el usuario no lo especifica, debes pedírselo antes de continuar.\n- Si el visado es TEMPORAL (Anexo 2 temporal): debes editar el Anexo 2 temporal correspondiente (Walmart Connect u otro proyecto), junto con la carta de responsabilidad y la declaración.\n- Si el visado es ANUAL (Anexo 2 anual): debes editar únicamente el Anexo 2 anual correspondiente (Walmart Connect u otro proyecto). No se incluyen la carta de responsabilidad ni la declaración. Además, al ser anual, NO debes solicitar fechas al usuario para este tipo de documento.\n\nREGLAS AL INSERTAR DATOS:\n- Al insertar valores numericos, si en el campo especifica 'en letra' debes insertarlo asi, ejemplo: 'diecinueve', si especifica 'en numeros', pues lo insertas normal, ejemplo: '19'.\n\nSigue este procedimiento estricto paso a paso:\n\nPASO 1: BÚSQUEDA Y PREPARACIÓN DE PLANTILLA\n- Usa la herramienta `buscar_template_drive` para encontrar la plantilla correspondiente al tipo de documento que pide el usuario.\n- Usa la herramienta `preparar_documento_y_extraer_placeholders` pasándole el ID de la plantilla. Esta herramienta creará la copia de trabajo y te devolverá el `new_file_id` junto con los placeholders a llenar (ej: <>, <>, etc.).\n\nPASO 2: OBTENCIÓN DE DATOS\n- Usa la herramienta `buscar_empleado_supabase` buscando por el nombre o identificador indicado por el usuario para obtener los datos requeridos.\n- Compara los datos obtenidos en Supabase con los placeholders extraídos en el PASO 1.\n- Para buscar el salario y salario variable del empleado, debes usar la herramienta `Buscar salario y salario variable del empleado`, aqui recibiras varios campos (4045, 4626, payRate)\n\nEn 4626 aparece el salario variable pero a veces aparece como null, en este caso debes buscarlo en el comentario en 4045.\nEn 4045 puede haber un comentario o puede ser null, en el comentario tendras que detectar el salario variable.\nEn payRate aparece el salario base.\n\nPASO 3: VALIDACIÓN DE INFORMACIÓN FALTANTE\n- Si faltan datos obligatorios para completar los placeholders que NO se encontraron en Supabase:\n STOP. Responde al usuario de inmediato indicando qué datos específicos faltan para que los proporcione. No continúes al paso 4 hasta tener toda la información.\n\nPASO 4: REEMPLAZO Y FINALIZACIÓN\n- Una vez tengas el 100% de los datos para todos los placeholders, llama a la herramienta `reemplazar_datos_y_finalizar_doc` enviando el `new_file_id` y los pares clave-valor a reemplazar.\n- Al insertar salario/salario variable debes insertarlos sin simbolos y nombre de monedas. Y poner comas.\n- Al insertar fechas siempre debes analizar el tipo de documento para saber que fecha insertar, si es constancia laboral siempre debes usar la fecha de hoy ({{ $now.toFormat('dd-MM-yyyy') }}), si no estas seguro para cuando poner la fecha debes preguntarle al usuario.\n\nPASO 5: CREAR CARPETA, MOVER ARCHIVOS, COMPARTIR A RRHH\n- Despues de haber hecho el paso 4, debes usar la herramienta 'Compartir archivos con RRHH' para crear la carpeta como nombre debe contener maximo 4 palabras, los archivos que se copiaron y el nombre a quien se pidio los archivos, por ejemplo: VISADO - John Doe.\n- En dicha herramienta Tambien se movera los archivos a la carpeta creada y se compartira la carpeta a RRHH como confirmacion de edicion de los archivos.\n- Adentro de la herramienta 'Compartir archivos con RRHH' debes poner el valor del campo 'mensajeFinal' como false. Y en el campo file_id debes poner los id de los archivos editados como array, por ejemplo: [\"12i3hoihi456\", \"Xkhus98798Js\"].\n- Debes guardar el id de la carpeta creada en tu memoria para poder usarla en el paso 7.\n\nPASO 6: CONFIRMACION\n- Despues de haber finalizado el paso 5 los permisos owner de los archivos al usuario, debes pedir al usuario la confirmacion si todos los datos estan correctos con los links de los archivos editados adjuntados, si contesta \"Si\" puedes pasar al paso 6, si contesta \"No\" y te envia los datos a corregir, debes editar nuevamente el archivo que te especifique. Al terminar de hacer la correcion, debes preguntar otra vez si todo esta correcto. Si todo esta correcto puedes pasar al paso 6. \n\nPaso 7: CONVERTIR ARCHIVOS A PDF Y COMPARTIR CARPETA A RRHH\n- Despues de haber hecho el paso 6, si contestaron que la edicion estuvo bien, debes usar la herramienta 'Compartir archivos con RRHH' para compartir la carpeta a RRHH y convertir los archivos como PDF.\n- En la herramienta 'Compartir archivos con RRHH' el valor del campo 'mensajeFinal' debes poner true. Y en el campo folder_id debes poner el id de la carpeta creada en el paso 5.\n\nPASO 8: RESPUESTA FINAL\n- Devuelve un mensaje de confirmación al usuario en Google Chat informando que el documento ha sido creado exitosamente e incluye el enlace (URL) directamente hacia la carpeta generado en Google Drive.\n- En la respuesta no incluyas palabras tecnicas como Supabase.\n- Siempre debes preguntar al usuario si quiere subir el/los archivos editados al perfil de BambooHR del empleado. Debes poner un listado de los archivos editados para que el usuario pueda elegir especificamente cual subir. El usuario puede responer \"No\", \"Todos\" o especificar los archivos por el nombre.\n- Para hablar con el usuario debes usar el tool de Contestar.\n\nPASO 9: DESCARGAR ARCHIVO Y SUBIR ARCHIVO A BAMBOOHR\n- Luego de haber dado permisos owner al usuario que envio el mensaje, debes preguntarle al usuario si desea subir el/los archivos copiados al usuario que se hizo la solicitud en BambooHR. Si el usuario dice que \"Si\", debes enviar los datos a la herramienta 'Descargar archivo'. En esta herramienta se descargar el archivo y luego se envia a BambooHR. El nombre del archivo debe ser por ejemplo: NOMBRE_ARCHIVO.pdf (Reemplazar NOMBRE_ARCHIVO por el nombre real). No incluyas 'Copy of' en el nombre. En el campo employee_id debes poner el id del empleado al que se pidio el documento y en el campo file_id debes poner el id del archivo copiado. En el campo folder_name debes poner el nombre de la carpeta creada y en folder_id el id de la carpeta.\n- NO PASAR AL PASO 9 HASTA QUE EL USUARIO CONTESTE \"SI\" o \"NO\". Si el usuario contesta \"Si\", primer ejecutas la herramienta 'Descargar archivo' y luego el PASO 8, si el usuario contesta \"No\", no ejecutes la herramiente 'Descargar archivo' y pasa al PASO 8.\n\n## Archivos del pais {{ $('Limpiar').item.json.pais }}:\n{{ JSON.stringify($json.files) }}", "maxIterations": 70 } }, "type": "@n8n/n8n-nodes-langchain.agent", "typeVersion": 3.1, "position": [ -176, 0 ], "id": "83c431da-951a-4705-8f07-772f2a33f3e2", "name": "AI Agent", "onError": "continueErrorOutput" }, { "parameters": { "modelName": "models/gemini-3.1-pro-preview-customtools", "options": { "temperature": 0.1 } }, "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini", "typeVersion": 1.1, "position": [ -432, 208 ], "id": "42d67367-1511-44bd-b2fd-be7f7ba0fbf0", "name": "Google Gemini Chat Model", "credentials": { "googlePalmApi": { "id": "tFqBJras00HUi1hA", "name": "Eidan - Google Gemini(PaLM) Api account" } } }, { "parameters": { "sessionIdType": "customKey", "sessionKey": "={{ $('Limpiar').item.json.usuario }}" }, "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow", "typeVersion": 1.4, "position": [ -256, 208 ], "id": "018b5024-aed8-4cd7-b46a-6280c55e1e84", "name": "Simple Memory" }, { "parameters": { "descriptionType": "manual", "toolDescription": "Use this tool to copy the file the user specified in the prompt.", "operation": "copy", "fileId": { "__rl": true, "mode": "id", "value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('File', ``, 'string') }}" }, "name": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('File_Name', `El nombre del archivo debe ser el mismo que el original sin incluir 'Copy of'`, 'string') }}", "sameFolder": false, "driveId": { "__rl": true, "mode": "list", "value": "My Drive" }, "folderId": { "__rl": true, "value": "1PQRsZfuNGa_YTJPggbghn6h6dNRNfkEa", "mode": "list", "cachedResultName": "DocAssist - Documentos temporal", "cachedResultUrl": "https://drive.google.com/drive/folders/1PQRsZfuNGa_YTJPggbghn6h6dNRNfkEa" }, "options": {} }, "type": "n8n-nodes-base.googleDriveTool", "typeVersion": 3, "position": [ -400, 736 ], "id": "006c9822-f45e-4bb3-933a-22e27af1fbaa", "name": "Copiar archivo", "credentials": { "googleDriveOAuth2Api": { "id": "gL2ZTwJb6xojauac", "name": "Eidan - Google Drive account" } } }, { "parameters": { "descriptionType": "manual", "toolDescription": "Debes usar este tool para buscar los datos del empleado usando el nombre especificado en el prompt.", "operation": "getAll", "tableId": "empleados_glm", "returnAll": true, "filters": { "conditions": [ { "keyName": "name", "condition": "fullText", "searchFunction": "wfts", "keyValue": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('conditions0_Field_Value', `Aqui debes poner el nombre del empleado especificado en el prompt.`, 'string') }}" } ] } }, "type": "n8n-nodes-base.supabaseTool", "typeVersion": 1, "position": [ -304, 592 ], "id": "f4f75099-dd90-4713-bffc-5bc6ed89d935", "name": "Get many rows in Supabase", "credentials": { "supabaseApi": { "id": "2PlsR6rpK7rQTIEn", "name": "Sofia test - Supabase account" } } }, { "parameters": { "toolDescription": "Usa este tool para mandar mensajes al usuario.", "method": "POST", "url": "=https://chat.googleapis.com/v1/{{ $('Limpiar').item.json.espacio }}/messages", "authentication": "predefinedCredentialType", "nodeCredentialType": "googleApi", "sendBody": true, "specifyBody": "json", "jsonBody": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('JSON', `Para enviar el body con el mensaje debes usar un JSON con esta estructura:\n{\n \"text\": \"mensaje\"\n}`, 'json') }}", "options": {} }, "type": "n8n-nodes-base.httpRequestTool", "typeVersion": 4.4, "position": [ -32, 224 ], "id": "9a3901c7-44fc-45a8-9af9-fcff3e72c538", "name": "Contestar1", "credentials": { "googleApi": { "id": "KzKVIgSNE4alOH2z", "name": "Eidan bot docAssist - Google Service Account account" } } }, { "parameters": { "toolDescription": "Debes usar este tool para extraer el texto del archivo que el usuario quiere editar.", "url": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('URL', `En este campo debes poner esta URL:\nhttps://www.googleapis.com/drive/v3/files/FILE_ID/export\n\nDebes reemplazar FILE_ID por el archivo el id actual que el usuario quiere editar.`, 'string') }}", "authentication": "predefinedCredentialType", "nodeCredentialType": "googleDriveOAuth2Api", "sendQuery": true, "queryParameters": { "parameters": [ { "name": "mimeType", "value": "text/plain" } ] }, "options": { "response": { "response": { "responseFormat": "text" } } } }, "type": "n8n-nodes-base.httpRequestTool", "typeVersion": 4.4, "position": [ -128, 336 ], "id": "0f3e7395-0686-4dbf-a6bd-67442c8fc15d", "name": "Extraer texto1", "credentials": { "googleOAuth2Api": { "id": "0HsSRUm82KPsWdiJ", "name": "Eidan - Google account" }, "googleDriveOAuth2Api": { "id": "gL2ZTwJb6xojauac", "name": "Eidan - Google Drive account" } } }, { "parameters": { "descriptionType": "manual", "toolDescription": "Usa este tool para editar el archivo especificado por el usuario.", "operation": "update", "documentURL": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Doc_ID_or_URL', `Aqui debes poner el id del archivo que el usuario quiere editar.`, 'string') }}", "actionsUi": { "actionFields": [ { "action": "replaceAll", "text": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('actionFields0_Old_Text', `Aqui debes poner las palabras que estan adentro de estos simbolos <<>>`, 'string') }}", "replaceText": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('actionFields0_New_Text', `Aqui debes poner el texto nuevo`, 'string') }}" } ] } }, "type": "n8n-nodes-base.googleDocsTool", "typeVersion": 2, "position": [ 32, 336 ], "id": "3904ec16-a89a-4eec-a1ec-b9d6fabfb2a6", "name": "Update a document in Google Docs", "credentials": { "googleDocsOAuth2Api": { "id": "GYYiwIAhdCjK5OP3", "name": "Eidan - Google Docs account" } } }, { "parameters": { "toolDescription": "Debes usar este tool para buscar el salario y salario variable del empleado.", "url": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('URL', `Aqui debes poner esta URL: https://glm.bamboohr.com/api/v1/employees/EMPLEADO_ID?fields=4626,payRate,4045\n\nDebes reemplazar EMPLEADO_ID por el id de la persona especificada en el mensaje. Para encontrar el id debes usar el tool que conecta a Supabase.`, 'string') }}", "authentication": "genericCredentialType", "genericAuthType": "httpBasicAuth", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "accept", "value": "application/json" } ] }, "options": {} }, "type": "n8n-nodes-base.httpRequestTool", "typeVersion": 4.4, "position": [ -224, 448 ], "id": "9e6b1174-e5b9-4bfe-98b3-5dfe8fda9aa2", "name": "Buscar salario y salario variable del empleado", "credentials": { "httpBasicAuth": { "id": "vXrW3oJWVhNbzB07", "name": "GLM Credential" } } }, { "parameters": { "content": "## Carpeta de employee uploads: id 14" }, "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [ 800, 240 ], "id": "6e247bb3-cc65-458e-aceb-55f1cb031bce", "name": "Sticky Note" }, { "parameters": { "url": "=https://api.bamboohr.com/api/gateway.php/glm/v1/employees/50467/files/view", "authentication": "genericCredentialType", "genericAuthType": "httpBasicAuth", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "accept", "value": "application/json" } ] }, "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.4, "position": [ 528, 400 ], "id": "bac8fbd9-dbba-4cb5-be89-8c430c44cadc", "name": "Categoria", "retryOnFail": true, "waitBetweenTries": 2000, "credentials": { "httpBasicAuth": { "id": "vXrW3oJWVhNbzB07", "name": "GLM Credential" } } }, { "parameters": { "method": "DELETE", "url": "=https://api.bamboohr.com/api/gateway.php/glm/v1/employees/50467/files/106224", "authentication": "genericCredentialType", "genericAuthType": "httpBasicAuth", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "accept", "value": "application/json" } ] }, "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.4, "position": [ 720, 400 ], "id": "26f015da-0f2f-4f1a-aa16-e1dc18fc3fde", "name": "Borrar archivos de prueba", "retryOnFail": true, "waitBetweenTries": 2000, "credentials": { "httpBasicAuth": { "id": "vXrW3oJWVhNbzB07", "name": "GLM Credential" } } }, { "parameters": { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 3 }, "conditions": [ { "id": "d152472d-6ef1-4d5d-8081-cc8b7064af2e", "leftValue": "={{ $('Webhook').item.json.body.chat.messagePayload.space.displayName }}", "rightValue": "", "operator": { "type": "string", "operation": "exists", "singleValue": true } }, { "id": "2b3eb077-a373-4530-b1fb-e33d7c6871a8", "leftValue": "={{ $('Webhook').item.json.body.chat.messagePayload.message.argumentText }}", "rightValue": "", "operator": { "type": "string", "operation": "exists", "singleValue": true } } ], "combinator": "and" }, "options": {} }, "type": "n8n-nodes-base.if", "typeVersion": 2.3, "position": [ -576, -112 ], "id": "cadb4331-6cf5-4a91-a731-3e6c51733ea9", "name": "Mencion al bot?" }, { "parameters": { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 3 }, "conditions": [ { "id": "d152472d-6ef1-4d5d-8081-cc8b7064af2e", "leftValue": "={{ $('Webhook').item.json.body.chat.messagePayload.space.singleUserBotDm }}", "rightValue": "", "operator": { "type": "boolean", "operation": "notExists", "singleValue": true } } ], "combinator": "and" }, "options": {} }, "type": "n8n-nodes-base.if", "typeVersion": 2.3, "position": [ -784, 0 ], "id": "ffe0b334-5691-465b-bc25-84c5595f9378", "name": "Mensaje en un espacio?" }, { "parameters": { "jsCode": "const usuario = $('Webhook').first().json.body.chat.messagePayload.message.sender.name;\n\nconst mensaje = $('Webhook').first().json.body.chat.messagePayload.message.argumentText;\n\nconst space = $('Webhook').first().json.body.chat.messagePayload.space.name;\n\nconst fueMensajeDirecto = $('Webhook').first().json.body.chat.messagePayload.space.singleUserBotDm || false;\n\nconst email = $('Webhook').first().json.body.chat.messagePayload.message.sender.email;\n\nconst pais = $input.first().json.country;\n\nreturn {\n usuario: usuario,\n mensaje: mensaje,\n espacio: space,\n fueMensajeDirecto: fueMensajeDirecto,\n email: email,\n pais: pais\n};" }, "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ -1664, -16 ], "id": "249f2673-49e8-495e-9ecf-9bd52887de13", "name": "Limpiar" }, { "parameters": { "description": "Usa esta herramienta para descargar el archivo enviarlo a BambooHR.", "workflowId": { "__rl": true, "value": "j0PIxCiiNMt0hWmr", "mode": "list", "cachedResultUrl": "/workflow/j0PIxCiiNMt0hWmr", "cachedResultName": "DocAssist descargar y enviar archivo" }, "workflowInputs": { "mappingMode": "defineBelow", "value": { "employee_id": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('employee_id', `Aqui debes poner el id del empleado.`, 'number') }}", "file_id": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('file_id', `Aqui debes poner como lista el/los id del archivo copiado que el usuario quiera subir al perfil de BambooHR del empleado.`, 'json') }}", "file_name": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('file_name', `Aqui debes poner el nombre del archivo con la extension .pdf. Ejemplo: NOMBRE_ARCHIVO.pdf`, 'string') }}" }, "matchingColumns": [], "schema": [ { "id": "employee_id", "displayName": "employee_id", "required": false, "defaultMatch": false, "display": true, "canBeUsedToMatch": true, "type": "number" }, { "id": "file_id", "displayName": "file_id", "required": false, "defaultMatch": false, "display": true, "canBeUsedToMatch": true, "type": "array" }, { "id": "file_name", "displayName": "file_name", "required": false, "defaultMatch": false, "display": true, "canBeUsedToMatch": true, "type": "string" } ], "attemptToConvertTypes": false, "convertFieldsToString": false } }, "type": "@n8n/n8n-nodes-langchain.toolWorkflow", "typeVersion": 2.2, "position": [ 160, 400 ], "id": "1a7b1a66-cdbb-44fe-9215-3739ac583342", "name": "Descargar archivo" }, { "parameters": { "description": "Herramienta OBLIGATORIA para compartir la carpeta de archivos con RRHH. Debes usarla SIEMPRE, inmediatamente despues de editar los archivos, y ANTES de responder a RRHH o dar la solicitud por confirmacion. Nunca omitas esta llamada ni la reemplaces por otra accion. ", "workflowId": { "__rl": true, "value": "NZbFBiVEXuS7kjO0", "mode": "list", "cachedResultUrl": "/workflow/NZbFBiVEXuS7kjO0", "cachedResultName": "DocAssist compartir folder - Optimizado" }, "workflowInputs": { "mappingMode": "defineBelow", "value": { "file_id": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('file_id', `Aqui debes poner el/los id del archivo copiado como array.`, 'json') }}", "file_name": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('file_name', `Aqui debes poner el nombre del archivo con la extension .pdf. Ejemplo: NOMBRE_ARCHIVO.pdf`, 'string') }}", "folder_name": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('folder_name', `Aqui debes poner el nombre de la carpeta creada.`, 'string') }}", "folder_id": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('folder_id', `Aqui debes poner el id de la carpeta creada.`, 'string') }}", "googlechat_space_name": "={{ $('Limpiar').item.json.espacio }}", "fueMensajeDirecto": "={{ $('Limpiar').item.json.fueMensajeDirecto }}", "email": "={{ $('Limpiar').item.json.email }}", "mensajeFinal": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('mensajeFinal', `- Si vas a crear la carpeta y mover los archivos para mandar el mensaje de confirmacion debes poner este valor como false.\n- Si vas a mandar el mensaje final con todo ya confirmado debes poner este valor como true.`, 'boolean') }}" }, "matchingColumns": [], "schema": [ { "id": "file_id", "displayName": "file_id", "required": false, "defaultMatch": false, "display": true, "canBeUsedToMatch": true, "type": "array" }, { "id": "file_name", "displayName": "file_name", "required": false, "defaultMatch": false, "display": true, "canBeUsedToMatch": true, "type": "string" }, { "id": "folder_name", "displayName": "folder_name", "required": false, "defaultMatch": false, "display": true, "canBeUsedToMatch": true, "type": "string" }, { "id": "folder_id", "displayName": "folder_id", "required": false, "defaultMatch": false, "display": true, "canBeUsedToMatch": true, "type": "string" }, { "id": "googlechat_space_name", "displayName": "googlechat_space_name", "required": false, "defaultMatch": false, "display": true, "canBeUsedToMatch": true, "type": "string" }, { "id": "fueMensajeDirecto", "displayName": "fueMensajeDirecto", "required": false, "defaultMatch": false, "display": true, "canBeUsedToMatch": true, "type": "string" }, { "id": "email", "displayName": "email", "required": false, "defaultMatch": false, "display": true, "canBeUsedToMatch": true, "type": "string" }, { "id": "mensajeFinal", "displayName": "mensajeFinal", "required": false, "defaultMatch": false, "display": true, "canBeUsedToMatch": true, "type": "boolean", "removed": false } ], "attemptToConvertTypes": false, "convertFieldsToString": false } }, "type": "@n8n/n8n-nodes-langchain.toolWorkflow", "typeVersion": 2.2, "position": [ -240, 768 ], "id": "842557a5-925d-4f84-a38a-28c9ec31b38e", "name": "Compartir archivos con RRHH" }, { "parameters": { "method": "POST", "url": "=https://chat.googleapis.com/v1/{{ $('Limpiar').item.json.espacio }}/messages", "authentication": "predefinedCredentialType", "nodeCredentialType": "googleApi", "sendBody": true, "specifyBody": "json", "jsonBody": "{\n \"text\": \"Por favor, intente nuevamente en unos minutos. Si la falla persiste, le solicitamos comunicarse con el equipo de IT para asistirlos. Muchas gracias.\"\n}", "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.4, "position": [ 208, 48 ], "id": "e8d3cf08-f25c-485a-8869-3ff8e57e9c2c", "name": "Contestar", "credentials": { "googleApi": { "id": "KzKVIgSNE4alOH2z", "name": "Eidan bot docAssist - Google Service Account account" } } }, { "parameters": { "workflowInputs": { "values": [ { "name": "usuario" }, { "name": "mensaje" }, { "name": "espacio" }, { "name": "fueMensajeDirecto" }, { "name": "email" } ] } }, "type": "n8n-nodes-base.executeWorkflowTrigger", "typeVersion": 1.1, "position": [ -2048, -176 ], "id": "585c169e-ba2f-45a9-be98-afacae3a66f9", "name": "When Executed by Another Workflow" }, { "parameters": { "operation": "get", "tableId": "empleados_glm", "filters": { "conditions": [ { "keyName": "work_email", "keyValue": "={{ $json.body.chat.messagePayload.message.sender.email }}" } ] } }, "type": "n8n-nodes-base.supabase", "typeVersion": 1, "position": [ -1856, -16 ], "id": "50fa6a53-0eda-4ada-9b84-ff2ffd2ba3c7", "name": "Obtener pais", "credentials": { "supabaseApi": { "id": "2PlsR6rpK7rQTIEn", "name": "Sofia test - Supabase account" } } }, { "parameters": { "promptType": "define", "text": "={{ $json.mensaje }}", "options": { "systemMessage": "=Eres un asistente automatizado de Recursos Humanos encargado de generar documentos a partir de plantillas en Google Drive.\n\n## Reglas\n- Tus respuestas hacia el usuario deben ser no tecnicas, deben ser formales y friendly para usuarios no tecnicos.\n- La plataforma para subir archivos al empleado se llama BambooHR.\n- Cada solicitud de generacion de archivos debe crearse en una carpeta nueva, NO guardar los nuevos archivos en una carpeta vieja.\n- Debes usar los archivos del pais del usuario: {{ $json.pais }}\n\nHay archivos que van en conjunto con otros pero varia segun pais.\n## Reglas para archivos en conjunto para Guatemala:\n- Si el usuario pide un visado, el usuario debe especificar si el visado es temporal (Anexo 2) o anual (Anexo 2), y si aplica a Walmart Connect u otro proyecto. Si el usuario no lo especifica, debes pedírselo antes de continuar.\n- Si el visado es TEMPORAL (Anexo 2 temporal): debes editar el Anexo 2 temporal correspondiente (Walmart Connect u otro proyecto), junto con la carta de responsabilidad y la declaración.\n- Si el visado es ANUAL (Anexo W anual): debes editar únicamente el Anexo 2 anual correspondiente (Walmart Connect u otro proyecto). No se incluyen la carta de responsabilidad ni la declaración. Además, al ser anual, NO debes solicitar fechas al usuario para este tipo de documento.\n\nREGLAS AL INSERTAR DATOS:\n- Al insertar valores numericos, si en el campo especifica 'en letra' debes insertarlo asi, ejemplo: 'diecinueve', si especifica 'en numeros', pues lo insertas normal, ejemplo: '19'.\n\nSigue este procedimiento estricto paso a paso:\n\nPASO 1: BÚSQUEDA Y PREPARACIÓN DE PLANTILLA\n- Usa la herramienta `buscar_template_drive` para encontrar la plantilla correspondiente al tipo de documento que pide el usuario.\n- Usa la herramienta `preparar_documento_y_extraer_placeholders` pasándole el ID de la plantilla. Esta herramienta creará la copia de trabajo y te devolverá el `new_file_id` junto con los placeholders a llenar (ej: <>, <>, etc.).\n\nPASO 2: OBTENCIÓN DE DATOS\n- Usa la herramienta `buscar_empleado_supabase` buscando por el nombre o identificador indicado por el usuario para obtener los datos requeridos.\n- Compara los datos obtenidos en Supabase con los placeholders extraídos en el PASO 1.\n- Para buscar el salario y salario variable del empleado, debes usar la herramienta `Buscar salario y salario variable del empleado`, aqui recibiras varios campos (4045, 4626, payRate)\n\nEn 4626 aparece el salario variable pero a veces aparece como null, en este caso debes buscarlo en el comentario en 4045.\nEn 4045 puede haber un comentario o puede ser null, en el comentario tendras que detectar el salario variable.\nEn payRate aparece el salario base.\n\nPASO 3: VALIDACIÓN DE INFORMACIÓN FALTANTE\n- Si faltan datos obligatorios para completar los placeholders que NO se encontraron en Supabase:\n STOP. Responde al usuario de inmediato indicando qué datos específicos faltan para que los proporcione. No continúes al paso 4 hasta tener toda la información.\n\nPASO 4: REEMPLAZO Y FINALIZACIÓN\n- Una vez tengas el 100% de los datos para todos los placeholders, llama a la herramienta `reemplazar_datos_y_finalizar_doc` enviando el `new_file_id` y los pares clave-valor a reemplazar.\n- Al insertar salario/salario variable debes insertarlos sin simbolos y nombre de monedas. Y poner comas.\n- Al insertar fechas siempre debes analizar el tipo de documento para saber que fecha insertar, si es constancia laboral siempre debes usar la fecha de hoy ({{ $now.toFormat('dd-MM-yyyy') }}), si no estas seguro para cuando poner la fecha debes preguntarle al usuario.\n\nPASO 5: DAR PERMISOS OWNER AL USUARIO (Este paso siempre debe realizarse)\n- Despues de haber hecho el paso 4, debes usar la herramienta 'Compartir archivos con RRHH' para hacer que el usuario que envio el mensaje sea owner de la carpeta que contiene los archivos copiados.\n\nPASO 6: CONFIRMACION\n- Despues de haber finalizado la edicion de los archivos, debes pedir al usuario la confirmacion si todos los datos estan correctos con los links de los archivos editados adjuntados, si contesta \"Si\" puedes pasar al paso 6, si contesta \"No\" y te envia los datos a corregir, debes editar nuevamente el archivo que te especifique. Al terminar de hacer la correcion, debes preguntar otra vez si todo esta correcto. Si todo esta correcto puedes pasar al paso 6. \n\nPASO 7: CREAR CARPETA\n- Despues de finalizar la edicion de los archivos. Usando la herramienta 'Crear carpeta' debes crear una carpeta que contenga en maximo 3 palabras los archivos que se copiaron y el nombre a quien se pidio los archivos, por ejemplo: VISADO - John Doe\n- Despues de crear la carpeta, debes mover los archivos copiados en la carpeta creada usando la herramienta 'Mover archivo'.\n\nPASO 8: RESPUESTA FINAL\n- Devuelve un mensaje de confirmación al usuario en Google Chat informando que el documento ha sido creado exitosamente e incluye el enlace (URL) directamente hacia la carpeta generado en Google Drive.\n- En la respuesta no incluyas palabras tecnicas como Supabase.\n- Siempre debes preguntar al usuario si quiere subir el/los archivos editados al perfil de BambooHR del empleado. Debes poner un listado de los archivos editados para que el usuario pueda elegir especificamente cual subir. El usuario puede responer \"No\", \"Todos\" o especificar los archivos por el nombre.\n- Para hablar con el usuario debes usar el tool de Contestar.\n\nPASO 9: DESCARGAR ARCHIVO Y SUBIR ARCHIVO A BAMBOOHR\n- Luego de haber dado permisos owner al usuario que envio el mensaje, debes preguntarle al usuario si desea subir el/los archivos copiados al usuario que se hizo la solicitud en BambooHR. Si el usuario dice que \"Si\", debes enviar los datos a la herramienta 'Descargar archivo'. En esta herramienta se descargar el archivo y luego se envia a BambooHR. El nombre del archivo debe ser por ejemplo: NOMBRE_ARCHIVO.pdf (Reemplazar NOMBRE_ARCHIVO por el nombre real). No incluyas 'Copy of' en el nombre. En el campo employee_id debes poner el id del empleado al que se pidio el documento y en el campo file_id debes poner el id del archivo copiado. En el campo folder_name debes poner el nombre de la carpeta creada y en folder_id el id de la carpeta.\n- NO PASAR AL PASO 9 HASTA QUE EL USUARIO CONTESTE \"SI\" o \"NO\". Si el usuario contesta \"Si\", primer ejecutas la herramienta 'Descargar archivo' y luego el PASO 8, si el usuario contesta \"No\", no ejecutes la herramiente 'Descargar archivo' y pasa al PASO 8.\n\nPASO 10: ELIMINAR ARCHIVOS COPIADOS\n- Despues de haber dado los permisos, debes eliminar todos los archivos que han sido copiados usando la herramienta 'Eliminar archivo copiado'.", "maxIterations": 70 } }, "type": "@n8n/n8n-nodes-langchain.agent", "typeVersion": 3.1, "position": [ -16, -288 ], "id": "dcc482e8-ad87-4840-a003-bcf2c6ea15ea", "name": "AI Agent1", "onError": "continueErrorOutput" }, { "parameters": { "rules": { "values": [ { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 3 }, "conditions": [ { "leftValue": "={{ $json.pais }}", "rightValue": "Guatemala", "operator": { "type": "string", "operation": "equals" }, "id": "2ded6020-e787-48a3-adf8-bb0c2ca96532" } ], "combinator": "and" } }, { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 3 }, "conditions": [ { "id": "55b84a4e-47ad-4fed-bc10-1b82449659be", "leftValue": "={{ $json.pais }}", "rightValue": "El Salvador", "operator": { "type": "string", "operation": "equals", "name": "filter.operator.equals" } } ], "combinator": "and" } }, { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 3 }, "conditions": [ { "id": "781cc29c-6638-472d-a51d-f342d44a3b68", "leftValue": "={{ $json.pais }}", "rightValue": "Republica Dominicana", "operator": { "type": "string", "operation": "equals", "name": "filter.operator.equals" } } ], "combinator": "and" } } ] }, "options": {} }, "type": "n8n-nodes-base.switch", "typeVersion": 3.4, "position": [ -1472, -16 ], "id": "02607710-4a0b-4f0e-a188-075bdba24974", "name": "Switch" }, { "parameters": { "url": "https://www.googleapis.com/drive/v3/files", "authentication": "predefinedCredentialType", "nodeCredentialType": "googleDriveOAuth2Api", "sendQuery": true, "queryParameters": { "parameters": [ { "name": "q", "value": "'1WAlkzQMWlJ226-yUv8yalXtydQHQs0WJ' in parents and trashed = false" } ] }, "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.4, "position": [ -1232, -160 ], "id": "df8c9d9b-89dc-43d2-934d-b716f3022f17", "name": "Archivos Guatemala", "credentials": { "googleDriveOAuth2Api": { "id": "gL2ZTwJb6xojauac", "name": "Eidan - Google Drive account" } } }, { "parameters": { "url": "https://www.googleapis.com/drive/v3/files", "authentication": "predefinedCredentialType", "nodeCredentialType": "googleDriveOAuth2Api", "sendQuery": true, "queryParameters": { "parameters": [ { "name": "q", "value": "'1h2DO6ojQz1bzp5_yWz4mtgEZKexNwwic' in parents and trashed = false" } ] }, "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.4, "position": [ -1232, 0 ], "id": "81b01781-2d82-42e7-a2a5-4efddff5990f", "name": "Archivos El Salvador", "credentials": { "googleDriveOAuth2Api": { "id": "gL2ZTwJb6xojauac", "name": "Eidan - Google Drive account" } } }, { "parameters": { "url": "https://www.googleapis.com/drive/v3/files", "authentication": "predefinedCredentialType", "nodeCredentialType": "googleDriveOAuth2Api", "sendQuery": true, "queryParameters": { "parameters": [ { "name": "q", "value": "'1h_jDj8F0gCDPLDfuYobjC5hWFdcodIK5' in parents and trashed = false" } ] }, "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.4, "position": [ -1232, 160 ], "id": "bd3c9a6a-aa4e-47d6-a09d-20481ebf6e42", "name": "Archivos Republica Dominicana", "credentials": { "googleDriveOAuth2Api": { "id": "gL2ZTwJb6xojauac", "name": "Eidan - Google Drive account" } } }, { "parameters": { "jsCode": "const items = $input.all();\n\nconst files = items.flatMap(item =>\n (item.json.files ?? []).map(file => ({\n id: file.id,\n name: file.name\n }))\n);\n\nreturn [\n {\n json: {\n files\n }\n }\n];" }, "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ -976, 0 ], "id": "44a116b1-c2a8-43db-b089-a74f6a9dbe64", "name": "Limpiar lista archivos" }, { "parameters": { "httpMethod": "POST", "path": "doc-assist", "options": { "responseData": "{}", "responseHeaders": { "entries": [ { "name": "Content-Type", "value": "application/json" } ] } } }, "type": "n8n-nodes-base.webhook", "typeVersion": 2.1, "position": [ -2048, 144 ], "id": "67cb6321-1795-4f90-be0d-568637e14edb", "name": "Webhook1", "webhookId": "a4e58dc3-2006-4af9-9c85-8adbce3cf4b4", "disabled": true }, { "parameters": {}, "type": "n8n-nodes-base.manualTrigger", "typeVersion": 1, "position": [ -2000, 656 ], "id": "45ab19ad-1e86-4134-92d6-73b02b40bc3e", "name": "When clicking ‘Execute workflow’" }, { "parameters": { "method": "POST", "url": "=https://git.digitalcompass.agency/api/v1/repos/{{ $('Valores').item.json.user }}/{{ $('Valores').item.json.repo_name }}/contents/{{ $('Valores').item.json.file_name }}.json", "authentication": "genericCredentialType", "genericAuthType": "httpHeaderAuth", "sendBody": true, "specifyBody": "json", "jsonBody": "={\n \"message\": \"{{ $json.message }}\",\n \"content\": \"{{ $json.content }}\",\n \"branch\": \"{{ $json.branch }}\"\n}", "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.4, "position": [ -1024, 768 ], "id": "13af15b0-94da-413d-b62b-18d5f9be8927", "name": "Subir archivo", "retryOnFail": false, "credentials": { "httpHeaderAuth": { "id": "R4tnNpYoEjhBYeUT", "name": "Eidan - gitea" } } }, { "parameters": { "url": "=https://git.digitalcompass.agency/api/v1/repos/{{ $json.user }}/{{ $json.repo_name }}/contents/{{ $json.file_name }}.json", "authentication": "genericCredentialType", "genericAuthType": "httpHeaderAuth", "sendHeaders": true, "headerParameters": { "parameters": [] }, "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.4, "position": [ -1632, 656 ], "id": "c6ac9918-e6f4-4eda-8388-6d05ec99b471", "name": "Obtener archivo", "credentials": { "httpHeaderAuth": { "id": "R4tnNpYoEjhBYeUT", "name": "Eidan - gitea" } }, "onError": "continueErrorOutput" }, { "parameters": { "method": "PUT", "url": "=https://git.digitalcompass.agency/api/v1/repos/{{ $('Valores').item.json.user }}/{{ $('Valores').item.json.repo_name }}/contents/{{ $('Valores').item.json.file_name }}.json", "authentication": "genericCredentialType", "genericAuthType": "httpHeaderAuth", "sendBody": true, "specifyBody": "json", "jsonBody": "={\n \"message\": \"{{ $json.message }}\",\n \"content\": \"{{ $json.content }}\",\n \"sha\": \"{{ $json.sha }}\",\n \"branch\": \"{{ $json.branch }}\"\n}", "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.4, "position": [ -1024, 560 ], "id": "653c7a9a-8cd3-49d7-8268-cfea26b95d60", "name": "Actualizar archivo", "credentials": { "httpHeaderAuth": { "id": "R4tnNpYoEjhBYeUT", "name": "Eidan - gitea" } } }, { "parameters": { "operation": "get", "workflowId": { "__rl": true, "value": "yYmp0SKgpWeooCYm", "mode": "list", "cachedResultName": "GLM DocAssist - Optimizado (#yYmp0SKgpWeooCYm)" }, "requestOptions": {} }, "type": "n8n-nodes-base.n8n", "typeVersion": 1, "position": [ -1376, 560 ], "id": "a90a70d4-08d1-4847-9ea8-e4776c180ee0", "name": "Get a workflow1", "credentials": { "n8nApi": { "id": "73Ydc9X8h5HXvFrt", "name": "Eidan - n8n account" } } }, { "parameters": { "operation": "get", "workflowId": { "__rl": true, "value": "yYmp0SKgpWeooCYm", "mode": "list", "cachedResultName": "GLM DocAssist - Optimizado (#yYmp0SKgpWeooCYm)" }, "requestOptions": {} }, "type": "n8n-nodes-base.n8n", "typeVersion": 1, "position": [ -1376, 768 ], "id": "e653fddd-6e0a-4864-909f-1f45c16a318b", "name": "Get a workflow2", "credentials": { "n8nApi": { "id": "73Ydc9X8h5HXvFrt", "name": "Eidan - n8n account" } } }, { "parameters": { "assignments": { "assignments": [ { "id": "31558805-f167-47c4-b0b4-46b8a80ca282", "name": "user", "value": "mgomez", "type": "string" }, { "id": "3519ad4c-6d66-4963-ab76-ee5517d88d67", "name": "repo_name", "value": "glm-doc-assist", "type": "string" }, { "id": "0df99f1e-1354-43b9-9d20-9f994cc82cf6", "name": "file_name", "value": "doc-assist-workflow", "type": "string" } ] }, "options": {} }, "type": "n8n-nodes-base.set", "typeVersion": 3.4, "position": [ -1808, 656 ], "id": "817953ea-d46e-498e-9e1a-3affb78aef51", "name": "Valores" }, { "parameters": { "jsCode": "const sha = $('Obtener archivo').first().json.sha;\nconst data = { $json };\n\nreturn [{\n json: {\n message: \"Update \" + $('Valores').first().json.file_name + \".json\",\n content: Buffer.from(JSON.stringify(data, null, 2)).toString(\"base64\"),\n sha: sha,\n branch: \"main\"\n }\n}];" }, "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ -1200, 560 ], "id": "dd638aac-5b28-48c4-9038-b734cc7215e2", "name": "Code in JavaScript2" }, { "parameters": { "jsCode": "const sha = $json.sha; // viene del GET anterior\nconst data = { $json };\n\nconst base64 = Buffer.from(JSON.stringify(data, null, 2)).toString(\"base64\");\n\nreturn [{\n json: {\n message: \"Create \" + $('Valores').first().json.file_name + \".json\",\n content: base64,\n sha: sha,\n branch: \"main\"\n }\n}];" }, "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ -1200, 768 ], "id": "033b9f56-3402-4846-b42b-b59a22c8400a", "name": "Code in JavaScript4" } ], "connections": { "Webhook": { "main": [ [ { "node": "Obtener pais", "type": "main", "index": 0 } ] ] }, "Google Gemini Chat Model": { "ai_languageModel": [ [ { "node": "AI Agent", "type": "ai_languageModel", "index": 0 } ] ] }, "AI Agent": { "main": [ [], [ { "node": "Contestar", "type": "main", "index": 0 } ] ] }, "Simple Memory": { "ai_memory": [ [ { "node": "AI Agent", "type": "ai_memory", "index": 0 } ] ] }, "Copiar archivo": { "ai_tool": [ [ { "node": "AI Agent", "type": "ai_tool", "index": 0 } ] ] }, "Get many rows in Supabase": { "ai_tool": [ [ { "node": "AI Agent", "type": "ai_tool", "index": 0 } ] ] }, "Contestar1": { "ai_tool": [ [ { "node": "AI Agent", "type": "ai_tool", "index": 0 } ] ] }, "Extraer texto1": { "ai_tool": [ [ { "node": "AI Agent", "type": "ai_tool", "index": 0 } ] ] }, "Update a document in Google Docs": { "ai_tool": [ [ { "node": "AI Agent", "type": "ai_tool", "index": 0 } ] ] }, "Buscar salario y salario variable del empleado": { "ai_tool": [ [ { "node": "AI Agent", "type": "ai_tool", "index": 0 } ] ] }, "Categoria": { "main": [ [ { "node": "Borrar archivos de prueba", "type": "main", "index": 0 } ] ] }, "Mencion al bot?": { "main": [ [ { "node": "AI Agent", "type": "main", "index": 0 } ] ] }, "Mensaje en un espacio?": { "main": [ [ { "node": "Mencion al bot?", "type": "main", "index": 0 } ], [ { "node": "AI Agent", "type": "main", "index": 0 } ] ] }, "Limpiar": { "main": [ [ { "node": "Switch", "type": "main", "index": 0 } ] ] }, "Descargar archivo": { "ai_tool": [ [ { "node": "AI Agent", "type": "ai_tool", "index": 0 } ] ] }, "Compartir archivos con RRHH": { "ai_tool": [ [ { "node": "AI Agent", "type": "ai_tool", "index": 0 } ] ] }, "When Executed by Another Workflow": { "main": [ [ { "node": "Limpiar", "type": "main", "index": 0 } ] ] }, "Obtener pais": { "main": [ [ { "node": "Limpiar", "type": "main", "index": 0 } ] ] }, "Switch": { "main": [ [ { "node": "Archivos Guatemala", "type": "main", "index": 0 } ], [ { "node": "Archivos El Salvador", "type": "main", "index": 0 } ], [ { "node": "Archivos Republica Dominicana", "type": "main", "index": 0 } ] ] }, "Archivos Guatemala": { "main": [ [ { "node": "Limpiar lista archivos", "type": "main", "index": 0 } ] ] }, "Archivos El Salvador": { "main": [ [ { "node": "Limpiar lista archivos", "type": "main", "index": 0 } ] ] }, "Archivos Republica Dominicana": { "main": [ [ { "node": "Limpiar lista archivos", "type": "main", "index": 0 } ] ] }, "Limpiar lista archivos": { "main": [ [ { "node": "Mensaje en un espacio?", "type": "main", "index": 0 } ] ] }, "Webhook1": { "main": [ [] ] }, "When clicking ‘Execute workflow’": { "main": [ [ { "node": "Valores", "type": "main", "index": 0 } ] ] }, "Obtener archivo": { "main": [ [ { "node": "Get a workflow1", "type": "main", "index": 0 } ], [ { "node": "Get a workflow2", "type": "main", "index": 0 } ] ] }, "Get a workflow1": { "main": [ [ { "node": "Code in JavaScript2", "type": "main", "index": 0 } ] ] }, "Get a workflow2": { "main": [ [ { "node": "Code in JavaScript4", "type": "main", "index": 0 } ] ] }, "Valores": { "main": [ [ { "node": "Obtener archivo", "type": "main", "index": 0 } ] ] }, "Code in JavaScript2": { "main": [ [ { "node": "Actualizar archivo", "type": "main", "index": 0 } ] ] }, "Code in JavaScript4": { "main": [ [ { "node": "Subir archivo", "type": "main", "index": 0 } ] ] } }, "authors": "Eidan Then", "name": "Version e86bccda", "description": "", "autosaved": true, "workflowPublishHistory": [ { "createdAt": "2026-09-11T19:32:44.956Z", "id": 5827, "workflowId": "yYmp0SKgpWeooCYm", "versionId": "e86bccda-7355-4785-873e-8f826af636ef", "event": "activated", "userId": "de14e7e5-491b-4983-abb2-f88af42e92fd" } ] } } }