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:
58
apps/web/lib/api/asignaciones.ts
Normal file
58
apps/web/lib/api/asignaciones.ts
Normal 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);
|
||||
89
apps/web/lib/hooks/use-asignaciones.ts
Normal file
89
apps/web/lib/hooks/use-asignaciones.ts
Normal 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'] });
|
||||
},
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user