Skip to main content

HR Payroll Metrics

Data formatting and visualization utilities for HR analytics and payroll metrics in the WorkPayCore frontend application.

Overview​

The HR payroll metrics helpers provide functions for formatting complex HR data into chart-ready formats, calculating payroll summaries, and processing employee analytics data.

Employee Demographics Functions​

formatTotalEmployees(data)​

Formats employee gender distribution data for chart visualization.

Parameters:

  • data (array): Array of employee gender data objects

Returns:

  • array: Chart-ready format with headers and gender counts

Example:

import { formatTotalEmployees } from '@/utils/helpers/hr-payrol-metrics';

const genderData = [
{ label: 'MALE', count: 45 },
{ label: 'FEMALE', count: 38 },
{ label: 'UNKNOWN', count: 2 },
{ label: 'Not Set', count: 1 },
];

const chartData = formatTotalEmployees(genderData);
console.log(chartData);
// Returns: [
// ['Gender', 'Count'],
// ['Male', 45],
// ['Female', 38],
// ['Unknown', 2],
// ['Not Set', 1]
// ]

Use Cases:

  • Gender distribution charts
  • Employee demographics visualization
  • Diversity reporting
  • HR analytics dashboards

formatAgeSummary(data)​

Formats employee age group data with color coding for visualization.

Parameters:

  • data (array): Array of age group objects with count data

Returns:

  • array: Chart-ready format with age groups, counts, and colors

Example:

import { formatAgeSummary } from '@/utils/helpers/hr-payrol-metrics';

const ageData = [
{ 'Gen Z [10-25 Yrs]': '15' },
{ 'Millenials [26-41 Yrs]': '35' },
{ 'Gen X [42-57 Yrs]': '25' },
{ 'Boomers II [58-67 Yrs]': '8' },
{ Unkown: '2' },
];

const chartData = formatAgeSummary(ageData);
console.log(chartData);
// Returns: [
// ['', 'Count', { role: 'style' }],
// ['Gen Z 10-25 Yrs', 15, '#f9dba1'],
// ['Millenials 26-41 Yrs', 35, '#DEEBFF'],
// ['GenX 42-57 Yrs', 25, '#a0c68f'],
// ['Boomers II 58-67 Yrs', 8, '#62a446'],
// ['Unkown', 2, '#fee6e9']
// ]

Use Cases:

  • Age distribution visualization
  • Generational analytics
  • Workforce planning
  • Retirement planning analysis

formatAgeGroupAnalysis(data)​

Formats age group turnover analysis data for charts.

Parameters:

  • data (array): Array of age group turnover data

Returns:

  • array: Chart-ready format with turnover data and styling

Example:

import { formatAgeGroupAnalysis } from '@/utils/helpers/hr-payrol-metrics';

const turnoverData = [
{ label: 'Gen Z [10-25 Yrs]', turnover: '12' },
{ label: 'Millenials [26-41 Yrs]', turnover: '8' },
{ label: 'Gen X [42-57 Yrs]', turnover: '5' },
];

const chartData = formatAgeGroupAnalysis(turnoverData);
console.log(chartData);
// Returns chart data with turnover rates and color coding

Use Cases:

  • Turnover analysis by age group
  • Retention metrics
  • HR strategy planning
  • Workforce stability analysis

Movement and Trend Functions​

formatEmployeeMovement(data, departments)​

Formats employee movement data across departments and time periods.

Parameters:

  • data (array): Employee movement data by department
  • departments (array): List of department names

Returns:

  • array: Matrix format for time series visualization

Example:

import { formatEmployeeMovement } from '@/utils/helpers/hr-payrol-metrics';

const movementData = [
{
items: [
{ label: 'January', count: 5 },
{ label: 'February', count: 3 },
],
},
];

const departments = ['Engineering', 'Marketing', 'Sales'];
const chartData = formatEmployeeMovement(movementData, departments);
console.log(chartData);
// Returns time series data formatted for charts

Use Cases:

  • Employee hiring trends
  • Department growth tracking
  • Workforce planning
  • Seasonal hiring analysis

formatEmployeeMovement2(data, departments)​

Alternative employee movement formatting with month-based organization.

Parameters:

  • data (array): Department-based movement data
  • departments (array): Department names array

Returns:

  • array: Month-organized movement data

Example:

import { formatEmployeeMovement2 } from '@/utils/helpers/hr-payrol-metrics';

const departmentData = [
{
/* Engineering data */
},
{
/* Marketing data */
},
{
/* Sales data */
},
];

const departments = ['Engineering', 'Marketing', 'Sales'];
const chartData = formatEmployeeMovement2(departmentData, departments);
// Returns monthly movement data across departments

Use Cases:

  • Monthly hiring reports
  • Cross-department analysis
  • Recruitment effectiveness
  • Workforce trends

