7.1 KiB
Sesión 2026-05-23: Asignaciones, Tareas, Admin UI y Fixes
Resumen
Sesión extensa con múltiples fixes de bugs críticos descubiertos tras deploy de la feature de asignaciones, más nuevas funcionalidades de UX solicitadas por el usuario.
1. Fixes de build y deploy inicial de Asignaciones
Problemas de build de Next.js
Badgeno exportado desde@horux/shared-ui: Reemplazado por<span>con clases CSS equivalentes enseguimiento-auxiliares.tsx.TabsrequeríadefaultValue: AgregadodefaultValue="carteras"al componente<Tabs>encarteras/page.tsx.
Migración tenant 046 aplicada
- Archivo:
apps/api/src/migrations/tenant/046_asignaciones_obligaciones_tareas.sql - Tablas creadas:
obligacion_asignaciones,tarea_asignaciones - Aplicada a 7 tenants activos.
2. Fix: Invitación de usuarios no enviaba correo
Root cause: usuarios.service.ts → inviteUsuario generaba tempPassword pero nunca llamaba emailService.sendWelcome().
Fix:
- Importado
emailServiceenusuarios.service.ts - Agregada llamada
emailService.sendWelcome()cuando se crea un usuario nuevo (tempPassword !== null) - Aplicado también a
createUsuarioGlobal
Reenvío de correos a usuarios invitados previos
- Identificados 9 usuarios creados entre jueves 21/05 y hoy sin
lastLogin - Generadas nuevas contraseñas temporales, hasheadas en BD, y enviados correos de bienvenida
3. Fix: Subcartera mostraba contribuyentes de todo el tenant
Root cause: SubcarteraCard filtraba available solo excluyendo los ya asignados a la subcartera, sin verificar que pertenecieran a la cartera padre.
Fixes:
- Frontend:
SubcarteraCardahora recibeparentEntidadIdsy filtra:(parentEntidadIds ?? []).includes(c.id) - Backend:
cartera.service.ts→addEntidadToCarteravalida que si es subcartera (parentId !== null), la entidad previamente exista en la cartera padre.
4. Fix: Obligaciones y Tareas no se mostraban (error 500)
Root cause: Las queries de obligaciones.service.ts, tareas.service.ts y asignaciones.service.ts hacían LEFT JOIN users en la BD de tenant, pero la tabla users solo existe en la BD central (horux360).
Error: relation "users" does not exist
Fixes:
- Quitados todos los
LEFT JOIN usersde queries de tenant - En
obligaciones.service.tsytareas.service.ts: se mantiene soloauxiliarAsignadoId(sin nombre) - En
asignaciones.service.ts: creada funciónresolveUserNames()que consulta Prisma (BD central) para obtener nombres de usuarios y mapearlos en los resultados - Fix adicional:
asignaciones.controller.tsusabareq.params.idcomoobligacionIdcuando en realidadreq.params.ideracontribuyenteId. Corregido areq.params.obligacionId.
5. Fix: Endpoint /carteras/asignaciones devolvía 500
Root cause: Ruta dinámica GET /:id estaba definida antes de GET /asignaciones en cartera.routes.ts. Express interpretaba "asignaciones" como parámetro :id.
Error: invalid input syntax for type uuid: "asignaciones"
Fix: Reordenadas las rutas estáticas (/asignaciones, /asignaciones/mias, /asignaciones/sin-asignar) antes de las rutas dinámicas (/:id).
6. Fix: Owner no veía asignaciones en "Asignadas"
Root cause: getAsignacionesPorSupervisor filtraba por asp.supervisor_user_id = $1. Un owner no aparece en auxiliar_supervisores, por lo que no veía sus propias asignaciones.
Fix: La función ahora recibe role como parámetro. Si es owner/cfo/contador, no filtra por supervisor. Si es supervisor, filtra por auxiliar_supervisores.
7. Fix: Lista "Sin asignar" no se refrescaba tras asignar
Root cause: Las mutations useAsignarObligacion, useDesasignarObligacion, useAsignarTarea, useDesasignarTarea invalidaban ['asignaciones-supervisor'] pero no ['asignaciones-sin-asignar'].
Fix: Agregada invalidación de ['asignaciones-sin-asignar'] a las 4 mutations.
8. Feature: Seguimiento de Auxiliares — pestaña "Sin asignar"
Nuevo endpoint: GET /carteras/asignaciones/sin-asignar
- Devuelve obligaciones y tareas activas que NO están en las tablas de asignaciones
- Respeta permisos: owner/cfo ven todo, supervisor solo sus contribuyentes
Frontend:
- Reestructurado
SeguimientoAuxiliarescon tabs principales: "Asignadas" | "Sin asignar" - Dentro de cada uno, subtabs: Obligaciones | Tareas
- El modal de asignación funciona en ambas vistas
9. Feature: Nueva página /tareas (Tareas Operativas)
Nuevo endpoint: GET /tareas/mis-tareas
- Devuelve todas las tareas activas con su periodo actual para los contribuyentes visibles del usuario
- Usa
materializarPeriodospara cada contribuyente y luegolistTareasConPeriodoPorContribuyentespara traer todo en batch
Frontend:
- Nueva ruta:
/tareas - Agregada al sidebar principal en todos los layouts (icono
CheckSquare2) - Muestra tareas agrupadas por contribuyente
- Filtros: Todas / Pendientes / Completadas
- Permite marcar/desmarcar tareas como completadas
- Muestra indicadores: atrasada, supervisor-only, recurrencia, fecha límite
10. Feature: Obligaciones Fiscales ya no se pueden marcar como completadas
En /pendientes, se quitó el botón interactivo de check de las obligaciones fiscales. Ahora solo muestra un ícono visual del estado sin acción.
11. Feature: Invitaciones Trial movido a Admin Usuarios
Sidebar: Quitado "Invitaciones Trial" de adminNavigation en los 4 layouts (sidebar.tsx, sidebar-compact.tsx, sidebar-floating.tsx, topnav.tsx).
Admin Usuarios: Agregados tabs con <Tabs>:
- "Usuarios" — gestión de usuarios global existente
- "Invitaciones Trial" — formulario de envío + historial (extraído a componente
admin/_components/invitaciones-trial-tab.tsx)
Archivos modificados
Backend
apps/api/src/services/usuarios.service.tsapps/api/src/services/cartera.service.tsapps/api/src/services/obligaciones.service.tsapps/api/src/services/tareas.service.tsapps/api/src/services/asignaciones.service.tsapps/api/src/controllers/asignaciones.controller.tsapps/api/src/controllers/tareas.controller.tsapps/api/src/routes/cartera.routes.tsapps/api/src/routes/contribuyente.routes.tsapps/api/src/routes/tareas.routes.ts
Frontend
apps/web/app/(dashboard)/carteras/page.tsxapps/web/app/(dashboard)/carteras/seguimiento-auxiliares.tsxapps/web/app/(dashboard)/pendientes/page.tsxapps/web/app/(dashboard)/admin/usuarios/page.tsxapps/web/app/(dashboard)/admin/_components/invitaciones-trial-tab.tsxapps/web/app/(dashboard)/tareas/page.tsxapps/web/components/layouts/sidebar.tsxapps/web/components/layouts/sidebar-compact.tsxapps/web/components/layouts/sidebar-floating.tsxapps/web/components/layouts/topnav.tsxapps/web/lib/api/asignaciones.tsapps/web/lib/api/tareas-mis.tsapps/web/lib/hooks/use-asignaciones.tsapps/web/lib/hooks/use-tareas-mis.ts
Migraciones
apps/api/src/migrations/tenant/046_asignaciones_obligaciones_tareas.sql