feat(api,web): meta de positivacao diaria salva no servidor com botao Salvar
Antes a meta vivia no localStorage do navegador (perdia em outro dispositivo). Agora: coluna meta_positivacao_dia em config_empresa, PUT /dashboard/manager/meta-positivacao-dia (gerente/admin), meta vem no dashboard e o card tem botao Salvar (desabilitado sem mudanca). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
import { useState } from 'react';
|
||||
import { useEffect, useState } from 'react';
|
||||
import { useMutation, useQueryClient } from '@tanstack/react-query';
|
||||
import {
|
||||
Button,
|
||||
Card,
|
||||
@@ -13,6 +14,7 @@ import {
|
||||
Table,
|
||||
Tag,
|
||||
Typography,
|
||||
message,
|
||||
} from 'antd';
|
||||
import { useNavigate } from '@tanstack/react-router';
|
||||
import type { TableColumnsType } from 'antd';
|
||||
@@ -43,6 +45,7 @@ import dayjs from 'dayjs';
|
||||
import type { Dayjs } from 'dayjs';
|
||||
import type { RankingRep, PositivacaoRep, PositivacaoDia, MetaItem } from '@sar/api-interface';
|
||||
import { useManagerDashboard } from '../../lib/queries/gerente';
|
||||
import { apiFetch } from '../../lib/api-client';
|
||||
|
||||
ChartJS.register(
|
||||
CategoryScale,
|
||||
@@ -56,9 +59,6 @@ ChartJS.register(
|
||||
|
||||
const { Title, Text } = Typography;
|
||||
|
||||
// Meta diária de positivação é preferência local do gerente (não vem do ERP)
|
||||
const META_POSITIVACAO_DIA_KEY = 'sar:ger:meta-positivacao-dia';
|
||||
|
||||
function fmt(v: number): string {
|
||||
return v.toLocaleString('pt-BR', { style: 'currency', currency: 'BRL' });
|
||||
}
|
||||
@@ -229,25 +229,31 @@ const rankingColumns: TableColumnsType<RankingRep> = [
|
||||
|
||||
function PositivacaoDiariaCard({
|
||||
dados,
|
||||
metaSalva,
|
||||
periodo,
|
||||
periodoLabel,
|
||||
isMesAtual,
|
||||
}: {
|
||||
dados: PositivacaoDia[];
|
||||
metaSalva: number;
|
||||
periodo: Dayjs;
|
||||
periodoLabel: string;
|
||||
isMesAtual: boolean;
|
||||
}) {
|
||||
const [meta, setMeta] = useState<number>(() => {
|
||||
const saved = Number(localStorage.getItem(META_POSITIVACAO_DIA_KEY));
|
||||
return Number.isFinite(saved) && saved > 0 ? saved : 0;
|
||||
});
|
||||
// Meta salva no servidor (config_empresa) — vale em qualquer dispositivo
|
||||
const [meta, setMeta] = useState<number>(metaSalva);
|
||||
useEffect(() => setMeta(metaSalva), [metaSalva]);
|
||||
const qc = useQueryClient();
|
||||
const [msg, msgCtx] = message.useMessage();
|
||||
|
||||
function changeMeta(v: number | null) {
|
||||
const val = v ?? 0;
|
||||
setMeta(val);
|
||||
localStorage.setItem(META_POSITIVACAO_DIA_KEY, String(val));
|
||||
}
|
||||
const salvarMeta = useMutation({
|
||||
mutationFn: (m: number) =>
|
||||
apiFetch('/dashboard/manager/meta-positivacao-dia', { method: 'PUT', body: { meta: m } }),
|
||||
onSuccess: () => {
|
||||
void qc.invalidateQueries({ queryKey: ['dashboard', 'manager'] });
|
||||
void msg.success('Meta salva');
|
||||
},
|
||||
});
|
||||
|
||||
// Eixo com todos os dias: até hoje no mês atual, mês inteiro nos anteriores
|
||||
const ultimoDia = isMesAtual ? dayjs().date() : periodo.endOf('month').date();
|
||||
@@ -334,13 +340,23 @@ function PositivacaoDiariaCard({
|
||||
min={0}
|
||||
size="small"
|
||||
value={meta > 0 ? meta : undefined}
|
||||
onChange={changeMeta}
|
||||
onChange={(v) => setMeta(v ?? 0)}
|
||||
placeholder="—"
|
||||
style={{ width: 80 }}
|
||||
/>
|
||||
<Button
|
||||
type="primary"
|
||||
size="small"
|
||||
disabled={meta === metaSalva}
|
||||
loading={salvarMeta.isPending}
|
||||
onClick={() => salvarMeta.mutate(meta)}
|
||||
>
|
||||
Salvar
|
||||
</Button>
|
||||
</Flex>
|
||||
}
|
||||
>
|
||||
{msgCtx}
|
||||
<div style={{ height: 280 }}>
|
||||
<Chart type="bar" data={chartData} options={options} />
|
||||
</div>
|
||||
@@ -645,6 +661,7 @@ export function GerPainel() {
|
||||
{/* Positivação Diária */}
|
||||
<PositivacaoDiariaCard
|
||||
dados={positivacaoDiaria}
|
||||
metaSalva={data.metaPositivacaoDia ?? 0}
|
||||
periodo={periodo}
|
||||
periodoLabel={periodoLabel}
|
||||
isMesAtual={isMesAtual}
|
||||
|
||||
Reference in New Issue
Block a user