365 lines
10 KiB
Markdown
365 lines
10 KiB
Markdown
# Seguimiento de Impuestos GLM
|
|
|
|
> Aplicación interna que centraliza el calendario tributario regional de GomezLee Marketing y automatiza el envío de recordatorios por correo y WhatsApp.
|
|
|
|
---
|
|
|
|
## INFORMACIÓN GENERAL
|
|
|
|
| Campo | Detalle |
|
|
|---|---|
|
|
| **Proyecto** | Seguimiento de Impuestos GLM |
|
|
| **Área** | Administración |
|
|
| **Estado** | Listo para producción |
|
|
| **Developer principal** | Isaac Aracena |
|
|
| **IT Manager** | Luis Matos |
|
|
| **Fecha de inicio** | 2026-07-24 |
|
|
| **Fecha de cierre** | 2026-07-27 |
|
|
|
|
---
|
|
|
|
## OBJETIVO
|
|
|
|
### Problema que resuelve
|
|
|
|
El seguimiento de las obligaciones tributarias de los diferentes países de GLM se realizaba mediante calendarios y archivos separados. Esto dificultaba consultar las fechas límite, identificar a los responsables y garantizar que los avisos fueran enviados a tiempo.
|
|
|
|
Además, agregar o cambiar destinatarios requería modificar manualmente los flujos de automatización.
|
|
|
|
### Solución implementada
|
|
|
|
Seguimiento de Impuestos GLM centraliza en una sola aplicación:
|
|
|
|
- El calendario tributario regional.
|
|
- Las obligaciones de Nómina y Administración.
|
|
- Los países y fechas límite.
|
|
- Los contactos responsables.
|
|
- Los canales habilitados para cada contacto.
|
|
- El historial de notificaciones enviadas.
|
|
|
|
La aplicación permite administrar obligaciones y contactos desde una interfaz web. Un flujo de n8n consulta diariamente la información almacenada en Supabase y envía los recordatorios correspondientes por Gmail y WhatsApp.
|
|
|
|
### Usuarios y beneficiarios
|
|
|
|
- Equipo de Administración.
|
|
- Equipo de Nómina.
|
|
- Responsables tributarios de cada país.
|
|
- Contactos regionales.
|
|
- Dirección de Recursos Humanos.
|
|
- Equipo de IT de GomezLee Marketing.
|
|
|
|
---
|
|
|
|
## ARQUITECTURA
|
|
|
|
### Diagrama general
|
|
|
|
```text
|
|
Usuario autorizado
|
|
|
|
|
v
|
|
Frontend React + Vite
|
|
|
|
|
+------> Supabase Auth
|
|
|
|
|
+------> Supabase PostgreSQL
|
|
|
|
|
v
|
|
Obligaciones y contactos
|
|
|
|
|
v
|
|
n8n — Ejecución 8:00 AM
|
|
|
|
|
v
|
|
RPC tax_due_reminders
|
|
|
|
|
+--------+--------+
|
|
| |
|
|
v v
|
|
Gmail HTML WhatsApp
|
|
| |
|
|
+--------+--------+
|
|
|
|
|
v
|
|
tax_notification_log
|
|
```
|
|
|
|
### Stack tecnológico
|
|
|
|
| Componente | Tecnología | Propósito |
|
|
|---|---|---|
|
|
| Frontend | React 19 | Interfaz de usuario |
|
|
| Lenguaje | TypeScript | Tipado y lógica de la aplicación |
|
|
| Bundler | Vite | Desarrollo y compilación |
|
|
| Estilos | Tailwind CSS | Diseño visual |
|
|
| Autenticación | Supabase Auth + Google OAuth | Control de acceso |
|
|
| Base de datos | Supabase / PostgreSQL | Obligaciones, países, contactos y bitácora |
|
|
| API de datos | Supabase REST / PostgREST | Comunicación entre frontend, n8n y base de datos |
|
|
| Automatización | n8n | Orquestación de recordatorios |
|
|
| Correo | Gmail OAuth | Envío de correos HTML |
|
|
| Mensajería | WhatsApp GLM | Envío de avisos por WhatsApp |
|
|
| Hosting | EasyPanel / servidor GLM | Despliegue de la aplicación y servicios |
|
|
|
|
### Integraciones externas
|
|
|
|
| Sistema | Tipo de integración | Datos que fluyen |
|
|
|---|---|---|
|
|
| Supabase Auth | Google OAuth | Inicio de sesión y sesión del usuario |
|
|
| Supabase REST | API REST / RPC | Obligaciones, contactos, países y notificaciones |
|
|
| n8n | Webhook y Schedule Trigger | Ejecución manual, diaria y notificación de cambios |
|
|
| Gmail | OAuth | Correos de recordatorio |
|
|
| WhatsApp GLM | API REST | Mensajes de recordatorio |
|
|
| Google Workspace | OAuth | Identidad corporativa de los usuarios |
|
|
|
|
---
|
|
|
|
## REGLAS DE NEGOCIO
|
|
|
|
### Regla de recordatorios
|
|
|
|
La fórmula principal es:
|
|
|
|
> **Miércoles estrictamente anterior y el mismo día de la fecha límite.**
|
|
|
|
Ejemplos:
|
|
|
|
| Fecha límite | Primer aviso | Segundo aviso |
|
|
|---|---|---|
|
|
| Lunes | Miércoles anterior | Lunes |
|
|
| Martes | Miércoles anterior | Martes |
|
|
| Miércoles | Miércoles de la semana anterior | Miércoles |
|
|
| Jueves | Miércoles anterior | Jueves |
|
|
| Viernes | Miércoles anterior | Viernes |
|
|
| Sábado | Miércoles anterior | Sábado |
|
|
| Domingo | Miércoles anterior | Domingo |
|
|
|
|
El miércoles calculado debe ser estrictamente anterior. Si la obligación vence un miércoles, el primer aviso corresponde al miércoles de la semana anterior.
|
|
|
|
### Enrutamiento de contactos
|
|
|
|
- Los contactos de área **Regional** reciben todas las obligaciones de todos los países.
|
|
- Los contactos regionales de **Nómina** reciben las obligaciones de Nómina de todos los países.
|
|
- Los contactos regionales de **Administración** reciben las obligaciones administrativas de todos los países.
|
|
- Los contactos de un país específico reciben solamente las obligaciones de su país y categoría.
|
|
- Solo se utilizan contactos activos.
|
|
- El correo se envía únicamente cuando el canal de correo está habilitado.
|
|
- WhatsApp se envía únicamente cuando el canal de WhatsApp está habilitado.
|
|
- Los números deben guardarse con código internacional.
|
|
|
|
### Obligaciones tributarias
|
|
|
|
- El país es obligatorio.
|
|
- Las únicas categorías disponibles son:
|
|
- Nómina.
|
|
- Administración.
|
|
- Una obligación puede editarse o eliminarse mientras no tenga avisos enviados.
|
|
- Después del primer correo o WhatsApp registrado, la obligación queda bloqueada.
|
|
- Las obligaciones bloqueadas permanecen disponibles en modo de solo lectura.
|
|
- Cuando un día tiene más de tres obligaciones, la opción **Ver todos** permite consultar la lista completa.
|
|
|
|
### Prevención de duplicados
|
|
|
|
Cada notificación enviada se registra en `tax_notification_log`.
|
|
|
|
La combinación de obligación, contacto, canal y tipo de aviso evita que el mismo recordatorio sea enviado dos veces.
|
|
|
|
---
|
|
|
|
## BASE DE DATOS
|
|
|
|
### Tablas
|
|
|
|
La aplicación utiliza cinco tablas:
|
|
|
|
| Tabla | Propósito |
|
|
|---|---|
|
|
| `tax_calendar_access` | Correos autorizados para ingresar |
|
|
| `tax_countries` | Catálogo de países |
|
|
| `tax_obligations` | Obligaciones y eventos tributarios |
|
|
| `tax_contacts` | Contactos responsables y canales habilitados |
|
|
| `tax_notification_log` | Bitácora de correos y WhatsApp enviados |
|
|
|
|
### Funciones principales
|
|
|
|
| Función | Propósito |
|
|
|---|---|
|
|
| `has_tax_calendar_access` | Valida si el correo puede utilizar la aplicación |
|
|
| `tax_previous_wednesday` | Calcula el miércoles estrictamente anterior |
|
|
| `tax_due_reminders` | Devuelve los recordatorios y destinatarios pendientes |
|
|
| `tax_record_notification` | Registra un envío exitoso |
|
|
| `tax_obligation_delivery_status` | Consulta si una obligación ya fue notificada |
|
|
| `tax_prevent_sent_obligation_changes` | Bloquea cambios después del primer aviso |
|
|
|
|
### Instalación completa
|
|
|
|
Para una instalación nueva, ejecutar en Supabase:
|
|
|
|
```text
|
|
supabase/Seguimiento-de-Impuestos-GLM.sql
|
|
```
|
|
|
|
El script incluye:
|
|
|
|
- Tablas.
|
|
- Índices.
|
|
- Triggers.
|
|
- Funciones RPC.
|
|
- Políticas RLS.
|
|
- Accesos iniciales.
|
|
- Países.
|
|
- Contactos.
|
|
- Obligaciones históricas de 2026.
|
|
- Prevención de notificaciones duplicadas.
|
|
|
|
### Actualizaciones incrementales
|
|
|
|
Para bases que ya tenían una versión anterior:
|
|
|
|
```text
|
|
supabase/actualizacion_eventos_bloqueados.sql
|
|
supabase/actualizacion_final_calendario_y_nomina.sql
|
|
```
|
|
|
|
No ejecutar actualizaciones incrementales si ya se utilizó el script completo más reciente.
|
|
|
|
---
|
|
|
|
## CONFIGURACIÓN Y SETUP
|
|
|
|
### Prerrequisitos
|
|
|
|
- Node.js instalado.
|
|
- npm instalado.
|
|
- Acceso al Supabase empresarial.
|
|
- Acceso a Google Cloud y Supabase Auth.
|
|
- Acceso a n8n.
|
|
- Credencial de Gmail configurada en n8n.
|
|
- Acceso a la API de WhatsApp de GLM.
|
|
- Acceso al hosting de EasyPanel.
|
|
- Correo autorizado para ingresar a la aplicación.
|
|
|
|
### Variables del frontend
|
|
|
|
Copiar el archivo de ejemplo:
|
|
|
|
```powershell
|
|
Copy-Item .env.example .env
|
|
```
|
|
|
|
Configurar:
|
|
|
|
```env
|
|
VITE_SUPABASE_URL=https://dbit.digitalcompass.agency
|
|
VITE_SUPABASE_PUBLISHABLE_KEY=REEMPLAZAR_CON_LA_LLAVE_PUBLICA
|
|
VITE_TAX_WEBHOOK_URL=https://agenteit.digitalcompass.agency/webhook/seguimiento-impuestos
|
|
```
|
|
|
|
También puede utilizarse:
|
|
|
|
```env
|
|
VITE_SUPABASE_ANON_KEY=REEMPLAZAR_CON_LA_ANON_KEY
|
|
```
|
|
|
|
Nunca colocar la llave `service_role` dentro del frontend.
|
|
|
|
## INSTALACIÓN LOCAL
|
|
|
|
### 1. Clonar el repositorio
|
|
|
|
```powershell
|
|
git clone https://git.digitalcompass.agency/Isaac_Aracena/seguimiento-impuestos.git
|
|
cd seguimiento-impuestos
|
|
```
|
|
|
|
### 2. Instalar dependencias
|
|
|
|
```powershell
|
|
npm install
|
|
```
|
|
|
|
### 3. Crear el archivo de entorno
|
|
|
|
```powershell
|
|
Copy-Item .env.example .env
|
|
```
|
|
|
|
Editar `.env` con la configuración pública correspondiente.
|
|
|
|
### 4. Ejecutar en desarrollo
|
|
|
|
```powershell
|
|
npm run dev
|
|
```
|
|
|
|
Aplicación local:
|
|
|
|
```text
|
|
http://localhost:5173/
|
|
```
|
|
|
|
### 5. Validar el proyecto
|
|
|
|
```powershell
|
|
npm run typecheck
|
|
npm run lint
|
|
npm run format:check
|
|
```
|
|
|
|
### 6. Generar el build
|
|
|
|
```powershell
|
|
npm run build
|
|
```
|
|
|
|
### 7. Probar el build
|
|
|
|
```powershell
|
|
npm run preview
|
|
```
|
|
|
|
---
|
|
|
|
|
|
## CONFIGURACIÓN DE N8N
|
|
|
|
Importar el archivo:
|
|
|
|
```text
|
|
n8n/Seguimiento-de-Impuestos-GLM.json
|
|
```
|
|
|
|
Después de importarlo:
|
|
|
|
1. Seleccionar la credencial en **Gmail - Enviar recordatorio**.
|
|
2. Configurar la conexión privada con Supabase.
|
|
3. Configurar el endpoint y la API key de WhatsApp.
|
|
4. Verificar la zona horaria `America/Santo_Domingo`.
|
|
5. Ejecutar una prueba manual.
|
|
6. Confirmar el correo recibido.
|
|
7. Confirmar el WhatsApp recibido.
|
|
8. Verificar el registro en `tax_notification_log`.
|
|
9. Activar el workflow.
|
|
|
|
---
|
|
|
|
## CÓMO FUNCIONA
|
|
|
|
### Flujo diario
|
|
|
|
1. El Schedule Trigger inicia el workflow a las 8:00 a. m.
|
|
2. n8n obtiene la fecha correspondiente a la ejecución.
|
|
3. El nodo de Supabase llama la RPC `tax_due_reminders`.
|
|
4. Supabase identifica las obligaciones que deben notificarse.
|
|
5. Supabase cruza cada obligación con los contactos aplicables.
|
|
6. n8n genera el correo HTML con el branding de GLM.
|
|
7. n8n genera el mensaje de WhatsApp.
|
|
8. Gmail envía los correos habilitados.
|
|
9. La API de WhatsApp envía los mensajes habilitados.
|
|
10. Cada envío exitoso se registra en Supabase.
|
|
11. Los registros enviados quedan protegidos contra duplicados.
|
|
|
|
|
|
|
|
|
|
|
|
Documento mantenido por el equipo **GLM IT**. |