import z from "zod"; const zPreprocessarNumero = (p) => { if (typeof p === "number") return p; if (typeof p !== "string") return p; let p2 = p; if (p2.includes(",")) { // ponto de milhar → remove; vírgula decimal → troca por ponto p2 = p2.replace(/\./g, "").replace(",", "."); } // remove tudo que não seja dígito ou ponto decimal p2 = p2.replace(/[^0-9.]/g, ""); if (p2 == "") return null; return Number(p2); }; /** * Schema numérico que aceita strings legadas e normaliza para `number`. * * O campo **é** um número. O `preprocess` resolve compatibilidade com dados * antigos onde o frontend enviava strings formatadas (BR ou monetária). * * Formatos de entrada aceitos: * - `10` → number direto * - `10.1` → ponto decimal * - `10,1` → vírgula decimal (BR) * - `1.000,1` → milhar com ponto + vírgula decimal (BR) * - `R$ 10,01` → prefixo monetário legado */ export const zNumero = z.preprocess(zPreprocessarNumero, z.number()); export const zNumeroPositivo = z.preprocess(zPreprocessarNumero, z.number().positive()); export const zNumeroInteiro = z.preprocess(zPreprocessarNumero, z.number().int());