diff --git a/glmway-workflow.json b/glmway-workflow.json index 6711d03..ae967d1 100644 --- a/glmway-workflow.json +++ b/glmway-workflow.json @@ -1,6 +1,6 @@ { "$json": { - "updatedAt": "2026-07-27T18:59:44.632Z", + "updatedAt": "2026-07-27T21:54:31.864Z", "createdAt": "2026-06-08T13:50:12.174Z", "id": "F1iPg8hktNAebZua", "name": "GLMWay", @@ -228,109 +228,6 @@ "id": "30ffb25f-3ad7-465d-9630-887828df95f6", "name": "Code in JavaScript4" }, - { - "parameters": { - "url": "=https://glm.bamboohr.com/api/v1/employees/{{ $json.supervisorEId }}?fields=displayName,workEmail,status,supervisorEmail,location,jobTitle,department,", - "authentication": "genericCredentialType", - "genericAuthType": "httpBasicAuth", - "sendHeaders": true, - "headerParameters": { - "parameters": [ - { - "name": "accept", - "value": "application/json" - } - ] - }, - "options": {} - }, - "type": "n8n-nodes-base.httpRequest", - "typeVersion": 4.4, - "position": [ - 2608, - -960 - ], - "id": "a34b5746-bdbc-4016-bffc-f953b5c0e7be", - "name": "Informacion del supervisor", - "retryOnFail": true, - "waitBetweenTries": 2000, - "credentials": { - "httpBasicAuth": { - "id": "vXrW3oJWVhNbzB07", - "name": "GLM Credential" - } - } - }, - { - "parameters": { - "method": "POST", - "url": "=https://api.bamboohr.com/api/gateway.php/glm/v1/reports/custom", - "authentication": "genericCredentialType", - "genericAuthType": "httpBasicAuth", - "sendHeaders": true, - "headerParameters": { - "parameters": [ - { - "name": "accept", - "value": "application/json" - } - ] - }, - "sendBody": true, - "specifyBody": "json", - "jsonBody": "{\n \"title\": \"Employees\",\n \"fields\": [\n \"id\",\n \"firstName\",\n \"lastName\",\n \"hireDate\",\n \"department\",\n \"jobTitle\"\n ]\n}", - "options": {} - }, - "type": "n8n-nodes-base.httpRequest", - "typeVersion": 4.4, - "position": [ - 1280, - -1408 - ], - "id": "a52ef26c-a5d6-4bb5-9a99-61fa25206105", - "name": "Informacion del supervisor1", - "retryOnFail": true, - "waitBetweenTries": 2000, - "credentials": { - "httpBasicAuth": { - "id": "vXrW3oJWVhNbzB07", - "name": "GLM Credential" - } - } - }, - { - "parameters": { - "url": "=https://glm.bamboohr.com/api/v1/employees/50743?fields=displayName,mobilePhone,workPhone,workEmail,status,employeeNumber,supervisor,supervisorEmail,location,jobTitle,department,hireDate,supervisorEId", - "authentication": "genericCredentialType", - "genericAuthType": "httpBasicAuth", - "sendHeaders": true, - "headerParameters": { - "parameters": [ - { - "name": "accept", - "value": "application/json" - } - ] - }, - "options": {} - }, - "type": "n8n-nodes-base.httpRequest", - "typeVersion": 4.4, - "position": [ - 1632, - -1344 - ], - "id": "0088cd80-6150-4577-89a9-b28b06fea6b4", - "name": "Informacion del empleado1", - "retryOnFail": true, - "waitBetweenTries": 2000, - "credentials": { - "httpBasicAuth": { - "id": "vXrW3oJWVhNbzB07", - "name": "GLM Credential" - } - } - }, { "parameters": { "operation": "get", @@ -352,137 +249,6 @@ } } }, - { - "parameters": { - "operation": "getAll", - "calendar": { - "__rl": true, - "value": "ethen@gomezleemarketing.com", - "mode": "list", - "cachedResultName": "ethen@gomezleemarketing.com" - }, - "returnAll": true, - "timeMax": "={{ $now.plus({ week: 3 }) }}", - "options": { - "query": "Entrenamiento" - } - }, - "type": "n8n-nodes-base.googleCalendar", - "typeVersion": 1.3, - "position": [ - 2656, - -784 - ], - "id": "901ca3ad-1e76-41fe-a1ff-a55b0f5c1ea2", - "name": "Get many events1", - "credentials": { - "googleCalendarOAuth2Api": { - "id": "yEmGG4av5RxOK7wu", - "name": "Eidan - Google Calendar account" - } - } - }, - { - "parameters": { - "operation": "getAll", - "calendar": { - "__rl": true, - "value": "ethen@gomezleemarketing.com", - "mode": "list", - "cachedResultName": "ethen@gomezleemarketing.com" - }, - "returnAll": true, - "timeMax": "={{ $now.plus({ week: 2 }) }}", - "options": { - "query": "Entrenamiento #TheGLMWay" - } - }, - "type": "n8n-nodes-base.googleCalendar", - "typeVersion": 1.3, - "position": [ - 1872, - -688 - ], - "id": "2cd687f2-a8b5-4c46-854a-4f60b4d7107f", - "name": "Entrenamiento español", - "credentials": { - "googleCalendarOAuth2Api": { - "id": "yEmGG4av5RxOK7wu", - "name": "Eidan - Google Calendar account" - } - } - }, - { - "parameters": { - "operation": "getAll", - "calendar": { - "__rl": true, - "value": "ethen@gomezleemarketing.com", - "mode": "list", - "cachedResultName": "ethen@gomezleemarketing.com" - }, - "returnAll": true, - "timeMax": "={{ $now.plus({ week: 2 }) }}", - "options": { - "query": "#TheGLMWay Training" - } - }, - "type": "n8n-nodes-base.googleCalendar", - "typeVersion": 1.3, - "position": [ - 1872, - -864 - ], - "id": "01099730-b224-4b81-98cc-b924e2b02367", - "name": "Entrenamiento ingles", - "credentials": { - "googleCalendarOAuth2Api": { - "id": "yEmGG4av5RxOK7wu", - "name": "Eidan - Google Calendar account" - } - } - }, - { - "parameters": { - "documentId": { - "__rl": true, - "value": "1zQabzR4ZpQVqYvJ0Cv5QTQ2TZRl9TahBJGfyZB4CRmI", - "mode": "list", - "cachedResultName": "GLM_GLMWay_Calendario de Entrenamientos", - "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1zQabzR4ZpQVqYvJ0Cv5QTQ2TZRl9TahBJGfyZB4CRmI/edit?usp=drivesdk" - }, - "sheetName": { - "__rl": true, - "value": "gid=0", - "mode": "list", - "cachedResultName": "Hoja 1", - "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1DzUjeikfp8eSdFqEW0LEZZBkn13jI8Uhy15DjGZ2tK4/edit#gid=0" - }, - "filtersUI": { - "values": [ - { - "lookupColumn": "col_1", - "lookupValue": "2 July" - } - ] - }, - "options": {} - }, - "type": "n8n-nodes-base.googleSheets", - "typeVersion": 4.7, - "position": [ - 2368, - -1184 - ], - "id": "ed7dc4ef-e1fe-4305-ba7e-a98b617ee095", - "name": "Get row(s) in sheet2", - "credentials": { - "googleSheetsOAuth2Api": { - "id": "8Pp0ek3NPsEkyXfY", - "name": "Eidan - Google Sheets account" - } - } - }, { "parameters": { "rule": { @@ -506,37 +272,6 @@ "id": "7f7d71b2-6c53-49a2-92d8-e66b2d0bff54", "name": "Schedule Trigger" }, - { - "parameters": { - "operation": "getAll", - "calendar": { - "__rl": true, - "value": "ethen@gomezleemarketing.com", - "mode": "list", - "cachedResultName": "ethen@gomezleemarketing.com" - }, - "returnAll": true, - "timeMax": "={{ $now.plus({ week: 4 }) }}", - "options": { - "fields": "", - "query": "Training" - } - }, - "type": "n8n-nodes-base.googleCalendar", - "typeVersion": 1.3, - "position": [ - 2464, - -832 - ], - "id": "77e81486-bffe-457d-8bc0-442c25ff4512", - "name": "Entrenamiento ingles1", - "credentials": { - "googleCalendarOAuth2Api": { - "id": "yEmGG4av5RxOK7wu", - "name": "Eidan - Google Calendar account" - } - } - }, { "parameters": { "url": "=https://glm.bamboohr.com/api/v1/employees/{{ $json.id }}?fields=supervisorEmail,hireDate,supervisorEId,jobTitle", @@ -603,40 +338,6 @@ "id": "8a2be7cc-85ad-4e44-92a7-fe3f94df703f", "name": "Hay coordinador?" }, - { - "parameters": { - "conditions": { - "options": { - "caseSensitive": true, - "leftValue": "", - "typeValidation": "strict", - "version": 3 - }, - "conditions": [ - { - "id": "d7d68505-8c34-44cd-b771-56bef28ada41", - "leftValue": "={{ $('Get an employee').item.json.workEmail }}", - "rightValue": "", - "operator": { - "type": "string", - "operation": "notEmpty", - "singleValue": true - } - } - ], - "combinator": "and" - }, - "options": {} - }, - "type": "n8n-nodes-base.if", - "typeVersion": 2.3, - "position": [ - 2432, - -1344 - ], - "id": "deb40073-dc0e-41e4-ad7c-6df18de25b4f", - "name": "Empleado le falta info?" - }, { "parameters": { "content": "## Formato fecha\nyyyy-mm-dd\n", @@ -789,8 +490,8 @@ }, "type": "n8n-nodes-base.stickyNote", "position": [ - 640, - -816 + 784, + -640 ], "typeVersion": 1, "id": "719365c8-8099-4108-a910-83b651d81181", @@ -814,7 +515,7 @@ "parameters": [ { "name": "number", - "value": "={{ \"18097159076@s.whatsapp.net\" }}" + "value": "={{ \"18494105855@s.whatsapp.net\" }}" }, { "name": "mediatype", @@ -996,7 +697,7 @@ "parameters": { "content": "## Envio de formulario de evaluacion despues que la sesion finalize", "height": 304, - "width": 2720, + "width": 2976, "color": 6 }, "type": "n8n-nodes-base.stickyNote", @@ -1024,36 +725,6 @@ "id": "cd2fe5c5-9963-410b-a61a-edc36b5aaed1", "name": "Sticky Note5" }, - { - "parameters": { - "operation": "getAll", - "calendar": { - "__rl": true, - "value": "ethen@gomezleemarketing.com", - "mode": "list", - "cachedResultName": "ethen@gomezleemarketing.com" - }, - "returnAll": true, - "timeMax": "={{ $now.plus({ week: 2 }) }}", - "options": { - "query": "#TheGLMWay Training" - } - }, - "type": "n8n-nodes-base.googleCalendar", - "typeVersion": 1.3, - "position": [ - 1200, - -896 - ], - "id": "e0cc1e60-9379-45fb-b7f4-6def9c3e9601", - "name": "Entrenamiento ingles3", - "credentials": { - "googleCalendarOAuth2Api": { - "id": "yEmGG4av5RxOK7wu", - "name": "Eidan - Google Calendar account" - } - } - }, { "parameters": { "content": "## Completar datos y enviar invitacion", @@ -1151,66 +822,6 @@ "id": "ce9f31d4-454e-4e31-9a22-8173b3fae392", "name": "Pais?1" }, - { - "parameters": { - "operation": "getAll", - "calendar": { - "__rl": true, - "value": "ethen@gomezleemarketing.com", - "mode": "list", - "cachedResultName": "ethen@gomezleemarketing.com" - }, - "returnAll": true, - "timeMax": "={{ $now.plus({ week: 2 }) }}", - "options": { - "query": "Entrenamiento #TheGLMWay" - } - }, - "type": "n8n-nodes-base.googleCalendar", - "typeVersion": 1.3, - "position": [ - 2240, - -672 - ], - "id": "00c87312-256a-4738-856d-e92b9e144c75", - "name": "Entrenamiento español1", - "credentials": { - "googleCalendarOAuth2Api": { - "id": "yEmGG4av5RxOK7wu", - "name": "Eidan - Google Calendar account" - } - } - }, - { - "parameters": { - "operation": "getAll", - "calendar": { - "__rl": true, - "value": "ethen@gomezleemarketing.com", - "mode": "list", - "cachedResultName": "ethen@gomezleemarketing.com" - }, - "returnAll": true, - "timeMax": "={{ $now.plus({ week: 2 }) }}", - "options": { - "query": "#TheGLMWay Training" - } - }, - "type": "n8n-nodes-base.googleCalendar", - "typeVersion": 1.3, - "position": [ - 2240, - -848 - ], - "id": "b3c26eeb-2ff9-42c9-b5cc-fe0776e53c46", - "name": "Entrenamiento ingles4", - "credentials": { - "googleCalendarOAuth2Api": { - "id": "yEmGG4av5RxOK7wu", - "name": "Eidan - Google Calendar account" - } - } - }, { "parameters": { "conditions": { @@ -1262,7 +873,7 @@ "parameters": [ { "name": "number", - "value": "={{ \"18097159076@s.whatsapp.net\" }}" + "value": "={{ \"18494105855@s.whatsapp.net\" }}" }, { "name": "mediatype", @@ -1375,55 +986,6 @@ "id": "b183c892-8822-4bc3-a92c-4410eac41a01", "name": "Pais?" }, - { - "parameters": { - "operation": "update", - "calendar": { - "__rl": true, - "value": "ethen@gomezleemarketing.com", - "mode": "list", - "cachedResultName": "ethen@gomezleemarketing.com" - }, - "eventId": "3ul4moq4isoavr9jhqpcbs7juu_20260617T230000Z", - "updateFields": { - "attendeesUi": { - "values": { - "attendees": [ - "" - ] - } - } - } - }, - "type": "n8n-nodes-base.googleCalendar", - "typeVersion": 1.3, - "position": [ - 1520, - -928 - ], - "id": "711b3353-6f75-4c6d-bef7-e704290787e8", - "name": "Invitar con calendarios entrenamiento ingles", - "credentials": { - "googleCalendarOAuth2Api": { - "id": "yEmGG4av5RxOK7wu", - "name": "Eidan - Google Calendar account" - } - } - }, - { - "parameters": { - "content": "## Invitar al nuevo ingreso a travez del calendario usando el id del evento, asi le aparece el evento", - "height": 384 - }, - "type": "n8n-nodes-base.stickyNote", - "position": [ - 1440, - -1168 - ], - "typeVersion": 1, - "id": "304297ee-18fc-4cbd-8a01-b627ae08b991", - "name": "Sticky Note7" - }, { "parameters": { "amount": 2 @@ -1558,48 +1120,6 @@ } } }, - { - "parameters": { - "documentId": { - "__rl": true, - "value": "1Xs-MkeXiZvWeJuwm-IblcI-ilr7lyhMtED0R7wczmRg", - "mode": "list", - "cachedResultName": "Calendario #TheGLMWay", - "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Xs-MkeXiZvWeJuwm-IblcI-ilr7lyhMtED0R7wczmRg/edit?usp=drivesdk" - }, - "sheetName": { - "__rl": true, - "value": 169172567, - "mode": "list", - "cachedResultName": "Coordinadores RRHH", - "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Xs-MkeXiZvWeJuwm-IblcI-ilr7lyhMtED0R7wczmRg/edit#gid=169172567" - }, - "filtersUI": { - "values": [ - { - "lookupColumn": "Pais", - "lookupValue": "={{ $('Get an employee').item.json.location }}" - } - ] - }, - "options": {} - }, - "type": "n8n-nodes-base.googleSheets", - "typeVersion": 4.7, - "position": [ - 1024, - -688 - ], - "id": "d565bfde-93eb-4b39-afc8-4b294c7e9df7", - "name": "Obtener coordinador", - "alwaysOutputData": true, - "credentials": { - "googleSheetsOAuth2Api": { - "id": "8Pp0ek3NPsEkyXfY", - "name": "Eidan - Google Sheets account" - } - } - }, { "parameters": { "options": {} @@ -1661,36 +1181,6 @@ "id": "4d94c907-8ab1-4213-be20-9e24173cf0a3", "name": "Pais?2" }, - { - "parameters": { - "operation": "getAll", - "calendar": { - "__rl": true, - "value": "ethen@gomezleemarketing.com", - "mode": "list", - "cachedResultName": "ethen@gomezleemarketing.com" - }, - "returnAll": true, - "timeMax": "={{ $now.plus({ week: 2 }) }}", - "options": { - "query": "Entrenamiento #TheGLMWay" - } - }, - "type": "n8n-nodes-base.googleCalendar", - "typeVersion": 1.3, - "position": [ - 1008, - -816 - ], - "id": "516244e1-3e39-4905-9160-86af296a0479", - "name": "Entrenamiento español3", - "credentials": { - "googleCalendarOAuth2Api": { - "id": "yEmGG4av5RxOK7wu", - "name": "Eidan - Google Calendar account" - } - } - }, { "parameters": { "assignments": { @@ -2220,24 +1710,11 @@ "typeVersion": 1.3, "position": [ -352, - 1552 + 1504 ], "id": "6951af7d-5098-4156-81bd-8f67034fcf70", "name": "Schedule Trigger3" }, - { - "parameters": { - "options": {} - }, - "type": "n8n-nodes-base.splitInBatches", - "typeVersion": 3, - "position": [ - 704, - 1376 - ], - "id": "7545364a-df0a-4420-a1af-5bcd4f8c9602", - "name": "Loop Over Items2" - }, { "parameters": { "conditions": { @@ -2329,45 +1806,11 @@ "typeVersion": 2.2, "position": [ 1520, - 1536 + 1488 ], "id": "13ee807a-f1cd-48ef-921b-7b5c260ba116", "name": "Pais?3" }, - { - "parameters": { - "conditions": { - "options": { - "caseSensitive": true, - "leftValue": "", - "typeValidation": "strict", - "version": 2 - }, - "conditions": [ - { - "id": "9674fd7e-dd62-42d4-8931-6c67e59e3dd7", - "leftValue": "={{ $json.isValid }}", - "rightValue": "Jamaica", - "operator": { - "type": "boolean", - "operation": "true", - "singleValue": true - } - } - ], - "combinator": "or" - }, - "options": {} - }, - "type": "n8n-nodes-base.if", - "typeVersion": 2.2, - "position": [ - 432, - 1344 - ], - "id": "0fea4950-f873-4375-8964-45cfc3fead02", - "name": "Falta 48h para el evento?1" - }, { "parameters": { "jsCode": "// Helper para parsear \"14 December\" → Date (año actual)\nfunction parseSessionDate(dateStr) {\n if (!dateStr) return null;\n const [day, month] = dateStr.split(' ');\n const year = new Date().getFullYear();\n return new Date(`${month} ${day}, ${year}`);\n}\n\n// Formatear fecha como \"26 June\"\nfunction formatDate(date) {\n const day = date.getDate();\n const month = date.toLocaleString('en-US', { month: 'long' });\n return `${day} ${month}`;\n}\n\nconst fecha_sesion = $input.first().json.fecha_sesion_inscrito;\n\n// Fecha de hoy normalizada a medianoche\nconst hoy = new Date();\nhoy.setHours(0, 0, 0, 0);\n\nconst sesion = parseSessionDate(fecha_sesion);\nsesion.setHours(0, 0, 0, 0);\n\n// Diferencia en días\nconst diferenciaDias = Math.floor(\n (sesion - hoy) / (1000 * 60 * 60 * 24)\n);\n\n// True si es hoy (0 días) o mañana (1 día)\nconst isValid = diferenciaDias >= 0 && diferenciaDias <= 1;\n\nreturn [\n {\n json: {\n fecha_sesion,\n fecha_hoy: formatDate(hoy),\n diferenciaDias,\n isValid\n }\n }\n];" @@ -2381,91 +1824,6 @@ "id": "bbd0558c-3b3a-462b-957c-83b1975e5413", "name": "Calcular falta 24h o es el mismo dia" }, - { - "parameters": { - "documentId": { - "__rl": true, - "value": "1DzUjeikfp8eSdFqEW0LEZZBkn13jI8Uhy15DjGZ2tK4", - "mode": "list", - "cachedResultName": "Empleados GLM Prueba", - "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1DzUjeikfp8eSdFqEW0LEZZBkn13jI8Uhy15DjGZ2tK4/edit?usp=drivesdk" - }, - "sheetName": { - "__rl": true, - "value": "gid=0", - "mode": "list", - "cachedResultName": "Hoja 1", - "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1DzUjeikfp8eSdFqEW0LEZZBkn13jI8Uhy15DjGZ2tK4/edit#gid=0" - }, - "filtersUI": { - "values": [ - { - "lookupColumn": "cargo", - "lookupValue": "Coordinador RRHH" - } - ] - }, - "options": {} - }, - "type": "n8n-nodes-base.googleSheets", - "typeVersion": 4.7, - "position": [ - 3856, - 432 - ], - "id": "ddfe7158-8cc6-440c-9e59-de97b7124eb8", - "name": "Obtener coordinador2", - "alwaysOutputData": true, - "credentials": { - "googleSheetsOAuth2Api": { - "id": "8Pp0ek3NPsEkyXfY", - "name": "Eidan - Google Sheets account" - } - } - }, - { - "parameters": { - "operation": "getAll", - "calendar": { - "__rl": true, - "value": "ethen@gomezleemarketing.com", - "mode": "list", - "cachedResultName": "ethen@gomezleemarketing.com" - }, - "returnAll": true, - "timeMax": "={{ $now.plus({ week: 2 }) }}", - "options": { - "query": "Entrenamiento #TheGLMWay" - } - }, - "type": "n8n-nodes-base.googleCalendar", - "typeVersion": 1.3, - "position": [ - 2464, - -656 - ], - "id": "98ab4271-94af-4a22-9882-b80f84be7c24", - "name": "Entrenamiento español4", - "credentials": { - "googleCalendarOAuth2Api": { - "id": "yEmGG4av5RxOK7wu", - "name": "Eidan - Google Calendar account" - } - } - }, - { - "parameters": { - "jsCode": "const monthNames = ['January','February','March','April','May','June','July',\n 'August','September','October','November','December'];\n\nreturn items.map(item => {\n const event = item.json;\n const startStr = event.start.dateTime || event.start.date;\n const datePart = startStr.split('T')[0]; // \"2026-06-21\"\n const [year, month, day] = datePart.split('-').map(Number);\n const formattedDate = `${day} ${monthNames[month - 1]}`;\n\n const summary = event.summary || '';\n const organizerName = event.organizer?.displayName \n || (event.organizer?.email ? event.organizer.email.split('@')[0] : '');\n\n let espanol = '';\n let english = '';\n\n if (summary.toLowerCase().includes('entrenamiento')) {\n espanol = organizerName;\n } else if (summary.toLowerCase().includes('training')) {\n english = organizerName;\n }\n\n return {\n json: {\n Fecha: formattedDate,\n Espanol: espanol,\n English: english\n }\n };\n});" - }, - "type": "n8n-nodes-base.code", - "typeVersion": 2, - "position": [ - 4064, - 432 - ], - "id": "41289b04-a9f4-4abc-8816-5afccd0e7996", - "name": "Code in JavaScript1" - }, { "parameters": { "rule": { @@ -2607,27 +1965,6 @@ "id": "ddcb9db1-2590-4364-aeeb-db79c35ea604", "name": "Sticky Note10" }, - { - "parameters": { - "operation": "get", - "employeeId": "=50821", - "options": {} - }, - "type": "n8n-nodes-base.bambooHr", - "typeVersion": 1, - "position": [ - 432, - -864 - ], - "id": "4ac439e5-1b93-4355-a450-b019b63e9437", - "name": "Get an employee2", - "credentials": { - "bambooHrApi": { - "id": "VwYITXROyinOC4je", - "name": "Eidan - BambooHR account" - } - } - }, { "parameters": { "sendTo": "=eidan.then14@gmail.com", @@ -2640,7 +1977,7 @@ "type": "n8n-nodes-base.gmail", "typeVersion": 2.2, "position": [ - 1968, + 2032, 2848 ], "id": "3c22bc65-799f-4432-86fe-10ae92e036de", @@ -2665,7 +2002,7 @@ "type": "n8n-nodes-base.gmail", "typeVersion": 2.2, "position": [ - 1968, + 2032, 2672 ], "id": "4dfc0135-6886-4d33-9b2a-a26efbe72832", @@ -2703,7 +2040,7 @@ "type": "n8n-nodes-base.supabase", "typeVersion": 1, "position": [ - 2192, + 2256, 2768 ], "id": "b7c02e2f-1382-4086-9059-cf75fee9d278", @@ -3076,32 +2413,6 @@ "id": "8f80d9ca-1e4b-4753-b482-df7b0fd24f61", "name": "Formatear fecha y detectar idioma" }, - { - "parameters": { - "jsCode": "const start = $input.first().json.start?.dateTime || $input.first().json.start?.date;\nconst end = $input.first().json.end?.dateTime || $input.first().json.end?.date;\n\nfunction formatHora(dateTimeStr) {\n if (!dateTimeStr) return null;\n return dateTimeStr.split('T')[1].substring(0, 5);\n}\n\nreturn [{\n json: {\n hora_inicio: formatHora(start),\n hora_fin: formatHora(end)\n }\n}];" - }, - "type": "n8n-nodes-base.code", - "typeVersion": 2, - "position": [ - 3856, - 288 - ], - "id": "abdbae74-c0ab-4f9a-b9d8-73cef07748a2", - "name": "Calcular fecha hireDate2" - }, - { - "parameters": { - "jsCode": "const months = [\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"];\n\nfunction formatearFecha(dateTimeStr) {\n if (!dateTimeStr) return null;\n const datePart = dateTimeStr.split('T')[0];\n const [year, month, day] = datePart.split('-');\n return `${parseInt(day, 10)} ${months[parseInt(month, 10) - 1]}`;\n}\n\nfunction detectarIdioma(summary) {\n if (!summary) return null;\n if (summary.includes(\"#TheGLMWay Training\")) return \"EN\";\n if (summary.includes(\"Entrenamiento #TheGLMWay\")) return \"ES\";\n return null;\n}\n\nfunction formatearHora(dateTimeStr) {\n if (!dateTimeStr) return null;\n const timePart = dateTimeStr.split('T')[1];\n if (!timePart) return null;\n return timePart.substring(0, 5);\n}\n\nconst output = [];\n\nfor (const item of $input.all()) {\n const event = item.json;\n\n const startRaw = event.start?.dateTime || event.start?.date;\n const endRaw = event.end?.dateTime || event.end?.date;\n const url = event.conferenceData?.entryPoints?.[0]?.uri || null;\n const idioma = detectarIdioma(event.summary);\n\n // Ignorar eventos vacíos o sin datos esenciales\n if (!event.summary || !startRaw) {\n console.log(\"Evento ignorado (vacío):\", JSON.stringify(event));\n continue;\n }\n\n output.push({\n json: {\n id: event.id,\n titulo: event.summary,\n idioma: idioma,\n fecha: formatearFecha(startRaw),\n hora_inicio: formatearHora(startRaw),\n hora_fin: formatearHora(endRaw),\n url: url,\n descripcion: event.description || null\n }\n });\n}\n\nconsole.log(`Sesiones procesadas: ${output.length}`);\nreturn output;\n\n// Agrega esto antes del return output\nconst resumen = output.map(i => ({\n meet_id: i.json.meet_id,\n titulo: i.json.titulo,\n fecha_sesion: i.json.fecha_sesion,\n hora_inicio: i.json.hora_inicio,\n hora_fin: i.json.hora_fin,\n enlace_reunion: i.json.enlace_reunion,\n idioma: i.json.idioma\n}));\nconsole.log(JSON.stringify(resumen));" - }, - "type": "n8n-nodes-base.code", - "typeVersion": 2, - "position": [ - 4144, - 192 - ], - "id": "cded5025-8e1b-4609-b7c6-5acb81244bdf", - "name": "Formatear fecha y detectar idioma1" - }, { "parameters": { "jsCode": "const today = new Date();\ntoday.setHours(0, 0, 0, 0);\n\nconst sessions = $input.all();\n\n// Helper para parsear \"14 January\" → Date (año actual)\nfunction parseSessionDate(dateStr) {\n if (!dateStr) return null;\n const [day, month] = dateStr.split(' ');\n const year = new Date().getFullYear();\n return new Date(`${month} ${day}, ${year}`);\n}\n\n// Formatear fecha como \"26 June\"\nfunction formatDate(date) {\n const day = date.getDate();\n const month = date.toLocaleString('en-US', { month: 'long' });\n return `${day} ${month}`;\n}\n\n// Iterar hasta encontrar la sesión que hace match con hoy\nlet matchedSession = null;\n\nfor (const item of sessions) {\n const sessionDate = parseSessionDate(item.json.fecha_sesion);\n if (!sessionDate) continue;\n\n sessionDate.setHours(0, 0, 0, 0);\n\n if (sessionDate.getTime() === today.getTime()) {\n matchedSession = item;\n break;\n }\n}\n\nreturn [\n {\n json: {\n today: formatDate(today),\n foundSession: !!matchedSession,\n session: matchedSession?.json ?? null\n }\n }\n];" @@ -3124,8 +2435,8 @@ }, "type": "n8n-nodes-base.stickyNote", "position": [ - 880, - 2960 + 928, + 2912 ], "typeVersion": 1, "id": "a9266141-49ab-41f7-b8ab-dc45e746ed1c", @@ -3144,7 +2455,7 @@ "typeVersion": 1, "position": [ -192, - 1552 + 1504 ], "id": "a4fc1575-5326-467f-8b05-f8c9569cdca1", "name": "Obtener sesiones", @@ -3155,53 +2466,6 @@ } } }, - { - "parameters": { - "operation": "update", - "tableId": "sesiones_glmway", - "filters": { - "conditions": [ - { - "keyName": "fecha_sesion", - "condition": "eq", - "keyValue": "={{ $json.fecha_sesion_inscrito }}" - } - ] - }, - "fieldsUi": { - "fieldValues": [ - {} - ] - } - }, - "type": "n8n-nodes-base.supabase", - "typeVersion": 1, - "position": [ - 3744, - 272 - ], - "id": "df865311-bf25-4b35-ac8a-da71a3d93e05", - "name": "Añadir a listado de participantes1", - "credentials": { - "supabaseApi": { - "id": "2PlsR6rpK7rQTIEn", - "name": "Sofia test - Supabase account" - } - } - }, - { - "parameters": { - "jsCode": "const item = $input.first().json;\nconst fecha_sesion = item.fecha_sesion;\n\n// Hoy\nconst hoy = new Date();\nhoy.setHours(0, 0, 0, 0);\n\n// Formatear hoy como \"26 June\"\nconst fecha_hoy = hoy.toLocaleDateString('en-GB', {\n day: 'numeric',\n month: 'long'\n});\n\n// Crear la fecha de la sesión usando el año actual\nlet sesion = new Date(`${fecha_sesion} ${hoy.getFullYear()}`);\nsesion.setHours(0, 0, 0, 0);\n\n// Si ya pasó este año, asumir el próximo\nif (sesion < hoy) {\n sesion = new Date(`${fecha_sesion} ${hoy.getFullYear() + 1}`);\n sesion.setHours(0, 0, 0, 0);\n}\n\n// Diferencia en días\nconst diferenciaDias = Math.floor(\n (sesion - hoy) / (1000 * 60 * 60 * 24)\n);\n\nconst isValid = diferenciaDias >= 0 && diferenciaDias <= 2;\n\n// Si no cumple la condición, no retornar nada\nif (!isValid) {\n return [];\n}\n\n// Retornar la sesión dentro de la llave \"sesion\"\nreturn [\n {\n json: {\n sesion: item,\n fecha_hoy,\n diferenciaDias,\n isValid\n }\n }\n];" - }, - "type": "n8n-nodes-base.code", - "typeVersion": 2, - "position": [ - 240, - 1344 - ], - "id": "e8d383b8-9081-4829-8516-a03f6f5a1b63", - "name": "Calcular falta 48h o 24h" - }, { "parameters": { "operation": "getAll", @@ -3226,7 +2490,7 @@ "typeVersion": 1, "position": [ 464, - 1536 + 1488 ], "id": "0457dbf8-9c04-4f2d-9928-4f770eb51cc0", "name": "Obtener coordinadores1", @@ -3266,7 +2530,7 @@ "typeVersion": 2.3, "position": [ 208, - 1552 + 1504 ], "id": "334a5703-db8a-4a88-b528-8468ee61ddbc", "name": "Hay inscritos en la sesion?" @@ -3279,48 +2543,11 @@ "typeVersion": 2, "position": [ 656, - 1536 + 1488 ], "id": "3073d739-a2c7-4ba1-81bc-aeae266ad3ff", "name": "Matchear coordinador y pais inscrito" }, - { - "parameters": { - "operation": "update", - "tableId": "coordinadores_rrhh_glmway", - "filters": { - "conditions": [ - { - "keyName": "pais", - "condition": "eq", - "keyValue": "={{ Object.keys($json)[0] }}" - } - ] - }, - "fieldsUi": { - "fieldValues": [ - { - "fieldId": "estado", - "fieldValue": "notificado" - } - ] - } - }, - "type": "n8n-nodes-base.supabase", - "typeVersion": 1, - "position": [ - 2160, - 1552 - ], - "id": "0881ba84-bd04-4e91-9c09-0ba18e28ed28", - "name": "Actualizar estado a notificado", - "credentials": { - "supabaseApi": { - "id": "2PlsR6rpK7rQTIEn", - "name": "Sofia test - Supabase account" - } - } - }, { "parameters": { "conditions": { @@ -3956,8 +3183,8 @@ "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ - 1536, - 1936 + 1840, + 1824 ], "id": "11458855-2bd1-4778-81f6-efe07ee1ee8b", "name": "Enviar al espacio de prueba", @@ -4231,44 +3458,6 @@ "name": "Enviar notifacion a glmway notificaciones", "retryOnFail": true }, - { - "parameters": { - "method": "POST", - "url": "=https://chat.googleapis.com/v1/spaces/AAQAR2K6i8Y/messages?key=AIzaSyDdI0hCZtE6vySjMm-WEfRq3CPzqKqqsHI&token=yOTYTZ6rayK3NlOworCkaKMPCqssxjbokfKY3wFjeXg", - "sendBody": true, - "specifyBody": "json", - "jsonBody": "={{ $json }}", - "options": {} - }, - "type": "n8n-nodes-base.httpRequest", - "typeVersion": 4.2, - "position": [ - 1920, - 1456 - ], - "id": "5d50cef9-0ebb-4f28-8deb-69c7feb6f62e", - "name": "Enviar al espacio de prueba1", - "retryOnFail": true - }, - { - "parameters": { - "method": "POST", - "url": "=https://chat.googleapis.com/v1/spaces/AAQAR2K6i8Y/messages?key=AIzaSyDdI0hCZtE6vySjMm-WEfRq3CPzqKqqsHI&token=yOTYTZ6rayK3NlOworCkaKMPCqssxjbokfKY3wFjeXg", - "sendBody": true, - "specifyBody": "json", - "jsonBody": "={{ $json }}", - "options": {} - }, - "type": "n8n-nodes-base.httpRequest", - "typeVersion": 4.2, - "position": [ - 1920, - 1632 - ], - "id": "c83590cd-6e98-4e2d-81f6-6e2f204a948d", - "name": "Enviar al espacio de prueba2", - "retryOnFail": true - }, { "parameters": { "jsCode": "// 1. Obtener datos de la sesión del nodo \"Calcular falta 48h o 24h1\"\nconst sessionNode = $('Calcular falta 48h o 24h1').first();\nconst sesion = sessionNode?.json?.sesion || {}; // Leído desde la raíz del JSON\n\n// 2. Contar participantes y construir de forma dinámica la lista por país\nlet totalParticipantes = 0;\nlet listaParticipantesTexto = \"\";\n\nif (sesion.participantes) {\n Object.keys(sesion.participantes).forEach(pais => {\n const listaPais = sesion.participantes[pais];\n if (Array.isArray(listaPais) && listaPais.length > 0) {\n totalParticipantes += listaPais.length;\n \n // Añadir el encabezado del país\n listaParticipantesTexto += `
📍 ${pais} (${listaPais.length}):
`;\n \n // Listar cada participante de ese país\n listaPais.forEach(p => {\n listaParticipantesTexto += `• ${p.nombre} (${p.departamento || 'Sin Depto'} | ${p.division || 'Sin Division'})
`;\n });\n }\n });\n}\n\n// 3. Obtener los contactId del nodo anterior para generar las menciones de los coordinadores\nlet menciones = \"\";\ntry {\n const itemsUnirDatos = $('Unir datos3').all(); // Asegúrate de verificar si tu nodo se llama Unir datos3 o similar\n const idsUnicos = [...new Set(\n itemsUnirDatos\n .map(item => item.json.contactId)\n .filter(id => id !== undefined && id !== null && id !== \"\")\n )];\n menciones = idsUnicos.map(id => ``).join(\" \");\n} catch (error) {\n menciones = \"\";\n}\n\n// 4. Construir cuerpo del mensaje con formato Google Chat Card\nconst body = {\n text: `🔔 *Aviso para Coordinadores RRHH* \\nEstimados ${menciones}, aquí está el listado de personas inscritas para la sesión de mañana.`,\n cardsV2: [\n {\n cardId: \"session-reminder-hr\",\n card: {\n header: {\n title: `🎓 Capacitación #TheGLMWay de mañana`,\n },\n sections: [\n {\n header: \"📈 Resumen de Asistencia\",\n widgets: [\n {\n textParagraph: {\n text: `Total inscritos: ${totalParticipantes} personas
` + \n listaParticipantesTexto\n }\n }\n ]\n }\n ]\n }\n }\n ]\n};\n\nreturn [{ json: body }];" @@ -4277,7 +3466,7 @@ "typeVersion": 2, "position": [ 1744, - 1632 + 1584 ], "id": "87ace248-4ea5-406f-89da-88d450ad413e", "name": "Formatear datos espanol2" @@ -4290,7 +3479,7 @@ "typeVersion": 2, "position": [ 1744, - 1456 + 1408 ], "id": "bb4cbe19-9364-4c83-a309-5594d9c5a26b", "name": "Formatear datos ingles2" @@ -4303,7 +3492,7 @@ "typeVersion": 2, "position": [ 0, - 1552 + 1504 ], "id": "47542a5b-ebe1-4e85-8229-bb9aa7e1b744", "name": "Calcular falta 48h o 24h1" @@ -4321,7 +3510,7 @@ "typeVersion": 1, "position": [ 1200, - 1536 + 1488 ], "id": "f49640d2-f7a0-43da-b9e1-1da5dbe93a22", "name": "Get a contact1", @@ -4340,7 +3529,7 @@ "typeVersion": 2, "position": [ 1024, - 1536 + 1488 ], "id": "c17d8ecc-45f9-4c03-a4d4-88d90ae8a3ec", "name": "Limpiar id1" @@ -4353,7 +3542,7 @@ "typeVersion": 2, "position": [ 1360, - 1536 + 1488 ], "id": "73de340f-189b-4963-bdf6-9b1bfd603cd6", "name": "Unir datos3" @@ -4369,7 +3558,7 @@ "typeVersion": 4.2, "position": [ 864, - 1536 + 1488 ], "id": "949eb6ae-2aba-43d2-a262-f91313336d2f", "name": "Obtener miembros RRHH Notificaciones", @@ -4447,7 +3636,7 @@ "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.4, "position": [ - 368, + 432, 2752 ], "id": "c05fc7b5-5d4e-403b-aa67-49b7427f9b04", @@ -4467,7 +3656,7 @@ "conditions": [ { "keyName": "fecha_sesion", - "keyValue": "={{ $('Prueba3').item.json.dateFormatted }}" + "keyValue": "={{ $('Buscar sesion con hora UTC').item.json.dateFormatted }}" } ] } @@ -4475,7 +3664,7 @@ "type": "n8n-nodes-base.supabase", "typeVersion": 1, "position": [ - 736, + 800, 2752 ], "id": "e4115807-580d-4075-8d62-de14c174c43a", @@ -4494,7 +3683,7 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 896, + 960, 2752 ], "id": "2e7c7d5a-13bf-40a0-bdf8-1f2f5b07188b", @@ -4508,7 +3697,7 @@ "type": "n8n-nodes-base.splitOut", "typeVersion": 1, "position": [ - 1056, + 1120, 2752 ], "id": "8b9471a9-f616-414d-988a-8f9914d72db3", @@ -4700,8 +3889,8 @@ "type": "n8n-nodes-base.supabase", "typeVersion": 1, "position": [ - 912, - 3040 + 960, + 2992 ], "id": "982ec4df-b792-46b9-bce5-ab6e8709a2a8", "name": "Actualizar instructor de inscritos", @@ -4712,19 +3901,6 @@ } } }, - { - "parameters": { - "jsCode": "// 1. Obtener los registros del nodo anterior\nconst records = $input.first().json.conferenceRecords || [];\n\n// 2. Extraer el valor directo de timestampRD\nconst timestampRD = $(\"Generar timestamp RD y UTC\").first().json.timestampRD;\n\n// Convertir a fecha/tiempo (JavaScript realiza el cálculo internamente en UTC)\nconst fechaObjetivoMs = new Date(timestampRD).getTime();\n\nlet sesionEncontrada = null;\nlet sesionMasCercana = null;\nlet menorDiferencia = Infinity;\n\n// 3. Iterar sobre las conferencias\nfor (const record of records) {\n if (!record.startTime || !record.endTime) continue;\n\n const startMs = new Date(record.startTime).getTime();\n const endMs = new Date(record.endTime).getTime();\n\n // Opción 1: Si timestampRD está DENTRO de la sesión (startTime <= timestampRD <= endTime)\n if (fechaObjetivoMs >= startMs && fechaObjetivoMs <= endMs) {\n sesionEncontrada = record;\n break; // Prioridad máxima, encontramos la sesión activa\n }\n\n // Opción 2: Buscar la más cercana mediante la diferencia al centro de la reunión\n const centroReunion = startMs + (endMs - startMs) / 2;\n const diferencia = Math.abs(fechaObjetivoMs - centroReunion);\n\n if (diferencia < menorDiferencia) {\n menorDiferencia = diferencia;\n sesionMasCercana = record;\n }\n}\n\n// Usar la sesión activa; si no hay ninguna activa en ese momento exacto, toma la más cercana\nconst match = sesionEncontrada || sesionMasCercana;\n\nif (!match) {\n return [];\n}\n\nconst startObj = new Date(match.startTime);\nconst endObj = new Date(match.endTime);\n\n// Formatear a \"15 July\" extrayendo día y mes individualmente según la zona de RD\nconst formatter = new Intl.DateTimeFormat(\"en-US\", {\n day: \"numeric\",\n month: \"long\",\n timeZone: \"America/Santo_Domingo\"\n});\n\nconst parts = formatter.formatToParts(startObj);\nconst day = parts.find(p => p.type === 'day').value;\nconst month = parts.find(p => p.type === 'month').value;\nconst dateFormatted = `${day} ${month}`; // Forzado a \"15 July\"\n\n// 4. Retornar el resultado\nreturn [\n {\n json: {\n id: match.name ? match.name.split('/').pop() : \"\",\n name: match.name || \"\",\n space: match.space || \"\",\n dateFormatted: dateFormatted, // Ej: \"15 July\"\n startTimeRaw: match.startTime,\n endTimeRaw: match.endTime,\n startTimeLocalRD: startObj.toLocaleString(\"es-DO\", { timeZone: \"America/Santo_Domingo\" }),\n endTimeLocalRD: endObj.toLocaleString(\"es-DO\", { timeZone: \"America/Santo_Domingo\" })\n }\n }\n];" - }, - "type": "n8n-nodes-base.code", - "typeVersion": 2, - "position": [ - 208, - 2752 - ], - "id": "881e05b0-c9fd-4799-b828-395b99f92a88", - "name": "Prueba3" - }, { "parameters": { "operation": "update", @@ -4751,7 +3927,7 @@ "type": "n8n-nodes-base.supabase", "typeVersion": 1, "position": [ - 1216, + 1280, 2752 ], "id": "d93b4d14-106f-4d05-b397-78ec6d0dc522", @@ -4783,7 +3959,7 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 560, + 624, 2752 ], "id": "73c64bc3-4321-46d6-9d5b-ef74bd385b2c", @@ -4879,7 +4055,7 @@ "type": "n8n-nodes-base.if", "typeVersion": 2.2, "position": [ - 1760, + 1824, 2752 ], "id": "5df50d37-798a-42f8-ab7b-2ae3f05610fd", @@ -4892,7 +4068,7 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 1616, + 1680, 2752 ], "id": "9c046113-3694-40f9-819c-42122ec117e5", @@ -4926,7 +4102,7 @@ "type": "n8n-nodes-base.if", "typeVersion": 2.3, "position": [ - 1392, + 1456, 2752 ], "id": "a2011c37-b133-431b-b8ff-41b6a4bb4f10", @@ -4966,6 +4142,145 @@ "name": "Eidan - Google Calendar account" } } + }, + { + "parameters": { + "jsCode": "// 1. Obtener los registros del nodo anterior\nconst records = $input.first().json.conferenceRecords || [];\n\n// 2. Extraer el valor directo de timestampRD\nconst timestampRD = $(\"Generar timestamp RD y UTC\").first().json.timestampRD;\n\n// Convertir a fecha/tiempo (JavaScript realiza el cálculo internamente en UTC)\nconst fechaObjetivoMs = new Date(timestampRD).getTime();\n\nlet sesionEncontrada = null;\nlet sesionMasCercana = null;\nlet menorDiferencia = Infinity;\n\n// 3. Iterar sobre las conferencias\nfor (const record of records) {\n if (!record.startTime || !record.endTime) continue;\n\n const startMs = new Date(record.startTime).getTime();\n const endMs = new Date(record.endTime).getTime();\n\n // Opción 1: Si timestampRD está DENTRO de la sesión (startTime <= timestampRD <= endTime)\n if (fechaObjetivoMs >= startMs && fechaObjetivoMs <= endMs) {\n sesionEncontrada = record;\n break; // Prioridad máxima, encontramos la sesión activa\n }\n\n // Opción 2: Buscar la más cercana mediante la diferencia al centro de la reunión\n const centroReunion = startMs + (endMs - startMs) / 2;\n const diferencia = Math.abs(fechaObjetivoMs - centroReunion);\n\n if (diferencia < menorDiferencia) {\n menorDiferencia = diferencia;\n sesionMasCercana = record;\n }\n}\n\n// Usar la sesión activa; si no hay ninguna activa en ese momento exacto, toma la más cercana\nconst match = sesionEncontrada || sesionMasCercana;\n\nif (!match) {\n return [];\n}\n\nconst startObj = new Date(match.startTime);\nconst endObj = new Date(match.endTime);\n\n// Formatear a \"15 July\" extrayendo día y mes individualmente según la zona de RD\nconst formatter = new Intl.DateTimeFormat(\"en-US\", {\n day: \"numeric\",\n month: \"long\",\n timeZone: \"America/Santo_Domingo\"\n});\n\nconst parts = formatter.formatToParts(startObj);\nconst day = parts.find(p => p.type === 'day').value;\nconst month = parts.find(p => p.type === 'month').value;\nconst dateFormatted = `${day} ${month}`; // Forzado a \"15 July\"\n\n// 4. Retornar el resultado\nreturn [\n {\n json: {\n id: match.name ? match.name.split('/').pop() : \"\",\n name: match.name || \"\",\n space: match.space || \"\",\n dateFormatted: dateFormatted, // Ej: \"15 July\"\n startTimeRaw: match.startTime,\n endTimeRaw: match.endTime,\n startTimeLocalRD: startObj.toLocaleString(\"es-DO\", { timeZone: \"America/Santo_Domingo\" }),\n endTimeLocalRD: endObj.toLocaleString(\"es-DO\", { timeZone: \"America/Santo_Domingo\" })\n }\n }\n];" + }, + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [ + 240, + 2752 + ], + "id": "881e05b0-c9fd-4799-b828-395b99f92a88", + "name": "Buscar sesion con hora UTC" + }, + { + "parameters": { + "httpMethod": "POST", + "path": "evaluacion-glmway", + "options": {} + }, + "type": "n8n-nodes-base.webhook", + "typeVersion": 2.1, + "position": [ + -320, + 3104 + ], + "id": "fe7c0429-6070-4181-ad6d-1a5a4888ce66", + "name": "Webhook1", + "webhookId": "14f1d226-12da-42c2-90d1-4d8fd5620cae" + }, + { + "parameters": { + "content": "## Guardar conteo de evaluaciones han sido resueltas", + "height": 240, + "width": 608, + "color": 4 + }, + "type": "n8n-nodes-base.stickyNote", + "position": [ + -384, + 3024 + ], + "typeVersion": 1, + "id": "7d34e6af-6b75-4780-9f70-848d2045b123", + "name": "Sticky Note7" + }, + { + "parameters": { + "method": "POST", + "url": "https://dbit.digitalcompass.agency/rest/v1/rpc/incrementar_evaluaciones_resueltas_glmway", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "apikey", + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q" + }, + { + "name": "Authorization", + "value": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q" + } + ] + }, + "options": {} + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.4, + "position": [ + -112, + 3104 + ], + "id": "59013746-bac2-4c90-a39e-3d7835ab6c31", + "name": "Incrementar conteo de evaluaciones respondidas" + }, + { + "parameters": { + "method": "POST", + "url": "https://dbit.digitalcompass.agency/rest/v1/rpc/incrementar_evaluaciones_enviadas_glmway", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "apikey", + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q" + }, + { + "name": "Authorization", + "value": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q" + } + ] + }, + "options": {} + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.4, + "position": [ + 2448, + 2768 + ], + "id": "5b1e1192-2e9b-44b2-9303-194b6266202b", + "name": "Incrementar conteo de evaluaciones enviadas" + }, + { + "parameters": { + "method": "POST", + "url": "=https://chat.googleapis.com/v1/spaces/AAQAQj1t9AA/messages?key=AIzaSyDdI0hCZtE6vySjMm-WEfRq3CPzqKqqsHI&token=Bjwcj-R0V8RsffMTHW0JovFcjotMghLp8bQ-40sxyfI", + "sendBody": true, + "specifyBody": "json", + "jsonBody": "={{ $json }}", + "options": {} + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [ + 1952, + 1408 + ], + "id": "5d50cef9-0ebb-4f28-8deb-69c7feb6f62e", + "name": "Enviar notificacion a rrhh notificaciones", + "retryOnFail": true + }, + { + "parameters": { + "method": "POST", + "url": "=https://chat.googleapis.com/v1/spaces/AAQAQj1t9AA/messages?key=AIzaSyDdI0hCZtE6vySjMm-WEfRq3CPzqKqqsHI&token=Bjwcj-R0V8RsffMTHW0JovFcjotMghLp8bQ-40sxyfI", + "sendBody": true, + "specifyBody": "json", + "jsonBody": "={{ $json }}", + "options": {} + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [ + 1952, + 1584 + ], + "id": "c83590cd-6e98-4e2d-81f6-6e2f204a948d", + "name": "Enviar notificacion a rrhh notificaciones1", + "retryOnFail": true } ], "connections": { @@ -5075,11 +4390,6 @@ ] ] }, - "Informacion del supervisor": { - "main": [ - [] - ] - }, "Informacion extra del empleado": { "main": [ [ @@ -5183,16 +4493,6 @@ ] ] }, - "Entrenamiento ingles": { - "main": [ - [] - ] - }, - "Entrenamiento español": { - "main": [ - [] - ] - }, "Calcular fecha hireDate1": { "main": [ [ @@ -5240,16 +4540,6 @@ ] ] }, - "Entrenamiento español1": { - "main": [ - [] - ] - }, - "Entrenamiento ingles4": { - "main": [ - [] - ] - }, "Hay coordinador?1": { "main": [ [ @@ -5341,11 +4631,6 @@ ] ] }, - "Obtener coordinador": { - "main": [ - [] - ] - }, "Loop Over Items1": { "main": [ [], @@ -5636,12 +4921,6 @@ ] ] }, - "Loop Over Items2": { - "main": [ - [], - [] - ] - }, "Pais?3": { "main": [ [ @@ -5660,12 +4939,6 @@ ] ] }, - "Falta 48h para el evento?1": { - "main": [ - [], - [] - ] - }, "Calcular falta 24h o es el mismo dia": { "main": [ [ @@ -5907,17 +5180,6 @@ ] ] }, - "Calcular falta 48h o 24h": { - "main": [ - [ - { - "node": "Falta 48h para el evento?1", - "type": "main", - "index": 0 - } - ] - ] - }, "Obtener coordinadores1": { "main": [ [ @@ -5952,11 +5214,6 @@ ] ] }, - "Actualizar estado a notificado": { - "main": [ - [] - ] - }, "Hay inscritos?": { "main": [ [ @@ -6234,7 +5491,7 @@ "main": [ [ { - "node": "Prueba3", + "node": "Buscar sesion con hora UTC", "type": "main", "index": 0 } @@ -6365,33 +5622,11 @@ ] ] }, - "Enviar al espacio de prueba2": { - "main": [ - [ - { - "node": "Actualizar estado a notificado", - "type": "main", - "index": 0 - } - ] - ] - }, - "Enviar al espacio de prueba1": { - "main": [ - [ - { - "node": "Actualizar estado a notificado", - "type": "main", - "index": 0 - } - ] - ] - }, "Formatear datos ingles2": { "main": [ [ { - "node": "Enviar al espacio de prueba1", + "node": "Enviar notificacion a rrhh notificaciones", "type": "main", "index": 0 } @@ -6402,7 +5637,7 @@ "main": [ [ { - "node": "Enviar al espacio de prueba2", + "node": "Enviar notificacion a rrhh notificaciones1", "type": "main", "index": 0 } @@ -6578,17 +5813,6 @@ ] ] }, - "Prueba3": { - "main": [ - [ - { - "node": "Obtener participantes", - "type": "main", - "index": 0 - } - ] - ] - }, "Generar timestamp RD y UTC": { "main": [ [ @@ -6664,7 +5888,13 @@ }, "Actualizar estado a recordado2": { "main": [ - [] + [ + { + "node": "Incrementar conteo de evaluaciones enviadas", + "type": "main", + "index": 0 + } + ] ] }, "Termino evento": { @@ -6677,6 +5907,38 @@ } ] ] + }, + "Buscar sesion con hora UTC": { + "main": [ + [ + { + "node": "Obtener participantes", + "type": "main", + "index": 0 + } + ] + ] + }, + "Webhook1": { + "main": [ + [ + { + "node": "Incrementar conteo de evaluaciones respondidas", + "type": "main", + "index": 0 + } + ] + ] + }, + "Enviar notificacion a rrhh notificaciones": { + "main": [ + [] + ] + }, + "Enviar notificacion a rrhh notificaciones1": { + "main": [ + [] + ] } }, "settings": { @@ -6743,26 +6005,13 @@ "recurrenceRules": [] }, "node:Termino evento": { - "lastTimeChecked": "2026-07-27T18:59:46Z" + "lastTimeChecked": "2026-07-27T21:54:34Z" } }, "meta": { "templateCredsSetupCompleted": true }, "pinData": { - "Get row(s) in sheet2": [ - { - "json": { - "row_number": 108, - "col_1": "2 July", - "Espanol": "Poul", - "English": "" - }, - "pairedItem": { - "item": 0 - } - } - ], "Schedule Trigger1": [ { "json": { @@ -6783,54 +6032,6 @@ } } ], - "Calcular falta 48h o 24h1": [ - { - "json": { - "sesion": { - "titulo": "Entrenamiento #TheGLMWay", - "descripcion": null, - "fecha_sesion": "29 July", - "hora_inicio": "19:00", - "hora_fin": "20:00", - "instructor": "Pablo", - "enlace_reunion": "https://meet.google.com/aao-ixkr-uwu", - "idioma": "ES", - "created_at": "2026-06-25T21:44:29.483246+00:00", - "id": "367813be-f9b6-4209-85f7-0ea63a9777fb", - "correo_instructor": "null", - "meet_id": "3ul4moq4isoavr9jhqpcbs7juu_20260729T230000Z", - "participantes": { - "Guatemala": [ - { - "correo": "hporoj@gomezlee.marketing", - "nombre": "Héctor Ernesto Poroj ixcayau", - "division": "P&G", - "departamento": "Field Force" - } - ], - "Costa Rica": [ - { - "correo": "nmora@gomezlee.marketing", - "nombre": "NIURKA De Los Ángeles MORA ROMERO", - "division": "P&G", - "departamento": "Field Force" - } - ], - "Republica Dominicana": [ - { - "correo": "avizcaino@gomezlee.marketing", - "nombre": "Abraham Teodoro Vizcaino Santos", - "division": "Nestlé Purina", - "departamento": "Field Force" - } - ] - } - }, - "fecha_hoy": "21 July", - "diferenciaDias": 1 - } - } - ], "Generar timestamp RD y UTC": [ { "json": { @@ -6841,10 +6042,10 @@ } ] }, - "versionId": "83052b6c-cde6-459c-a163-5ebf7b2f030a", - "activeVersionId": "83052b6c-cde6-459c-a163-5ebf7b2f030a", - "versionCounter": 6638, - "triggerCount": 10, + "versionId": "c56efe26-f231-4faf-b54c-c98dcd8e734a", + "activeVersionId": "c56efe26-f231-4faf-b54c-c98dcd8e734a", + "versionCounter": 6758, + "triggerCount": 11, "shared": [ { "updatedAt": "2026-06-08T13:50:12.177Z", @@ -6866,9 +6067,9 @@ ], "tags": [], "activeVersion": { - "updatedAt": "2026-07-27T18:59:46.000Z", - "createdAt": "2026-07-27T18:59:44.644Z", - "versionId": "83052b6c-cde6-459c-a163-5ebf7b2f030a", + "updatedAt": "2026-07-27T21:54:35.000Z", + "createdAt": "2026-07-27T21:54:31.876Z", + "versionId": "c56efe26-f231-4faf-b54c-c98dcd8e734a", "workflowId": "F1iPg8hktNAebZua", "nodes": [ { @@ -7091,109 +6292,6 @@ "id": "30ffb25f-3ad7-465d-9630-887828df95f6", "name": "Code in JavaScript4" }, - { - "parameters": { - "url": "=https://glm.bamboohr.com/api/v1/employees/{{ $json.supervisorEId }}?fields=displayName,workEmail,status,supervisorEmail,location,jobTitle,department,", - "authentication": "genericCredentialType", - "genericAuthType": "httpBasicAuth", - "sendHeaders": true, - "headerParameters": { - "parameters": [ - { - "name": "accept", - "value": "application/json" - } - ] - }, - "options": {} - }, - "type": "n8n-nodes-base.httpRequest", - "typeVersion": 4.4, - "position": [ - 2608, - -960 - ], - "id": "a34b5746-bdbc-4016-bffc-f953b5c0e7be", - "name": "Informacion del supervisor", - "retryOnFail": true, - "waitBetweenTries": 2000, - "credentials": { - "httpBasicAuth": { - "id": "vXrW3oJWVhNbzB07", - "name": "GLM Credential" - } - } - }, - { - "parameters": { - "method": "POST", - "url": "=https://api.bamboohr.com/api/gateway.php/glm/v1/reports/custom", - "authentication": "genericCredentialType", - "genericAuthType": "httpBasicAuth", - "sendHeaders": true, - "headerParameters": { - "parameters": [ - { - "name": "accept", - "value": "application/json" - } - ] - }, - "sendBody": true, - "specifyBody": "json", - "jsonBody": "{\n \"title\": \"Employees\",\n \"fields\": [\n \"id\",\n \"firstName\",\n \"lastName\",\n \"hireDate\",\n \"department\",\n \"jobTitle\"\n ]\n}", - "options": {} - }, - "type": "n8n-nodes-base.httpRequest", - "typeVersion": 4.4, - "position": [ - 1280, - -1408 - ], - "id": "a52ef26c-a5d6-4bb5-9a99-61fa25206105", - "name": "Informacion del supervisor1", - "retryOnFail": true, - "waitBetweenTries": 2000, - "credentials": { - "httpBasicAuth": { - "id": "vXrW3oJWVhNbzB07", - "name": "GLM Credential" - } - } - }, - { - "parameters": { - "url": "=https://glm.bamboohr.com/api/v1/employees/50743?fields=displayName,mobilePhone,workPhone,workEmail,status,employeeNumber,supervisor,supervisorEmail,location,jobTitle,department,hireDate,supervisorEId", - "authentication": "genericCredentialType", - "genericAuthType": "httpBasicAuth", - "sendHeaders": true, - "headerParameters": { - "parameters": [ - { - "name": "accept", - "value": "application/json" - } - ] - }, - "options": {} - }, - "type": "n8n-nodes-base.httpRequest", - "typeVersion": 4.4, - "position": [ - 1632, - -1344 - ], - "id": "0088cd80-6150-4577-89a9-b28b06fea6b4", - "name": "Informacion del empleado1", - "retryOnFail": true, - "waitBetweenTries": 2000, - "credentials": { - "httpBasicAuth": { - "id": "vXrW3oJWVhNbzB07", - "name": "GLM Credential" - } - } - }, { "parameters": { "operation": "get", @@ -7215,137 +6313,6 @@ } } }, - { - "parameters": { - "operation": "getAll", - "calendar": { - "__rl": true, - "value": "ethen@gomezleemarketing.com", - "mode": "list", - "cachedResultName": "ethen@gomezleemarketing.com" - }, - "returnAll": true, - "timeMax": "={{ $now.plus({ week: 3 }) }}", - "options": { - "query": "Entrenamiento" - } - }, - "type": "n8n-nodes-base.googleCalendar", - "typeVersion": 1.3, - "position": [ - 2656, - -784 - ], - "id": "901ca3ad-1e76-41fe-a1ff-a55b0f5c1ea2", - "name": "Get many events1", - "credentials": { - "googleCalendarOAuth2Api": { - "id": "yEmGG4av5RxOK7wu", - "name": "Eidan - Google Calendar account" - } - } - }, - { - "parameters": { - "operation": "getAll", - "calendar": { - "__rl": true, - "value": "ethen@gomezleemarketing.com", - "mode": "list", - "cachedResultName": "ethen@gomezleemarketing.com" - }, - "returnAll": true, - "timeMax": "={{ $now.plus({ week: 2 }) }}", - "options": { - "query": "Entrenamiento #TheGLMWay" - } - }, - "type": "n8n-nodes-base.googleCalendar", - "typeVersion": 1.3, - "position": [ - 1872, - -688 - ], - "id": "2cd687f2-a8b5-4c46-854a-4f60b4d7107f", - "name": "Entrenamiento español", - "credentials": { - "googleCalendarOAuth2Api": { - "id": "yEmGG4av5RxOK7wu", - "name": "Eidan - Google Calendar account" - } - } - }, - { - "parameters": { - "operation": "getAll", - "calendar": { - "__rl": true, - "value": "ethen@gomezleemarketing.com", - "mode": "list", - "cachedResultName": "ethen@gomezleemarketing.com" - }, - "returnAll": true, - "timeMax": "={{ $now.plus({ week: 2 }) }}", - "options": { - "query": "#TheGLMWay Training" - } - }, - "type": "n8n-nodes-base.googleCalendar", - "typeVersion": 1.3, - "position": [ - 1872, - -864 - ], - "id": "01099730-b224-4b81-98cc-b924e2b02367", - "name": "Entrenamiento ingles", - "credentials": { - "googleCalendarOAuth2Api": { - "id": "yEmGG4av5RxOK7wu", - "name": "Eidan - Google Calendar account" - } - } - }, - { - "parameters": { - "documentId": { - "__rl": true, - "value": "1zQabzR4ZpQVqYvJ0Cv5QTQ2TZRl9TahBJGfyZB4CRmI", - "mode": "list", - "cachedResultName": "GLM_GLMWay_Calendario de Entrenamientos", - "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1zQabzR4ZpQVqYvJ0Cv5QTQ2TZRl9TahBJGfyZB4CRmI/edit?usp=drivesdk" - }, - "sheetName": { - "__rl": true, - "value": "gid=0", - "mode": "list", - "cachedResultName": "Hoja 1", - "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1DzUjeikfp8eSdFqEW0LEZZBkn13jI8Uhy15DjGZ2tK4/edit#gid=0" - }, - "filtersUI": { - "values": [ - { - "lookupColumn": "col_1", - "lookupValue": "2 July" - } - ] - }, - "options": {} - }, - "type": "n8n-nodes-base.googleSheets", - "typeVersion": 4.7, - "position": [ - 2368, - -1184 - ], - "id": "ed7dc4ef-e1fe-4305-ba7e-a98b617ee095", - "name": "Get row(s) in sheet2", - "credentials": { - "googleSheetsOAuth2Api": { - "id": "8Pp0ek3NPsEkyXfY", - "name": "Eidan - Google Sheets account" - } - } - }, { "parameters": { "rule": { @@ -7369,37 +6336,6 @@ "id": "7f7d71b2-6c53-49a2-92d8-e66b2d0bff54", "name": "Schedule Trigger" }, - { - "parameters": { - "operation": "getAll", - "calendar": { - "__rl": true, - "value": "ethen@gomezleemarketing.com", - "mode": "list", - "cachedResultName": "ethen@gomezleemarketing.com" - }, - "returnAll": true, - "timeMax": "={{ $now.plus({ week: 4 }) }}", - "options": { - "fields": "", - "query": "Training" - } - }, - "type": "n8n-nodes-base.googleCalendar", - "typeVersion": 1.3, - "position": [ - 2464, - -832 - ], - "id": "77e81486-bffe-457d-8bc0-442c25ff4512", - "name": "Entrenamiento ingles1", - "credentials": { - "googleCalendarOAuth2Api": { - "id": "yEmGG4av5RxOK7wu", - "name": "Eidan - Google Calendar account" - } - } - }, { "parameters": { "url": "=https://glm.bamboohr.com/api/v1/employees/{{ $json.id }}?fields=supervisorEmail,hireDate,supervisorEId,jobTitle", @@ -7466,40 +6402,6 @@ "id": "8a2be7cc-85ad-4e44-92a7-fe3f94df703f", "name": "Hay coordinador?" }, - { - "parameters": { - "conditions": { - "options": { - "caseSensitive": true, - "leftValue": "", - "typeValidation": "strict", - "version": 3 - }, - "conditions": [ - { - "id": "d7d68505-8c34-44cd-b771-56bef28ada41", - "leftValue": "={{ $('Get an employee').item.json.workEmail }}", - "rightValue": "", - "operator": { - "type": "string", - "operation": "notEmpty", - "singleValue": true - } - } - ], - "combinator": "and" - }, - "options": {} - }, - "type": "n8n-nodes-base.if", - "typeVersion": 2.3, - "position": [ - 2432, - -1344 - ], - "id": "deb40073-dc0e-41e4-ad7c-6df18de25b4f", - "name": "Empleado le falta info?" - }, { "parameters": { "content": "## Formato fecha\nyyyy-mm-dd\n", @@ -7652,8 +6554,8 @@ }, "type": "n8n-nodes-base.stickyNote", "position": [ - 640, - -816 + 784, + -640 ], "typeVersion": 1, "id": "719365c8-8099-4108-a910-83b651d81181", @@ -7677,7 +6579,7 @@ "parameters": [ { "name": "number", - "value": "={{ \"18097159076@s.whatsapp.net\" }}" + "value": "={{ \"18494105855@s.whatsapp.net\" }}" }, { "name": "mediatype", @@ -7859,7 +6761,7 @@ "parameters": { "content": "## Envio de formulario de evaluacion despues que la sesion finalize", "height": 304, - "width": 2720, + "width": 2976, "color": 6 }, "type": "n8n-nodes-base.stickyNote", @@ -7887,36 +6789,6 @@ "id": "cd2fe5c5-9963-410b-a61a-edc36b5aaed1", "name": "Sticky Note5" }, - { - "parameters": { - "operation": "getAll", - "calendar": { - "__rl": true, - "value": "ethen@gomezleemarketing.com", - "mode": "list", - "cachedResultName": "ethen@gomezleemarketing.com" - }, - "returnAll": true, - "timeMax": "={{ $now.plus({ week: 2 }) }}", - "options": { - "query": "#TheGLMWay Training" - } - }, - "type": "n8n-nodes-base.googleCalendar", - "typeVersion": 1.3, - "position": [ - 1200, - -896 - ], - "id": "e0cc1e60-9379-45fb-b7f4-6def9c3e9601", - "name": "Entrenamiento ingles3", - "credentials": { - "googleCalendarOAuth2Api": { - "id": "yEmGG4av5RxOK7wu", - "name": "Eidan - Google Calendar account" - } - } - }, { "parameters": { "content": "## Completar datos y enviar invitacion", @@ -8014,66 +6886,6 @@ "id": "ce9f31d4-454e-4e31-9a22-8173b3fae392", "name": "Pais?1" }, - { - "parameters": { - "operation": "getAll", - "calendar": { - "__rl": true, - "value": "ethen@gomezleemarketing.com", - "mode": "list", - "cachedResultName": "ethen@gomezleemarketing.com" - }, - "returnAll": true, - "timeMax": "={{ $now.plus({ week: 2 }) }}", - "options": { - "query": "Entrenamiento #TheGLMWay" - } - }, - "type": "n8n-nodes-base.googleCalendar", - "typeVersion": 1.3, - "position": [ - 2240, - -672 - ], - "id": "00c87312-256a-4738-856d-e92b9e144c75", - "name": "Entrenamiento español1", - "credentials": { - "googleCalendarOAuth2Api": { - "id": "yEmGG4av5RxOK7wu", - "name": "Eidan - Google Calendar account" - } - } - }, - { - "parameters": { - "operation": "getAll", - "calendar": { - "__rl": true, - "value": "ethen@gomezleemarketing.com", - "mode": "list", - "cachedResultName": "ethen@gomezleemarketing.com" - }, - "returnAll": true, - "timeMax": "={{ $now.plus({ week: 2 }) }}", - "options": { - "query": "#TheGLMWay Training" - } - }, - "type": "n8n-nodes-base.googleCalendar", - "typeVersion": 1.3, - "position": [ - 2240, - -848 - ], - "id": "b3c26eeb-2ff9-42c9-b5cc-fe0776e53c46", - "name": "Entrenamiento ingles4", - "credentials": { - "googleCalendarOAuth2Api": { - "id": "yEmGG4av5RxOK7wu", - "name": "Eidan - Google Calendar account" - } - } - }, { "parameters": { "conditions": { @@ -8125,7 +6937,7 @@ "parameters": [ { "name": "number", - "value": "={{ \"18097159076@s.whatsapp.net\" }}" + "value": "={{ \"18494105855@s.whatsapp.net\" }}" }, { "name": "mediatype", @@ -8238,55 +7050,6 @@ "id": "b183c892-8822-4bc3-a92c-4410eac41a01", "name": "Pais?" }, - { - "parameters": { - "operation": "update", - "calendar": { - "__rl": true, - "value": "ethen@gomezleemarketing.com", - "mode": "list", - "cachedResultName": "ethen@gomezleemarketing.com" - }, - "eventId": "3ul4moq4isoavr9jhqpcbs7juu_20260617T230000Z", - "updateFields": { - "attendeesUi": { - "values": { - "attendees": [ - "" - ] - } - } - } - }, - "type": "n8n-nodes-base.googleCalendar", - "typeVersion": 1.3, - "position": [ - 1520, - -928 - ], - "id": "711b3353-6f75-4c6d-bef7-e704290787e8", - "name": "Invitar con calendarios entrenamiento ingles", - "credentials": { - "googleCalendarOAuth2Api": { - "id": "yEmGG4av5RxOK7wu", - "name": "Eidan - Google Calendar account" - } - } - }, - { - "parameters": { - "content": "## Invitar al nuevo ingreso a travez del calendario usando el id del evento, asi le aparece el evento", - "height": 384 - }, - "type": "n8n-nodes-base.stickyNote", - "position": [ - 1440, - -1168 - ], - "typeVersion": 1, - "id": "304297ee-18fc-4cbd-8a01-b627ae08b991", - "name": "Sticky Note7" - }, { "parameters": { "amount": 2 @@ -8421,48 +7184,6 @@ } } }, - { - "parameters": { - "documentId": { - "__rl": true, - "value": "1Xs-MkeXiZvWeJuwm-IblcI-ilr7lyhMtED0R7wczmRg", - "mode": "list", - "cachedResultName": "Calendario #TheGLMWay", - "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Xs-MkeXiZvWeJuwm-IblcI-ilr7lyhMtED0R7wczmRg/edit?usp=drivesdk" - }, - "sheetName": { - "__rl": true, - "value": 169172567, - "mode": "list", - "cachedResultName": "Coordinadores RRHH", - "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Xs-MkeXiZvWeJuwm-IblcI-ilr7lyhMtED0R7wczmRg/edit#gid=169172567" - }, - "filtersUI": { - "values": [ - { - "lookupColumn": "Pais", - "lookupValue": "={{ $('Get an employee').item.json.location }}" - } - ] - }, - "options": {} - }, - "type": "n8n-nodes-base.googleSheets", - "typeVersion": 4.7, - "position": [ - 1024, - -688 - ], - "id": "d565bfde-93eb-4b39-afc8-4b294c7e9df7", - "name": "Obtener coordinador", - "alwaysOutputData": true, - "credentials": { - "googleSheetsOAuth2Api": { - "id": "8Pp0ek3NPsEkyXfY", - "name": "Eidan - Google Sheets account" - } - } - }, { "parameters": { "options": {} @@ -8524,36 +7245,6 @@ "id": "4d94c907-8ab1-4213-be20-9e24173cf0a3", "name": "Pais?2" }, - { - "parameters": { - "operation": "getAll", - "calendar": { - "__rl": true, - "value": "ethen@gomezleemarketing.com", - "mode": "list", - "cachedResultName": "ethen@gomezleemarketing.com" - }, - "returnAll": true, - "timeMax": "={{ $now.plus({ week: 2 }) }}", - "options": { - "query": "Entrenamiento #TheGLMWay" - } - }, - "type": "n8n-nodes-base.googleCalendar", - "typeVersion": 1.3, - "position": [ - 1008, - -816 - ], - "id": "516244e1-3e39-4905-9160-86af296a0479", - "name": "Entrenamiento español3", - "credentials": { - "googleCalendarOAuth2Api": { - "id": "yEmGG4av5RxOK7wu", - "name": "Eidan - Google Calendar account" - } - } - }, { "parameters": { "assignments": { @@ -9083,24 +7774,11 @@ "typeVersion": 1.3, "position": [ -352, - 1552 + 1504 ], "id": "6951af7d-5098-4156-81bd-8f67034fcf70", "name": "Schedule Trigger3" }, - { - "parameters": { - "options": {} - }, - "type": "n8n-nodes-base.splitInBatches", - "typeVersion": 3, - "position": [ - 704, - 1376 - ], - "id": "7545364a-df0a-4420-a1af-5bcd4f8c9602", - "name": "Loop Over Items2" - }, { "parameters": { "conditions": { @@ -9192,45 +7870,11 @@ "typeVersion": 2.2, "position": [ 1520, - 1536 + 1488 ], "id": "13ee807a-f1cd-48ef-921b-7b5c260ba116", "name": "Pais?3" }, - { - "parameters": { - "conditions": { - "options": { - "caseSensitive": true, - "leftValue": "", - "typeValidation": "strict", - "version": 2 - }, - "conditions": [ - { - "id": "9674fd7e-dd62-42d4-8931-6c67e59e3dd7", - "leftValue": "={{ $json.isValid }}", - "rightValue": "Jamaica", - "operator": { - "type": "boolean", - "operation": "true", - "singleValue": true - } - } - ], - "combinator": "or" - }, - "options": {} - }, - "type": "n8n-nodes-base.if", - "typeVersion": 2.2, - "position": [ - 432, - 1344 - ], - "id": "0fea4950-f873-4375-8964-45cfc3fead02", - "name": "Falta 48h para el evento?1" - }, { "parameters": { "jsCode": "// Helper para parsear \"14 December\" → Date (año actual)\nfunction parseSessionDate(dateStr) {\n if (!dateStr) return null;\n const [day, month] = dateStr.split(' ');\n const year = new Date().getFullYear();\n return new Date(`${month} ${day}, ${year}`);\n}\n\n// Formatear fecha como \"26 June\"\nfunction formatDate(date) {\n const day = date.getDate();\n const month = date.toLocaleString('en-US', { month: 'long' });\n return `${day} ${month}`;\n}\n\nconst fecha_sesion = $input.first().json.fecha_sesion_inscrito;\n\n// Fecha de hoy normalizada a medianoche\nconst hoy = new Date();\nhoy.setHours(0, 0, 0, 0);\n\nconst sesion = parseSessionDate(fecha_sesion);\nsesion.setHours(0, 0, 0, 0);\n\n// Diferencia en días\nconst diferenciaDias = Math.floor(\n (sesion - hoy) / (1000 * 60 * 60 * 24)\n);\n\n// True si es hoy (0 días) o mañana (1 día)\nconst isValid = diferenciaDias >= 0 && diferenciaDias <= 1;\n\nreturn [\n {\n json: {\n fecha_sesion,\n fecha_hoy: formatDate(hoy),\n diferenciaDias,\n isValid\n }\n }\n];" @@ -9244,91 +7888,6 @@ "id": "bbd0558c-3b3a-462b-957c-83b1975e5413", "name": "Calcular falta 24h o es el mismo dia" }, - { - "parameters": { - "documentId": { - "__rl": true, - "value": "1DzUjeikfp8eSdFqEW0LEZZBkn13jI8Uhy15DjGZ2tK4", - "mode": "list", - "cachedResultName": "Empleados GLM Prueba", - "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1DzUjeikfp8eSdFqEW0LEZZBkn13jI8Uhy15DjGZ2tK4/edit?usp=drivesdk" - }, - "sheetName": { - "__rl": true, - "value": "gid=0", - "mode": "list", - "cachedResultName": "Hoja 1", - "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1DzUjeikfp8eSdFqEW0LEZZBkn13jI8Uhy15DjGZ2tK4/edit#gid=0" - }, - "filtersUI": { - "values": [ - { - "lookupColumn": "cargo", - "lookupValue": "Coordinador RRHH" - } - ] - }, - "options": {} - }, - "type": "n8n-nodes-base.googleSheets", - "typeVersion": 4.7, - "position": [ - 3856, - 432 - ], - "id": "ddfe7158-8cc6-440c-9e59-de97b7124eb8", - "name": "Obtener coordinador2", - "alwaysOutputData": true, - "credentials": { - "googleSheetsOAuth2Api": { - "id": "8Pp0ek3NPsEkyXfY", - "name": "Eidan - Google Sheets account" - } - } - }, - { - "parameters": { - "operation": "getAll", - "calendar": { - "__rl": true, - "value": "ethen@gomezleemarketing.com", - "mode": "list", - "cachedResultName": "ethen@gomezleemarketing.com" - }, - "returnAll": true, - "timeMax": "={{ $now.plus({ week: 2 }) }}", - "options": { - "query": "Entrenamiento #TheGLMWay" - } - }, - "type": "n8n-nodes-base.googleCalendar", - "typeVersion": 1.3, - "position": [ - 2464, - -656 - ], - "id": "98ab4271-94af-4a22-9882-b80f84be7c24", - "name": "Entrenamiento español4", - "credentials": { - "googleCalendarOAuth2Api": { - "id": "yEmGG4av5RxOK7wu", - "name": "Eidan - Google Calendar account" - } - } - }, - { - "parameters": { - "jsCode": "const monthNames = ['January','February','March','April','May','June','July',\n 'August','September','October','November','December'];\n\nreturn items.map(item => {\n const event = item.json;\n const startStr = event.start.dateTime || event.start.date;\n const datePart = startStr.split('T')[0]; // \"2026-06-21\"\n const [year, month, day] = datePart.split('-').map(Number);\n const formattedDate = `${day} ${monthNames[month - 1]}`;\n\n const summary = event.summary || '';\n const organizerName = event.organizer?.displayName \n || (event.organizer?.email ? event.organizer.email.split('@')[0] : '');\n\n let espanol = '';\n let english = '';\n\n if (summary.toLowerCase().includes('entrenamiento')) {\n espanol = organizerName;\n } else if (summary.toLowerCase().includes('training')) {\n english = organizerName;\n }\n\n return {\n json: {\n Fecha: formattedDate,\n Espanol: espanol,\n English: english\n }\n };\n});" - }, - "type": "n8n-nodes-base.code", - "typeVersion": 2, - "position": [ - 4064, - 432 - ], - "id": "41289b04-a9f4-4abc-8816-5afccd0e7996", - "name": "Code in JavaScript1" - }, { "parameters": { "rule": { @@ -9470,27 +8029,6 @@ "id": "ddcb9db1-2590-4364-aeeb-db79c35ea604", "name": "Sticky Note10" }, - { - "parameters": { - "operation": "get", - "employeeId": "=50821", - "options": {} - }, - "type": "n8n-nodes-base.bambooHr", - "typeVersion": 1, - "position": [ - 432, - -864 - ], - "id": "4ac439e5-1b93-4355-a450-b019b63e9437", - "name": "Get an employee2", - "credentials": { - "bambooHrApi": { - "id": "VwYITXROyinOC4je", - "name": "Eidan - BambooHR account" - } - } - }, { "parameters": { "sendTo": "=eidan.then14@gmail.com", @@ -9503,7 +8041,7 @@ "type": "n8n-nodes-base.gmail", "typeVersion": 2.2, "position": [ - 1968, + 2032, 2848 ], "id": "3c22bc65-799f-4432-86fe-10ae92e036de", @@ -9528,7 +8066,7 @@ "type": "n8n-nodes-base.gmail", "typeVersion": 2.2, "position": [ - 1968, + 2032, 2672 ], "id": "4dfc0135-6886-4d33-9b2a-a26efbe72832", @@ -9566,7 +8104,7 @@ "type": "n8n-nodes-base.supabase", "typeVersion": 1, "position": [ - 2192, + 2256, 2768 ], "id": "b7c02e2f-1382-4086-9059-cf75fee9d278", @@ -9939,32 +8477,6 @@ "id": "8f80d9ca-1e4b-4753-b482-df7b0fd24f61", "name": "Formatear fecha y detectar idioma" }, - { - "parameters": { - "jsCode": "const start = $input.first().json.start?.dateTime || $input.first().json.start?.date;\nconst end = $input.first().json.end?.dateTime || $input.first().json.end?.date;\n\nfunction formatHora(dateTimeStr) {\n if (!dateTimeStr) return null;\n return dateTimeStr.split('T')[1].substring(0, 5);\n}\n\nreturn [{\n json: {\n hora_inicio: formatHora(start),\n hora_fin: formatHora(end)\n }\n}];" - }, - "type": "n8n-nodes-base.code", - "typeVersion": 2, - "position": [ - 3856, - 288 - ], - "id": "abdbae74-c0ab-4f9a-b9d8-73cef07748a2", - "name": "Calcular fecha hireDate2" - }, - { - "parameters": { - "jsCode": "const months = [\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"];\n\nfunction formatearFecha(dateTimeStr) {\n if (!dateTimeStr) return null;\n const datePart = dateTimeStr.split('T')[0];\n const [year, month, day] = datePart.split('-');\n return `${parseInt(day, 10)} ${months[parseInt(month, 10) - 1]}`;\n}\n\nfunction detectarIdioma(summary) {\n if (!summary) return null;\n if (summary.includes(\"#TheGLMWay Training\")) return \"EN\";\n if (summary.includes(\"Entrenamiento #TheGLMWay\")) return \"ES\";\n return null;\n}\n\nfunction formatearHora(dateTimeStr) {\n if (!dateTimeStr) return null;\n const timePart = dateTimeStr.split('T')[1];\n if (!timePart) return null;\n return timePart.substring(0, 5);\n}\n\nconst output = [];\n\nfor (const item of $input.all()) {\n const event = item.json;\n\n const startRaw = event.start?.dateTime || event.start?.date;\n const endRaw = event.end?.dateTime || event.end?.date;\n const url = event.conferenceData?.entryPoints?.[0]?.uri || null;\n const idioma = detectarIdioma(event.summary);\n\n // Ignorar eventos vacíos o sin datos esenciales\n if (!event.summary || !startRaw) {\n console.log(\"Evento ignorado (vacío):\", JSON.stringify(event));\n continue;\n }\n\n output.push({\n json: {\n id: event.id,\n titulo: event.summary,\n idioma: idioma,\n fecha: formatearFecha(startRaw),\n hora_inicio: formatearHora(startRaw),\n hora_fin: formatearHora(endRaw),\n url: url,\n descripcion: event.description || null\n }\n });\n}\n\nconsole.log(`Sesiones procesadas: ${output.length}`);\nreturn output;\n\n// Agrega esto antes del return output\nconst resumen = output.map(i => ({\n meet_id: i.json.meet_id,\n titulo: i.json.titulo,\n fecha_sesion: i.json.fecha_sesion,\n hora_inicio: i.json.hora_inicio,\n hora_fin: i.json.hora_fin,\n enlace_reunion: i.json.enlace_reunion,\n idioma: i.json.idioma\n}));\nconsole.log(JSON.stringify(resumen));" - }, - "type": "n8n-nodes-base.code", - "typeVersion": 2, - "position": [ - 4144, - 192 - ], - "id": "cded5025-8e1b-4609-b7c6-5acb81244bdf", - "name": "Formatear fecha y detectar idioma1" - }, { "parameters": { "jsCode": "const today = new Date();\ntoday.setHours(0, 0, 0, 0);\n\nconst sessions = $input.all();\n\n// Helper para parsear \"14 January\" → Date (año actual)\nfunction parseSessionDate(dateStr) {\n if (!dateStr) return null;\n const [day, month] = dateStr.split(' ');\n const year = new Date().getFullYear();\n return new Date(`${month} ${day}, ${year}`);\n}\n\n// Formatear fecha como \"26 June\"\nfunction formatDate(date) {\n const day = date.getDate();\n const month = date.toLocaleString('en-US', { month: 'long' });\n return `${day} ${month}`;\n}\n\n// Iterar hasta encontrar la sesión que hace match con hoy\nlet matchedSession = null;\n\nfor (const item of sessions) {\n const sessionDate = parseSessionDate(item.json.fecha_sesion);\n if (!sessionDate) continue;\n\n sessionDate.setHours(0, 0, 0, 0);\n\n if (sessionDate.getTime() === today.getTime()) {\n matchedSession = item;\n break;\n }\n}\n\nreturn [\n {\n json: {\n today: formatDate(today),\n foundSession: !!matchedSession,\n session: matchedSession?.json ?? null\n }\n }\n];" @@ -9987,8 +8499,8 @@ }, "type": "n8n-nodes-base.stickyNote", "position": [ - 880, - 2960 + 928, + 2912 ], "typeVersion": 1, "id": "a9266141-49ab-41f7-b8ab-dc45e746ed1c", @@ -10007,7 +8519,7 @@ "typeVersion": 1, "position": [ -192, - 1552 + 1504 ], "id": "a4fc1575-5326-467f-8b05-f8c9569cdca1", "name": "Obtener sesiones", @@ -10018,53 +8530,6 @@ } } }, - { - "parameters": { - "operation": "update", - "tableId": "sesiones_glmway", - "filters": { - "conditions": [ - { - "keyName": "fecha_sesion", - "condition": "eq", - "keyValue": "={{ $json.fecha_sesion_inscrito }}" - } - ] - }, - "fieldsUi": { - "fieldValues": [ - {} - ] - } - }, - "type": "n8n-nodes-base.supabase", - "typeVersion": 1, - "position": [ - 3744, - 272 - ], - "id": "df865311-bf25-4b35-ac8a-da71a3d93e05", - "name": "Añadir a listado de participantes1", - "credentials": { - "supabaseApi": { - "id": "2PlsR6rpK7rQTIEn", - "name": "Sofia test - Supabase account" - } - } - }, - { - "parameters": { - "jsCode": "const item = $input.first().json;\nconst fecha_sesion = item.fecha_sesion;\n\n// Hoy\nconst hoy = new Date();\nhoy.setHours(0, 0, 0, 0);\n\n// Formatear hoy como \"26 June\"\nconst fecha_hoy = hoy.toLocaleDateString('en-GB', {\n day: 'numeric',\n month: 'long'\n});\n\n// Crear la fecha de la sesión usando el año actual\nlet sesion = new Date(`${fecha_sesion} ${hoy.getFullYear()}`);\nsesion.setHours(0, 0, 0, 0);\n\n// Si ya pasó este año, asumir el próximo\nif (sesion < hoy) {\n sesion = new Date(`${fecha_sesion} ${hoy.getFullYear() + 1}`);\n sesion.setHours(0, 0, 0, 0);\n}\n\n// Diferencia en días\nconst diferenciaDias = Math.floor(\n (sesion - hoy) / (1000 * 60 * 60 * 24)\n);\n\nconst isValid = diferenciaDias >= 0 && diferenciaDias <= 2;\n\n// Si no cumple la condición, no retornar nada\nif (!isValid) {\n return [];\n}\n\n// Retornar la sesión dentro de la llave \"sesion\"\nreturn [\n {\n json: {\n sesion: item,\n fecha_hoy,\n diferenciaDias,\n isValid\n }\n }\n];" - }, - "type": "n8n-nodes-base.code", - "typeVersion": 2, - "position": [ - 240, - 1344 - ], - "id": "e8d383b8-9081-4829-8516-a03f6f5a1b63", - "name": "Calcular falta 48h o 24h" - }, { "parameters": { "operation": "getAll", @@ -10089,7 +8554,7 @@ "typeVersion": 1, "position": [ 464, - 1536 + 1488 ], "id": "0457dbf8-9c04-4f2d-9928-4f770eb51cc0", "name": "Obtener coordinadores1", @@ -10129,7 +8594,7 @@ "typeVersion": 2.3, "position": [ 208, - 1552 + 1504 ], "id": "334a5703-db8a-4a88-b528-8468ee61ddbc", "name": "Hay inscritos en la sesion?" @@ -10142,48 +8607,11 @@ "typeVersion": 2, "position": [ 656, - 1536 + 1488 ], "id": "3073d739-a2c7-4ba1-81bc-aeae266ad3ff", "name": "Matchear coordinador y pais inscrito" }, - { - "parameters": { - "operation": "update", - "tableId": "coordinadores_rrhh_glmway", - "filters": { - "conditions": [ - { - "keyName": "pais", - "condition": "eq", - "keyValue": "={{ Object.keys($json)[0] }}" - } - ] - }, - "fieldsUi": { - "fieldValues": [ - { - "fieldId": "estado", - "fieldValue": "notificado" - } - ] - } - }, - "type": "n8n-nodes-base.supabase", - "typeVersion": 1, - "position": [ - 2160, - 1552 - ], - "id": "0881ba84-bd04-4e91-9c09-0ba18e28ed28", - "name": "Actualizar estado a notificado", - "credentials": { - "supabaseApi": { - "id": "2PlsR6rpK7rQTIEn", - "name": "Sofia test - Supabase account" - } - } - }, { "parameters": { "conditions": { @@ -10819,8 +9247,8 @@ "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ - 1536, - 1936 + 1840, + 1824 ], "id": "11458855-2bd1-4778-81f6-efe07ee1ee8b", "name": "Enviar al espacio de prueba", @@ -11094,44 +9522,6 @@ "name": "Enviar notifacion a glmway notificaciones", "retryOnFail": true }, - { - "parameters": { - "method": "POST", - "url": "=https://chat.googleapis.com/v1/spaces/AAQAR2K6i8Y/messages?key=AIzaSyDdI0hCZtE6vySjMm-WEfRq3CPzqKqqsHI&token=yOTYTZ6rayK3NlOworCkaKMPCqssxjbokfKY3wFjeXg", - "sendBody": true, - "specifyBody": "json", - "jsonBody": "={{ $json }}", - "options": {} - }, - "type": "n8n-nodes-base.httpRequest", - "typeVersion": 4.2, - "position": [ - 1920, - 1456 - ], - "id": "5d50cef9-0ebb-4f28-8deb-69c7feb6f62e", - "name": "Enviar al espacio de prueba1", - "retryOnFail": true - }, - { - "parameters": { - "method": "POST", - "url": "=https://chat.googleapis.com/v1/spaces/AAQAR2K6i8Y/messages?key=AIzaSyDdI0hCZtE6vySjMm-WEfRq3CPzqKqqsHI&token=yOTYTZ6rayK3NlOworCkaKMPCqssxjbokfKY3wFjeXg", - "sendBody": true, - "specifyBody": "json", - "jsonBody": "={{ $json }}", - "options": {} - }, - "type": "n8n-nodes-base.httpRequest", - "typeVersion": 4.2, - "position": [ - 1920, - 1632 - ], - "id": "c83590cd-6e98-4e2d-81f6-6e2f204a948d", - "name": "Enviar al espacio de prueba2", - "retryOnFail": true - }, { "parameters": { "jsCode": "// 1. Obtener datos de la sesión del nodo \"Calcular falta 48h o 24h1\"\nconst sessionNode = $('Calcular falta 48h o 24h1').first();\nconst sesion = sessionNode?.json?.sesion || {}; // Leído desde la raíz del JSON\n\n// 2. Contar participantes y construir de forma dinámica la lista por país\nlet totalParticipantes = 0;\nlet listaParticipantesTexto = \"\";\n\nif (sesion.participantes) {\n Object.keys(sesion.participantes).forEach(pais => {\n const listaPais = sesion.participantes[pais];\n if (Array.isArray(listaPais) && listaPais.length > 0) {\n totalParticipantes += listaPais.length;\n \n // Añadir el encabezado del país\n listaParticipantesTexto += `
📍 ${pais} (${listaPais.length}):
`;\n \n // Listar cada participante de ese país\n listaPais.forEach(p => {\n listaParticipantesTexto += `• ${p.nombre} (${p.departamento || 'Sin Depto'} | ${p.division || 'Sin Division'})
`;\n });\n }\n });\n}\n\n// 3. Obtener los contactId del nodo anterior para generar las menciones de los coordinadores\nlet menciones = \"\";\ntry {\n const itemsUnirDatos = $('Unir datos3').all(); // Asegúrate de verificar si tu nodo se llama Unir datos3 o similar\n const idsUnicos = [...new Set(\n itemsUnirDatos\n .map(item => item.json.contactId)\n .filter(id => id !== undefined && id !== null && id !== \"\")\n )];\n menciones = idsUnicos.map(id => ``).join(\" \");\n} catch (error) {\n menciones = \"\";\n}\n\n// 4. Construir cuerpo del mensaje con formato Google Chat Card\nconst body = {\n text: `🔔 *Aviso para Coordinadores RRHH* \\nEstimados ${menciones}, aquí está el listado de personas inscritas para la sesión de mañana.`,\n cardsV2: [\n {\n cardId: \"session-reminder-hr\",\n card: {\n header: {\n title: `🎓 Capacitación #TheGLMWay de mañana`,\n },\n sections: [\n {\n header: \"📈 Resumen de Asistencia\",\n widgets: [\n {\n textParagraph: {\n text: `Total inscritos: ${totalParticipantes} personas
` + \n listaParticipantesTexto\n }\n }\n ]\n }\n ]\n }\n }\n ]\n};\n\nreturn [{ json: body }];" @@ -11140,7 +9530,7 @@ "typeVersion": 2, "position": [ 1744, - 1632 + 1584 ], "id": "87ace248-4ea5-406f-89da-88d450ad413e", "name": "Formatear datos espanol2" @@ -11153,7 +9543,7 @@ "typeVersion": 2, "position": [ 1744, - 1456 + 1408 ], "id": "bb4cbe19-9364-4c83-a309-5594d9c5a26b", "name": "Formatear datos ingles2" @@ -11166,7 +9556,7 @@ "typeVersion": 2, "position": [ 0, - 1552 + 1504 ], "id": "47542a5b-ebe1-4e85-8229-bb9aa7e1b744", "name": "Calcular falta 48h o 24h1" @@ -11184,7 +9574,7 @@ "typeVersion": 1, "position": [ 1200, - 1536 + 1488 ], "id": "f49640d2-f7a0-43da-b9e1-1da5dbe93a22", "name": "Get a contact1", @@ -11203,7 +9593,7 @@ "typeVersion": 2, "position": [ 1024, - 1536 + 1488 ], "id": "c17d8ecc-45f9-4c03-a4d4-88d90ae8a3ec", "name": "Limpiar id1" @@ -11216,7 +9606,7 @@ "typeVersion": 2, "position": [ 1360, - 1536 + 1488 ], "id": "73de340f-189b-4963-bdf6-9b1bfd603cd6", "name": "Unir datos3" @@ -11232,7 +9622,7 @@ "typeVersion": 4.2, "position": [ 864, - 1536 + 1488 ], "id": "949eb6ae-2aba-43d2-a262-f91313336d2f", "name": "Obtener miembros RRHH Notificaciones", @@ -11310,7 +9700,7 @@ "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.4, "position": [ - 368, + 432, 2752 ], "id": "c05fc7b5-5d4e-403b-aa67-49b7427f9b04", @@ -11330,7 +9720,7 @@ "conditions": [ { "keyName": "fecha_sesion", - "keyValue": "={{ $('Prueba3').item.json.dateFormatted }}" + "keyValue": "={{ $('Buscar sesion con hora UTC').item.json.dateFormatted }}" } ] } @@ -11338,7 +9728,7 @@ "type": "n8n-nodes-base.supabase", "typeVersion": 1, "position": [ - 736, + 800, 2752 ], "id": "e4115807-580d-4075-8d62-de14c174c43a", @@ -11357,7 +9747,7 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 896, + 960, 2752 ], "id": "2e7c7d5a-13bf-40a0-bdf8-1f2f5b07188b", @@ -11371,7 +9761,7 @@ "type": "n8n-nodes-base.splitOut", "typeVersion": 1, "position": [ - 1056, + 1120, 2752 ], "id": "8b9471a9-f616-414d-988a-8f9914d72db3", @@ -11563,8 +9953,8 @@ "type": "n8n-nodes-base.supabase", "typeVersion": 1, "position": [ - 912, - 3040 + 960, + 2992 ], "id": "982ec4df-b792-46b9-bce5-ab6e8709a2a8", "name": "Actualizar instructor de inscritos", @@ -11575,19 +9965,6 @@ } } }, - { - "parameters": { - "jsCode": "// 1. Obtener los registros del nodo anterior\nconst records = $input.first().json.conferenceRecords || [];\n\n// 2. Extraer el valor directo de timestampRD\nconst timestampRD = $(\"Generar timestamp RD y UTC\").first().json.timestampRD;\n\n// Convertir a fecha/tiempo (JavaScript realiza el cálculo internamente en UTC)\nconst fechaObjetivoMs = new Date(timestampRD).getTime();\n\nlet sesionEncontrada = null;\nlet sesionMasCercana = null;\nlet menorDiferencia = Infinity;\n\n// 3. Iterar sobre las conferencias\nfor (const record of records) {\n if (!record.startTime || !record.endTime) continue;\n\n const startMs = new Date(record.startTime).getTime();\n const endMs = new Date(record.endTime).getTime();\n\n // Opción 1: Si timestampRD está DENTRO de la sesión (startTime <= timestampRD <= endTime)\n if (fechaObjetivoMs >= startMs && fechaObjetivoMs <= endMs) {\n sesionEncontrada = record;\n break; // Prioridad máxima, encontramos la sesión activa\n }\n\n // Opción 2: Buscar la más cercana mediante la diferencia al centro de la reunión\n const centroReunion = startMs + (endMs - startMs) / 2;\n const diferencia = Math.abs(fechaObjetivoMs - centroReunion);\n\n if (diferencia < menorDiferencia) {\n menorDiferencia = diferencia;\n sesionMasCercana = record;\n }\n}\n\n// Usar la sesión activa; si no hay ninguna activa en ese momento exacto, toma la más cercana\nconst match = sesionEncontrada || sesionMasCercana;\n\nif (!match) {\n return [];\n}\n\nconst startObj = new Date(match.startTime);\nconst endObj = new Date(match.endTime);\n\n// Formatear a \"15 July\" extrayendo día y mes individualmente según la zona de RD\nconst formatter = new Intl.DateTimeFormat(\"en-US\", {\n day: \"numeric\",\n month: \"long\",\n timeZone: \"America/Santo_Domingo\"\n});\n\nconst parts = formatter.formatToParts(startObj);\nconst day = parts.find(p => p.type === 'day').value;\nconst month = parts.find(p => p.type === 'month').value;\nconst dateFormatted = `${day} ${month}`; // Forzado a \"15 July\"\n\n// 4. Retornar el resultado\nreturn [\n {\n json: {\n id: match.name ? match.name.split('/').pop() : \"\",\n name: match.name || \"\",\n space: match.space || \"\",\n dateFormatted: dateFormatted, // Ej: \"15 July\"\n startTimeRaw: match.startTime,\n endTimeRaw: match.endTime,\n startTimeLocalRD: startObj.toLocaleString(\"es-DO\", { timeZone: \"America/Santo_Domingo\" }),\n endTimeLocalRD: endObj.toLocaleString(\"es-DO\", { timeZone: \"America/Santo_Domingo\" })\n }\n }\n];" - }, - "type": "n8n-nodes-base.code", - "typeVersion": 2, - "position": [ - 208, - 2752 - ], - "id": "881e05b0-c9fd-4799-b828-395b99f92a88", - "name": "Prueba3" - }, { "parameters": { "operation": "update", @@ -11614,7 +9991,7 @@ "type": "n8n-nodes-base.supabase", "typeVersion": 1, "position": [ - 1216, + 1280, 2752 ], "id": "d93b4d14-106f-4d05-b397-78ec6d0dc522", @@ -11646,7 +10023,7 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 560, + 624, 2752 ], "id": "73c64bc3-4321-46d6-9d5b-ef74bd385b2c", @@ -11742,7 +10119,7 @@ "type": "n8n-nodes-base.if", "typeVersion": 2.2, "position": [ - 1760, + 1824, 2752 ], "id": "5df50d37-798a-42f8-ab7b-2ae3f05610fd", @@ -11755,7 +10132,7 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 1616, + 1680, 2752 ], "id": "9c046113-3694-40f9-819c-42122ec117e5", @@ -11789,7 +10166,7 @@ "type": "n8n-nodes-base.if", "typeVersion": 2.3, "position": [ - 1392, + 1456, 2752 ], "id": "a2011c37-b133-431b-b8ff-41b6a4bb4f10", @@ -11829,6 +10206,145 @@ "name": "Eidan - Google Calendar account" } } + }, + { + "parameters": { + "jsCode": "// 1. Obtener los registros del nodo anterior\nconst records = $input.first().json.conferenceRecords || [];\n\n// 2. Extraer el valor directo de timestampRD\nconst timestampRD = $(\"Generar timestamp RD y UTC\").first().json.timestampRD;\n\n// Convertir a fecha/tiempo (JavaScript realiza el cálculo internamente en UTC)\nconst fechaObjetivoMs = new Date(timestampRD).getTime();\n\nlet sesionEncontrada = null;\nlet sesionMasCercana = null;\nlet menorDiferencia = Infinity;\n\n// 3. Iterar sobre las conferencias\nfor (const record of records) {\n if (!record.startTime || !record.endTime) continue;\n\n const startMs = new Date(record.startTime).getTime();\n const endMs = new Date(record.endTime).getTime();\n\n // Opción 1: Si timestampRD está DENTRO de la sesión (startTime <= timestampRD <= endTime)\n if (fechaObjetivoMs >= startMs && fechaObjetivoMs <= endMs) {\n sesionEncontrada = record;\n break; // Prioridad máxima, encontramos la sesión activa\n }\n\n // Opción 2: Buscar la más cercana mediante la diferencia al centro de la reunión\n const centroReunion = startMs + (endMs - startMs) / 2;\n const diferencia = Math.abs(fechaObjetivoMs - centroReunion);\n\n if (diferencia < menorDiferencia) {\n menorDiferencia = diferencia;\n sesionMasCercana = record;\n }\n}\n\n// Usar la sesión activa; si no hay ninguna activa en ese momento exacto, toma la más cercana\nconst match = sesionEncontrada || sesionMasCercana;\n\nif (!match) {\n return [];\n}\n\nconst startObj = new Date(match.startTime);\nconst endObj = new Date(match.endTime);\n\n// Formatear a \"15 July\" extrayendo día y mes individualmente según la zona de RD\nconst formatter = new Intl.DateTimeFormat(\"en-US\", {\n day: \"numeric\",\n month: \"long\",\n timeZone: \"America/Santo_Domingo\"\n});\n\nconst parts = formatter.formatToParts(startObj);\nconst day = parts.find(p => p.type === 'day').value;\nconst month = parts.find(p => p.type === 'month').value;\nconst dateFormatted = `${day} ${month}`; // Forzado a \"15 July\"\n\n// 4. Retornar el resultado\nreturn [\n {\n json: {\n id: match.name ? match.name.split('/').pop() : \"\",\n name: match.name || \"\",\n space: match.space || \"\",\n dateFormatted: dateFormatted, // Ej: \"15 July\"\n startTimeRaw: match.startTime,\n endTimeRaw: match.endTime,\n startTimeLocalRD: startObj.toLocaleString(\"es-DO\", { timeZone: \"America/Santo_Domingo\" }),\n endTimeLocalRD: endObj.toLocaleString(\"es-DO\", { timeZone: \"America/Santo_Domingo\" })\n }\n }\n];" + }, + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [ + 240, + 2752 + ], + "id": "881e05b0-c9fd-4799-b828-395b99f92a88", + "name": "Buscar sesion con hora UTC" + }, + { + "parameters": { + "httpMethod": "POST", + "path": "evaluacion-glmway", + "options": {} + }, + "type": "n8n-nodes-base.webhook", + "typeVersion": 2.1, + "position": [ + -320, + 3104 + ], + "id": "fe7c0429-6070-4181-ad6d-1a5a4888ce66", + "name": "Webhook1", + "webhookId": "14f1d226-12da-42c2-90d1-4d8fd5620cae" + }, + { + "parameters": { + "content": "## Guardar conteo de evaluaciones han sido resueltas", + "height": 240, + "width": 608, + "color": 4 + }, + "type": "n8n-nodes-base.stickyNote", + "position": [ + -384, + 3024 + ], + "typeVersion": 1, + "id": "7d34e6af-6b75-4780-9f70-848d2045b123", + "name": "Sticky Note7" + }, + { + "parameters": { + "method": "POST", + "url": "https://dbit.digitalcompass.agency/rest/v1/rpc/incrementar_evaluaciones_resueltas_glmway", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "apikey", + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q" + }, + { + "name": "Authorization", + "value": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q" + } + ] + }, + "options": {} + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.4, + "position": [ + -112, + 3104 + ], + "id": "59013746-bac2-4c90-a39e-3d7835ab6c31", + "name": "Incrementar conteo de evaluaciones respondidas" + }, + { + "parameters": { + "method": "POST", + "url": "https://dbit.digitalcompass.agency/rest/v1/rpc/incrementar_evaluaciones_enviadas_glmway", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "apikey", + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q" + }, + { + "name": "Authorization", + "value": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q" + } + ] + }, + "options": {} + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.4, + "position": [ + 2448, + 2768 + ], + "id": "5b1e1192-2e9b-44b2-9303-194b6266202b", + "name": "Incrementar conteo de evaluaciones enviadas" + }, + { + "parameters": { + "method": "POST", + "url": "=https://chat.googleapis.com/v1/spaces/AAQAQj1t9AA/messages?key=AIzaSyDdI0hCZtE6vySjMm-WEfRq3CPzqKqqsHI&token=Bjwcj-R0V8RsffMTHW0JovFcjotMghLp8bQ-40sxyfI", + "sendBody": true, + "specifyBody": "json", + "jsonBody": "={{ $json }}", + "options": {} + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [ + 1952, + 1408 + ], + "id": "5d50cef9-0ebb-4f28-8deb-69c7feb6f62e", + "name": "Enviar notificacion a rrhh notificaciones", + "retryOnFail": true + }, + { + "parameters": { + "method": "POST", + "url": "=https://chat.googleapis.com/v1/spaces/AAQAQj1t9AA/messages?key=AIzaSyDdI0hCZtE6vySjMm-WEfRq3CPzqKqqsHI&token=Bjwcj-R0V8RsffMTHW0JovFcjotMghLp8bQ-40sxyfI", + "sendBody": true, + "specifyBody": "json", + "jsonBody": "={{ $json }}", + "options": {} + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [ + 1952, + 1584 + ], + "id": "c83590cd-6e98-4e2d-81f6-6e2f204a948d", + "name": "Enviar notificacion a rrhh notificaciones1", + "retryOnFail": true } ], "connections": { @@ -11938,11 +10454,6 @@ ] ] }, - "Informacion del supervisor": { - "main": [ - [] - ] - }, "Informacion extra del empleado": { "main": [ [ @@ -12046,16 +10557,6 @@ ] ] }, - "Entrenamiento ingles": { - "main": [ - [] - ] - }, - "Entrenamiento español": { - "main": [ - [] - ] - }, "Calcular fecha hireDate1": { "main": [ [ @@ -12103,16 +10604,6 @@ ] ] }, - "Entrenamiento español1": { - "main": [ - [] - ] - }, - "Entrenamiento ingles4": { - "main": [ - [] - ] - }, "Hay coordinador?1": { "main": [ [ @@ -12204,11 +10695,6 @@ ] ] }, - "Obtener coordinador": { - "main": [ - [] - ] - }, "Loop Over Items1": { "main": [ [], @@ -12499,12 +10985,6 @@ ] ] }, - "Loop Over Items2": { - "main": [ - [], - [] - ] - }, "Pais?3": { "main": [ [ @@ -12523,12 +11003,6 @@ ] ] }, - "Falta 48h para el evento?1": { - "main": [ - [], - [] - ] - }, "Calcular falta 24h o es el mismo dia": { "main": [ [ @@ -12770,17 +11244,6 @@ ] ] }, - "Calcular falta 48h o 24h": { - "main": [ - [ - { - "node": "Falta 48h para el evento?1", - "type": "main", - "index": 0 - } - ] - ] - }, "Obtener coordinadores1": { "main": [ [ @@ -12815,11 +11278,6 @@ ] ] }, - "Actualizar estado a notificado": { - "main": [ - [] - ] - }, "Hay inscritos?": { "main": [ [ @@ -13097,7 +11555,7 @@ "main": [ [ { - "node": "Prueba3", + "node": "Buscar sesion con hora UTC", "type": "main", "index": 0 } @@ -13228,33 +11686,11 @@ ] ] }, - "Enviar al espacio de prueba2": { - "main": [ - [ - { - "node": "Actualizar estado a notificado", - "type": "main", - "index": 0 - } - ] - ] - }, - "Enviar al espacio de prueba1": { - "main": [ - [ - { - "node": "Actualizar estado a notificado", - "type": "main", - "index": 0 - } - ] - ] - }, "Formatear datos ingles2": { "main": [ [ { - "node": "Enviar al espacio de prueba1", + "node": "Enviar notificacion a rrhh notificaciones", "type": "main", "index": 0 } @@ -13265,7 +11701,7 @@ "main": [ [ { - "node": "Enviar al espacio de prueba2", + "node": "Enviar notificacion a rrhh notificaciones1", "type": "main", "index": 0 } @@ -13441,17 +11877,6 @@ ] ] }, - "Prueba3": { - "main": [ - [ - { - "node": "Obtener participantes", - "type": "main", - "index": 0 - } - ] - ] - }, "Generar timestamp RD y UTC": { "main": [ [ @@ -13527,7 +11952,13 @@ }, "Actualizar estado a recordado2": { "main": [ - [] + [ + { + "node": "Incrementar conteo de evaluaciones enviadas", + "type": "main", + "index": 0 + } + ] ] }, "Termino evento": { @@ -13540,18 +11971,50 @@ } ] ] + }, + "Buscar sesion con hora UTC": { + "main": [ + [ + { + "node": "Obtener participantes", + "type": "main", + "index": 0 + } + ] + ] + }, + "Webhook1": { + "main": [ + [ + { + "node": "Incrementar conteo de evaluaciones respondidas", + "type": "main", + "index": 0 + } + ] + ] + }, + "Enviar notificacion a rrhh notificaciones": { + "main": [ + [] + ] + }, + "Enviar notificacion a rrhh notificaciones1": { + "main": [ + [] + ] } }, "authors": "Eidan Then", - "name": "Version 83052b6c", + "name": "Version c56efe26", "description": "", - "autosaved": false, + "autosaved": true, "workflowPublishHistory": [ { - "createdAt": "2026-07-27T18:59:46.228Z", - "id": 3508, + "createdAt": "2026-07-27T21:54:34.952Z", + "id": 3536, "workflowId": "F1iPg8hktNAebZua", - "versionId": "83052b6c-cde6-459c-a163-5ebf7b2f030a", + "versionId": "c56efe26-f231-4faf-b54c-c98dcd8e734a", "event": "activated", "userId": "de14e7e5-491b-4983-abb2-f88af42e92fd" }