Financial and Payroll Functions​

formatPayrollSummary(data)​

Formats payroll summary data for financial reporting.

Parameters:

  • data (array): Payroll summary data

Returns:

  • array: Chart-ready payroll summary

Example:

import { formatPayrollSummary } from '@/utils/helpers/hr-payrol-metrics';

const payrollData = [
{ month: 'January', gross: 125000, net: 95000, deductions: 30000 },
{ month: 'February', gross: 130000, net: 98000, deductions: 32000 },
];

const chartData = formatPayrollSummary(payrollData);
// Returns formatted payroll metrics for visualization

Use Cases:

  • Monthly payroll reports
  • Financial planning
  • Budget analysis
  • Compensation trends

formatPayrollAllowancesDeductions(data, defaultArray)​

Formats allowances and deductions data for payroll analysis.

Parameters:

  • data (array): Allowances and deductions data
  • defaultArray (array): Default structure for missing data

Returns:

  • array: Formatted allowances/deductions data

Example:

import { formatPayrollAllowancesDeductions } from '@/utils/helpers/hr-payrol-metrics';

const allowanceData = [
{ type: 'Housing', amount: 15000 },
{ type: 'Transport', amount: 8000 },
{ type: 'Medical', amount: 5000 },
];

const defaultStructure = ['Housing', 'Transport', 'Medical', 'Bonus'];
const chartData = formatPayrollAllowancesDeductions(
allowanceData,
defaultStructure,
);
// Returns formatted allowances/deductions breakdown

Use Cases:

  • Compensation analysis
  • Benefit cost tracking
  • Payroll component breakdown
  • Financial reporting

Utility Functions​

formatAmount(amount)​

Formats monetary amounts for display with proper locale formatting.

Parameters:

  • amount (number): Monetary amount to format

Returns:

  • string: Formatted amount string

Example:

import { formatAmount } from '@/utils/helpers/hr-payrol-metrics';

formatAmount(1234567.89); // Returns: "1,234,567.89"
formatAmount(1000); // Returns: "1,000.00"
formatAmount(0); // Returns: "0.00"

Use Cases:

  • Salary display
  • Financial reporting
  • Currency formatting
  • Report generation

progressBlendColors(name)​

Generates color schemes for progress indicators and charts.

Parameters:

  • name (string): Color scheme name

Returns:

  • string: Generated color value

Example:

import { progressBlendColors } from '@/utils/helpers/hr-payrol-metrics';

const chartColor = progressBlendColors('primary');
const accentColor = progressBlendColors('secondary');

// Use in chart configurations
const chartConfig = {
backgroundColor: chartColor,
borderColor: accentColor,
};

Use Cases:

  • Dynamic chart coloring
  • Theme-based visualization
  • Progress indicators
  • Dashboard styling

Leave Management​

canSubmittedLeaveBeApproved(options)​

Determines if a submitted leave request can be approved based on workflow and permissions.

Parameters:

  • options (object): Leave approval configuration object
    • hasApprovalWorkflowStages (boolean): Workflow stages present
    • settings (object): Company leave settings
    • original (object): Original leave request
    • role (string): User role
    • is_employee_supervisor (boolean): Supervisor status
    • permissions (array): User permissions

Returns:

  • boolean: Whether leave can be approved

Example:

import { canSubmittedLeaveBeApproved } from '@/utils/helpers/hr-payrol-metrics';

const canApprove = canSubmittedLeaveBeApproved({
hasApprovalWorkflowStages: true,
settings: { requireSupervisorApproval: true },
original: { employeeId: 123, days: 5 },
role: 'manager',
is_employee_supervisor: true,
permissions: ['approve_leave', 'manage_employees'],
});

if (canApprove) {
// Show approval buttons
showApprovalInterface();
}

Use Cases:

  • Leave approval workflows
  • Permission checking
  • Role-based access control
  • HR process automation

Advanced Usage Examples​

Dashboard Metrics Component​

import {
formatTotalEmployees,
formatAgeSummary,
formatPayrollSummary,
formatAmount,
} from '@/utils/helpers/hr-payrol-metrics';

const HRDashboard = ({ employeeData, payrollData, ageData }) => {
const genderChartData = useMemo(
() => formatTotalEmployees(employeeData?.gender || []),
[employeeData],
);

const ageChartData = useMemo(
() => formatAgeSummary(ageData || []),
[ageData],
);

const payrollChartData = useMemo(
() => formatPayrollSummary(payrollData || []),
[payrollData],
);

const totalPayroll = useMemo(() => {
const total = payrollData?.reduce((sum, item) => sum + item.gross, 0) || 0;
return formatAmount(total);
}, [payrollData]);

return (
<div className='hr-dashboard'>
<div className='metrics-row'>
<MetricCard title='Total Payroll' value={totalPayroll} />
</div>

<div className='charts-row'>
<Chart type='pie' data={genderChartData} title='Gender Distribution' />

<Chart type='column' data={ageChartData} title='Age Groups' />

<Chart type='line' data={payrollChartData} title='Payroll Trends' />
</div>
</div>
);
};

