+ {/* Header */}
+
+
+
+
+ Analytics & Produtividade
+
+
+ {activeOrg?.name || 'Workspace'}
+
+
+
+ Auditoria de tempo investido, distribuição por iniciativas e acompanhamento da vazão da equipe.
+
+
+
+
+
+
+ {error && (
+
+
+
+
+ )}
+
+ {loading ? (
+
+ {[1, 2, 3, 4].map((i) => (
+
+ ))}
+
+ ) : (
+ <>
+ {/* Top 4 KPI Cards */}
+
+ {/* Total Time */}
+
+
+
Tempo Total Dedicado
+
+
+
+
+
+
+ {formatSecondsToTimer(kpis.totalSecondsTracked)}
+
+
+ Equivalente a {formatSecondsToHuman(kpis.totalSecondsTracked)}
+
+
+
+
+ {/* Completion Rate */}
+
+
+
Taxa de Conclusão
+
+
+
+
+
+
+ {kpis.completionRate}%
+
+
+ {kpis.completedTasks} de {kpis.totalTasks} demandas finalizadas
+
+
+
+
+ {/* In Progress vs Backlog */}
+
+
+
+
+ {kpis.inProgressTasks} tarefas
+
+
+ {kpis.notStartedTasks} no backlog aguardando início
+
+
+
+
+ {/* Avg Time per Task */}
+
+
+
Média por Entrega
+
+
+
+
+
+
+ {formatSecondsToHuman(kpis.avgSecondsPerCompletedTask)}
+
+
+ Tempo médio gasto em cada entrega concluída
+
+
+
+
+
+ {/* Main Grid: Projects & Categories Breakdown */}
+
+ {/* Project Time Distribution */}
+
+
+
+
+
+
+
+ Tempo por Projeto
+
+
+
+ {projectBreakdown.length} projetos
+
+
+
+ {projectBreakdown.length === 0 ? (
+
Nenhum dado de projeto disponível.
+ ) : (
+
+ {projectBreakdown.map((item) => {
+ const pct =
+ kpis.totalSecondsTracked > 0
+ ? Math.round((item.seconds / kpis.totalSecondsTracked) * 100)
+ : 0
+ return (
+
+
+
+
+
+ {item.project.name}
+
+
+ ({item.taskCount} {item.taskCount === 1 ? 'tarefa' : 'tarefas'})
+
+
+
+
+ {formatSecondsToHuman(item.seconds)}
+
+
+ {pct}%
+
+
+
+
+
+ )
+ })}
+
+ )}
+
+
+ {/* Category Time Distribution */}
+
+
+
+
+
+
+
+ Tempo por Categoria / Tag
+
+
+
+ {categoryBreakdown.length} categorias
+
+
+
+ {categoryBreakdown.length === 0 ? (
+
Nenhum dado de categoria disponível.
+ ) : (
+
+ {categoryBreakdown.map((item) => {
+ const pct =
+ kpis.totalSecondsTracked > 0
+ ? Math.round((item.seconds / kpis.totalSecondsTracked) * 100)
+ : 0
+ return (
+
+
+
+
+
+ {item.category.name}
+
+
+ ({item.taskCount} {item.taskCount === 1 ? 'tarefa' : 'tarefas'})
+
+
+
+
+ {formatSecondsToHuman(item.seconds)}
+
+
+ {pct}%
+
+
+
+
+
+ )
+ })}
+
+ )}
+
+
+
+ {/* Team Productivity Table */}
+
+
+
+
+
+
+
+ Dedicação por Membro da Equipe
+
+
+
+ {memberBreakdown.length} colaboradores
+
+
+
+
+
+
+
+ | Membro |
+ Tarefas Atribuídas |
+ Entregas Concluídas |
+ Tempo Total Registrado |
+
+
+
+ {memberBreakdown.map((member, idx) => (
+
+
+
+
+ {member.name.charAt(0)}
+
+
+ {member.name}
+ {member.email}
+
+
+ |
+
+ {member.totalCount}
+ |
+
+
+
+ {member.completedCount}
+
+ |
+
+ {formatSecondsToTimer(member.seconds)}
+ |
+
+ ))}
+
+
+
+
+ >
+ )}
+
+ )
+}
diff --git a/new-frontend/src/pages/ProfilePage.tsx b/new-frontend/src/pages/ProfilePage.tsx
new file mode 100644
index 0000000..9d8d8d9
--- /dev/null
+++ b/new-frontend/src/pages/ProfilePage.tsx
@@ -0,0 +1,196 @@
+import React, { useState, useEffect } from 'react'
+import { useNavigate } from 'react-router-dom'
+import {
+ Mail,
+ LogOut,
+ ExternalLink,
+ Loader2,
+} from 'lucide-react'
+import { useAuth } from '../contexts/AuthContext'
+import { taskService } from '../services/taskService'
+import type { Task } from '../types/task'
+import { calculateTaskTotalSeconds, formatSecondsToHuman, formatSecondsToTimer } from '../lib/timeUtils'
+
+export const ProfilePage: React.FC = () => {
+ const { user, activeOrg, setActiveOrg, logout } = useAuth()
+ const navigate = useNavigate()
+
+ const [myTasks, setMyTasks] = useState