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 (
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.
Risk Score:
{riskScore}
Risk Level: {riskLevel}
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.
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.