Tengo una variedad de objetos en javascript donde tengo tiempos de inicio de sesión de empleados. Quiero averiguar si un empleado ha trabajado más de 5 horas consecutivas, entonces tendrá un descanso. De lo contrario, si un empleado trabajó más de 5 horas, pero no consecutivamente, no tendrá descanso.
Aquí está el código: actualmente solo está verificando la cantidad de horas que un empleado ha trabajado, pero no está verificando las horas consecutivas.
checkBreakTimings() { let breakTimes = ""; const timings = [ { timeIn: '11:00', timeOut: '12:00', }, { timeIn: '12:00', timeOut: '13:00', }, { timeIn: '14:00', timeOut: '16:00', }, { timeIn: '16:00', timeOut: '18:00', } ]; let h = 0; timings.forEach(e => { const ms = moment(e.timeOut, "HH:mm").diff(moment(e.timeIn, "HH:mm")); h = h + = Number(moment.duration(ms).asHours()); }); if(h > 5 ) { breakTimes = "Yes"; } } return breakTimes; }
Como puede ver en los tiempos anteriores, un empleado trabajó 8 horas, de las cuales 6 horas son consecutivas de 14:00 a 18:00, aquí se aplicará un descanso, pero los 2 tiempos anteriores no son consecutivamente más de 5 horas.
Mi problema es: ¿hay alguna forma de averiguar la cantidad de horas consecutivas de una matriz usando JavaScript o en moment.js?
Prueba como el siguiente fragmento:
const checkBreakTimings = () => { let breakTimes = ""; const timings = [ {timeIn: '11:15', timeOut: '12:00', }, {timeIn: '12:00', timeOut: '13:00', }, {timeIn: '13:00', timeOut: '15:46', }, {timeIn: '16:00', timeOut: '18:00', } ]; let h = 0; let consecutive = 0 let lastOut = null timings.forEach(e => { const ms = moment(e.timeOut, "HH:mm").diff(moment(e.timeIn, "HH:mm")); let worked = Number(moment.duration(ms).asHours()) consecutive = worked if (lastOut === e.timeIn) { //👈 compare if timeIn is equal to last timeOut and sum values consecutive += worked } else consecutive = 0 lastOut = e.timeOut if (consecutive > 5) breakTimes = "Yes" //👈 it's more then 5 hours h = h + Number(moment.duration(ms).asHours()); }); console.log(breakTimes); } checkBreakTimings()
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js" integrity="sha512-qTXRIMyZIFb8iQcfjXWCO8+M5Tbc38Qi5WzdPOYZHIlZpzBHG3L3by84BBBOiRGiEb7KKtAOAs5qYdUiZiQNNQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
Aquí hay una función que podría hacer el truco.
function isAllowedBrake(times) { let isAllowed = false let consecutive = 0; let lastVal times.forEach((e) => { if (lastVal && moment(lastVal, "HH:mm").isBefore(moment(e.timeIn, "HH:mm"))) { consecutive = 0 } const ms = moment(e.timeOut, "HH:mm").diff(moment(e.timeIn, "HH:mm")); let duration = Number(moment.duration(ms).asHours()) consecutive += duration lastVal = e.timeOut }) if (consecutive > 5) { isAllowed = true; } return isAllowed; }