feat(r6): R6.3 — Ressources sur mobile (Stock, Tiers, Fichiers)

api/ressources.ts (usePartners, useParts/usePart, useCreatePurchaseOrder,
useDocuments). Écran Stock (sous-seuil en tête) + fiche pièce + "Commander"
pré-rempli en une ligne (fournisseur figé, quantité = manquant jusqu'au
seuil, prix = dernier connu — BC multi-lignes détaillé réservé au web, D4).
Tiers en lecture seule (création/édition réservées au web). Fichiers en
métadonnées seules — l'ouverture demande expo-sharing (dépendance native
absente, donc un nouveau build natif) : différée explicitement plutôt
qu'ajoutée à la légère au milieu de cette passe.

Menu : Stock & achats / Tiers / Fichiers routent réellement.

Typecheck propre, 17 tests Jest, lint 5/5 paquets. Contrat non touché,
toutes les opérations utilisées existaient déjà depuis R3.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
pr-daaif
2026-08-02 11:35:55 +01:00
parent 21dd6cf034
commit f210d4f801
9 changed files with 489 additions and 4 deletions

View File

@@ -0,0 +1,47 @@
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import type { PurchaseOrderCreate } from '@siop/shared';
import { api, unwrap } from './client';
/** Hooks R6.3 — Ressources (Stock, Tiers, Fichiers) : mêmes opérations que
* le web (gestion.ts), périmètre mobile plus étroit (D4 — consultation +
* action courante « commander », pas les flux de gestion les plus denses :
* pas de création/édition de pièce ou de tiers sur mobile pour l'instant). */
export function usePartners() {
return useQuery({
queryKey: ['partners'],
queryFn: async () => (await unwrap(await api.GET('/partners'))).partners,
});
}
export function useParts() {
return useQuery({
queryKey: ['parts'],
queryFn: async () => (await unwrap(await api.GET('/parts'))).parts,
});
}
export function usePart(id: string) {
return useQuery({
queryKey: ['parts', id],
queryFn: async () => unwrap(await api.GET('/parts/{id}', { params: { path: { id } } })),
});
}
export function useCreatePurchaseOrder() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: async (body: PurchaseOrderCreate) =>
unwrap(await api.POST('/purchase-orders', { body })),
onSuccess: () => queryClient.invalidateQueries({ queryKey: ['purchase-orders'] }),
});
}
/** Bibliothèque complète (sans filtre appareil/OT — voir aussi
* `useDocumentsOT` dans exploitation.ts, scopée à un OT). */
export function useDocuments() {
return useQuery({
queryKey: ['documents'],
queryFn: async () => (await unwrap(await api.GET('/documents'))).documents,
});
}