- Add Conceptos tab in CFDI page with column filters, sorting, pagination - Add GET /cfdi/conceptos endpoint with filters and orderBy - Backfill cfdi_conceptos from legacy XMLs (824k concepts inserted) - Fix CFDI delete button (bypass subscription check, add alerts) - Fix export to Excel (fetch all filtered results, limit 10k) - Fix facturacion page concepto delete bug (immutable updates, unique ids) - Add Facturapi live key auto-generation and caching - Fix SAT fechaPagoP parsing - Add metrics cache support for current year - Increase DB pool max to 15
85 lines
2.8 KiB
TypeScript
85 lines
2.8 KiB
TypeScript
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
|
|
import * as cfdiApi from '@/lib/api/cfdi';
|
|
import type { CfdiFilters, CfdiConceptoFilters } from '@horux/shared';
|
|
import type { CreateCfdiData } from '@/lib/api/cfdi';
|
|
import { useContribuyenteStore } from '@/stores/contribuyente-store';
|
|
|
|
export function useCfdis(filters: CfdiFilters) {
|
|
const { selectedContribuyenteId } = useContribuyenteStore();
|
|
const filtersWithContribuyente: CfdiFilters = {
|
|
...filters,
|
|
contribuyenteId: selectedContribuyenteId || undefined,
|
|
};
|
|
return useQuery({
|
|
queryKey: ['cfdis', filters, selectedContribuyenteId],
|
|
queryFn: () => cfdiApi.getCfdis(filtersWithContribuyente),
|
|
});
|
|
}
|
|
|
|
export function useCfdi(id: string) {
|
|
return useQuery({
|
|
queryKey: ['cfdi', id],
|
|
queryFn: () => cfdiApi.getCfdiById(id),
|
|
enabled: !!id,
|
|
});
|
|
}
|
|
|
|
export function useResumenCfdi(año?: number, mes?: number) {
|
|
const { selectedContribuyenteId } = useContribuyenteStore();
|
|
return useQuery({
|
|
queryKey: ['cfdi-resumen', año, mes, selectedContribuyenteId],
|
|
queryFn: () => cfdiApi.getResumenCfdi(año, mes, selectedContribuyenteId || undefined),
|
|
});
|
|
}
|
|
|
|
export function useCreateCfdi() {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: (data: CreateCfdiData) => cfdiApi.createCfdi(data),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ['cfdis'] });
|
|
queryClient.invalidateQueries({ queryKey: ['cfdi-resumen'] });
|
|
queryClient.invalidateQueries({ queryKey: ['dashboard'] });
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useCreateManyCfdis() {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: (cfdis: CreateCfdiData[]) => cfdiApi.createManyCfdis(cfdis),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ['cfdis'] });
|
|
queryClient.invalidateQueries({ queryKey: ['cfdi-resumen'] });
|
|
queryClient.invalidateQueries({ queryKey: ['dashboard'] });
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useCfdiConceptos(filters: CfdiConceptoFilters) {
|
|
const { selectedContribuyenteId } = useContribuyenteStore();
|
|
const filtersWithContribuyente: CfdiConceptoFilters = {
|
|
...filters,
|
|
contribuyenteId: selectedContribuyenteId || undefined,
|
|
};
|
|
return useQuery({
|
|
queryKey: ['cfdi-conceptos', filters, selectedContribuyenteId],
|
|
queryFn: () => cfdiApi.getAllCfdiConceptos(filtersWithContribuyente),
|
|
});
|
|
}
|
|
|
|
export function useDeleteCfdi() {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: (id: string) => cfdiApi.deleteCfdi(id),
|
|
onSuccess: () => {
|
|
queryClient.invalidateQueries({ queryKey: ['cfdis'] });
|
|
queryClient.invalidateQueries({ queryKey: ['cfdi-resumen'] });
|
|
queryClient.invalidateQueries({ queryKey: ['dashboard'] });
|
|
},
|
|
});
|
|
}
|