feat(catalog): filtro de preço e seletor de pauta

- Catálogo só mostra produtos com preço preenchido (vl_preco1 > 0) por default
- Novo endpoint GET /catalog/pautas — retorna as 6 pautas do representante logado
- GET /catalog?idPauta=N — usa preço da pauta selecionada (vw_pauta_produtos)
- CatalogPage: dropdown "Selecionar pauta de preços" com as pautas do rep
- product.contract: adiciona PautaSchema e idPauta no ProdutoListQuerySchema

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-29 14:55:18 +00:00
parent 1f8a9d872a
commit e7cbadcf7e
5 changed files with 185 additions and 84 deletions

View File

@@ -11,7 +11,7 @@ export const ProdutoSummarySchema = z.object({
codigo: z.string(),
descricao: z.string(),
unidade: z.string().nullable(),
vlPreco1: z.string(),
vlPreco1: z.string(), // preço base (vw_produtos) ou preço da pauta selecionada
codGrupo: z.number().int().nullable(),
grupo: z.string().nullable(),
codSubgrupo: z.number().int().nullable(),
@@ -21,6 +21,13 @@ export const ProdutoSummarySchema = z.object({
qtdEstoque: z.string().nullable(),
listaParauta: z.number().int().nullable(),
});
export const PautaSchema = z.object({
idPauta: z.number().int(),
codigo: z.number().int(),
descricao: z.string(),
});
export type Pauta = z.infer<typeof PautaSchema>;
export type ProdutoSummary = z.infer<typeof ProdutoSummarySchema>;
// ─── Produto Detail ───────────────────────────────────────────────────────────
@@ -44,6 +51,7 @@ export type ProdutoDetail = z.infer<typeof ProdutoDetailSchema>;
export const ProdutoListQuerySchema = z.object({
q: z.string().optional(),
codGrupo: z.coerce.number().int().optional(),
idPauta: z.coerce.number().int().optional(),
page: z.coerce.number().int().positive().default(1),
limit: z.coerce.number().int().min(1).max(200).default(50),
});