feat(web+api): cockpit rep — novo pedido v2, endereço de entrega e cancelamento de orçamento

- NewOrderPage: etapas 1-5 — merge de cards, busca de produto melhorada
  (autocomplete com estoque + modal catálogo), responsividade mobile (tabela →
  cards, footer compacto), histórico de compras do cliente e campo de
  endereço de entrega (cadastrado vs livre)
- endEntrega: campo TEXT adicionado em sar.pedidos; contrato CreatePedidoSchema
  e PedidoDetailSchema atualizados; aparece no detalhe (OrderDetailPage,
  OrderDetailModal) e no PDF (OrderPrintPage)
- Cancelamento de orçamento: PATCH /orders/:id/cancel — rep cancela seu
  próprio orçamento (situa 0); histórico registrado; UI com Modal.confirm
  substituindo alert() em OrderActionsMenu
- Fix: useClientDetail chamado para cliente selecionado manualmente, garantindo
  que clientEndStr seja preenchido mesmo sem clientIdParam na URL

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-29 14:25:24 +00:00
parent 5bda00009f
commit a6cb1df2aa
10 changed files with 1181 additions and 202 deletions

View File

@@ -115,6 +115,7 @@ export type ContatoResult = z.infer<typeof ContatoResultSchema>;
export const TopProdutoSchema = z.object({
idProduto: z.number().int(),
codProduto: z.string(),
descricao: z.string(),
unidade: z.string().nullable(),
qtdTotal: z.number(),

View File

@@ -88,6 +88,7 @@ export const PedidoDetailSchema = PedidoSummarySchema.extend({
comissao: z.string(),
pedFlex: z.string(),
formaPagamento: z.string().nullable().optional(),
endEntrega: z.string().nullable().optional(),
aprovadoPor: z.number().int().nullable(),
aprovadoEm: z.iso.datetime().nullable(),
motivoRecusa: z.string().nullable(),
@@ -138,6 +139,7 @@ export const CreatePedidoSchema = z.object({
idPauta: z.number().int().optional(),
codFormapag: z.number().int().optional(),
obs: z.string().optional(),
endEntrega: z.string().optional(),
idempotencyKey: z.string().optional(),
itens: z.array(CreatePedidoItemSchema).min(1),
});