import React, { useState } from 'react'; const ManualHandlingRiskCalculator = () => { // State for form inputs const [formData, setFormData] = useState({ weight: 5, liftingHeight: 'knuckle', liftingDistance: 'close', twist: 'none', frequency: 'less1', grip: 'good', environment: 'normal', teamHandling: false, numberOfPeople: 2, coordination: 'good', }); // State for results const [showResults, setShowResults] = useState(false); const [riskScore, setRiskScore] = useState(0); const [riskLevel, setRiskLevel] = useState(''); const [recommendations, setRecommendations] = useState([]); // Weight score multipliers const weightScores = { male: { 5: 0, 10: 1, 15: 2, 20: 4, 25: 6, 30: 8, 40: 12, 50: 16 }, female: { 3: 0, 5: 1, 7: 2, 10: 4, 15: 6, 20: 8, 25: 12, 30: 16 } }; // Height multipliers const heightMultipliers = { 'floor': 3, 'knee': 2, 'knuckle': 1, 'elbow': 1, 'shoulder': 2, 'head': 3, 'above': 4 }; // Distance multipliers const distanceMultipliers = { 'close': 1, 'moderate': 2, 'far': 3 }; // Twist multipliers const twistMultipliers = { 'none': 1, 'quarter': 1.5, 'half': 2, 'threequarter': 3 }; // Frequency multipliers const frequencyMultipliers = { 'less1': 1, '1to5': 1.5, '6to12': 2, 'more12': 3 }; // Grip multipliers const gripMultipliers = { 'good': 1, 'fair': 1.5, 'poor': 2 }; // Environment multipliers const environmentMultipliers = { 'normal': 1, 'hot': 1.2, 'cold': 1.2, 'humid': 1.2, 'windy': 1.2, 'wet': 1.3, 'unstable': 1.6 }; // Team handling adjustment const getTeamHandlingMultiplier = (people, coordination) => { if (!people || people < 2) return 1; const baseReduction = { 2: 0.85, 3: 0.7, 4: 0.6 }; const coordinationFactor = { 'good': 1, 'fair': 1.2, 'poor': 1.4 }; return (baseReduction[Math.min(people, 4)] || 0.6) * (coordinationFactor[coordination] || 1); }; // Handle input changes const handleInputChange = (e) => { const { name, value, type, checked } = e.target; setFormData({ ...formData, [name]: type === 'checkbox' ? checked : value }); }; // Calculate risk score const calculateRiskScore = () => { // Get weight score (assuming male for now, can be adjusted with gender selection) const weightBrackets = Object.keys(weightScores.male).map(Number).sort((a, b) => a - b); let weightScore = 0; // Find the appropriate weight bracket for (let i = 0; i < weightBrackets.length; i++) { if (formData.weight <= weightBrackets[i]) { weightScore = weightScores.male[weightBrackets[i]]; break; } if (i === weightBrackets.length - 1) { weightScore = weightScores.male[weightBrackets[i]]; } } // Apply multipliers let score = weightScore; score *= heightMultipliers[formData.liftingHeight] || 1; score *= distanceMultipliers[formData.liftingDistance] || 1; score *= twistMultipliers[formData.twist] || 1; score *= frequencyMultipliers[formData.frequency] || 1; score *= gripMultipliers[formData.grip] || 1; score *= environmentMultipliers[formData.environment] || 1; // Apply team handling adjustment if applicable if (formData.teamHandling) { score *= getTeamHandlingMultiplier(formData.numberOfPeople, formData.coordination); } // Round the score const finalScore = Math.round(score); // Determine risk level let level = ''; let recs = []; if (finalScore < 10) { level = 'Low risk (Green)'; recs = [ 'The task can be performed safely', 'Monitor task occasionally', 'Review if conditions change' ]; } else if (finalScore < 20) { level = 'Moderate risk (Amber)'; recs = [ 'Examine task more closely', 'Consider simple modifications', 'Train workers on proper techniques', 'Implement job rotation if possible' ]; } else if (finalScore < 30) { level = 'High risk (Red)'; recs = [ 'Redesign task urgently', 'Use mechanical assistance', 'Modify workplace layout', 'Consider team lifting with proper training', 'Implement comprehensive risk controls' ]; } else { level = 'Very high risk (Purple)'; recs = [ 'Stop this activity immediately', 'Complete task redesign required', 'Mechanical handling essential', 'Report to senior management', 'Formal risk assessment mandatory' ]; } setRiskScore(finalScore); setRiskLevel(level); setRecommendations(recs); setShowResults(true); }; // Reset form const resetForm = () => { setFormData({ weight: 5, liftingHeight: 'knuckle', liftingDistance: 'close', twist: 'none', frequency: 'less1', grip: 'good', environment: 'normal', teamHandling: false, numberOfPeople: 2, coordination: 'good', }); setShowResults(false); }; // Get CSS class for risk level display const getRiskLevelClass = () => { if (riskLevel.includes('Low')) return 'bg-green-100 border-green-500 text-green-800'; if (riskLevel.includes('Moderate')) return 'bg-yellow-100 border-yellow-500 text-yellow-800'; if (riskLevel.includes('High')) return 'bg-red-100 border-red-500 text-red-800'; if (riskLevel.includes('Very high')) return 'bg-purple-100 border-purple-500 text-purple-800'; return ''; }; return (

Manual Handling Risk Calculator (NZMAC)

This tool helps you assess manual handling risks in your workplace using the New Zealand Manual Handling Assessment Charts (NZMAC) methodology. Enter the details of your lifting task to get a risk assessment and recommended actions.

Why use this calculator? Manual handling injuries account for approximately one-third of all workplace injuries in New Zealand. Proper risk assessment can significantly reduce these injuries and associated costs.

Task Parameters

Task Conditions

{formData.teamHandling && ( <>
)}
{showResults && (

Risk Assessment Results

Risk Score:

{riskScore}

Risk Level: {riskLevel}

Recommended Actions:

    {recommendations.map((rec, index) => (
  • {rec}
  • ))}

Next Steps: Document this assessment, implement the recommended controls, and ensure all workers are trained on safe manual handling techniques. For a comprehensive workplace health and safety management system, contact NZOHS for expert support.

Get Professional Support from NZOHS
)}

Disclaimer: This calculator is based on the NZMAC methodology and provides a general risk assessment. It should be used as a guide only and not as a substitute for a comprehensive risk assessment by a qualified health and safety professional.

For detailed advice specific to your workplace, please contact NZOHS.

); }; export default ManualHandlingRiskCalculator;