109 lines
4.8 KiB
TypeScript
109 lines
4.8 KiB
TypeScript
/**
|
|
* Transformers for converting API request data to display format
|
|
*/
|
|
|
|
import type { ConvertedRequest } from '../types/requests.types';
|
|
|
|
export function transformRequest(req: any): ConvertedRequest {
|
|
const createdAt = req.submittedAt || req.submitted_at || req.createdAt || req.created_at;
|
|
const priority = (req.priority || '').toString().toLowerCase();
|
|
const status = (req.status || '').toString().toUpperCase();
|
|
|
|
// Extract current approver - handle multiple field name variations
|
|
let currentApprover = '—';
|
|
let approverLevel = '—';
|
|
|
|
// Try to get current approver from various possible locations
|
|
const currentApproverObj = req.currentApprover || req.current_approver || req.currentApproverData;
|
|
if (currentApproverObj) {
|
|
// Handle object format: { name, email, approverName, approverEmail, etc. }
|
|
currentApprover = currentApproverObj.name ||
|
|
currentApproverObj.approverName ||
|
|
currentApproverObj.displayName ||
|
|
currentApproverObj.email ||
|
|
currentApproverObj.approverEmail ||
|
|
'—';
|
|
} else if (req.approvals && Array.isArray(req.approvals) && req.approvals.length > 0) {
|
|
// For completed requests, show the last approver (final approver)
|
|
// For active requests, find the current pending/in-progress approver
|
|
const activeApproval = req.approvals.find((a: any) => {
|
|
const aStatus = (a.status || '').toString().toUpperCase();
|
|
return aStatus === 'PENDING' || aStatus === 'IN_PROGRESS';
|
|
});
|
|
|
|
if (activeApproval) {
|
|
// Active request - show current approver
|
|
currentApprover = activeApproval.approverName ||
|
|
activeApproval.approver?.name ||
|
|
activeApproval.approver?.displayName ||
|
|
activeApproval.approverEmail ||
|
|
activeApproval.approver?.email ||
|
|
'—';
|
|
} else {
|
|
// Completed request - show final approver (last one in the array, or highest level)
|
|
const sortedApprovals = [...req.approvals].sort((a: any, b: any) => {
|
|
const aLevel = a.levelNumber || a.level_number || 0;
|
|
const bLevel = b.levelNumber || b.level_number || 0;
|
|
return bLevel - aLevel; // Sort descending to get highest level
|
|
});
|
|
const finalApproval = sortedApprovals[0];
|
|
if (finalApproval) {
|
|
currentApprover = finalApproval.approverName ||
|
|
finalApproval.approver?.name ||
|
|
finalApproval.approver?.displayName ||
|
|
finalApproval.approverEmail ||
|
|
finalApproval.approver?.email ||
|
|
'—';
|
|
}
|
|
}
|
|
}
|
|
|
|
// Extract approval level information - handle multiple field name variations
|
|
const currentLevel = req.currentLevel || req.current_level || req.currentLevelNumber || req.current_level_number;
|
|
const totalLevels = req.totalLevels || req.total_levels || req.totalLevelsCount || req.total_levels_count;
|
|
|
|
if (currentLevel && totalLevels) {
|
|
approverLevel = `${currentLevel} of ${totalLevels}`;
|
|
} else if (req.approvals && Array.isArray(req.approvals) && req.approvals.length > 0) {
|
|
// Fallback: calculate from approvals array
|
|
const activeApproval = req.approvals.find((a: any) => {
|
|
const aStatus = (a.status || '').toString().toUpperCase();
|
|
return aStatus === 'PENDING' || aStatus === 'IN_PROGRESS';
|
|
});
|
|
|
|
if (activeApproval) {
|
|
const levelNum = activeApproval.levelNumber || activeApproval.level_number || 0;
|
|
const total = totalLevels || req.approvals.length;
|
|
approverLevel = `${levelNum} of ${total}`;
|
|
} else if (totalLevels) {
|
|
// Completed request - show final level
|
|
approverLevel = `${totalLevels} of ${totalLevels}`;
|
|
}
|
|
} else if (req.currentStep && req.totalSteps) {
|
|
// Alternative field names
|
|
approverLevel = `${req.currentStep} of ${req.totalSteps}`;
|
|
}
|
|
|
|
return {
|
|
id: req.requestNumber || req.request_number || req.requestId || req.id || req.request_id,
|
|
requestId: req.requestId || req.id || req.request_id,
|
|
displayId: req.requestNumber || req.request_number || req.id,
|
|
title: req.title,
|
|
description: req.description,
|
|
status: status.toLowerCase().replace('_','-'),
|
|
priority: priority,
|
|
department: req.department || req.initiator?.department,
|
|
submittedDate: req.submittedAt || (req.createdAt ? new Date(req.createdAt).toISOString().split('T')[0] : undefined),
|
|
createdAt: createdAt,
|
|
currentApprover: currentApprover,
|
|
approverLevel: approverLevel,
|
|
templateType: req.templateType,
|
|
templateName: req.templateName
|
|
};
|
|
}
|
|
|
|
export function transformRequests(requests: any[]): ConvertedRequest[] {
|
|
return Array.isArray(requests) ? requests.map(transformRequest) : [];
|
|
}
|
|
|