Files
anbar/src/app/api/reports/leaderboard/route.js
T

52 lines
1.6 KiB
JavaScript

import prisma from '@/lib/prisma';
import { NextResponse } from 'next/server';
export async function GET() {
try {
const users = await prisma.user.findMany({
include: {
countings: true
}
});
const report = users.map(user => {
const counts = user.countings || [];
const totalCounted = counts.length;
// Calculate discrepancies (assuming old_count !== new_count)
const discrepancies = counts.filter(c => c.old_count !== c.new_count).length;
// Calculate total cancelled
const cancelled = counts.filter(c => c.status === 'CANCELLED').length;
// Unique shelves visited
const uniqueShelves = new Set(counts.map(c => c.shelfCode).filter(Boolean)).size;
return {
id: user.id,
name: user.name || user.username,
totalCounted,
discrepancies,
cancelled,
uniqueShelves,
accuracy: totalCounted > 0 ? (((totalCounted - discrepancies) / totalCounted) * 100).toFixed(1) : 0
};
}).filter(u => u.totalCounted > 0);
// Sort top performers by totalCounted
const topPerformers = [...report].sort((a, b) => b.totalCounted - a.totalCounted).slice(0, 5);
// Sort most discrepancies
const mostDiscrepancies = [...report].sort((a, b) => b.discrepancies - a.discrepancies).slice(0, 5);
return NextResponse.json({
topPerformers,
mostDiscrepancies,
all: report.sort((a, b) => b.totalCounted - a.totalCounted)
});
} catch (error) {
console.error('Fetch leaderboard error:', error);
return NextResponse.json({ error: 'خطا در دریافت گزارش' }, { status: 500 });
}
}