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: '',
codigoConta: '',
});
const [linhaSelecionada, setLinhaSelecionada] = useState<string | null>(null);
useEffect(() => {
fetchData();
@ -126,7 +127,7 @@ export default function Teste() {
};
// Função para lidar com clique nas linhas
const handleRowClick = (row: HierarchicalRow) => {
const handleRowClick = (row: HierarchicalRow, mesSelecionado?: string) => {
if (!data.length) return;
// Pegar todas as datas disponíveis para definir o período
@ -142,9 +143,19 @@ export default function Teste() {
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({
dataInicio: dataInicioStr,
dataFim: dataFimStr,
dataInicio: dataInicioFiltro,
dataFim: dataFimFiltro,
centroCusto: row.centro_custo || '',
codigoGrupo,
codigoSubgrupo,
@ -430,17 +441,29 @@ export default function Teste() {
const getRowStyle = (row: HierarchicalRow) => {
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) {
case 'grupo':
return `${baseStyle} bg-primary/5 font-semibold`;
return `${style} bg-primary/5 font-semibold`;
case 'subgrupo':
return `${baseStyle} bg-primary/10 font-medium`;
return `${style} bg-primary/10 font-medium`;
case 'centro_custo':
return `${baseStyle} bg-secondary/30 font-medium`;
return `${style} bg-secondary/30 font-medium`;
case 'conta':
return `${baseStyle} bg-muted/20`;
return `${style} bg-muted/20`;
default:
return baseStyle;
return style;
}
};
@ -607,14 +630,18 @@ export default function Teste() {
{mesesDisponiveis.map((mes) => (
<div
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]
? formatCurrency(row.valoresPorMes[mes])
: '-'}
</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!)}
</div>
</div>

View File

@ -19,8 +19,8 @@ export async function GET(request: NextRequest) {
);
}
let whereConditions = [];
let params = [dataInicio, dataFim];
const whereConditions = [];
const params = [dataInicio, dataFim];
if (centroCusto) {
whereConditions.push(`ffa.codigo_centrocusto = $${params.length + 1}`);
@ -52,32 +52,76 @@ export async function GET(request: NextRequest) {
conditions.push(`ffa.codigo_centrocusto = '${centroCusto}'`);
if (codigoConta) conditions.push(`ffa.codigo_conta = '${codigoConta}'`);
const whereClause =
conditions.length > 0 ? `AND ${conditions.join(' AND ')}` : '';
// Para grupo e subgrupo, vamos usar uma abordagem mais simples
let whereClause = '';
if (conditions.length > 0) {
whereClause = `AND ${conditions.join(' AND ')}`;
}
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)}
`;
// Se temos filtros de grupo ou subgrupo, precisamos fazer join com a view
if (codigoGrupo || codigoSubgrupo) {
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
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 {
// Query sem filtros específicos
query = sql`