Patrones de React Query v5 y hooks del proyecto. Invocar al crear/editar hooks en src/hooks o al consumir APIs desde frontend.
src/hooks/.'use client';.useApiClient() (src/hooks/use-api-client.ts).enabled: preferir chequeos explícitos (typeof negocioId === 'number', id != null) antes de ejecutar.onSuccess (queryClient.invalidateQueries).import { toast } from 'sonner'.use-api-client.ts: useApiClient()use-auth.ts: useAuth() (re-export de auth-context)use-tour.ts: useTour(tourId)use-movimientos.ts:
useMovimientos(filters)useMovimientoDetalle(id, negocioId)useMovimientoPendientesCount()useCreateMovimiento()useAprobarMovimiento()useRechazarMovimiento()useReenviarMovimiento()useDeleteMovimiento()useMarcarPagado()useCancelarMovimiento()use-negocios.ts:
useNegocios({ negocioId?, enabled? })useNegocioDetail({ id, enabled?, negocioId? })useCrearNegocio()useActualizarNegocio()useEliminarNegocio()use-cuentas-banco.ts:
useCuentasBanco({ negocioId })useCuentaBancoDetail({ id, negocioId })useCreateCuentaBanco({ negocioId })useUpdateCuentaBanco({ negocioId })useDeleteCuentaBanco({ negocioId })useUpdateSaldoReal({ negocioId })useAsignarNegocio({ negocioId })useRemoverNegocio({ negocioId })use-centros-costo.ts: useCentrosCosto({ negocioId }), useCentrosCostoTree({ negocioId })use-division-resumen.ts: useDivisionResumen({ centroCostoId, fechaDesde, fechaHasta })use-arqueo.ts: useArqueoNegocio({ negocioId, fechaCorte? }), useArqueoCuenta({ cuentaBancoId, fechaCorte? })use-consolidado.ts: useConsolidado({ enabled? })use-reportes.ts: useReportes({ ... })use-pending-count.ts: usePendingCount()use-usuarios.ts: useUsuarios(...), useUsuarioDetail(...), useRoles(...), useCreateUsuario(...), useUpdateUsuario(...), useDeleteUsuario(...)apiJson(apiFetch, url, { json }) para parsear JSON y levantar Error(message) si !res.ok.['recurso', negocioId]['recurso', id] o ['recurso', negocioId, id] si depende del tenant['recurso', negocioId, { ...filtros }]['recurso']