feat: seguimiento auxiliares UI con tabs Asignadas/Sin asignar

- Componente seguimiento-auxiliares.tsx con tabs Asignadas/Sin asignar
- Tabs internos Obligaciones/Tareas en cada vista
- API client y hooks para asignaciones
- Fix: invalidar query sin-asignar al asignar/desasignar
This commit is contained in:
Horux Dev
2026-05-23 23:40:39 +00:00
parent f43cb165c6
commit e8b0733304
4 changed files with 546 additions and 33 deletions

View File

@@ -0,0 +1,58 @@
import { apiClient } from './client';
export interface AsignacionObligacion {
id: string;
obligacionId: string;
obligacionNombre: string;
contribuyenteId: string;
contribuyenteRfc: string;
contribuyenteRazonSocial: string;
auxiliarUserId: string;
auxiliarNombre: string | null;
asignadoPor: string;
asignadoAt: string;
}
export interface AsignacionTarea {
id: string;
tareaId: string;
tareaNombre: string;
contribuyenteId: string;
contribuyenteRfc: string;
contribuyenteRazonSocial: string;
auxiliarUserId: string;
auxiliarNombre: string | null;
asignadoPor: string;
asignadoAt: string;
}
export interface AsignacionesResponse {
obligaciones: AsignacionObligacion[];
tareas: AsignacionTarea[];
}
export const getAsignacionesPorSupervisor = () =>
apiClient.get<AsignacionesResponse>('/carteras/asignaciones').then(r => r.data);
export const getAsignacionesPorAuxiliar = () =>
apiClient.get<AsignacionesResponse>('/carteras/asignaciones/mias').then(r => r.data);
export interface SinAsignarResponse {
obligaciones: Omit<AsignacionObligacion, 'id' | 'auxiliarUserId' | 'auxiliarNombre' | 'asignadoPor' | 'asignadoAt'>[];
tareas: Omit<AsignacionTarea, 'id' | 'auxiliarUserId' | 'auxiliarNombre' | 'asignadoPor' | 'asignadoAt'>[];
}
export const getSinAsignar = () =>
apiClient.get<SinAsignarResponse>('/carteras/asignaciones/sin-asignar').then(r => r.data);
export const asignarObligacion = (contribuyenteId: string, obligacionId: string, auxiliarUserId: string) =>
apiClient.post(`/contribuyentes/${contribuyenteId}/obligaciones/${obligacionId}/asignar`, { auxiliarUserId }).then(r => r.data);
export const desasignarObligacion = (contribuyenteId: string, obligacionId: string) =>
apiClient.delete(`/contribuyentes/${contribuyenteId}/obligaciones/${obligacionId}/asignar`).then(r => r.data);
export const asignarTarea = (tareaId: string, auxiliarUserId: string) =>
apiClient.post(`/tareas/${tareaId}/asignar`, { auxiliarUserId }).then(r => r.data);
export const desasignarTarea = (tareaId: string) =>
apiClient.delete(`/tareas/${tareaId}/asignar`).then(r => r.data);

View File

@@ -0,0 +1,89 @@
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import {
getAsignacionesPorSupervisor,
getAsignacionesPorAuxiliar,
getSinAsignar,
asignarObligacion,
desasignarObligacion,
asignarTarea,
desasignarTarea,
} from '../api/asignaciones';
export function useAsignacionesSupervisor() {
return useQuery({
queryKey: ['asignaciones-supervisor'],
queryFn: getAsignacionesPorSupervisor,
});
}
export function useAsignacionesAuxiliar() {
return useQuery({
queryKey: ['asignaciones-auxiliar'],
queryFn: getAsignacionesPorAuxiliar,
});
}
export function useSinAsignar() {
return useQuery({
queryKey: ['asignaciones-sin-asignar'],
queryFn: getSinAsignar,
});
}
export function useAsignarObligacion() {
const qc = useQueryClient();
return useMutation({
mutationFn: ({ contribuyenteId, obligacionId, auxiliarUserId }: {
contribuyenteId: string;
obligacionId: string;
auxiliarUserId: string;
}) => asignarObligacion(contribuyenteId, obligacionId, auxiliarUserId),
onSuccess: () => {
qc.invalidateQueries({ queryKey: ['asignaciones-supervisor'] });
qc.invalidateQueries({ queryKey: ['asignaciones-sin-asignar'] });
qc.invalidateQueries({ queryKey: ['obligaciones'] });
},
});
}
export function useDesasignarObligacion() {
const qc = useQueryClient();
return useMutation({
mutationFn: ({ contribuyenteId, obligacionId }: {
contribuyenteId: string;
obligacionId: string;
}) => desasignarObligacion(contribuyenteId, obligacionId),
onSuccess: () => {
qc.invalidateQueries({ queryKey: ['asignaciones-supervisor'] });
qc.invalidateQueries({ queryKey: ['asignaciones-sin-asignar'] });
qc.invalidateQueries({ queryKey: ['obligaciones'] });
},
});
}
export function useAsignarTarea() {
const qc = useQueryClient();
return useMutation({
mutationFn: ({ tareaId, auxiliarUserId }: {
tareaId: string;
auxiliarUserId: string;
}) => asignarTarea(tareaId, auxiliarUserId),
onSuccess: () => {
qc.invalidateQueries({ queryKey: ['asignaciones-supervisor'] });
qc.invalidateQueries({ queryKey: ['asignaciones-sin-asignar'] });
qc.invalidateQueries({ queryKey: ['tareas'] });
},
});
}
export function useDesasignarTarea() {
const qc = useQueryClient();
return useMutation({
mutationFn: ({ tareaId }: { tareaId: string }) => desasignarTarea(tareaId),
onSuccess: () => {
qc.invalidateQueries({ queryKey: ['asignaciones-supervisor'] });
qc.invalidateQueries({ queryKey: ['asignaciones-sin-asignar'] });
qc.invalidateQueries({ queryKey: ['tareas'] });
},
});
}