import { Types } from "./typing"; export namespace Obra { const normalizeHourMin = (h: number) => (Number(h)<10)?`0${h}`:h; const normalizeViewTime = (jornada: string) => { const iniFin = jornada.split('-'); const ini = iniFin[0].split('.'); const fin = iniFin[1].split('.'); const hourIni = normalizeHourMin(Number(ini[0])); const minIni = ini.length > 1 ? normalizeHourMin(Number(ini[1])) : '00'; const hourFin = normalizeHourMin(Number(fin[0])); const minFin = fin.length > 1 ? normalizeHourMin(Number(fin[1])) : '00'; return { inicio: { timeView: `${hourIni}:${minIni}`, hour: Number(hourIni), min: Number(minIni), }, fin: { timeView: `${hourFin}:${minFin}`, hour: Number(hourFin), min: Number(minFin) } } } /** * @param esquemas * @param utc * @param daySelected * Determina el inicio y fin de turno en horario UTC 0 y tz nacional basado en un esquema de trabajo. */ export const timesTurno = (esquemas: Types.EsquemaTrabajo[], utc: number, daySelected?: Date) => { const auxDate = new Date(); const difHoraria = utc || 4; let fecha = daySelected || new Date(auxDate.setHours(auxDate.getHours() - difHoraria)); const numberOfDay = fecha.getDay() let turno = '0-0'; for(const eachTurno of esquemas) { // if (eachTurno.dias.map(it => it === 7 ? 0 : it ).findIndex(it => it === numberOfDay) >= 0) { turno = `${eachTurno.horaInicio}-${eachTurno.horaFin}`; break; // } } const { inicio, fin } = normalizeViewTime(turno); const horaInicio = Number(inicio.hour); const horaFin = Number(fin.hour); const horaActual = new Date(new Date().getTime() - difHoraria * 60 * 60 * 1000).getHours(); if ( horaInicio > horaFin && horaActual < horaFin ) { fecha = new Date(fecha.setDate(fecha.getDate() - 1)); } const miliSecondUTCIni = new Date(fecha).setHours(horaInicio + difHoraria, inicio.min, 0, 0); const miliSecondTZIni = new Date(fecha).setHours(horaInicio, inicio.min, 0, 0); if (horaInicio > horaFin) { // Si ha cambiado de día, fin del turno siempre será el dia siguiente fecha = new Date(fecha.setDate(fecha.getDate() + 1)); } const miliSecondUTCFin = new Date(fecha).setHours(horaFin + difHoraria, fin.min, 0, 0); const miliSecondTZFin = new Date(fecha).setHours(horaFin, fin.min, 0, 0); const pt1 = `${inicio.timeView} (${normalizeHourMin(new Date(miliSecondTZIni).getDate())}/${normalizeHourMin(new Date(miliSecondTZIni).getMonth() + 1) })`; const pt2 = `${fin.timeView} (${normalizeHourMin(new Date(miliSecondTZFin).getDate())}/${normalizeHourMin(new Date(miliSecondTZFin).getMonth() + 1) })` return { turnoIni: { UTCTurno: new Date(miliSecondUTCIni).toISOString(), TZTurno: new Date(miliSecondTZIni).toISOString(), timeView: inicio.timeView }, turnoFin: { UTCTurno: new Date(miliSecondUTCFin).toISOString(), TZTurno: new Date(miliSecondTZFin).toISOString(), timeView: fin.timeView }, turnoString: `${pt1} - ${pt2}` } } export const getCalcMMAtTime = (historicAssignments: Types.Assignments[]) => { let MMworked = 0; historicAssignments.push({info: 'HH progress', date: new Date().toISOString(), assigned: []}); if ( historicAssignments.length ) { for ( let index = 0; index < historicAssignments.length; index++ ){ if (historicAssignments[index].assigned.length === 0 || !historicAssignments[index + 1]) continue; const minutesTranscurred = (new Date(historicAssignments[index+1].date).getTime() - new Date(historicAssignments[index].date).getTime()) / 60000; //expressed in minutes MMworked += minutesTranscurred * historicAssignments[index].assigned.length; } } MMworked = Math.round(MMworked); return MMworked; } }