This commit is contained in:
Vitex Tecnologia
2026-04-27 21:49:40 -03:00
parent 4c28862c5c
commit f2cc21f282
@@ -49,13 +49,35 @@ function parsePontuacaoInput(value: string): number {
return Number.isFinite(parsed) ? parsed : Number.NaN;
}
/** Pontuação do modal de lançamento: só inteiros ≥ 0 (o tipo bonus/desconto define o sinal no backend). */
const PONTUACAO_LANCAMENTO_MAX_FRAC = 2;
/** Pontuação do modal de lançamento: ≥ 0, até duas casas decimais (o tipo bonus/desconto define o sinal no backend). */
function sanitizePontuacaoLancamentoDigitando(raw: string): string {
const t = raw.trim();
const t = raw.trim().replace(/\s/g, "");
if (t === "") return "";
const n = parsePontuacaoInput(t);
if (!Number.isFinite(n) || n < 0) return "0";
return String(Math.trunc(Math.min(n, Number.MAX_SAFE_INTEGER)));
if (t === "," || t === ".") return "0" + t;
const c = t.indexOf(",");
const d = t.indexOf(".");
const si = c >= 0 && d >= 0 ? Math.min(c, d) : c >= 0 ? c : d >= 0 ? d : -1;
const sep = si >= 0 ? t[si]! : null;
if (sep == null) {
const digits = t.replace(/\D/g, "");
if (digits === "") return "";
const n = Number(digits);
if (n < 0) return "0";
return digits;
}
const intStr = t.slice(0, si).replace(/\D/g, "");
const rawAfter = t.slice(si + 1);
const fracStr = rawAfter.replace(/\D/g, "").slice(0, PONTUACAO_LANCAMENTO_MAX_FRAC);
const intPart = intStr === "" ? "0" : intStr;
if (t.endsWith(sep) && fracStr.length === 0) {
return intPart + sep;
}
return intPart + sep + fracStr;
}
function toPontuacaoInput(value: number): string {
@@ -303,7 +325,11 @@ export default function FechamentoDetalhes() {
return;
}
const descricao = lancamentoDescricao.trim();
const pontuacao = Math.trunc(Number(lancamentoPontuacao));
const pontuacao = (() => {
const n = parsePontuacaoInput(lancamentoPontuacao);
if (!Number.isFinite(n)) return Number.NaN;
return Math.round(n * 100) / 100;
})();
if (!descricao) {
toast.error("Informe a descrição do lançamento.");
return;
@@ -837,17 +863,11 @@ export default function FechamentoDetalhes() {
<Label htmlFor="lancamento-pontuacao">Pontuação</Label>
<Input
id="lancamento-pontuacao"
type="number"
inputMode="numeric"
min={0}
step={1}
type="text"
inputMode="decimal"
value={lancamentoPontuacao}
onKeyDown={(e) => {
if (e.key === "-" || e.key === "+" || e.key === "e" || e.key === "E" || e.key === "," || e.key === ".") {
e.preventDefault();
}
}}
onChange={(e) => setLancamentoPontuacao(sanitizePontuacaoLancamentoDigitando(e.target.value))}
placeholder="Ex.: 1,5"
/>
</div>