feat(web/adm-009): hooks TanStack Query para fiscal IVA
useTiposDeIvaList, useTipoDeIva, useHistorialTipoDeIva (lazy enable), mutations con invalidateQueries. staleTime: 15_000 en todas las queries. Query keys estables: ['fiscal', 'iva', ...].
This commit is contained in:
121
src/web/src/features/fiscal/iva/hooks/useTiposDeIva.ts
Normal file
121
src/web/src/features/fiscal/iva/hooks/useTiposDeIva.ts
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
// ADM-009 — TanStack Query hooks para fiscal/iva
|
||||||
|
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
|
||||||
|
import {
|
||||||
|
listTiposDeIva,
|
||||||
|
getTipoDeIvaById,
|
||||||
|
getHistorialTipoDeIva,
|
||||||
|
createTipoDeIva,
|
||||||
|
updateTipoDeIva,
|
||||||
|
nuevaVersionTipoDeIva,
|
||||||
|
deactivateTipoDeIva,
|
||||||
|
reactivateTipoDeIva,
|
||||||
|
} from '../api/ivaApi'
|
||||||
|
import type {
|
||||||
|
TipoDeIvaFilter,
|
||||||
|
CreateTipoDeIvaRequest,
|
||||||
|
UpdateTipoDeIvaRequest,
|
||||||
|
NuevaVersionTipoDeIvaRequest,
|
||||||
|
} from '../types/tipoDeIva.types'
|
||||||
|
|
||||||
|
// ─── Query keys estables ──────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
export const ivaListQueryKey = (filters: TipoDeIvaFilter) =>
|
||||||
|
['fiscal', 'iva', 'list', filters] as const
|
||||||
|
|
||||||
|
export const ivaDetailQueryKey = (id: number) =>
|
||||||
|
['fiscal', 'iva', id] as const
|
||||||
|
|
||||||
|
export const ivaHistorialQueryKey = (id: number) =>
|
||||||
|
['fiscal', 'iva', id, 'historial'] as const
|
||||||
|
|
||||||
|
// ─── List ─────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
export function useTiposDeIvaList(filters: TipoDeIvaFilter) {
|
||||||
|
return useQuery({
|
||||||
|
queryKey: ivaListQueryKey(filters),
|
||||||
|
queryFn: () => listTiposDeIva(filters),
|
||||||
|
staleTime: 15_000,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// ─── Detail ──────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
export function useTipoDeIva(id: number | null) {
|
||||||
|
return useQuery({
|
||||||
|
queryKey: ivaDetailQueryKey(id ?? 0),
|
||||||
|
queryFn: () => getTipoDeIvaById(id!),
|
||||||
|
enabled: id != null,
|
||||||
|
staleTime: 15_000,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// ─── Historial (lazy — solo cuando el tooltip está abierto) ───────────────────
|
||||||
|
|
||||||
|
export function useHistorialTipoDeIva(id: number | null, enabled = false) {
|
||||||
|
return useQuery({
|
||||||
|
queryKey: ivaHistorialQueryKey(id ?? 0),
|
||||||
|
queryFn: () => getHistorialTipoDeIva(id!),
|
||||||
|
enabled: id != null && enabled,
|
||||||
|
staleTime: 15_000,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// ─── Create ──────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
export function useCreateTipoDeIva() {
|
||||||
|
const queryClient = useQueryClient()
|
||||||
|
return useMutation({
|
||||||
|
mutationFn: (payload: CreateTipoDeIvaRequest) => createTipoDeIva(payload),
|
||||||
|
onSuccess: () => {
|
||||||
|
queryClient.invalidateQueries({ queryKey: ['fiscal', 'iva'] })
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// ─── Update ──────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
export function useUpdateTipoDeIva() {
|
||||||
|
const queryClient = useQueryClient()
|
||||||
|
return useMutation({
|
||||||
|
mutationFn: ({ id, body }: { id: number; body: UpdateTipoDeIvaRequest }) =>
|
||||||
|
updateTipoDeIva(id, body),
|
||||||
|
onSuccess: () => {
|
||||||
|
queryClient.invalidateQueries({ queryKey: ['fiscal', 'iva'] })
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// ─── Nueva versión ───────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
export function useNuevaVersionTipoDeIva() {
|
||||||
|
const queryClient = useQueryClient()
|
||||||
|
return useMutation({
|
||||||
|
mutationFn: ({ id, body }: { id: number; body: NuevaVersionTipoDeIvaRequest }) =>
|
||||||
|
nuevaVersionTipoDeIva(id, body),
|
||||||
|
onSuccess: () => {
|
||||||
|
queryClient.invalidateQueries({ queryKey: ['fiscal', 'iva'] })
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// ─── Deactivate / Reactivate ─────────────────────────────────────────────────
|
||||||
|
|
||||||
|
export function useDeactivateTipoDeIva() {
|
||||||
|
const queryClient = useQueryClient()
|
||||||
|
return useMutation({
|
||||||
|
mutationFn: (id: number) => deactivateTipoDeIva(id),
|
||||||
|
onSuccess: () => {
|
||||||
|
queryClient.invalidateQueries({ queryKey: ['fiscal', 'iva'] })
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function useReactivateTipoDeIva() {
|
||||||
|
const queryClient = useQueryClient()
|
||||||
|
return useMutation({
|
||||||
|
mutationFn: (id: number) => reactivateTipoDeIva(id),
|
||||||
|
onSuccess: () => {
|
||||||
|
queryClient.invalidateQueries({ queryKey: ['fiscal', 'iva'] })
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user