Merge pull request #3 from JurunenseDevInterno/feat-migracao-oracle-integration-analitico

Feat migracao oracle integration analitico
This commit is contained in:
Alessandro Gonçalves 2025-10-21 12:37:36 -03:00 committed by GitHub
commit 1bb063cea1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 48 additions and 42 deletions

View File

@ -1,8 +1,7 @@
{ {
"extends": "next/core-web-vitals", "extends": ["next/core-web-vitals"],
"rules": { "rules": {
"@typescript-eslint/no-explicit-any": "off", "@typescript-eslint/no-unused-vars": "warn",
"@typescript-eslint/no-unused-vars": "off", "@typescript-eslint/no-explicit-any": "warn"
"@typescript-eslint/no-empty-object-type": "off"
} }
} }

View File

@ -1,25 +0,0 @@
import { dirname } from "path";
import { fileURLToPath } from "url";
import { FlatCompat } from "@eslint/eslintrc";
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const compat = new FlatCompat({
baseDirectory: __dirname,
});
const eslintConfig = [
...compat.extends("next/core-web-vitals", "next/typescript"),
{
ignores: [
"node_modules/**",
".next/**",
"out/**",
"build/**",
"next-env.d.ts",
],
},
];
export default eslintConfig;

11
package-lock.json generated
View File

