diff --git a/calculo-de-ir-nicaragua.json b/calculo-de-ir-nicaragua.json index 1115237..a9f7104 100644 --- a/calculo-de-ir-nicaragua.json +++ b/calculo-de-ir-nicaragua.json @@ -1,5 +1,5 @@ { - "updatedAt": "2026-07-16T16:13:39.561Z", + "updatedAt": "2026-07-25T17:31:59.243Z", "createdAt": "2026-07-13T19:09:59.636Z", "id": "V1JFqI8iDtzzO5F0", "name": "Cálculo de IR - Nicaragua", @@ -140,8 +140,8 @@ "type": "n8n-nodes-base.formTrigger", "typeVersion": 2.3, "position": [ - 2176, - 8048 + 1584, + 8032 ], "id": "b3c9cfd2-6407-4bcb-ba7c-fb946106d90b", "name": "Formulario IR Nicaragua", @@ -156,8 +156,8 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 2448, - 8048 + 1856, + 8032 ], "notesInFlow": true, "notes": "Separa Q1 y Q2 y conserva sus binarios. No usa this.helpers, require() ni módulos externos." @@ -212,8 +212,8 @@ "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ - 2736, - 8048 + 2144, + 8032 ], "notesInFlow": true, "retryOnFail": true, @@ -236,8 +236,8 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 3008, - 8048 + 2416, + 8032 ], "notesInFlow": true, "notes": "Vuelve a unir cada URL resumible con el archivo XLSX correspondiente. No lee ni reconstruye el binario." @@ -269,8 +269,8 @@ "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ - 3296, - 8048 + 2704, + 8032 ], "notesInFlow": true, "retryOnFail": true, @@ -293,8 +293,8 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 3584, - 8048 + 2992, + 8032 ] }, { @@ -306,8 +306,8 @@ "type": "n8n-nodes-base.wait", "typeVersion": 1.1, "position": [ - 3856, - 8048 + 3264, + 8032 ], "webhookId": "36fcbd67-c472-445b-bf35-a2c293ff2cf2", "notesInFlow": true, @@ -322,8 +322,8 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 4144, - 8048 + 3552, + 8032 ] }, { @@ -349,8 +349,8 @@ "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ - 4416, - 8048 + 3824, + 8032 ], "notesInFlow": true, "retryOnFail": true, @@ -373,8 +373,8 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 4704, - 8048 + 4112, + 8032 ] }, { @@ -395,8 +395,8 @@ "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ - 4976, - 8048 + 4384, + 8032 ], "notesInFlow": true, "retryOnFail": true, @@ -419,8 +419,8 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 5264, - 8048 + 4672, + 8032 ], "notesInFlow": true, "notes": "Motor de lectura y conciliación en producción. El correo y el acceso de edición al reporte se asignan a Isaac, Estefani, Angie, Mati, Iveth y Máximo." @@ -434,8 +434,8 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 5536, - 8048 + 4944, + 8032 ], "notesInFlow": true, "notes": "Plantilla XLSX saneada: conserva fórmulas, estilos y las dos pestañas, pero elimina metadatos de comentarios heredados que podían impedir la importación en Google Sheets." @@ -455,8 +455,8 @@ "type": "n8n-nodes-base.convertToFile", "typeVersion": 1.1, "position": [ - 5824, - 8048 + 5232, + 8032 ], "notesInFlow": true, "notes": "Convierte la plantilla embebida en un archivo XLSX binario usando un nodo nativo de n8n." @@ -515,7 +515,7 @@ "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ - 6096, + 6864, 8048 ], "retryOnFail": true, @@ -539,7 +539,7 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 6384, + 7152, 8048 ], "notesInFlow": true, @@ -576,7 +576,7 @@ "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ - 6656, + 7424, 8048 ], "retryOnFail": true, @@ -600,7 +600,7 @@ "type": "n8n-nodes-base.wait", "typeVersion": 1.1, "position": [ - 7184, + 7952, 8048 ], "webhookId": "e611d2dd-0f14-4dc2-9358-349be9fefe66", @@ -630,7 +630,7 @@ "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ - 7456, + 8224, 8048 ], "retryOnFail": true, @@ -654,7 +654,7 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 7744, + 8512, 8048 ], "notes": "Escribe el título correcto, elimina los dos valores “1” heredados de la plantilla y llena la memoria con todos los empleados." @@ -677,7 +677,7 @@ "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ - 8016, + 8784, 8048 ], "retryOnFail": true, @@ -701,7 +701,7 @@ "type": "n8n-nodes-base.wait", "typeVersion": 1.1, "position": [ - 8304, + 9072, 8048 ], "webhookId": "ce72c97f-636e-4e9c-8ef6-bf6b13a7f239", @@ -717,7 +717,7 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 8576, + 9344, 8048 ] }, @@ -739,7 +739,7 @@ "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ - 8864, + 9632, 8048 ], "retryOnFail": true, @@ -763,7 +763,7 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 9136, + 9904, 8048 ], "notesInFlow": true, @@ -787,7 +787,7 @@ "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ - 9424, + 10192, 8048 ], "retryOnFail": true, @@ -811,7 +811,7 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 9696, + 10464, 8048 ], "notesInFlow": true, @@ -835,8 +835,8 @@ "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ - 9984, - 8048 + 11728, + 8208 ], "retryOnFail": true, "maxTries": 3, @@ -859,8 +859,8 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 10256, - 8048 + 12000, + 8208 ], "notesInFlow": true, "notes": "Genera un permiso de edición para cada destinatario oficial: Isaac, Estefani, Angie, Mati, Iveth y Máximo." @@ -896,8 +896,8 @@ "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ - 10544, - 8048 + 12288, + 8208 ], "retryOnFail": true, "maxTries": 3, @@ -920,8 +920,8 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 10816, - 8048 + 12560, + 8208 ] }, { @@ -953,8 +953,8 @@ "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ - 11104, - 8048 + 12848, + 8208 ], "retryOnFail": true, "maxTries": 3, @@ -977,8 +977,8 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 11376, - 8048 + 13120, + 8208 ] }, { @@ -1003,8 +1003,8 @@ "type": "n8n-nodes-base.gmail", "typeVersion": 2.2, "position": [ - 11664, - 8048 + 13408, + 8208 ], "retryOnFail": true, "maxTries": 3, @@ -1028,8 +1028,8 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 11936, - 8048 + 13680, + 8208 ] }, { @@ -1047,8 +1047,8 @@ "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ - 12224, - 8048 + 13968, + 8208 ], "retryOnFail": true, "maxTries": 3, @@ -1071,8 +1071,8 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 12496, - 8048 + 14240, + 8208 ] }, { @@ -1086,8 +1086,8 @@ "type": "n8n-nodes-base.form", "typeVersion": 2.5, "position": [ - 12784, - 8048 + 14528, + 8208 ], "webhookId": "2f187e78-3b59-4f38-8bd8-25c62d471d83", "notesInFlow": true, @@ -1120,7 +1120,7 @@ "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ - 6896, + 7664, 8048 ], "notesInFlow": true, @@ -1134,6 +1134,54 @@ } }, "notes": "Confirma explícitamente el nombre del archivo en Google Drive para evitar que el reporte quede como Untitled." + }, + { + "parameters": { + "content": "# 📥 RECEPCIÓN Y PREPARACIÓN DE NÓMINAS — IR NICARAGUA\n\nRecibe desde el formulario los archivos de nómina correspondientes al período y los prepara para el cálculo mensual del IR.\n\n## Conversión de archivos\n\nEl flujo:\n\n1. Separa y valida los archivos recibidos.\n2. Crea una sesión resumible para conservar el contexto.\n3. Convierte cada archivo XLSX temporalmente a Google Sheets.\n4. Reincorpora los archivos convertidos a la sesión.\n5. Espera que Google complete la conversión.\n6. Agrupa todos los archivos disponibles para procesarlos conjuntamente.\n\n## Lectura de las nóminas\n\nDespués de convertir los archivos:\n\n- Consulta las pestañas de cada libro.\n- Obtiene sus nombres e identificadores internos.\n- Prepara los rangos que deben leerse.\n- Recupera la información de todas las hojas.\n- Normaliza encabezados, empleados, identificaciones y valores monetarios.\n- Consolida las distintas quincenas y modalidades de pago.\n\n## Preparación de la memoria de cálculo\n\nCon los datos leídos:\n\n- Se identifican empleados únicos.\n- Se relacionan las nóminas del período.\n- Se preparan los valores que alimentarán la plantilla de IR.\n- Se conserva la procedencia de cada monto para validación.\n- Se transforma la plantilla embebida en un archivo utilizable.\n\nReglas:\n\n- No calcular IR directamente sobre los archivos originales.\n- No perder empleados presentes en una sola quincena.\n- No mezclar registros sin validar su identidad.\n- Mantener los archivos originales intactos.\n- Esperar la conversión completa antes de consultar las pestañas.\n- La plantilla embebida debe conservar su estructura y fórmulas.", + "height": 912, + "width": 4384, + "color": 2 + }, + "type": "n8n-nodes-base.stickyNote", + "typeVersion": 1, + "position": [ + 1024, + 7504 + ], + "id": "12eb54c4-d670-47ef-b928-efdc119ab354", + "name": "Sticky Note" + }, + { + "parameters": { + "content": "# 🧮 CÁLCULO DEL IR Y CONSTRUCCIÓN DE DIFERENCIAS\n\nCrea una copia operativa de la plantilla, llena la memoria de cálculo y recupera el IR calculado mediante las fórmulas oficiales del reporte.\n\n## Creación del reporte\n\nEl flujo:\n\n1. Inicia la sesión correspondiente al entregable.\n2. Reincorpora la plantilla preparada.\n3. Crea el Google Sheet de memoria.\n4. Asigna el título según el mes y año procesados.\n5. Espera que Google termine de crear el documento.\n6. Consulta la estructura y los IDs internos de sus hojas.\n\n## Llenado de la memoria\n\nLa información consolidada de las nóminas se transforma al formato requerido por la plantilla.\n\nSe escriben datos como:\n\n- Empleado e identificadores.\n- Ingresos de primera y segunda quincena.\n- Modalidad mensual o quincenal.\n- Ingresos acumulados.\n- IR retenido en nómina.\n- Valores necesarios para las fórmulas del cálculo.\n\nDespués de escribir los datos, el flujo espera que Google Sheets recalcule todas las fórmulas.\n\n## Lectura del IR calculado\n\nCuando el recálculo termina:\n\n- Se recupera el IR mensual esperado.\n- Se compara contra el IR retenido en las nóminas.\n- Se identifican diferencias materiales.\n- Se separan los casos no comparables.\n- Se conservan los empleados presentes en una sola quincena.\n\n## Hoja de diferencias\n\nLa hoja final incluye únicamente los casos que requieren revisión, indicando:\n\n- IR retenido.\n- IR esperado.\n- Diferencia.\n- Motivo o clasificación.\n- Quincenas disponibles.\n- Estado comparable o no comparable.\n\nReglas:\n\n- No calcular manualmente valores que corresponden a fórmulas de la plantilla.\n- No leer resultados antes de finalizar el recálculo.\n- Los empleados presentes en una sola quincena deben quedar como “No comparable”.\n- No presentar como diferencia real un caso con información incompleta.\n- Mantener la trazabilidad entre nómina, memoria y resultado calculado.", + "height": 1120, + "width": 5040, + "color": 3 + }, + "type": "n8n-nodes-base.stickyNote", + "typeVersion": 1, + "position": [ + 5680, + 7440 + ], + "id": "37146b93-cbfa-420b-b36a-a15cf00a3594", + "name": "Sticky Note1" + }, + { + "parameters": { + "content": "# 📤 ENTREGA DEL REPORTE Y LIMPIEZA FINAL\n\nAplica el formato definitivo, distribuye el reporte, envía el archivo Excel y elimina los documentos temporales utilizados durante la ejecución.\n\n## Formato del reporte\n\nEl flujo aplica ajustes como:\n\n- Encabezados y títulos.\n- Formatos monetarios.\n- Formatos de fechas.\n- Alineación de columnas.\n- Anchos y alturas.\n- Filtros y filas congeladas.\n- Ocultamiento de columnas técnicas.\n- Presentación visual de la hoja de diferencias.\n\n## Permisos y distribución\n\nDespués de completar el reporte:\n\n1. Prepara los permisos de los destinatarios.\n2. Comparte el Google Sheet con las personas autorizadas.\n3. Conserva el enlace final del documento.\n4. Continúa solamente después de completar la distribución.\n\n## Exportación y correo\n\nEl reporte también se exporta a formato XLSX.\n\nLuego:\n\n- Se asigna un nombre identificable con el período.\n- Se prepara el mensaje de correo.\n- Se adjunta el archivo Excel.\n- Se envía mediante Gmail a los destinatarios definidos.\n\nEl Google Sheet permite revisión colaborativa y el XLSX funciona como entregable descargable.\n\n## Limpieza de temporales\n\nAl finalizar:\n\n1. Se identifican las nóminas convertidas temporalmente.\n2. Se eliminan únicamente los archivos de staging.\n3. Se conservan los archivos originales.\n4. Se confirma que la limpieza terminó.\n5. Se muestra al usuario la página final del formulario.\n\nReglas:\n\n- No compartir el reporte antes de completar el formato.\n- No enviar el correo antes de exportar correctamente el XLSX.\n- No eliminar archivos temporales mientras sigan siendo necesarios.\n- No borrar nóminas originales ni el reporte final.\n- No mostrar confirmación de éxito si falló la distribución o el correo.\n- La página final debe indicar claramente que el proceso terminó.", + "height": 1088, + "width": 3792, + "color": "#28551B" + }, + "type": "n8n-nodes-base.stickyNote", + "typeVersion": 1, + "position": [ + 11008, + 7424 + ], + "id": "35f04532-48af-4ec3-a26c-efe374da370e", + "name": "Sticky Note2" } ], "connections": { @@ -1559,13 +1607,17 @@ "settings": { "executionOrder": "v1", "binaryMode": "separate", - "availableInMCP": true + "availableInMCP": true, + "timeSavedMode": "fixed", + "errorWorkflow": "puF4LUczoSz3hcek", + "timezone": "America/Santo_Domingo", + "callerPolicy": "workflowsFromSameOwner" }, "staticData": null, "meta": null, - "versionId": "d6ea5f21-17e3-4775-8098-95789b121c37", - "activeVersionId": "d6ea5f21-17e3-4775-8098-95789b121c37", - "versionCounter": 64, + "versionId": "f3a9248e-5987-455f-b00f-2e0a575c9a37", + "activeVersionId": "f3a9248e-5987-455f-b00f-2e0a575c9a37", + "versionCounter": 102, "triggerCount": 1, "shared": [ { @@ -1588,9 +1640,9 @@ ], "tags": [], "activeVersion": { - "updatedAt": "2026-07-14T23:30:35.000Z", - "createdAt": "2026-07-14T23:30:25.129Z", - "versionId": "d6ea5f21-17e3-4775-8098-95789b121c37", + "updatedAt": "2026-07-22T01:12:29.000Z", + "createdAt": "2026-07-22T01:12:27.696Z", + "versionId": "f3a9248e-5987-455f-b00f-2e0a575c9a37", "workflowId": "V1JFqI8iDtzzO5F0", "nodes": [ { @@ -1726,8 +1778,8 @@ "type": "n8n-nodes-base.formTrigger", "typeVersion": 2.3, "position": [ - 2176, - 8048 + 1584, + 8032 ], "id": "b3c9cfd2-6407-4bcb-ba7c-fb946106d90b", "name": "Formulario IR Nicaragua", @@ -1742,8 +1794,8 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 2448, - 8048 + 1856, + 8032 ], "notesInFlow": true, "notes": "Separa Q1 y Q2 y conserva sus binarios. No usa this.helpers, require() ni módulos externos." @@ -1798,8 +1850,8 @@ "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ - 2736, - 8048 + 2144, + 8032 ], "notesInFlow": true, "retryOnFail": true, @@ -1822,8 +1874,8 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 3008, - 8048 + 2416, + 8032 ], "notesInFlow": true, "notes": "Vuelve a unir cada URL resumible con el archivo XLSX correspondiente. No lee ni reconstruye el binario." @@ -1855,8 +1907,8 @@ "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ - 3296, - 8048 + 2704, + 8032 ], "notesInFlow": true, "retryOnFail": true, @@ -1879,8 +1931,8 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 3584, - 8048 + 2992, + 8032 ] }, { @@ -1892,8 +1944,8 @@ "type": "n8n-nodes-base.wait", "typeVersion": 1.1, "position": [ - 3856, - 8048 + 3264, + 8032 ], "webhookId": "36fcbd67-c472-445b-bf35-a2c293ff2cf2", "notesInFlow": true, @@ -1908,8 +1960,8 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 4144, - 8048 + 3552, + 8032 ] }, { @@ -1935,8 +1987,8 @@ "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ - 4416, - 8048 + 3824, + 8032 ], "notesInFlow": true, "retryOnFail": true, @@ -1959,8 +2011,8 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 4704, - 8048 + 4112, + 8032 ] }, { @@ -1981,8 +2033,8 @@ "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ - 4976, - 8048 + 4384, + 8032 ], "notesInFlow": true, "retryOnFail": true, @@ -2005,8 +2057,8 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 5264, - 8048 + 4672, + 8032 ], "notesInFlow": true, "notes": "Motor de lectura y conciliación en producción. El correo y el acceso de edición al reporte se asignan a Isaac, Estefani, Angie, Mati, Iveth y Máximo." @@ -2020,8 +2072,8 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 5536, - 8048 + 4944, + 8032 ], "notesInFlow": true, "notes": "Plantilla XLSX saneada: conserva fórmulas, estilos y las dos pestañas, pero elimina metadatos de comentarios heredados que podían impedir la importación en Google Sheets." @@ -2041,8 +2093,8 @@ "type": "n8n-nodes-base.convertToFile", "typeVersion": 1.1, "position": [ - 5824, - 8048 + 5232, + 8032 ], "notesInFlow": true, "notes": "Convierte la plantilla embebida en un archivo XLSX binario usando un nodo nativo de n8n." @@ -2101,7 +2153,7 @@ "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ - 6096, + 6864, 8048 ], "retryOnFail": true, @@ -2125,7 +2177,7 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 6384, + 7152, 8048 ], "notesInFlow": true, @@ -2162,7 +2214,7 @@ "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ - 6656, + 7424, 8048 ], "retryOnFail": true, @@ -2186,7 +2238,7 @@ "type": "n8n-nodes-base.wait", "typeVersion": 1.1, "position": [ - 7184, + 7952, 8048 ], "webhookId": "e611d2dd-0f14-4dc2-9358-349be9fefe66", @@ -2216,7 +2268,7 @@ "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ - 7456, + 8224, 8048 ], "retryOnFail": true, @@ -2240,7 +2292,7 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 7744, + 8512, 8048 ], "notes": "Escribe el título correcto, elimina los dos valores “1” heredados de la plantilla y llena la memoria con todos los empleados." @@ -2263,7 +2315,7 @@ "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ - 8016, + 8784, 8048 ], "retryOnFail": true, @@ -2287,7 +2339,7 @@ "type": "n8n-nodes-base.wait", "typeVersion": 1.1, "position": [ - 8304, + 9072, 8048 ], "webhookId": "ce72c97f-636e-4e9c-8ef6-bf6b13a7f239", @@ -2303,7 +2355,7 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 8576, + 9344, 8048 ] }, @@ -2325,7 +2377,7 @@ "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ - 8864, + 9632, 8048 ], "retryOnFail": true, @@ -2349,7 +2401,7 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 9136, + 9904, 8048 ], "notesInFlow": true, @@ -2373,7 +2425,7 @@ "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ - 9424, + 10192, 8048 ], "retryOnFail": true, @@ -2397,7 +2449,7 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 9696, + 10464, 8048 ], "notesInFlow": true, @@ -2421,8 +2473,8 @@ "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ - 9984, - 8048 + 11728, + 8208 ], "retryOnFail": true, "maxTries": 3, @@ -2445,8 +2497,8 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 10256, - 8048 + 12000, + 8208 ], "notesInFlow": true, "notes": "Genera un permiso de edición para cada destinatario oficial: Isaac, Estefani, Angie, Mati, Iveth y Máximo." @@ -2482,8 +2534,8 @@ "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ - 10544, - 8048 + 12288, + 8208 ], "retryOnFail": true, "maxTries": 3, @@ -2506,8 +2558,8 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 10816, - 8048 + 12560, + 8208 ] }, { @@ -2539,8 +2591,8 @@ "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ - 11104, - 8048 + 12848, + 8208 ], "retryOnFail": true, "maxTries": 3, @@ -2563,8 +2615,8 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 11376, - 8048 + 13120, + 8208 ] }, { @@ -2589,8 +2641,8 @@ "type": "n8n-nodes-base.gmail", "typeVersion": 2.2, "position": [ - 11664, - 8048 + 13408, + 8208 ], "retryOnFail": true, "maxTries": 3, @@ -2614,8 +2666,8 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 11936, - 8048 + 13680, + 8208 ] }, { @@ -2633,8 +2685,8 @@ "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ - 12224, - 8048 + 13968, + 8208 ], "retryOnFail": true, "maxTries": 3, @@ -2657,8 +2709,8 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - 12496, - 8048 + 14240, + 8208 ] }, { @@ -2672,8 +2724,8 @@ "type": "n8n-nodes-base.form", "typeVersion": 2.5, "position": [ - 12784, - 8048 + 14528, + 8208 ], "webhookId": "2f187e78-3b59-4f38-8bd8-25c62d471d83", "notesInFlow": true, @@ -2706,7 +2758,7 @@ "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ - 6896, + 7664, 8048 ], "notesInFlow": true, @@ -2720,6 +2772,54 @@ } }, "notes": "Confirma explícitamente el nombre del archivo en Google Drive para evitar que el reporte quede como Untitled." + }, + { + "parameters": { + "content": "# 📥 RECEPCIÓN Y PREPARACIÓN DE NÓMINAS — IR NICARAGUA\n\nRecibe desde el formulario los archivos de nómina correspondientes al período y los prepara para el cálculo mensual del IR.\n\n## Conversión de archivos\n\nEl flujo:\n\n1. Separa y valida los archivos recibidos.\n2. Crea una sesión resumible para conservar el contexto.\n3. Convierte cada archivo XLSX temporalmente a Google Sheets.\n4. Reincorpora los archivos convertidos a la sesión.\n5. Espera que Google complete la conversión.\n6. Agrupa todos los archivos disponibles para procesarlos conjuntamente.\n\n## Lectura de las nóminas\n\nDespués de convertir los archivos:\n\n- Consulta las pestañas de cada libro.\n- Obtiene sus nombres e identificadores internos.\n- Prepara los rangos que deben leerse.\n- Recupera la información de todas las hojas.\n- Normaliza encabezados, empleados, identificaciones y valores monetarios.\n- Consolida las distintas quincenas y modalidades de pago.\n\n## Preparación de la memoria de cálculo\n\nCon los datos leídos:\n\n- Se identifican empleados únicos.\n- Se relacionan las nóminas del período.\n- Se preparan los valores que alimentarán la plantilla de IR.\n- Se conserva la procedencia de cada monto para validación.\n- Se transforma la plantilla embebida en un archivo utilizable.\n\nReglas:\n\n- No calcular IR directamente sobre los archivos originales.\n- No perder empleados presentes en una sola quincena.\n- No mezclar registros sin validar su identidad.\n- Mantener los archivos originales intactos.\n- Esperar la conversión completa antes de consultar las pestañas.\n- La plantilla embebida debe conservar su estructura y fórmulas.", + "height": 912, + "width": 4384, + "color": 2 + }, + "type": "n8n-nodes-base.stickyNote", + "typeVersion": 1, + "position": [ + 1024, + 7504 + ], + "id": "12eb54c4-d670-47ef-b928-efdc119ab354", + "name": "Sticky Note" + }, + { + "parameters": { + "content": "# 🧮 CÁLCULO DEL IR Y CONSTRUCCIÓN DE DIFERENCIAS\n\nCrea una copia operativa de la plantilla, llena la memoria de cálculo y recupera el IR calculado mediante las fórmulas oficiales del reporte.\n\n## Creación del reporte\n\nEl flujo:\n\n1. Inicia la sesión correspondiente al entregable.\n2. Reincorpora la plantilla preparada.\n3. Crea el Google Sheet de memoria.\n4. Asigna el título según el mes y año procesados.\n5. Espera que Google termine de crear el documento.\n6. Consulta la estructura y los IDs internos de sus hojas.\n\n## Llenado de la memoria\n\nLa información consolidada de las nóminas se transforma al formato requerido por la plantilla.\n\nSe escriben datos como:\n\n- Empleado e identificadores.\n- Ingresos de primera y segunda quincena.\n- Modalidad mensual o quincenal.\n- Ingresos acumulados.\n- IR retenido en nómina.\n- Valores necesarios para las fórmulas del cálculo.\n\nDespués de escribir los datos, el flujo espera que Google Sheets recalcule todas las fórmulas.\n\n## Lectura del IR calculado\n\nCuando el recálculo termina:\n\n- Se recupera el IR mensual esperado.\n- Se compara contra el IR retenido en las nóminas.\n- Se identifican diferencias materiales.\n- Se separan los casos no comparables.\n- Se conservan los empleados presentes en una sola quincena.\n\n## Hoja de diferencias\n\nLa hoja final incluye únicamente los casos que requieren revisión, indicando:\n\n- IR retenido.\n- IR esperado.\n- Diferencia.\n- Motivo o clasificación.\n- Quincenas disponibles.\n- Estado comparable o no comparable.\n\nReglas:\n\n- No calcular manualmente valores que corresponden a fórmulas de la plantilla.\n- No leer resultados antes de finalizar el recálculo.\n- Los empleados presentes en una sola quincena deben quedar como “No comparable”.\n- No presentar como diferencia real un caso con información incompleta.\n- Mantener la trazabilidad entre nómina, memoria y resultado calculado.", + "height": 1120, + "width": 5040, + "color": 3 + }, + "type": "n8n-nodes-base.stickyNote", + "typeVersion": 1, + "position": [ + 5680, + 7440 + ], + "id": "37146b93-cbfa-420b-b36a-a15cf00a3594", + "name": "Sticky Note1" + }, + { + "parameters": { + "content": "# 📤 ENTREGA DEL REPORTE Y LIMPIEZA FINAL\n\nAplica el formato definitivo, distribuye el reporte, envía el archivo Excel y elimina los documentos temporales utilizados durante la ejecución.\n\n## Formato del reporte\n\nEl flujo aplica ajustes como:\n\n- Encabezados y títulos.\n- Formatos monetarios.\n- Formatos de fechas.\n- Alineación de columnas.\n- Anchos y alturas.\n- Filtros y filas congeladas.\n- Ocultamiento de columnas técnicas.\n- Presentación visual de la hoja de diferencias.\n\n## Permisos y distribución\n\nDespués de completar el reporte:\n\n1. Prepara los permisos de los destinatarios.\n2. Comparte el Google Sheet con las personas autorizadas.\n3. Conserva el enlace final del documento.\n4. Continúa solamente después de completar la distribución.\n\n## Exportación y correo\n\nEl reporte también se exporta a formato XLSX.\n\nLuego:\n\n- Se asigna un nombre identificable con el período.\n- Se prepara el mensaje de correo.\n- Se adjunta el archivo Excel.\n- Se envía mediante Gmail a los destinatarios definidos.\n\nEl Google Sheet permite revisión colaborativa y el XLSX funciona como entregable descargable.\n\n## Limpieza de temporales\n\nAl finalizar:\n\n1. Se identifican las nóminas convertidas temporalmente.\n2. Se eliminan únicamente los archivos de staging.\n3. Se conservan los archivos originales.\n4. Se confirma que la limpieza terminó.\n5. Se muestra al usuario la página final del formulario.\n\nReglas:\n\n- No compartir el reporte antes de completar el formato.\n- No enviar el correo antes de exportar correctamente el XLSX.\n- No eliminar archivos temporales mientras sigan siendo necesarios.\n- No borrar nóminas originales ni el reporte final.\n- No mostrar confirmación de éxito si falló la distribución o el correo.\n- La página final debe indicar claramente que el proceso terminó.", + "height": 1088, + "width": 3792, + "color": "#28551B" + }, + "type": "n8n-nodes-base.stickyNote", + "typeVersion": 1, + "position": [ + 11008, + 7424 + ], + "id": "35f04532-48af-4ec3-a26c-efe374da370e", + "name": "Sticky Note2" } ], "connections": { @@ -3143,17 +3243,33 @@ } }, "authors": "Isaac Aracena", - "name": "Version d6ea5f21", + "name": "Version f3a9248e", "description": "", "autosaved": true, "workflowPublishHistory": [ { - "createdAt": "2026-07-14T23:30:35.052Z", - "id": 2941, + "createdAt": "2026-07-22T01:12:29.799Z", + "id": 3350, "workflowId": "V1JFqI8iDtzzO5F0", - "versionId": "d6ea5f21-17e3-4775-8098-95789b121c37", + "versionId": "f3a9248e-5987-455f-b00f-2e0a575c9a37", "event": "activated", "userId": "0a88c0b1-928e-4412-896e-c5d1c99b2029" + }, + { + "createdAt": "2026-07-25T17:31:59.499Z", + "id": 3474, + "workflowId": "V1JFqI8iDtzzO5F0", + "versionId": "f3a9248e-5987-455f-b00f-2e0a575c9a37", + "event": "activated", + "userId": "0a88c0b1-928e-4412-896e-c5d1c99b2029" + }, + { + "createdAt": "2026-07-25T17:31:59.413Z", + "id": 3473, + "workflowId": "V1JFqI8iDtzzO5F0", + "versionId": "f3a9248e-5987-455f-b00f-2e0a575c9a37", + "event": "deactivated", + "userId": "0a88c0b1-928e-4412-896e-c5d1c99b2029" } ] }