Employee Analytics Hook​

import {
formatTotalEmployees,
formatAgeGroupAnalysis,
formatEmployeeMovement,
} from '@/utils/helpers/hr-payrol-metrics';

const useEmployeeAnalytics = filters => {
const [analytics, setAnalytics] = useState({
loading: true,
demographics: null,
movement: null,
turnover: null,
});

useEffect(() => {
const loadAnalytics = async () => {
setAnalytics(prev => ({ ...prev, loading: true }));

try {
const [demographicsData, movementData, turnoverData] =
await Promise.all([
fetchDemographics(filters),
fetchMovement(filters),
fetchTurnover(filters),
]);

setAnalytics({
loading: false,
demographics: {
gender: formatTotalEmployees(demographicsData.gender),
age: formatAgeGroupAnalysis(demographicsData.age),
},
movement: formatEmployeeMovement(movementData, filters.departments),
turnover: formatAgeGroupAnalysis(turnoverData),
});
} catch (error) {
console.error('Failed to load analytics:', error);
setAnalytics(prev => ({ ...prev, loading: false }));
}
};

loadAnalytics();
}, [filters]);

return analytics;
};

Leave Approval Component​

import { canSubmittedLeaveBeApproved } from '@/utils/helpers/hr-payrol-metrics';

const LeaveRequestCard = ({ leaveRequest, currentUser, companySettings }) => {
const canApprove = useMemo(
() =>
canSubmittedLeaveBeApproved({
hasApprovalWorkflowStages: companySettings.hasWorkflow,
settings: companySettings.leave,
original: leaveRequest,
role: currentUser.role,
is_employee_supervisor: currentUser.isSupervisor,
permissions: currentUser.permissions,
}),
[leaveRequest, currentUser, companySettings],
);

const handleApprove = async () => {
if (!canApprove) return;

try {
await approveLeaveRequest(leaveRequest.id);
// Handle success
} catch (error) {
// Handle error
}
};

return (
<div className='leave-request-card'>
<div className='request-details'>
<h3>{leaveRequest.employeeName}</h3>
<p>
Dates: {leaveRequest.startDate} - {leaveRequest.endDate}
</p>
<p>Days: {leaveRequest.days}</p>
</div>

{canApprove && (
<div className='approval-actions'>
<button onClick={handleApprove} className='approve-btn'>
Approve
</button>
<button onClick={handleReject} className='reject-btn'>
Reject
</button>
</div>
)}
</div>
);
};

Chart Integration​

Google Charts Integration​

import {
formatAgeSummary,
progressBlendColors,
} from '@/utils/helpers/hr-payrol-metrics';

const AgeDistributionChart = ({ data }) => {
const chartData = formatAgeSummary(data);

const options = {
title: 'Employee Age Distribution',
chartArea: { width: '50%' },
colors: [
progressBlendColors('gen-z'),
progressBlendColors('millennial'),
progressBlendColors('gen-x'),
progressBlendColors('boomer'),
],
hAxis: {
title: 'Age Groups',
minValue: 0,
},
vAxis: {
title: 'Number of Employees',
},
};

return (
<Chart
chartType='ColumnChart'
width='100%'
height='400px'
data={chartData}
options={options}
/>
);
};

Best Practices​

  1. Data Validation: Always validate input data before formatting
  2. Color Consistency: Use progressBlendColors for consistent theming
  3. Performance: Memoize chart data to prevent unnecessary recalculations
  4. Error Handling: Handle missing or malformed data gracefully
  5. Accessibility: Ensure charts have proper labels and descriptions


TypeScript Definitions​

export function formatTotalEmployees(data: any[]): any[];
export function formatAgeSummary(data: any[]): any[];
export function formatAgeGroupAnalysis(data: any[]): any[];
export function formatEmployeeMovement(
data: any[],
departments: string[],
): any[];
export function formatEmployeeMovement2(
data: any[],
departments: string[],
): any[];
export function formatPayrollSummary(data: any[]): any[];
export function formatPayrollAllowancesDeductions(
data: any[],
defaultArray: any[],
): any[];
export function formatAmount(amount: number): string;
export function progressBlendColors(name: string): string;
export function canSubmittedLeaveBeApproved(options: {
hasApprovalWorkflowStages: boolean;
settings: any;
original: any;
role: string;
is_employee_supervisor: boolean;
permissions: string[];
}): boolean;

Dependencies​

  • Chakra UI Theme Tools: For color utilities
  • Theme Colors: For consistent color schemes
  • Date/Time Utilities: For date formatting
  • String Utilities: For text processing