feat(web): clientes e catálogo funcionando com dados do ERP
- clients.ts, catalog.ts: corrige bug res.ok/res.json() — apiFetch retorna JSON direto - catalog.service.ts: corrige nomes de coluna da vw_produtos (descr_det, lista_pauta, remove preco_com_ipi inexistente) - CatalogPage.tsx: nova tela — código, descrição, grupo, marca, preço, estoque - router.tsx: adiciona rota /catalogo Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,8 +1,10 @@
|
||||
import { useQuery } from '@tanstack/react-query';
|
||||
import {
|
||||
ProdutoListResponseSchema,
|
||||
ProdutoDetailSchema,
|
||||
type ProdutoListQuery,
|
||||
type ProdutoListResponse,
|
||||
type ProdutoDetail,
|
||||
} from '@sar/api-interface';
|
||||
import { apiFetch } from '../api-client';
|
||||
|
||||
@@ -18,9 +20,19 @@ export function useCatalog(params: Partial<ProdutoListQuery> = {}) {
|
||||
queryKey: ['catalog', params],
|
||||
queryFn: async () => {
|
||||
const res = await apiFetch(`/catalog${qs ? `?${qs}` : ''}`);
|
||||
if (!res.ok) throw new Error(`catalog error ${res.status}`);
|
||||
return ProdutoListResponseSchema.parse(await res.json());
|
||||
return ProdutoListResponseSchema.parse(res);
|
||||
},
|
||||
staleTime: 4 * 60 * 60 * 1000,
|
||||
});
|
||||
}
|
||||
|
||||
export function useProdutoDetail(id: number | undefined) {
|
||||
return useQuery<ProdutoDetail>({
|
||||
queryKey: ['catalog', id],
|
||||
enabled: id != null,
|
||||
queryFn: async () => {
|
||||
const res = await apiFetch(`/catalog/${id}`);
|
||||
return ProdutoDetailSchema.parse(res);
|
||||
},
|
||||
staleTime: 4 * 60 * 60 * 1000, // TTL 4h — FR-4.4
|
||||
});
|
||||
}
|
||||
|
||||
@@ -27,8 +27,7 @@ export function useClientList(params: Partial<ClientListQuery> = {}) {
|
||||
queryKey: CLIENT_KEYS.list(params),
|
||||
queryFn: async () => {
|
||||
const res = await apiFetch(`/clients${query ? `?${query}` : ''}`);
|
||||
if (!res.ok) throw new Error(`clients list error ${res.status}`);
|
||||
return ClientListResponseSchema.parse(await res.json());
|
||||
return ClientListResponseSchema.parse(res);
|
||||
},
|
||||
});
|
||||
}
|
||||
@@ -38,8 +37,7 @@ export function useClientDetail(id: number | string | undefined) {
|
||||
queryKey: CLIENT_KEYS.detail(Number(id)),
|
||||
queryFn: async () => {
|
||||
const res = await apiFetch(`/clients/${id}`);
|
||||
if (!res.ok) throw new Error(`client detail error ${res.status}`);
|
||||
return ClientDetailSchema.parse(await res.json());
|
||||
return ClientDetailSchema.parse(res);
|
||||
},
|
||||
enabled: !!id,
|
||||
});
|
||||
|
||||
@@ -6,6 +6,7 @@ import { ClientDetailPage } from '../cockpits/rafael/ClientDetailPage';
|
||||
import { OrdersPage } from '../cockpits/rafael/OrdersPage';
|
||||
import { OrderDetailPage } from '../cockpits/rafael/OrderDetailPage';
|
||||
import { NewOrderPage } from '../cockpits/rafael/NewOrderPage';
|
||||
import { CatalogPage } from '../cockpits/rafael/CatalogPage';
|
||||
import { ApprovalQueuePage } from '../cockpits/sandra/ApprovalQueuePage';
|
||||
import { SandraPainel } from '../cockpits/sandra/SandraPainel';
|
||||
import { authStore } from './auth-store';
|
||||
@@ -76,6 +77,12 @@ const pedidoDetailRoute = createRoute({
|
||||
component: OrderDetailPage,
|
||||
});
|
||||
|
||||
const catalogoRoute = createRoute({
|
||||
getParentRoute: () => rootRoute,
|
||||
path: '/catalogo',
|
||||
component: CatalogPage,
|
||||
});
|
||||
|
||||
const aprovacoes = createRoute({
|
||||
getParentRoute: () => rootRoute,
|
||||
path: '/aprovacoes',
|
||||
@@ -90,6 +97,7 @@ const routeTree = rootRoute.addChildren([
|
||||
pedidosRoute,
|
||||
novoOrderRoute,
|
||||
pedidoDetailRoute,
|
||||
catalogoRoute,
|
||||
aprovacoes,
|
||||
]);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user