fix: inicialização
This commit is contained in:
parent
977918957b
commit
9696d38439
|
|
@ -40,7 +40,7 @@ interface DREItem {
|
|||
}
|
||||
|
||||
interface HierarchicalRow {
|
||||
type: "grupo" | "conta";
|
||||
type: "grupo" | "conta" | "calculado";
|
||||
level: number;
|
||||
grupo?: string;
|
||||
codigo_grupo?: string;
|
||||
|
|
@ -51,6 +51,7 @@ interface HierarchicalRow {
|
|||
valoresPorMes?: Record<string, number>;
|
||||
percentuaisPorMes?: Record<string, number>;
|
||||
percentualTotal?: number;
|
||||
isCalculado?: boolean;
|
||||
}
|
||||
|
||||
// Componente memoizado para linhas da tabela
|
||||
|
|
@ -344,6 +345,12 @@ export default function Teste() {
|
|||
console.log('🖱️ Clique na linha:', row);
|
||||
console.log('📅 Mês selecionado:', mesSelecionado);
|
||||
|
||||
// Linhas calculadas não devem abrir o componente analítico
|
||||
if (row.type === "calculado") {
|
||||
console.log('⚠️ Linha calculada - não abre componente analítico');
|
||||
return;
|
||||
}
|
||||
|
||||
if (!data.length) {
|
||||
console.log('⚠️ Sem dados disponíveis');
|
||||
return;
|
||||
|
|
@ -469,26 +476,39 @@ export default function Teste() {
|
|||
return valoresPorMes;
|
||||
};
|
||||
|
||||
// Função para calcular percentuais (simplificada - sem faturamento líquido)
|
||||
// Função para calcular percentuais baseado no CODGRUPO 01 (FATURAMENTO LÍQUIDO)
|
||||
const calcularPercentuaisPorMes = (
|
||||
valoresPorMes: Record<string, number>
|
||||
valoresPorMes: Record<string, number>,
|
||||
codigoGrupo?: string
|
||||
): Record<string, number> => {
|
||||
const percentuais: Record<string, number> = {};
|
||||
|
||||
// Calcular total geral por mês
|
||||
const totaisPorMes: Record<string, number> = {};
|
||||
// Se for CODGRUPO 01, sempre retornar 100%
|
||||
if (codigoGrupo === "01") {
|
||||
mesesDisponiveis.forEach(mes => {
|
||||
totaisPorMes[mes] = data
|
||||
.filter(item => item.data_competencia === mes)
|
||||
percentuais[mes] = 100;
|
||||
});
|
||||
return percentuais;
|
||||
}
|
||||
|
||||
// Calcular valores do grupo 01 por mês (base para cálculo)
|
||||
const valoresGrupo01PorMes: Record<string, number> = {};
|
||||
mesesDisponiveis.forEach(mes => {
|
||||
valoresGrupo01PorMes[mes] = data
|
||||
.filter(item => {
|
||||
const codgrupo = item.codgrupo || item.codigo_grupo || "";
|
||||
return codgrupo === "01" && item.data_competencia === mes;
|
||||
})
|
||||
.reduce((sum, item) => sum + parseFloat(item.valor), 0);
|
||||
});
|
||||
|
||||
// Calcular percentuais baseado no grupo 01
|
||||
Object.keys(valoresPorMes).forEach((mes) => {
|
||||
const valorAtual = valoresPorMes[mes];
|
||||
const totalMes = totaisPorMes[mes] || 0;
|
||||
const valorGrupo01 = valoresGrupo01PorMes[mes] || 0;
|
||||
|
||||
if (totalMes !== 0) {
|
||||
percentuais[mes] = (valorAtual / totalMes) * 100;
|
||||
if (valorGrupo01 !== 0) {
|
||||
percentuais[mes] = (valorAtual / valorGrupo01) * 100;
|
||||
} else {
|
||||
percentuais[mes] = 0;
|
||||
}
|
||||
|
|
@ -497,12 +517,23 @@ export default function Teste() {
|
|||
return percentuais;
|
||||
};
|
||||
|
||||
// Função para calcular percentual do total
|
||||
const calcularPercentualTotal = (total: number): number => {
|
||||
const totalGeral = data.reduce((sum, item) => sum + parseFloat(item.valor), 0);
|
||||
// Função para calcular percentual do total baseado no CODGRUPO 01
|
||||
const calcularPercentualTotal = (total: number, codigoGrupo?: string): number => {
|
||||
// Se for CODGRUPO 01, sempre retornar 100%
|
||||
if (codigoGrupo === "01") {
|
||||
return 100;
|
||||
}
|
||||
|
||||
if (totalGeral !== 0) {
|
||||
return (total / totalGeral) * 100;
|
||||
// Calcular total do grupo 01 (base para cálculo)
|
||||
const totalGrupo01 = data
|
||||
.filter(item => {
|
||||
const codgrupo = item.codgrupo || item.codigo_grupo || "";
|
||||
return codgrupo === "01";
|
||||
})
|
||||
.reduce((sum, item) => sum + parseFloat(item.valor), 0);
|
||||
|
||||
if (totalGrupo01 !== 0) {
|
||||
return (total / totalGrupo01) * 100;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -523,6 +554,12 @@ export default function Teste() {
|
|||
return acc;
|
||||
}, {} as Record<string, DREItem[]>);
|
||||
|
||||
// Calcular valores por grupo para linhas calculadas
|
||||
const valoresPorGrupo: Record<string, Record<string, number>> = {};
|
||||
Object.keys(gruposPorCodigo).forEach(codgrupo => {
|
||||
valoresPorGrupo[codgrupo] = calcularValoresPorMes(gruposPorCodigo[codgrupo]);
|
||||
});
|
||||
|
||||
// Ordenar por CODGRUPO (numericamente)
|
||||
const sortedGrupos = Object.entries(gruposPorCodigo).sort(([codA], [codB]) => {
|
||||
const numA = parseInt(codA) || 0;
|
||||
|
|
@ -533,7 +570,7 @@ export default function Teste() {
|
|||
return codA.localeCompare(codB);
|
||||
});
|
||||
|
||||
sortedGrupos.forEach(([codgrupo, items]) => {
|
||||
sortedGrupos.forEach(([codgrupo, items], index) => {
|
||||
// Calcular total do grupo
|
||||
const totalGrupo = items.reduce(
|
||||
(sum, item) => sum + parseFloat(item.valor),
|
||||
|
|
@ -550,8 +587,8 @@ export default function Teste() {
|
|||
total: totalGrupo,
|
||||
isExpanded: expandedGrupos.has(codgrupo),
|
||||
valoresPorMes: valoresGrupoPorMes,
|
||||
percentuaisPorMes: calcularPercentuaisPorMes(valoresGrupoPorMes),
|
||||
percentualTotal: calcularPercentualTotal(totalGrupo),
|
||||
percentuaisPorMes: calcularPercentuaisPorMes(valoresGrupoPorMes, codgrupo),
|
||||
percentualTotal: calcularPercentualTotal(totalGrupo, codgrupo),
|
||||
});
|
||||
|
||||
if (expandedGrupos.has(codgrupo)) {
|
||||
|
|
@ -596,11 +633,47 @@ export default function Teste() {
|
|||
total: totalConta,
|
||||
isExpanded: false,
|
||||
valoresPorMes: valoresContaPorMes,
|
||||
percentuaisPorMes: calcularPercentuaisPorMes(valoresContaPorMes),
|
||||
percentualTotal: calcularPercentualTotal(totalConta),
|
||||
percentuaisPorMes: calcularPercentuaisPorMes(valoresContaPorMes, codgrupo),
|
||||
percentualTotal: calcularPercentualTotal(totalConta, codgrupo),
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// Adicionar linha calculada "MARGEM DE LOJA" após o grupo 02
|
||||
// Verificar se é o último grupo ou se o próximo grupo é maior que 02
|
||||
const proximoCodigo = sortedGrupos[index + 1]?.[0];
|
||||
const proximoNumero = proximoCodigo ? parseInt(proximoCodigo) : 999;
|
||||
|
||||
if (codgrupo === "02" || (parseInt(codgrupo) === 2 && proximoNumero > 2)) {
|
||||
// Calcular MARGEM DE LOJA = CODGRUPO 01 - CODGRUPO 02
|
||||
const valoresGrupo01 = valoresPorGrupo["01"] || {};
|
||||
const valoresGrupo02 = valoresPorGrupo["02"] || {};
|
||||
|
||||
// Calcular valores por mês para MARGEM DE LOJA
|
||||
const valoresMargemPorMes: Record<string, number> = {};
|
||||
mesesDisponiveis.forEach(mes => {
|
||||
const valor01 = valoresGrupo01[mes] || 0;
|
||||
const valor02 = valoresGrupo02[mes] || 0;
|
||||
valoresMargemPorMes[mes] = valor01 - valor02;
|
||||
});
|
||||
|
||||
// Calcular total
|
||||
const totalMargem = Object.values(valoresMargemPorMes).reduce((sum, val) => sum + val, 0);
|
||||
|
||||
// Adicionar linha calculada
|
||||
rows.push({
|
||||
type: "calculado",
|
||||
level: 0,
|
||||
grupo: "MARGEM DE LOJA",
|
||||
codigo_grupo: "MARGEM",
|
||||
total: totalMargem,
|
||||
isExpanded: false,
|
||||
valoresPorMes: valoresMargemPorMes,
|
||||
percentuaisPorMes: calcularPercentuaisPorMes(valoresMargemPorMes, "MARGEM"),
|
||||
percentualTotal: calcularPercentualTotal(totalMargem, "MARGEM"),
|
||||
isCalculado: true,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
return rows;
|
||||
|
|
@ -623,6 +696,8 @@ export default function Teste() {
|
|||
switch (row.type) {
|
||||
case "grupo":
|
||||
return `${style} bg-gradient-to-r from-blue-50/20 to-indigo-50/20 font-bold text-gray-900 border-b-2 border-blue-200`;
|
||||
case "calculado":
|
||||
return `${style} bg-gradient-to-r from-purple-50/30 to-pink-50/30 font-bold text-purple-900 border-b-2 border-purple-300 italic`;
|
||||
case "conta":
|
||||
return `${style} bg-white font-normal text-gray-600`;
|
||||
default:
|
||||
|
|
@ -641,6 +716,8 @@ export default function Teste() {
|
|||
switch (row.type) {
|
||||
case "grupo":
|
||||
return "bg-gradient-to-r from-blue-50 to-indigo-50";
|
||||
case "calculado":
|
||||
return "bg-gradient-to-r from-purple-50 to-pink-50";
|
||||
case "conta":
|
||||
return "bg-white";
|
||||
default:
|
||||
|
|
@ -684,6 +761,22 @@ export default function Teste() {
|
|||
</button>
|
||||
</div>
|
||||
);
|
||||
case "calculado":
|
||||
return (
|
||||
<div className="flex items-center gap-2 whitespace-nowrap">
|
||||
<div className="w-8 h-8 flex items-center justify-center flex-shrink-0">
|
||||
{/* <span className="text-purple-600 font-bold text-lg">=</span> */}
|
||||
<ChevronRight className="w-4 h-4 text-blue-600 transition-transform duration-150" />
|
||||
</div>
|
||||
<div className="flex-1 text-left p-2">
|
||||
<div className="flex items-center gap-2">
|
||||
<span className="font-bold text-purple-700 italic">
|
||||
{row.grupo}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
case "conta":
|
||||
return (
|
||||
<div className="flex items-center gap-2 whitespace-nowrap">
|
||||
|
|
|
|||
Loading…
Reference in New Issue