import {useEffect, useState} from "react"; import {NumericFormat} from "react-number-format"; import {Container, Typography} from "@mui/material"; function Result({listEntry, baseSalary}) { const [totalOvertimePay, setTotalOvertimePay] = useState(0); useEffect(() => { setTotalOvertimePay(getOvertimePayTotal(listEntry, baseSalary)); }, [listEntry, baseSalary]); if (totalOvertimePay < 0) { return ( Waktu selesai mendahului waktu mulai. Mohon diperbaiki input. ) } return ( Total Upah Lembur: Rp Rincian { listEntry.map((entry) => { return (
{entry.date.format('DD MMMM YYYY')}{weekendDay(entry.date) ? ` (${weekendDay(entry.date)})` : ''}: Rp
) }) }
) } function segmentTime(duration, segments) { const segmentSum = segments.reduce((partialSum, a) => partialSum + a, 0); const segmentsFilled = [...segments, 24 - segmentSum]; const segmentedHours = []; for (const[index, segmentDuration] of segmentsFilled.entries()) { if (index < segmentsFilled.length - 1) { const hours = Math.min(duration, segmentDuration); segmentedHours.push(hours); duration -= hours; } else { segmentedHours.push(duration); } } return segmentedHours; } function weekendDay(date) { if (date.day() === 0) { return 'Minggu'; } else if (date.day() === 6) { return 'Sabtu'; } return ''; } function calculatePerDay(entry, baseSalary) { const hourlyPay = baseSalary / 173; const overtimeDuration = entry.finish.diff(entry.start, 'hour', true); let multiplier = 0; // TODO: find better way const multiplierMap = { workDays: [ 1.5, // jam pertama 2 ], holidays: [ 2, // 8 jam pertama 3, // jam ke 9 4 ] } const segmentPattern = weekendDay(entry.date) ? [8, 1, 15] : [1]; const segmentedDuration = segmentTime(overtimeDuration, segmentPattern); const usedMap = weekendDay(entry.date) ? multiplierMap.holidays : multiplierMap.workDays; for (let i = 0; i < segmentedDuration.length; i++) { if (segmentedDuration[i]) multiplier += segmentedDuration[i] * usedMap[i]; } return multiplier * hourlyPay; } function getOvertimePayTotal(listEntry, baseSalary) { let total = 0; listEntry.forEach((entry) => { total += calculatePerDay(entry, baseSalary) }); return total; } export default Result;