Eliminar README.md
This commit is contained in:
@@ -1,364 +0,0 @@
|
|||||||
# 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 |
|
|
||||||
| **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**.
|
|
||||||
Reference in New Issue
Block a user