Re_Figma_Code/src/pages/Requests/utils/requestCalculations.ts

86 lines
3.2 KiB
TypeScript

/**
* Calculation utilities for request stats
*/
import type { RequestStats, BackendStats } from '../types/requests.types';
export function calculateStatsFromFilteredData(
allFilteredRequests: any[],
isOrgLevel: boolean,
backendStats: BackendStats | null,
hasActiveFilters: boolean,
totalRecords: number,
convertedRequests: any[]
): RequestStats {
// Check if we have active filters (excluding default date range)
const hasFilters = hasActiveFilters;
// Use allFilteredRequests (data filtered by all filters EXCEPT status) for stats calculation
// This ensures stats show all status counts based on other filters (priority, department, etc.)
if (allFilteredRequests.length > 0) {
// Always show all status counts - status filter only affects the list, not the stats
const total = allFilteredRequests.length;
const pending = allFilteredRequests.filter((r: any) => {
const status = (r.status || '').toString().toUpperCase();
return status === 'PENDING' || status === 'IN_PROGRESS';
}).length;
const approved = allFilteredRequests.filter((r: any) => {
const status = (r.status || '').toString().toUpperCase();
return status === 'APPROVED';
}).length;
const rejected = allFilteredRequests.filter((r: any) => {
const status = (r.status || '').toString().toUpperCase();
return status === 'REJECTED';
}).length;
const draft = allFilteredRequests.filter((r: any) => {
const status = (r.status || '').toString().toUpperCase();
return status === 'DRAFT';
}).length;
const closed = allFilteredRequests.filter((r: any) => {
const status = (r.status || '').toString().toUpperCase();
return status === 'CLOSED';
}).length;
const paused = allFilteredRequests.filter((r: any) => {
const status = (r.status || '').toString().toUpperCase();
return status === 'PAUSED';
}).length;
return {
total: total, // Total based on other filters (priority, department, etc.)
pending,
paused,
approved,
rejected,
draft,
closed
};
} else if (isOrgLevel && !hasFilters && backendStats) {
// No filters and backend stats available - use backend stats for better performance
return {
total: backendStats.total,
pending: backendStats.pending,
paused: backendStats.paused || 0,
approved: backendStats.approved,
rejected: backendStats.rejected,
draft: backendStats.draft,
closed: backendStats.closed
};
} else {
// Fallback: calculate from convertedRequests (paginated data - less accurate)
// Note: This fallback should ideally not be used, but if it is, we still show all status counts
const total = totalRecords || convertedRequests.length;
return {
total: total,
pending: convertedRequests.filter(r => r.status === 'pending' || r.status === 'in-progress').length,
paused: convertedRequests.filter(r => r.status === 'paused').length,
approved: convertedRequests.filter(r => r.status === 'approved').length,
rejected: convertedRequests.filter(r => r.status === 'rejected').length,
draft: convertedRequests.filter(r => r.status === 'draft').length,
closed: convertedRequests.filter(r => r.status === 'closed').length
};
}
}