@ -30,6 +30,7 @@
"devDependencies": { "devDependencies": {
"@eslint/eslintrc": "^3", "@eslint/eslintrc": "^3",
"@types/node": "^20", "@types/node": "^20",
"@types/oracledb": "^6.9.1",
"@types/pg": "^8.15.5", "@types/pg": "^8.15.5",
"@types/react": "^19", "@types/react": "^19",
"@types/react-dom": "^19", "@types/react-dom": "^19",
@ -2211,6 +2212,16 @@
"undici-types": "~6.21.0" "undici-types": "~6.21.0"
} }
}, },
"node_modules/@types/oracledb": {
"version": "6.9.1",
"resolved": "https://registry.npmjs.org/@types/oracledb/-/oracledb-6.9.1.tgz",
"integrity": "sha512-rXDnApyfaki0dvHuqzQvfirK6yHbtEO5nJ4CXKHrZYdwNAx4PjddqoCXdN1dZaEnZxXFwCy9xEWyIemL8EI/NQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/pg": { "node_modules/@types/pg": {
"version": "8.15.5", "version": "8.15.5",
"resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.15.5.tgz", "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.15.5.tgz",

View File

@ -31,6 +31,7 @@
"devDependencies": { "devDependencies": {
"@eslint/eslintrc": "^3", "@eslint/eslintrc": "^3",
"@types/node": "^20", "@types/node": "^20",
"@types/oracledb": "^6.9.1",
"@types/pg": "^8.15.5", "@types/pg": "^8.15.5",
"@types/react": "^19", "@types/react": "^19",
"@types/react-dom": "^19", "@types/react-dom": "^19",

View File

@ -308,7 +308,7 @@ export default function AnaliticoComponent({ filtros }: AnaliticoProps) {
const conds = Array.isArray(filters) ? filters : [filters]; const conds = Array.isArray(filters) ? filters : [filters];
// A coluna deve atender a todas as condições aplicáveis a ela // A coluna deve atender a todas as condições aplicáveis a ela
return conds.every((filter) => { return conds.every((filter: any) => {
const raw = row.getValue(columnId); const raw = row.getValue(columnId);
const v = raw == null ? "" : String(raw); const v = raw == null ? "" : String(raw);
const op = filter.operator; const op = filter.operator;
@ -417,8 +417,28 @@ export default function AnaliticoComponent({ filtros }: AnaliticoProps) {
// Calcular totais das colunas de valores para o footer - EXATAMENTE o mesmo padrão do Valor Total // Calcular totais das colunas de valores para o footer - EXATAMENTE o mesmo padrão do Valor Total
const columnTotals = React.useMemo(() => { const columnTotals = React.useMemo(() => {
// Garantir que sempre temos dados para calcular
if (!data || data.length === 0) {
console.log("⚠️ Sem dados para calcular totais das colunas");
return {
valorRealizado: 0,
valorPrevisto: 0,
valorConfirmado: 0,
valorPago: 0,
};
}
// Usar EXATAMENTE a mesma lógica do totalValor // Usar EXATAMENTE a mesma lógica do totalValor
const filteredData = table.getRowModel().rows.map((row) => row.original); const filteredData = table.getRowModel().rows.map((row) => row.original);
console.log("🔄 Calculando totais das colunas - Dados filtrados:", {
totalRows: filteredData.length,
originalDataLength: data.length,
columnFilters: columnFilters.length,
globalFilter,
firstItem: filteredData[0]
});
const valorRealizado = filteredData.reduce((sum, item) => { const valorRealizado = filteredData.reduce((sum, item) => {
const valor = typeof item.valor === "string" ? parseFloat(item.valor) : item.valor; const valor = typeof item.valor === "string" ? parseFloat(item.valor) : item.valor;
return sum + (isNaN(valor) ? 0 : valor); return sum + (isNaN(valor) ? 0 : valor);
@ -455,7 +475,7 @@ export default function AnaliticoComponent({ filtros }: AnaliticoProps) {
valorConfirmado, valorConfirmado,
valorPago, valorPago,
}; };
}, [table, columnFilters, globalFilter]); }, [table, columnFilters, globalFilter, data]);
const exportToExcel = () => { const exportToExcel = () => {
if (data.length === 0) return; if (data.length === 0) return;
@ -840,8 +860,8 @@ export default function AnaliticoComponent({ filtros }: AnaliticoProps) {
TOTAL: {table.getRowModel().rows.length} registros TOTAL: {table.getRowModel().rows.length} registros
</div> </div>
<div className="w-[120px] whitespace-nowrap"></div> <div className="w-[120px] whitespace-nowrap"></div>
<div className="w-[100px] whitespace-nowrap"></div> <div className="w-[120px] whitespace-nowrap"></div>
<div className="w-[160px] whitespace-nowrap"></div> <div className="w-[120px] whitespace-nowrap"></div>
<div className="w-[220px] whitespace-nowrap"></div> <div className="w-[220px] whitespace-nowrap"></div>
<div className="w-[140px] whitespace-nowrap"></div> <div className="w-[140px] whitespace-nowrap"></div>
<div className="w-[130px] whitespace-nowrap"></div> <div className="w-[130px] whitespace-nowrap"></div>
@ -901,7 +921,7 @@ export default function AnaliticoComponent({ filtros }: AnaliticoProps) {
)} )}
</div> </div>
<div className="w-[20px] whitespace-nowrap"></div> <div className="w-[20px] whitespace-nowrap"></div>
<div className="w-[200px] whitespace-nowrap"></div> <div className="w-[320px] whitespace-nowrap"></div>
<div className="w-[500px] whitespace-nowrap"></div> <div className="w-[500px] whitespace-nowrap"></div>
<div className="w-[30px] whitespace-nowrap"></div> <div className="w-[30px] whitespace-nowrap"></div>
</div> </div>

View File

@ -125,23 +125,23 @@ export default function Teste() {
const dadosCompletos = await response.json(); const dadosCompletos = await response.json();
// Extrair períodos únicos dos dados // Extrair períodos únicos dos dados
const periodosUnicos = [...new Set(dadosCompletos.map((item: DREItem) => item.data_competencia))].sort(); const periodosUnicos = [...new Set(dadosCompletos.map((item: DREItem) => item.data_competencia))].sort() as string[];
setMesesDisponiveis(periodosUnicos); setMesesDisponiveis(periodosUnicos);
// Extrair grupos únicos // Extrair grupos únicos
const gruposUnicos = [...new Set(dadosCompletos.map((item: DREItem) => item.grupo))].sort(); const gruposUnicos = [...new Set(dadosCompletos.map((item: DREItem) => item.grupo))].sort() as string[];
setOpcoesGrupos(gruposUnicos); setOpcoesGrupos(gruposUnicos);
// Extrair subgrupos únicos // Extrair subgrupos únicos
const subgruposUnicos = [...new Set(dadosCompletos.map((item: DREItem) => item.subgrupo))].sort(); const subgruposUnicos = [...new Set(dadosCompletos.map((item: DREItem) => item.subgrupo))].sort() as string[];
setOpcoesSubgrupos(subgruposUnicos); setOpcoesSubgrupos(subgruposUnicos);
// Extrair centros de custo únicos // Extrair centros de custo únicos
const centrosCustoUnicos = [...new Set(dadosCompletos.map((item: DREItem) => item.centro_custo))].sort(); const centrosCustoUnicos = [...new Set(dadosCompletos.map((item: DREItem) => item.centro_custo))].sort() as string[];
setOpcoesCentrosCusto(centrosCustoUnicos); setOpcoesCentrosCusto(centrosCustoUnicos);
// Extrair contas únicas // Extrair contas únicas
const contasUnicas = [...new Set(dadosCompletos.map((item: DREItem) => item.conta))].sort(); const contasUnicas = [...new Set(dadosCompletos.map((item: DREItem) => item.conta))].sort() as string[];
setOpcoesContas(contasUnicas); setOpcoesContas(contasUnicas);
} catch (error) { } catch (error) {
@ -418,7 +418,7 @@ export default function Teste() {
setFiltrosAplicados(true); setFiltrosAplicados(true);
// Extrair meses únicos dos dados filtrados // Extrair meses únicos dos dados filtrados
const mesesUnicos = [...new Set(dadosFiltrados.map(item => item.data_competencia))].sort(); const mesesUnicos = [...new Set(dadosFiltrados.map((item: DREItem) => item.data_competencia))].sort() as string[];
setMesesDisponiveis(mesesUnicos); setMesesDisponiveis(mesesUnicos);
} catch (error) { } catch (error) {

View File

@ -69,7 +69,7 @@ function criarGruposCalculados(dados: any[]) {
const dadosMes = dadosPorMes[mes]; const dadosMes = dadosPorMes[mes];
// Calcular valores por grupo usando código numérico // Calcular valores por grupo usando código numérico
const valoresPorGrupo = dadosMes.reduce((acc, item) => { const valoresPorGrupo = dadosMes.reduce((acc: Record<string, number>, item: any) => {
const codgrupo = item.codgrupo; const codgrupo = item.codgrupo;
if (!acc[codgrupo]) acc[codgrupo] = 0; if (!acc[codgrupo]) acc[codgrupo] = 0;
acc[codgrupo] += parseFloat(item.valor); acc[codgrupo] += parseFloat(item.valor);