Files
ir-nicaragua/README.md
T
2026-07-16 00:14:40 +00:00

597 lines
19 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Cálculo de IR — Nicaragua
> Automatización mensual que procesa las nóminas de primera y segunda quincena, recalcula el Impuesto sobre la Renta de cada empleado, identifica diferencias y genera una memoria de cálculo completa para Administración.
---
## Información general
| Campo | Detalle |
|---|---|
| **Proyecto** | Cálculo de IR — Nicaragua |
| **Área** | Administración / Nómina |
| **Estado** | Listo para producción |
| **Developer principal** | Isaac Aracena |
| **Product Owner / Sponsor** | Máximo Gomez |
| **IT Manager** | Luis Matos |
| **Fecha de inicio** | 2026-07-10 |
| **Fecha de cierre técnico** | 2026-07-15 |
| **Tipo de iniciativa** | Automatización operativa mensual |
| **Board de ejecución** | [Kan.bn — IR Nicaragua](https://pmit.digitalcompass.agency/cards/z7ms5z0ciw1k) |
| **Repositorio** | [Gitea — ir-nicaragua](https://git.digitalcompass.agency/Isaac_Aracena/ir-nicaragua) |
| **Workflow principal** | `Cálculo de IR - Nicaragua.json` |
| **Workflow auxiliar** | Limpieza de archivos temporales de IR Nicaragua |
---
## Objetivo
### Problema que resuelve
Administración de Nicaragua utilizaba una memoria de cálculo de Excel para validar el IR mensual, pero debía copiar manualmente la información de cada empleado desde las nóminas de primera y segunda quincena. Aunque el Excel contenía las fórmulas fiscales, la digitación empleado por empleado consumía demasiado tiempo, aumentaba el riesgo de errores y dificultaba revisar oportunamente las diferencias del sistema de nómina.
### Solución implementada
El sistema presenta un formulario en n8n donde Administración selecciona el mes y el año, adjunta las dos nóminas en formato `.xlsx` y ejecuta la validación. El workflow lee automáticamente todas las pestañas operativas, cruza a los empleados, recalcula el IR, genera una memoria completa en Google Sheets y Excel, crea una pestaña exclusiva de diferencias y envía un resumen por correo.
### Usuarios y beneficiarios
- Administración de GomezLee Marketing Nicaragua.
- Personal responsable de validar nómina e IR.
- Recursos Humanos.
- Dirección administrativa.
- Dirección de Recursos Humanos.
- Equipo de IT que monitorea la automatización.
---
## Arquitectura
### Diagrama general
```text
Formulario n8n
|
|-- Mes
|-- Año
|-- Nómina Q1 (.xlsx)
`-- Nómina Q2 (.xlsx)
|
v
Conversión temporal de XLSX a Google Sheets
|
v
Lectura de todas las pestañas operativas
|
v
Normalización y cruce de empleados
|
v
Recalculo independiente del IR
|
v
Creación de memoria de cálculo
|-- MEMORIA DE CALCULO
`-- DIFERENCIAS
|
+--> Compartir Google Sheet
+--> Exportar copia XLSX
+--> Enviar correo HTML
`--> Eliminar archivos temporales
```
### Stack tecnológico
| Componente | Tecnología | Propósito |
|---|---|---|
| Automatización | n8n self-hosted | Orquestación del proceso |
| Interfaz de entrada | n8n Form Trigger | Recepción de período y archivos |
| Procesamiento | JavaScript nativo en Code nodes | Lectura lógica, normalización, cruce y cálculo |
| Conversión de archivos | Google Drive API | Conversión temporal de XLSX a Google Sheets |
| Lectura y escritura | Google Sheets API | Lectura multih hoja, fórmulas, formato y reporte |
| Notificaciones | Gmail OAuth2 | Envío del correo HTML y del Excel adjunto |
| Almacenamiento temporal | Google Drive | Archivos temporales durante la ejecución |
| Infraestructura | Servidor corporativo GLM | Hosting de n8n |
| Base de datos | No aplica | El flujo no requiere base de datos |
### Integraciones externas
| Sistema | Tipo de integración | Datos que fluyen |
|---|---|---|
| Google Drive | OAuth2 / REST API | Carga, conversión, exportación, permisos y eliminación |
| Google Sheets | OAuth2 / REST API | Lectura de pestañas, escritura, fórmulas y formato |
| Gmail | OAuth2 | Correo HTML y archivo Excel adjunto |
| n8n Form | Trigger web | Mes, año y nóminas Q1/Q2 |
---
## Reglas de negocio
### Archivos de entrada
1. El formulario exige dos archivos: nómina de primera quincena y nómina de segunda quincena.
2. Ambos archivos deben estar en formato `.xlsx`.
3. Los dos libros deben corresponder al mismo mes y año seleccionados.
4. La validación del período se realiza con el contenido de cada pestaña, no únicamente con el nombre del archivo.
5. El archivo Q1 admite hojas con período del día 1 al 15.
6. El archivo Q2 admite hojas del día 16 al 28, 29, 30 o 31 y hojas mensuales del día 1 al 28, 29, 30 o 31.
7. Se excluyen automáticamente resúmenes, hojas auxiliares, copias de otros períodos, filas de totales y notas administrativas.
### Fuente monetaria para el cálculo
La fuente principal es la columna **Salario INSS**, porque representa el ingreso bruto sujeto a INSS antes de descontar el 7 %.
Cuando `Salario INSS` está vacío, se aplican los siguientes respaldos:
1. `Salario IR / 0.93`.
2. `INSS Laboral / 0.07`.
3. El registro se marca como dato derivado o incompleto.
No se utiliza `Total Ingresos` como fuente principal, porque puede incluir subsidios u otros conceptos no sujetos a INSS o IR.
### Cruce de empleados
El orden de coincidencia es:
1. Cédula normalizada.
2. Número de INSS válido.
3. Nombre normalizado.
El empleado no necesita permanecer en la misma hoja, proyecto o cliente entre las dos quincenas.
### Cálculo para personal quincenal
```text
Ingreso sujeto mensual = Salario INSS Q1 + Salario INSS Q2
INSS laboral = Ingreso sujeto mensual × 7 %
Base imponible = Ingreso sujeto mensual INSS laboral
Proyección anual = Base imponible × 12
```
A la proyección anual se le aplica la tabla progresiva del IR de Nicaragua.
### Cálculo para personal mensual
Para empleados incluidos en una hoja mensual dentro del archivo Q2:
```text
Ingreso sujeto mensual = Salario INSS mensual de Q2
```
No se busca una pareja en Q1 porque el valor de Q2 ya representa el mes completo.
### Tabla fiscal aplicada
| Renta anual | Porcentaje | Impuesto base | Exceso sobre |
|---:|---:|---:|---:|
| Hasta C$100,000.00 | 0 % | C$0.00 | C$0.00 |
| C$100,000.01 a C$200,000.00 | 15 % | C$0.00 | C$100,000.00 |
| C$200,000.01 a C$350,000.00 | 20 % | C$15,000.00 | C$200,000.00 |
| C$350,000.01 a C$500,000.00 | 25 % | C$45,000.00 | C$350,000.00 |
| Más de C$500,000.00 | 30 % | C$82,500.00 | C$500,000.00 |
### Comparación
```text
Diferencia = IR registrado en nómina Q2 IR esperado
```
- Resultado negativo: la nómina retuvo menos IR del esperado.
- Resultado positivo: la nómina retuvo más IR del esperado.
- Diferencia absoluta menor o igual a C$1.00: tolerancia de redondeo.
- Diferencia absoluta mayor a C$1.00: diferencia material.
### Estados del reporte
| Estado | Significado |
|---|---|
| `VALIDADO` | El IR se encuentra dentro de la tolerancia |
| `DIFERENCIA IR` | Existe una diferencia material mayor a C$1.00 |
| `SOLO EN 1RA QUINCENA` | El empleado no aparece en Q2 |
| `SOLO EN 2DA QUINCENA` | El empleado no aparece en Q1 |
| `DATO DERIVADO` | Se utilizó un respaldo o el cruce fue por nombre |
| `DATO INCOMPLETO` | No fue posible obtener toda la información requerida |
Los empleados presentes en una sola quincena se muestran como **No comparables**; el flujo no presenta un cálculo parcial como si fuera una validación mensual completa.
### Colores del reporte
- **Rojo:** diferencia material de IR.
- **Amarillo:** empleado presente en una sola quincena.
- **Naranja:** dato incompleto.
- **Azul:** dato derivado o emparejamiento por nombre.
- **Sin alerta:** empleado validado.
---
## Reportes generados
### Pestaña `MEMORIA DE CALCULO`
Contiene a todos los empleados identificados y conserva la estructura de la memoria original:
- NSS, cédula, nombres, cargo, empresa y departamento.
- Salario contractual, primera quincena y segunda quincena.
- Total, INSS, base imponible y proyección anual.
- Exceso, diferencia, porcentaje e impuesto base.
- IR anual, IR mensual e IR quincenal.
La tabla fiscal y las columnas técnicas se mantienen ocultas para facilitar la lectura.
### Pestaña `DIFERENCIAS`
Muestra únicamente registros que requieren atención:
- Diferencias materiales.
- Empleados presentes en una sola quincena.
- Datos derivados.
- Datos incompletos.
Incluye IR esperado, IR de nómina, diferencia, estado, interpretación, observación, hojas de origen y método de cruce.
### Correo HTML
El correo incluye:
- Branding y logo de GomezLee Marketing.
- Período procesado.
- Empleados Q1, Q2 y emparejados.
- Diferencias materiales.
- Empleados presentes en una sola quincena.
- Datos por revisar.
- Tabla con las principales diferencias.
- Botón para abrir el Google Sheet.
- Copia del reporte en formato Excel.
---
## Destinatarios y permisos
El correo y el acceso de edición al Google Sheet se asignan a:
| Nombre | Correo |
|---|---|
| Isaac Aracena | `iaracena@gomezleemarketing.com` |
| Estefani Orozco | `administrativo@gomezleemarketing.com` |
| Angie Carolina Chavez Silva | `administrativonicaragua@gomezleemarketing.com` |
| Mati Soto Valenzuela | `msoto@gomezleemarketing.com` |
| Iveth Herrera | `iherrera@gomezleemarketing.com` |
| Máximo Gomez | `mgomez@gomezleemarketing.com` |
No existe modo de prueba en la versión de producción. Cada ejecución envía el correo y comparte el documento con las seis personas configuradas.
---
## Configuración y setup
### Prerrequisitos
- Acceso al servidor corporativo de n8n.
- Google Drive API habilitada.
- Google Sheets API habilitada.
- Credencial OAuth2 de Google Drive en n8n.
- Credencial OAuth2 de Google Sheets en n8n.
- Credencial OAuth2 de Gmail en n8n.
- Permisos de Google Workspace para crear, compartir y eliminar archivos.
### Credenciales requeridas
| Credencial | Uso |
|---|---|
| Google Drive OAuth2 | Conversión, exportación, permisos y eliminación |
| Google Sheets OAuth2 | Lectura, escritura, fórmulas y formato |
| Gmail OAuth2 | Envío del correo y adjunto |
> Nunca incluir tokens, secretos OAuth ni contraseñas en el repositorio.
### Variables de entorno
El proyecto no requiere variables de entorno adicionales ni cambios al servidor.
No necesita ExcelJS, `require()`, `NODE_FUNCTION_ALLOW_EXTERNAL`, Dockerfile personalizado ni paquetes npm externos.
### Instalación
```bash
git clone https://git.digitalcompass.agency/Isaac_Aracena/ir-nicaragua.git
cd ir-nicaragua
```
1. Abrir n8n.
2. Ir a **Workflows**.
3. Seleccionar **Import from File**.
4. Importar `Cálculo de IR - Nicaragua.json`.
5. Confirmar las credenciales de Google Drive, Google Sheets y Gmail.
6. Guardar y publicar el workflow.
7. Copiar la Production URL del Form Trigger.
8. Registrar la URL en Kan.bn y compartirla únicamente con usuarios autorizados.
### Workflow de limpieza
El workflow auxiliar revisa diariamente Google Drive y elimina archivos temporales cuyo nombre comienza con:
```text
TMP_IR_NIC_
```
Solo elimina temporales con más de 24 horas para cubrir ejecuciones interrumpidas.
---
## Cómo funciona
1. Administración abre el formulario.
2. Selecciona mes y año.
3. Adjunta Q1 y Q2.
4. n8n valida los archivos.
5. Google Drive los convierte temporalmente a Google Sheets.
6. Google Sheets API enumera las pestañas.
7. Se identifican las hojas operativas válidas.
8. Se normalizan encabezados e identificadores.
9. Se extrae Salario INSS y el IR de Q2.
10. Se cruzan los empleados.
11. Se recalcula el IR.
12. Se crea la memoria completa.
13. Se genera la pestaña `DIFERENCIAS`.
14. Se comparte el Google Sheet.
15. Se exporta el Excel.
16. Gmail envía el correo.
17. Se eliminan los temporales.
18. El formulario muestra la confirmación.
### Triggers
| Trigger | Frecuencia | Descripción |
|---|---|---|
| n8n Form Trigger | Bajo demanda | Administración carga las nóminas |
| Schedule Trigger de limpieza | Diario, 2:00 a. m. | Elimina temporales con más de 24 horas |
---
## Testing
### Regresión histórica
| Período | Empleados Q1 | Empleados Q2 | Emparejados | Diferencias > C$1 | Solo en una quincena |
|---|---:|---:|---:|---:|---:|
| Marzo 2026 | 208 | 230 | 194 | 12 | 32 |
| Abril 2026 | 223 | 237 | 207 | 20 | 28 |
| Mayo 2026 | 225 | 245 | 220 | 14 | 13 |
### Casos de prueba
| Caso | Resultado esperado | Estado |
|---|---|---|
| Q1 y Q2 válidos | Reporte, correo y permisos correctos | Validado |
| Meses diferentes | Ejecución detenida | Validado |
| Archivo no XLSX | Rechazo antes de procesar | Validado |
| Hoja auxiliar | Excluida | Validado |
| Empleado mensual | Cálculo con Q2 mensual | Validado |
| Solo Q1 o solo Q2 | No comparable | Validado |
| Sin Salario INSS | Valor derivado y marcado | Validado |
| Diferencia ≤ C$1 | Redondeo | Validado |
| Diferencia > C$1 | Alerta roja | Validado |
| Error temporal de Google | Reintentos automáticos | Configurado |
| Fallo antes de limpiar | Limpieza diaria | Configurado |
---
## Errores conocidos y troubleshooting
| Error | Causa probable | Solución |
|---|---|---|
| Form Trigger con `?` | Versión incompatible | Usar `typeVersion: 2.3` |
| Error de `this.helpers` | Helper no soportado | Usar el workflow actual sin helpers |
| Google no convierte el XLSX | Sesión vencida o archivo incompatible | Iniciar una ejecución nueva |
| Error al aplicar formato | Columnas congeladas cortan celdas combinadas | Congelar solo filas |
| No encuentra hojas válidas | Mes/año incorrecto | Revisar archivos y selección |
| Coincidencia muy baja | Q1 y Q2 no corresponden | Cargar el mismo período |
| Correo no enviado | OAuth Gmail vencido | Reconectar la credencial |
| Permiso no creado | Restricción de Workspace | Revisar Google Admin |
| Timeout | Libro grande o servicio lento | Revisar retries y timeout |
| Temporales en Drive | Fallo antes de limpiar | Verificar workflow diario |
---
## Monitoreo
- Revisar **n8n → Executions** después de cada procesamiento.
- Verde significa completado; rojo significa fallo.
- Confirmar recepción del correo por los seis destinatarios.
- Confirmar las pestañas `MEMORIA DE CALCULO` y `DIFERENCIAS`.
- Confirmar el Excel adjunto.
- Confirmar la eliminación de temporales.
- Revisar el workflow de limpieza diariamente.
### Output esperado
1. Google Sheet con memoria completa.
2. Pestaña de diferencias.
3. Permisos de edición para seis destinatarios.
4. Correo HTML.
5. Excel adjunto.
6. Confirmación final en el formulario.
7. Eliminación de archivos temporales.
---
## Seguridad
- El formulario procesa datos sensibles de nómina.
- La URL debe compartirse únicamente con personal autorizado.
- No almacenar credenciales en el JSON.
- No publicar los reportes mediante acceso público por enlace.
- Eliminar temporales al finalizar.
- No subir nóminas reales ni reportes con datos personales al repositorio.
---
## Estructura del repositorio
```text
/ir-nicaragua
├── README.md
├── Cálculo de IR - Nicaragua.json
├── n8n/
│ ├── workflow-principal.json
│ └── workflow-limpieza-temporales.json
├── docs/
│ ├── arquitectura.md
│ ├── reglas-negocio.md
│ └── pruebas-historicas.md
├── CHANGELOG.md
└── DECISIONS.md
```
---
## Changelog
### 2026-07-15 — v1.0.0
- Workflow listo para producción.
- Formulario con Q1 y Q2.
- Lectura dinámica de pestañas.
- Cruce de empleados.
- Cálculo progresivo de IR.
- Memoria completa y pestaña de diferencias.
- Branding GLM.
- Correo HTML y Excel adjunto.
- Permisos para seis destinatarios.
- Limpieza de temporales.
- Pruebas de marzo, abril y mayo.
- Modo de prueba eliminado.
### 2026-07-13 — v0.9.0
- Ajustes de formato.
- Corrección de alineaciones y cuadrícula.
- Mejora de observaciones.
- Ajuste automático de filas.
- Corrección de celdas combinadas.
### 2026-07-10 — v0.1.0
- Inicio del proyecto.
- Análisis de la memoria.
- Análisis de nóminas.
- Definición de reglas.
---
## Decisions log
### DEC-001 — Exigir ambas quincenas
- **Decisión:** Q1 y Q2 son obligatorias.
- **Razón:** el IR depende de la suma real de ambas quincenas.
### DEC-002 — Usar Salario INSS
- **Decisión:** Salario INSS es la fuente principal.
- **Razón:** la memoria descuenta por sí misma el 7 %.
### DEC-003 — No instalar módulos externos
- **Decisión:** usar APIs de Google.
- **Razón:** no se puede modificar el servidor de n8n.
### DEC-004 — Tolerancia de C$1.00
- **Decisión:** reportar como material una diferencia absoluta mayor a C$1.
- **Razón:** excluir redondeos normales.
### DEC-005 — Dos pestañas
- **Decisión:** `MEMORIA DE CALCULO` y `DIFERENCIAS`.
- **Razón:** mantener trazabilidad y simplificar la revisión.
### DEC-006 — Una sola quincena no es comparable
- **Decisión:** dejar IR esperado y diferencia en blanco.
- **Razón:** evitar cálculos mensuales parciales.
### DEC-007 — Seis responsables
- **Decisión:** correo y edición para Isaac, Estefani, Angie, Mati, Iveth y Máximo.
- **Razón:** responsables oficiales de operación y seguimiento.
### DEC-008 — Limpieza automática
- **Decisión:** workflow diario de temporales.
- **Razón:** seguridad y mantenimiento de Drive.
---
## Contactos del proyecto
| Rol | Nombre | Contacto |
|---|---|---|
| Product Owner / Sponsor | Máximo Gomez | `mgomez@gomezleemarketing.com` |
| IT Manager | Luis Matos | Contacto corporativo GLM |
| Developer principal | Isaac Aracena | `iaracena@gomezleemarketing.com` |
| Administración Nicaragua | Estefani Orozco | `administrativo@gomezleemarketing.com` |
| Administración Nicaragua | Angie Carolina Chavez Silva | `administrativonicaragua@gomezleemarketing.com` |
| Revisión | Mati Soto Valenzuela | `msoto@gomezleemarketing.com` |
| Revisión | Iveth Herrera | `iherrera@gomezleemarketing.com` |
---
## Checklist mensual
Antes:
- [ ] Confirmar mismo mes en Q1 y Q2.
- [ ] Confirmar formato `.xlsx`.
- [ ] Seleccionar mes y año correctos.
Después:
- [ ] Confirmar ejecución verde.
- [ ] Abrir el Google Sheet.
- [ ] Revisar filas rojas.
- [ ] Revisar filas amarillas.
- [ ] Revisar datos derivados.
- [ ] Confirmar recepción del correo.
- [ ] Confirmar Excel adjunto.
- [ ] Confirmar permisos.
- [ ] Confirmar eliminación de temporales.
---
## Definition of Done
- [x] Memoria original analizada.
- [x] Nóminas históricas analizadas.
- [x] Reglas fiscales reproducidas.
- [x] Formulario funcionando.
- [x] Q1 y Q2 obligatorias.
- [x] Lectura multih hoja.
- [x] Cruce validado.
- [x] Google Sheet y Excel.
- [x] Pestaña de diferencias.
- [x] Correo HTML.
- [x] Permisos configurados.
- [x] Limpieza de temporales.
- [x] Pruebas históricas.
- [x] Workflow versionado.
- [x] README completo.
- [x] Modo de prueba eliminado.
- [ ] Validación formal final de Luis Matos.
- [ ] Aprobación formal final de Máximo Gomez.
---
## Mantenimiento
Todo cambio en la tasa del INSS, tabla fiscal, estructura de nóminas, encabezados, destinatarios, tolerancia o permisos debe:
1. Documentarse.
2. Probarse con un período histórico.
3. Exportarse nuevamente desde n8n.
4. Actualizarse en Gitea.
5. Registrarse en el changelog.
---
Documento mantenido por el equipo **GLM IT**.