diff --git a/src/app/DRE/teste.tsx b/src/app/DRE/teste.tsx index 0e86e05..59bf634 100644 --- a/src/app/DRE/teste.tsx +++ b/src/app/DRE/teste.tsx @@ -65,6 +65,7 @@ export default function Teste() { codigoSubgrupo: '', codigoConta: '', }); + const [linhaSelecionada, setLinhaSelecionada] = useState(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) => (
handleRowClick(row, mes)} > {row.valoresPorMes && row.valoresPorMes[mes] ? formatCurrency(row.valoresPorMes[mes]) : '-'}
))} -
+
handleRowClick(row)} + > {formatCurrency(row.total!)}
diff --git a/src/app/api/analitico/route.ts b/src/app/api/analitico/route.ts index fee8386..b57c0af 100644 --- a/src/app/api/analitico/route.ts +++ b/src/app/api/analitico/route.ts @@ -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`