import { TrendingUp, DollarSign, Calendar, Clock, CheckCircle2, ListTodo, AlertTriangle } from "lucide-react"; import { Card, CardContent } from "@/components/ui/card"; import { Progress } from "@/components/ui/progress"; import { Project } from "@/types/project"; interface ProjectStatsProps { project: Project; taskStats: { total: number; completed: number; inProgress: number; highPriority: number; overdue: number; completionRate: number; totalPlannedHours: number; totalWorkedHours: number; }; } // Formatear moneda function formatCurrency(amount: number): string { return new Intl.NumberFormat("es-ES", { style: "currency", currency: "EUR", minimumFractionDigits: 0, maximumFractionDigits: 0, }).format(amount); } // Formatear fecha function formatDate(dateString: string): string { return new Date(dateString).toLocaleDateString("es-ES", { day: "numeric", month: "short", }); } // Calcular días restantes function getDaysRemaining(endDate: string): number { const end = new Date(endDate); const today = new Date(); const diff = end.getTime() - today.getTime(); return Math.ceil(diff / (1000 * 60 * 60 * 24)); } export function ProjectStats({ project, taskStats }: ProjectStatsProps) { const daysRemaining = getDaysRemaining(project.endDate); const isOverdue = daysRemaining < 0; const budgetUsedPercent = project.budget > 0 ? (project.spent / project.budget) * 100 : 0; return (
{/* Progreso */}

Progreso

{project.progress}%

{/* Presupuesto */}

Presupuesto

{formatCurrency(project.budget)}

Usado: {formatCurrency(project.spent)} 90 ? "text-red-500" : "text-muted-foreground"}> {budgetUsedPercent.toFixed(0)}%
{/* Fecha límite */}

Fecha límite

{formatDate(project.endDate)}

{isOverdue ? `${Math.abs(daysRemaining)} días de retraso` : `${daysRemaining} días restantes` }

{/* Tareas */}

Tareas

{taskStats.completed}/{taskStats.total}

{taskStats.highPriority > 0 && ( {taskStats.highPriority} alta prioridad )} {taskStats.overdue > 0 && ( {taskStats.overdue} vencidas )} {taskStats.highPriority === 0 && taskStats.overdue === 0 && ( Todo en orden )}
); }