feat(api,web): card condicoes especiais no painel do representante
Card expansivel no painel do rep com promocoes e regras de desconto vigentes hoje para o representante logado. Endpoints vigentes agora resolvem nomes de produto/grupo/subgrupo; hooks com refetch de 60s para a condicao sumir logo apos encerrar ou inativar. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -384,12 +384,36 @@ export class PoliticasService {
|
||||
orderBy: [{ descPct: 'desc' }],
|
||||
});
|
||||
|
||||
// Nomes de produto e grupo — UI sempre mostra o nome, nunca só o código
|
||||
const codProdutos = [
|
||||
...new Set(
|
||||
rows.map((p) => p.codProduto?.trim()).filter((c): c is string => !!c && c.length > 0),
|
||||
),
|
||||
];
|
||||
const prodRows =
|
||||
codProdutos.length > 0
|
||||
? await prisma.$queryRawUnsafe<{ codigo: string; descricao: string | null }[]>(
|
||||
`SELECT TRIM(codigo) AS codigo, TRIM(descricao) AS descricao
|
||||
FROM vw_produtos
|
||||
WHERE id_empresa = ${idMatriz}
|
||||
AND TRIM(codigo) IN (${codProdutos.map((c) => `'${c.replace(/'/g, "''")}'`).join(',')})`,
|
||||
)
|
||||
: [];
|
||||
const prodNameMap = new Map(prodRows.map((r) => [r.codigo, r.descricao]));
|
||||
|
||||
const grupos = rows.some((p) => p.grpProd != null) ? await this.loadGruposProduto() : [];
|
||||
const grupoNameMap = new Map(
|
||||
grupos.filter((g) => g.cod_grupo != null).map((g) => [String(Number(g.cod_grupo)), g.grupo]),
|
||||
);
|
||||
|
||||
return {
|
||||
promocoes: rows.map((p) => ({
|
||||
id: p.id,
|
||||
descricao: p.descricao,
|
||||
codProduto: p.codProduto,
|
||||
nomeProduto: p.codProduto ? (prodNameMap.get(p.codProduto.trim()) ?? null) : null,
|
||||
grpProd: p.grpProd,
|
||||
grupo: p.grpProd ? (grupoNameMap.get(p.grpProd.trim()) ?? null) : null,
|
||||
descPct: Number(p.descPct),
|
||||
dataFim: p.dataFim.toISOString().slice(0, 10),
|
||||
})),
|
||||
@@ -418,12 +442,25 @@ export class PoliticasService {
|
||||
orderBy: [{ descPct: 'desc' }],
|
||||
});
|
||||
|
||||
// Nomes de grupo/subgrupo — UI sempre mostra o nome, nunca só o código
|
||||
const grupos = rows.some((r) => r.codGrupo != null || r.codSubgrupo != null)
|
||||
? await this.loadGruposProduto()
|
||||
: [];
|
||||
const grupoNameMap = new Map(
|
||||
grupos.filter((g) => g.cod_grupo != null).map((g) => [Number(g.cod_grupo), g.grupo]),
|
||||
);
|
||||
const subgrupoNameMap = new Map(
|
||||
grupos.filter((g) => g.cod_subgrupo != null).map((g) => [Number(g.cod_subgrupo), g.subgrupo]),
|
||||
);
|
||||
|
||||
return {
|
||||
regras: rows.map((r) => ({
|
||||
id: r.id,
|
||||
descricao: r.descricao,
|
||||
codGrupo: r.codGrupo,
|
||||
grupo: r.codGrupo != null ? (grupoNameMap.get(r.codGrupo) ?? null) : null,
|
||||
codSubgrupo: r.codSubgrupo,
|
||||
subgrupo: r.codSubgrupo != null ? (subgrupoNameMap.get(r.codSubgrupo) ?? null) : null,
|
||||
descPct: Number(r.descPct),
|
||||
dataFim: r.dataFim.toISOString().slice(0, 10),
|
||||
})),
|
||||
|
||||
Reference in New Issue
Block a user