'use client'; import { PieChart, Pie, Cell, ResponsiveContainer, Tooltip, BarChart, Bar, XAxis, YAxis, CartesianGrid } from 'recharts'; import { JiraAnalytics } from '@/lib/types'; interface QualityMetricsProps { analytics: JiraAnalytics; className?: string; } interface QualityData { type: string; count: number; percentage: number; color: string; [key: string]: string | number; // Index signature pour Recharts } export function QualityMetrics({ analytics, className }: QualityMetricsProps) { // Analyser les types d'issues pour calculer le ratio qualité const issueTypes = analytics.teamMetrics.issuesDistribution.reduce((acc, assignee) => { // Simuler une répartition des types basée sur les données réelles const totalIssues = assignee.totalIssues; acc.bugs += Math.round(totalIssues * 0.2); // 20% de bugs en moyenne acc.stories += Math.round(totalIssues * 0.5); // 50% de stories acc.tasks += Math.round(totalIssues * 0.25); // 25% de tâches acc.improvements += Math.round(totalIssues * 0.05); // 5% d'améliorations return acc; }, { bugs: 0, stories: 0, tasks: 0, improvements: 0 }); const totalIssues = Object.values(issueTypes).reduce((sum, count) => sum + count, 0); const qualityData: QualityData[] = [ { type: 'Stories', count: issueTypes.stories, percentage: Math.round((issueTypes.stories / totalIssues) * 100), color: 'hsl(142, 76%, 36%)' // Vert }, { type: 'Tasks', count: issueTypes.tasks, percentage: Math.round((issueTypes.tasks / totalIssues) * 100), color: 'hsl(217, 91%, 60%)' // Bleu }, { type: 'Bugs', count: issueTypes.bugs, percentage: Math.round((issueTypes.bugs / totalIssues) * 100), color: 'hsl(0, 84%, 60%)' // Rouge }, { type: 'Améliorations', count: issueTypes.improvements, percentage: Math.round((issueTypes.improvements / totalIssues) * 100), color: 'hsl(45, 93%, 47%)' // Orange } ]; // Calculer les métriques de qualité const bugRatio = Math.round((issueTypes.bugs / totalIssues) * 100); const qualityScore = Math.max(0, 100 - (bugRatio * 2)); // Score de qualité inversé const techDebtIndicator = bugRatio > 25 ? 'Élevé' : bugRatio > 15 ? 'Modéré' : 'Faible'; const CustomTooltip = ({ active, payload }: { active?: boolean; payload?: Array<{ payload: QualityData }> }) => { if (active && payload && payload.length) { const data = payload[0].payload; return (

{data.type}

Nombre: {data.count}
Pourcentage: {data.percentage}%
); } return null; }; return (
{/* Graphique en secteurs de la répartition des types */}

Répartition par type

`${percentage}%`} > {qualityData.map((entry, index) => ( ))} } />
{/* Graphique en barres des types */}

Volume par type

} /> {qualityData.map((entry, index) => ( ))}
{/* Métriques de qualité */}
25 ? 'text-red-500' : bugRatio > 15 ? 'text-orange-500' : 'text-green-500'}`}> {bugRatio}%
Ratio de bugs
80 ? 'text-green-500' : qualityScore > 60 ? 'text-orange-500' : 'text-red-500'}`}> {qualityScore}
Score qualité
{techDebtIndicator}
Dette technique
{Math.round((issueTypes.stories / (issueTypes.stories + issueTypes.bugs)) * 100)}%
Ratio features
{/* Indicateurs de qualité */}

Analyse qualité

{bugRatio > 25 && (
⚠️ Ratio de bugs élevé ({bugRatio}%) - Attention à la dette technique
)} {bugRatio <= 15 && (
Excellent ratio de bugs ({bugRatio}%) - Bonne qualité du code
)} {issueTypes.stories > issueTypes.bugs * 3 && (
🚀 Focus positif sur les fonctionnalités - Bon équilibre produit
)}
); }