ajuste nos filtros

This commit is contained in:
Felipe Batista 2025-10-08 02:30:37 -03:00
parent dbd6642303
commit 3b9f58b48c
2 changed files with 108 additions and 37 deletions

View File

@ -65,6 +65,7 @@ export default function Teste() {
codigoSubgrupo: '', codigoSubgrupo: '',
codigoConta: '', codigoConta: '',
}); });
const [linhaSelecionada, setLinhaSelecionada] = useState<string | null>(null);
useEffect(() => { useEffect(() => {
fetchData(); fetchData();
@ -126,7 +127,7 @@ export default function Teste() {
}; };
// Função para lidar com clique nas linhas // Função para lidar com clique nas linhas
const handleRowClick = (row: HierarchicalRow) => { const handleRowClick = (row: HierarchicalRow, mesSelecionado?: string) => {
if (!data.length) return; if (!data.length) return;
// Pegar todas as datas disponíveis para definir o período // Pegar todas as datas disponíveis para definir o período
@ -142,9 +143,19 @@ export default function Teste() {
row.subgrupo row.subgrupo
); );
// Criar um identificador único para a linha
const linhaId = `${row.type}-${row.grupo || ''}-${row.subgrupo || ''}-${
row.centro_custo || ''
}-${row.codigo_conta || ''}`;
setLinhaSelecionada(linhaId);
// Se um mês específico foi selecionado, usar apenas esse mês
const dataInicioFiltro = mesSelecionado || dataInicioStr;
const dataFimFiltro = mesSelecionado || dataFimStr;
setAnaliticoFiltros({ setAnaliticoFiltros({
dataInicio: dataInicioStr, dataInicio: dataInicioFiltro,
dataFim: dataFimStr, dataFim: dataFimFiltro,
centroCusto: row.centro_custo || '', centroCusto: row.centro_custo || '',
codigoGrupo, codigoGrupo,
codigoSubgrupo, codigoSubgrupo,
@ -430,17 +441,29 @@ export default function Teste() {
const getRowStyle = (row: HierarchicalRow) => { const getRowStyle = (row: HierarchicalRow) => {
const baseStyle = 'transition-colors hover:bg-muted/50'; const baseStyle = 'transition-colors hover:bg-muted/50';
// Criar identificador único para a linha
const linhaId = `${row.type}-${row.grupo || ''}-${row.subgrupo || ''}-${
row.centro_custo || ''
}-${row.codigo_conta || ''}`;
const isSelected = linhaSelecionada === linhaId;
let style = baseStyle;
if (isSelected) {
style += ' bg-blue-100 border-l-4 border-blue-500 shadow-md';
}
switch (row.type) { switch (row.type) {
case 'grupo': case 'grupo':
return `${baseStyle} bg-primary/5 font-semibold`; return `${style} bg-primary/5 font-semibold`;
case 'subgrupo': case 'subgrupo':
return `${baseStyle} bg-primary/10 font-medium`; return `${style} bg-primary/10 font-medium`;
case 'centro_custo': case 'centro_custo':
return `${baseStyle} bg-secondary/30 font-medium`; return `${style} bg-secondary/30 font-medium`;
case 'conta': case 'conta':
return `${baseStyle} bg-muted/20`; return `${style} bg-muted/20`;
default: default:
return baseStyle; return style;
} }
}; };
@ -607,14 +630,18 @@ export default function Teste() {
{mesesDisponiveis.map((mes) => ( {mesesDisponiveis.map((mes) => (
<div <div
key={mes} key={mes}
className="flex-1 min-w-[120px] max-w-[150px] text-right font-medium p-1 border-b px-1 text-xs" className="flex-1 min-w-[120px] max-w-[150px] text-right font-medium p-1 border-b px-1 text-xs cursor-pointer hover:bg-blue-50"
onClick={() => handleRowClick(row, mes)}
> >
{row.valoresPorMes && row.valoresPorMes[mes] {row.valoresPorMes && row.valoresPorMes[mes]
? formatCurrency(row.valoresPorMes[mes]) ? formatCurrency(row.valoresPorMes[mes])
: '-'} : '-'}
</div> </div>
))} ))}
<div className="flex-1 min-w-[120px] max-w-[150px] text-right font-medium p-1 border-b px-1 text-xs"> <div
className="flex-1 min-w-[120px] max-w-[150px] text-right font-medium p-1 border-b px-1 text-xs cursor-pointer hover:bg-blue-50"
onClick={() => handleRowClick(row)}
>
{formatCurrency(row.total!)} {formatCurrency(row.total!)}
</div> </div>
</div> </div>

View File

@ -19,8 +19,8 @@ export async function GET(request: NextRequest) {
); );
} }
let whereConditions = []; const whereConditions = [];
let params = [dataInicio, dataFim]; const params = [dataInicio, dataFim];
if (centroCusto) { if (centroCusto) {
whereConditions.push(`ffa.codigo_centrocusto = $${params.length + 1}`); whereConditions.push(`ffa.codigo_centrocusto = $${params.length + 1}`);
@ -52,32 +52,76 @@ export async function GET(request: NextRequest) {
conditions.push(`ffa.codigo_centrocusto = '${centroCusto}'`); conditions.push(`ffa.codigo_centrocusto = '${centroCusto}'`);
if (codigoConta) conditions.push(`ffa.codigo_conta = '${codigoConta}'`); if (codigoConta) conditions.push(`ffa.codigo_conta = '${codigoConta}'`);
const whereClause = // Para grupo e subgrupo, vamos usar uma abordagem mais simples
conditions.length > 0 ? `AND ${conditions.join(' AND ')}` : ''; let whereClause = '';
if (conditions.length > 0) {
whereClause = `AND ${conditions.join(' AND ')}`;
}
query = sql` // Se temos filtros de grupo ou subgrupo, precisamos fazer join com a view
SELECT if (codigoGrupo || codigoSubgrupo) {
ffa.codigo_fornecedor, query = sql`
ffa.nome_fornecedor, SELECT
ffa.id, ffa.codigo_fornecedor,
ffa.codfilial, ffa.nome_fornecedor,
ffa.recnum, ffa.id,
ffa.data_competencia, ffa.codfilial,
ffa.data_vencimento, ffa.recnum,
ffa.data_pagamento, ffa.data_competencia,
ffa.data_caixa, ffa.data_vencimento,
ffa.codigo_conta, ffa.data_pagamento,
ffa.conta, ffa.data_caixa,
ffa.codigo_centrocusto, ffa.codigo_conta,
ffa.valor, ffa.conta,
ffa.historico, ffa.codigo_centrocusto,
ffa.historico2, ffa.valor,
ffa.created_at, ffa.historico,
ffa.updated_at ffa.historico2,
FROM fato_financeiro_analitico AS ffa ffa.created_at,
WHERE to_char(ffa.data_competencia, 'YYYY-MM') BETWEEN ${dataInicio} AND ${dataFim} ffa.updated_at
${sql.raw(whereClause)} FROM fato_financeiro_analitico AS ffa
`; INNER JOIN public.view_dre_gerencial AS dre
ON ffa.codigo_conta = dre.codigo_conta::text
AND ffa.codigo_centrocusto = dre.centro_custo
AND to_char(ffa.data_competencia, 'YYYY-MM') = to_char(dre.data_competencia, 'YYYY-MM')
WHERE to_char(ffa.data_competencia, 'YYYY-MM') BETWEEN ${dataInicio} AND ${dataFim}
${sql.raw(whereClause)}
${
codigoGrupo
? sql`AND SUBSTRING(dre.grupo FROM '^\\s*(\\d+)\\s*\\.') = ${codigoGrupo}`
: sql``
}
${
codigoSubgrupo
? sql`AND (SUBSTRING(dre.subgrupo FROM '^\\s*(\\d+(?:\\.\\d+)+)\\s*-') = ${codigoSubgrupo} OR dre.subgrupo ILIKE '%${codigoSubgrupo}%')`
: sql``
}
`;
} else {
query = sql`
SELECT
ffa.codigo_fornecedor,
ffa.nome_fornecedor,
ffa.id,
ffa.codfilial,
ffa.recnum,
ffa.data_competencia,
ffa.data_vencimento,
ffa.data_pagamento,
ffa.data_caixa,
ffa.codigo_conta,
ffa.conta,
ffa.codigo_centrocusto,
ffa.valor,
ffa.historico,
ffa.historico2,
ffa.created_at,
ffa.updated_at
FROM fato_financeiro_analitico AS ffa
WHERE to_char(ffa.data_competencia, 'YYYY-MM') BETWEEN ${dataInicio} AND ${dataFim}
${sql.raw(whereClause)}
`;
}
} else { } else {
// Query sem filtros específicos // Query sem filtros específicos
query = sql` query = sql`