Como Calcular Las Horas De Trabajo

Calculadora de Horas de Trabajo – Calcula Tu Jornada Laboral :root { –primary-color: #004a99; –success-color: #28a745; –background-color: #f8f9fa; –text-color: #333; –border-color: #ddd; –shadow-color: rgba(0, 0, 0, 0.1); } body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background-color: var(–background-color); color: var(–text-color); line-height: 1.6; margin: 0; padding: 0; display: flex; flex-direction: column; align-items: center; padding-top: 20px; padding-bottom: 40px; } .container { width: 95%; max-width: 960px; background-color: #fff; padding: 30px; border-radius: 8px; box-shadow: 0 4px 15px var(–shadow-color); margin-bottom: 30px; } h1, h2, h3 { color: var(–primary-color); text-align: center; margin-bottom: 20px; } h1 { font-size: 2.2em; margin-bottom: 30px; } h2 { font-size: 1.8em; border-bottom: 2px solid var(–primary-color); padding-bottom: 10px; margin-top: 40px; } h3 { font-size: 1.4em; margin-top: 30px; color: #555; } .loan-calc-container { background-color: #fdfdfd; padding: 25px; border-radius: 6px; border: 1px solid var(–border-color); margin-bottom: 30px; } .input-group { margin-bottom: 20px; text-align: left; } .input-group label { display: block; margin-bottom: 8px; font-weight: bold; color: #444; } .input-group input[type="time"], .input-group input[type="number"], .input-group select { width: calc(100% – 22px); padding: 10px 12px; border: 1px solid var(–border-color); border-radius: 4px; font-size: 1em; box-sizing: border-box; } .input-group input[type="time"] { width: auto; /* Adjust for time input */ min-width: 150px; } .input-group small { display: block; margin-top: 5px; font-size: 0.85em; color: #666; } .error-message { color: #dc3545; font-size: 0.8em; margin-top: 5px; display: none; /* Hidden by default */ } .button-group { display: flex; justify-content: space-between; margin-top: 25px; gap: 10px; } button { padding: 12px 20px; border: none; border-radius: 5px; cursor: pointer; font-size: 1em; font-weight: bold; transition: background-color 0.3s ease; } .btn-primary { background-color: var(–primary-color); color: white; } .btn-primary:hover { background-color: #003366; } .btn-secondary { background-color: #6c757d; color: white; } .btn-secondary:hover { background-color: #5a6268; } .btn-success { background-color: var(–success-color); color: white; } .btn-success:hover { background-color: #218838; } #results { background-color: var(–primary-color); color: white; padding: 20px; border-radius: 6px; margin-top: 30px; text-align: center; box-shadow: inset 0 0 10px rgba(0,0,0,0.2); } #results h3 { color: white; margin-top: 0; margin-bottom: 15px; font-size: 1.6em; } #results .result-item { margin-bottom: 10px; font-size: 1.1em; } #results .result-item span { font-weight: bold; font-size: 1.4em; display: block; margin-top: 5px; } #results .formula-explanation { font-size: 0.9em; margin-top: 15px; opacity: 0.8; } table { width: 100%; border-collapse: collapse; margin-top: 20px; margin-bottom: 30px; box-shadow: 0 2px 5px var(–shadow-color); } th, td { padding: 12px 15px; text-align: left; border: 1px solid var(–border-color); } thead { background-color: var(–primary-color); color: white; } tbody tr:nth-child(even) { background-color: #f2f2f2; } caption { font-size: 1.1em; font-weight: bold; color: #444; margin-bottom: 10px; caption-side: top; text-align: left; } canvas { display: block; margin: 20px auto; max-width: 100%; border: 1px solid var(–border-color); border-radius: 4px; background-color: #fff; } .article-content { text-align: left; margin-top: 40px; background-color: #fff; padding: 30px; border-radius: 8px; box-shadow: 0 4px 15px var(–shadow-color); } .article-content p, .article-content ul, .article-content ol { margin-bottom: 1.5em; font-size: 1.05em; } .article-content ul, .article-content ol { padding-left: 25px; } .article-content li { margin-bottom: 0.8em; } .article-content a { color: var(–primary-color); text-decoration: none; font-weight: bold; } .article-content a:hover { text-decoration: underline; } .faq-item { margin-bottom: 20px; border-left: 3px solid var(–primary-color); padding-left: 15px; } .faq-item strong { display: block; color: #333; margin-bottom: 5px; } .faq-item p { margin-bottom: 0; font-size: 1em; } .related-links ul { list-style: none; padding: 0; } .related-links li { margin-bottom: 15px; font-size: 1.05em; } .related-links li a { font-weight: bold; } .related-links li span { display: block; font-size: 0.9em; color: #666; margin-top: 3px; } .highlight { background-color: var(–primary-color); color: white; padding: 5px 10px; border-radius: 3px; font-weight: bold; } .variable-table th, .variable-table td { font-size: 0.95em; } .variable-table td:nth-child(1) { font-weight: bold; } .variable-table td:nth-child(3) { font-style: italic; color: #555; } .variable-table td:nth-child(4) { font-family: monospace; } /* Responsive adjustments */ @media (max-width: 768px) { .container { width: 90%; padding: 20px; } h1 { font-size: 1.8em; } h2 { font-size: 1.5em; } button { padding: 10px 15px; font-size: 0.95em; } .button-group { flex-direction: column; align-items: center; } .button-group button { width: 100%; max-width: 300px; } .input-group input[type="time"] { min-width: unset; width: calc(100% – 22px); } }

Calculadora de Horas de Trabajo

Calcula tu jornada laboral de forma sencilla y precisa.

Introduce la hora a la que comenzaste a trabajar.
Introduce la hora a la que terminaste de trabajar.
Introduce el tiempo total de descanso en minutos (ej. 30, 60).
Número de días que abarca el cálculo (ej. 1 para un día, 5 para una semana laboral).

Resumen de Horas

Horas Totales Trabajadas: –:–
Horas Promedio Diarias: –:–
Horas Totales Netas (sin descanso): –:–
Horas Promedio Diarias Netas: –:–
Las horas totales se calculan restando la hora de fin a la hora de inicio. El descanso se resta para obtener las horas netas. El promedio diario se obtiene dividiendo el total por los días trabajados.

Detalles de la Jornada Laboral

Resumen de Horas por Día
Periodo Horas Totales Horas Netas
Introduce los datos y haz clic en "Calcular Horas".

Bienvenido a nuestra guía completa sobre como calcular las horas de trabajo. Entender tu jornada laboral es fundamental para la gestión de tu tiempo, el cálculo de nóminas y el cumplimiento de las normativas laborales. En esta página, encontrarás una herramienta práctica y una explicación detallada para dominar el cálculo de horas trabajadas.

¿Qué es Como Calcular las Horas de Trabajo?

Como calcular las horas de trabajo se refiere al proceso de determinar la cantidad exacta de tiempo que un empleado dedica a sus funciones laborales durante un período específico. Esto incluye no solo el tiempo frente a las tareas, sino también la consideración de descansos, pausas y posibles horas extraordinarias. Es un concepto clave tanto para el empleador, para la correcta liquidación de salarios y el cumplimiento legal, como para el empleado, para asegurar que se le remunera adecuadamente por su tiempo y esfuerzo.

¿Quién debe usar esta herramienta?

  • Empleados: Para verificar su pago, controlar sus horas extras y asegurarse de que se respetan sus derechos laborales.
  • Autónomos y Freelancers: Para facturar a sus clientes de manera precisa según el tiempo invertido en cada proyecto.
  • Pequeñas y Medianas Empresas (PYMES): Para gestionar la nómina, controlar la productividad y optimizar la asignación de recursos.
  • Departamentos de Recursos Humanos: Para administrar el tiempo del personal, calcular salarios y asegurar el cumplimiento normativo.

Mitos Comunes sobre el Cálculo de Horas:

  • "Solo cuentan las horas sentado en el escritorio": Incorrecto. Cualquier tiempo dedicado a actividades laborales, incluso si es fuera de la oficina o en reuniones, cuenta como tiempo de trabajo.
  • "Los descansos cortos no se descuentan": Depende de la legislación y el contrato. Generalmente, los descansos para comer o pausas largas sí se descuentan, mientras que las pausas breves para tomar un café pueden no hacerlo. Nuestra calculadora permite especificar la duración total del descanso.
  • "Las horas extras siempre se pagan igual": Falso. Muchas legislaciones establecen tarifas diferentes para horas extras diurnas, nocturnas o en días festivos.

Fórmula y Explicación Matemática de Como Calcular las Horas de Trabajo

El cálculo básico de las horas de trabajo se basa en la diferencia entre la hora de finalización y la hora de inicio, ajustando por los períodos de descanso. Aquí desglosamos la fórmula utilizada en nuestra calculadora:

Paso 1: Calcular el Tiempo Total Transcurrido

Primero, determinamos la duración total entre el momento en que se empieza a trabajar y el momento en que se termina.

Tiempo Transcurrido = Hora de Fin - Hora de Inicio

Paso 2: Restar el Tiempo de Descanso

A continuación, restamos la duración total de los descansos (en minutos, convertidos a horas) del tiempo total transcurrido para obtener las horas de trabajo netas.

Horas Netas = Tiempo Transcurrido - (Duración del Descanso en Minutos / 60)

Paso 3: Calcular el Promedio Diario

Si el cálculo abarca varios días, dividimos las horas totales y las horas netas entre el número de días trabajados para obtener un promedio.

Promedio Horas Diarias = Horas Netas / Días Trabajados

Variables Utilizadas:

Variables Clave en el Cálculo de Horas de Trabajo
Variable Significado Unidad Rango Típico
Hora de Inicio Momento exacto en que comienza la jornada laboral. Formato HH:MM (24h) 00:00 – 23:59
Hora de Fin Momento exacto en que finaliza la jornada laboral. Formato HH:MM (24h) 00:00 – 23:59
Duración del Descanso Tiempo total dedicado a descansos durante la jornada. Minutos 0 – 180 (o más, según política)
Días Trabajados Número de días que cubre el período de cálculo. Número Entero 1 – 31 (o más, según periodo)
Horas Totales Trabajadas Tiempo total desde el inicio hasta el fin, incluyendo descansos. Horas:Minutos (HH:MM) Variable
Horas Netas Tiempo efectivo de trabajo, excluyendo descansos. Horas:Minutos (HH:MM) Variable
Promedio Horas Diarias Media de horas netas trabajadas por día. Horas:Minutos (HH:MM) Variable

Ejemplos Prácticos de Como Calcular las Horas de Trabajo

Ejemplo 1: Jornada Laboral Estándar Diaria

Un empleado comienza su jornada a las 09:00 y termina a las 17:30. Durante el día, toma un descanso de 60 minutos para comer. Trabaja 1 día en este período.

  • Hora de Inicio: 09:00
  • Hora de Fin: 17:30
  • Duración del Descanso: 60 minutos
  • Días Trabajados: 1

Cálculo:

  • Tiempo Transcurrido: 17:30 – 09:00 = 8 horas y 30 minutos.
  • Horas Netas: 8h 30m – (60 min / 60 min/h) = 8h 30m – 1h = 7 horas y 30 minutos.
  • Promedio Horas Diarias Netas: 7h 30m / 1 día = 7 horas y 30 minutos.

Interpretación: El empleado ha trabajado efectivamente 7 horas y 30 minutos ese día.

Ejemplo 2: Semana Laboral con Horas Extras

Un trabajador autónomo registra sus horas para un proyecto. Durante una semana (5 días), trabaja de lunes a jueves de 08:30 a 18:00, y el viernes de 09:00 a 14:00. Ha tomado un total de 2 horas y 30 minutos de descanso acumulado durante la semana.

  • Horas Lunes-Jueves: 08:30 a 18:00 (8h 30m por día) x 4 días = 34 horas
  • Horas Viernes: 09:00 a 14:00 (5h 00m) x 1 día = 5 horas
  • Horas Totales Transcurridas (Semana): 34h + 5h = 39 horas
  • Duración del Descanso (Semana): 2 horas y 30 minutos = 150 minutos
  • Días Trabajados: 5

Cálculo:

  • Horas Netas (Semana): 39h 00m – (150 min / 60 min/h) = 39h 00m – 2h 30m = 36 horas y 30 minutos.
  • Promedio Horas Diarias Netas: 36h 30m / 5 días = 7 horas y 18 minutos por día.

Interpretación: El autónomo ha dedicado 36 horas y 30 minutos efectivos al proyecto esa semana, con un promedio diario de 7 horas y 18 minutos. Si su tarifa es por hora, puede facturar este tiempo.

Cómo Usar Esta Calculadora de Como Calcular las Horas de Trabajo

Nuestra herramienta está diseñada para ser intuitiva y fácil de usar. Sigue estos pasos:

  1. Introduce la Hora de Inicio: Selecciona la hora y minuto exactos en que comenzaste tu jornada laboral usando el selector `type="time"`.
  2. Introduce la Hora de Fin: Selecciona la hora y minuto exactos en que finalizaste tu jornada laboral.
  3. Especifica la Duración del Descanso: Ingresa el tiempo total de descanso que tomaste durante tu jornada, expresado en minutos (ej., 60 para una hora, 30 para media hora).
  4. Indica los Días Trabajados: Señala cuántos días abarca el período que estás calculando. Para un solo día, usa '1'. Para una semana laboral típica, usa '5'.
  5. Haz Clic en "Calcular Horas": La calculadora procesará tus datos y mostrará los resultados.

Cómo Leer los Resultados:

  • Horas Totales Trabajadas: Es el tiempo total transcurrido entre la hora de inicio y fin, incluyendo los descansos.
  • Horas Promedio Diarias: El tiempo total dividido entre los días trabajados.
  • Horas Totales Netas: El tiempo efectivo de trabajo, una vez restados los descansos. Este es el valor más relevante para la remuneración o facturación.
  • Horas Promedio Diarias Netas: El promedio de horas efectivas de trabajo por día.

Guía para la Toma de Decisiones: Utiliza las "Horas Netas" para asegurarte de que tu pago o facturación sea correcto. Compara las "Horas Promedio Diarias Netas" con tus objetivos de productividad o las expectativas laborales. Si calculas horas extras, asegúrate de que se reflejen correctamente en tu nómina o factura.

Factores Clave que Afectan los Resultados de Como Calcular las Horas de Trabajo

Si bien la fórmula básica es sencilla, varios factores pueden influir en el cálculo y la interpretación de las horas de trabajo:

  1. Legislación Laboral Local: Las leyes varían significativamente en cuanto a la definición de jornada máxima, el pago de horas extras (recargos), los descansos obligatorios y los períodos de trabajo nocturno. Es crucial conocer la normativa aplicable.
  2. Contrato de Trabajo o Acuerdo: Los términos específicos de tu contrato (jornada completa, parcial, por proyecto) o los acuerdos colectivos pueden modificar cómo se cuentan las horas y los descansos.
  3. Política de Descansos de la Empresa: Algunas empresas tienen políticas más estrictas sobre la duración y frecuencia de los descansos permitidos, lo cual afecta directamente las horas netas.
  4. Horas Extras y su Compensación: El cálculo de horas extras requiere identificar las horas que exceden la jornada ordinaria y aplicar la tarifa correspondiente (que puede ser mayor).
  5. Viajes y Desplazamientos: Dependiendo de la legislación y el contrato, el tiempo de viaje relacionado con el trabajo (entre oficinas, a reuniones externas) puede o no considerarse tiempo de trabajo efectivo.
  6. Trabajo Remoto vs. Presencial: Aunque el cálculo es el mismo, la supervisión y el registro pueden variar. Es importante mantener un registro fiable en ambos escenarios.
  7. Flexibilidad Horaria: Los esquemas de horario flexible pueden complicar el cálculo si no se establecen reglas claras para la entrada, salida y los descansos.
  8. Días Festivos y Permisos: Estos días no suelen computar como horas trabajadas, pero su impacto en el cálculo semanal o mensual debe ser considerado.

Preguntas Frecuentes (FAQ) sobre Como Calcular las Horas de Trabajo

¿Qué pasa si mi hora de fin es al día siguiente (ej. trabajo nocturno)?

Nuestra calculadora actual está diseñada para jornadas que inician y terminan el mismo día. Para jornadas que cruzan la medianoche, se debe calcular el tiempo hasta la medianoche y luego sumar el tiempo desde la medianoche hasta la hora de fin del día siguiente, o usar una calculadora especializada en turnos de 24 horas.

¿Debo incluir los descansos cortos (ej. 5-10 minutos)?

Generalmente, los descansos muy breves no se descuentan, pero depende de la política de la empresa y la legislación. Nuestra calculadora asume que la "Duración del Descanso" se refiere a pausas significativas (ej. almuerzo).

¿Cómo calculo las horas extras con esta herramienta?

Esta calculadora te da las horas netas totales. Para las horas extras, necesitarías saber tu jornada ordinaria (ej. 8 horas netas/día) y restar ese valor de las horas netas calculadas si exceden la jornada. Por ejemplo, si calculaste 9h 30m netas y tu jornada es de 8h, tienes 1h 30m de horas extras.

¿Es lo mismo "Horas Totales" que "Horas Netas"?

No. Las "Horas Totales" son el tiempo transcurrido desde que entras hasta que sales. Las "Horas Netas" son las horas efectivas de trabajo, descontando los descansos.

¿Puedo usar esta calculadora para calcular el tiempo de un proyecto freelance?

Sí, es ideal para ello. Simplemente introduce las horas de inicio y fin de tu trabajo en el proyecto y la duración total de tus descansos. El resultado neto te servirá para facturar.

¿Qué hago si me olvido de registrar mi hora de salida?

Es crucial registrar ambas horas con precisión. Si olvidas una, intenta recordarla lo mejor posible o consulta con tu supervisor. La precisión es clave para un cálculo correcto.

¿Cómo afecta el trabajo en días festivos?

Los días festivos generalmente no se consideran días laborables estándar y suelen tener una compensación especial (pago doble, día libre compensatorio). Esta calculadora básica no maneja específicamente festivos, pero puedes usarla para calcular las horas si trabajaste en un festivo y luego aplicar la normativa correspondiente.

¿Qué sucede si mi jornada es irregular?

Para jornadas muy irregulares, lo más recomendable es usar la calculadora para cada día o período específico y luego sumar los resultados. Asegúrate de registrar con precisión las horas de inicio, fin y descansos de cada jornada.

function getElement(id) { return document.getElementById(id); } function formatTime(totalMinutes) { if (isNaN(totalMinutes) || totalMinutes < 0) return "–:–"; var hours = Math.floor(totalMinutes / 60); var minutes = Math.floor(totalMinutes % 60); return String(hours).padStart(2, '0') + ':' + String(minutes).padStart(2, '0'); } function timeToMinutes(timeStr) { if (!timeStr) return 0; var [hours, minutes] = timeStr.split(':').map(Number); return hours * 60 + minutes; } function calculateWorkHours() { var startTimeInput = getElement("startTime"); var endTimeInput = getElement("endTime"); var breakDurationInput = getElement("breakDuration"); var daysWorkedInput = getElement("daysWorked"); var startTimeStr = startTimeInput.value; var endTimeStr = endTimeInput.value; var breakDurationMinutes = parseInt(breakDurationInput.value); var daysWorked = parseInt(daysWorkedInput.value); var startTimeError = getElement("startTimeError"); var endTimeError = getElement("endTimeError"); var breakDurationError = getElement("breakDurationError"); var daysWorkedError = getElement("daysWorkedError"); // Clear previous errors if (startTimeError) startTimeError.style.display = 'none'; if (endTimeError) endTimeError.style.display = 'none'; if (breakDurationError) breakDurationError.style.display = 'none'; if (daysWorkedError) daysWorkedError.style.display = 'none'; var isValid = true; if (!startTimeStr) { if (startTimeError) startTimeError.textContent = "La hora de inicio es obligatoria."; if (startTimeError) startTimeError.style.display = 'block'; isValid = false; } if (!endTimeStr) { if (endTimeError) endTimeError.textContent = "La hora de fin es obligatoria."; if (endTimeError) endTimeError.style.display = 'block'; isValid = false; } if (isNaN(breakDurationMinutes) || breakDurationMinutes < 0) { if (breakDurationError) breakDurationError.textContent = "Introduce una duración de descanso válida (número positivo)."; if (breakDurationError) breakDurationError.style.display = 'block'; isValid = false; } if (isNaN(daysWorked) || daysWorked = startMinutes) { totalMinutesTranscurridos = endMinutes – startMinutes; } else { // Handle cases where end time is on the next day (e.g., 22:00 to 06:00) // For simplicity in this calculator, we assume same-day or require manual split calculation. // A more robust solution would handle date differences. // For now, we'll show an error or assume it's an input mistake if end < start without date context. if (endTimeError) endTimeError.textContent = "La hora de fin no puede ser anterior a la hora de inicio en el mismo día."; if (endTimeError) endTimeError.style.display = 'block'; isValid = false; return; // Stop calculation if invalid time range } var totalHoursTranscurridas = totalMinutesTranscurridos / 60; var breakHours = breakDurationMinutes / 60; var netHours = totalHoursTranscurridas – breakHours; if (netHours < 0) netHours = 0; // Cannot have negative net hours var avgDailyNetHours = netHours / daysWorked; // Update results display getElement("totalHours").textContent = formatTime(totalMinutesTranscurridos); getElement("netHours").textContent = formatTime(netHours * 60); getElement("avgDailyHours").textContent = formatTime(totalMinutesTranscurridos / daysWorked); getElement("avgDailyNetHours").textContent = formatTime(avgDailyNetHours * 60); // Update table updateWorkHoursTable(daysWorked, totalMinutesTranscurridos, netHours * 60); // Update chart updateWorkHoursChart(daysWorked, totalMinutesTranscurridos, netHours * 60); } function updateWorkHoursTable(days, totalMinutes, netMinutes) { var tableBody = getElement("workHoursTableBody"); tableBody.innerHTML = ''; // Clear previous rows var totalMinutesPerDay = totalMinutes / days; var netMinutesPerDay = netMinutes / days; for (var i = 1; i <= days; i++) { var row = tableBody.insertRow(); var cellPeriod = row.insertCell(); var cellTotal = row.insertCell(); var cellNet = row.insertCell(); cellPeriod.textContent = "Día " + i; cellTotal.textContent = formatTime(totalMinutesPerDay); cellNet.textContent = formatTime(netMinutesPerDay); } if (days === 0) { // Handle case where daysWorked might be 0 after reset if not careful var row = tableBody.insertRow(); row.insertCell().colSpan = 3; row.cells[0].textContent = "Introduce un número de días válido."; } } var workHoursChartInstance = null; // To hold chart instance function updateWorkHoursChart(days, totalMinutes, netMinutes) { var ctx = getElement('workHoursChart').getContext('2d'); // Destroy previous chart instance if it exists if (workHoursChartInstance) { workHoursChartInstance.destroy(); } var labels = []; var totalData = []; var netData = []; var totalMinutesPerDay = totalMinutes / days; var netMinutesPerDay = netMinutes / days; for (var i = 1; i <= days; i++) { labels.push("Día " + i); totalData.push(totalMinutesPerDay / 60); // Store in hours for chart netData.push(netMinutesPerDay / 60); // Store in hours for chart } // Basic chart configuration using Canvas API directly // This is a simplified representation. A full charting library would be more robust. // For this exercise, we'll draw rectangles representing hours. var canvas = getElement('workHoursChart'); var chartWidth = canvas.width; var chartHeight = canvas.height; var barWidth = (chartWidth * 0.8) / days; // 80% of width for bars, divided by number of days var barSpacing = barWidth * 0.2; // 20% spacing var maxHours = Math.max(…totalData, …netData, 8) * 1.1; // Determine max scale, ensure at least 8 hours visible if (maxHours === 0) maxHours = 10; // Default if no data var scaleY = (chartHeight * 0.8) / maxHours; // Scale factor for Y axis (80% of height for bars) var originY = chartHeight * 0.9; // 90% down for X axis var ctx = canvas.getContext('2d'); ctx.clearRect(0, 0, chartWidth, chartHeight); // Clear canvas // Draw Title ctx.fillStyle = '#004a99'; ctx.font = 'bold 16px Segoe UI'; ctx.textAlign = 'center'; ctx.fillText('Horas Trabajadas vs. Netas por Día', chartWidth / 2, 30); // Draw Bars var barColorTotal = '#007bff'; // Blue for total hours var barColorNet = '#28a745'; // Green for net hours for (var i = 0; i < days; i++) { var xPos = chartWidth * 0.1 + i * (barWidth + barSpacing); // Start 10% in // Total Hours Bar var totalBarHeight = totalData[i] * scaleY; ctx.fillStyle = barColorTotal; ctx.fillRect(xPos, originY – totalBarHeight, barWidth, totalBarHeight); // Net Hours Bar (drawn on top or next to it, depending on visual preference) // Let's draw net hours slightly offset or as a distinct bar if space allows var netBarHeight = netData[i] * scaleY; ctx.fillStyle = barColorNet; // Offset net bar slightly to the right if space permits, or draw it fully var netXPos = xPos + barWidth * 0.1; // Small offset var netBarWidth = barWidth * 0.8; // Slightly narrower if (netBarWidth < 5) netBarWidth = 5; // Minimum width if (barWidth < 10) { // If bars are too narrow, just draw net bar ctx.fillRect(xPos, originY – netBarHeight, barWidth, netBarHeight); } else { ctx.fillRect(netXPos, originY – netBarHeight, netBarWidth, netBarHeight); } // Labels for Days ctx.fillStyle = '#333'; ctx.font = '12px Segoe UI'; ctx.textAlign = 'center'; ctx.fillText(labels[i], xPos + barWidth / 2, originY + 20); } // Draw Legend var legendX = chartWidth * 0.9; ctx.textAlign = 'right'; ctx.font = '14px Segoe UI'; // Total Legend ctx.fillStyle = barColorTotal; ctx.fillRect(legendX – 20, 50, 15, 10); ctx.fillStyle = '#333'; ctx.fillText('Horas Totales', legendX, 60); // Net Legend ctx.fillStyle = barColorNet; ctx.fillRect(legendX – 20, 70, 15, 10); ctx.fillStyle = '#333'; ctx.fillText('Horas Netas', legendX, 80); // Store instance for potential future destruction (though not strictly needed for redraw) workHoursChartInstance = { destroy: function() { /* No-op for direct canvas */ } }; } function resetCalculator() { getElement("startTime").value = "09:00"; getElement("endTime").value = "17:00"; getElement("breakDuration").value = "60"; getElement("daysWorked").value = "5"; // Clear errors var errorElements = document.querySelectorAll('.error-message'); for (var i = 0; i < errorElements.length; i++) { errorElements[i].style.display = 'none'; } calculateWorkHours(); // Recalculate with default values } function copyResults() { var totalHours = getElement("totalHours").textContent; var avgDailyHours = getElement("avgDailyHours").textContent; var netHours = getElement("netHours").textContent; var avgDailyNetHours = getElement("avgDailyNetHours").textContent; var assumptions = "Asunciones:\n"; assumptions += "- Hora de Inicio: " + getElement("startTime").value + "\n"; assumptions += "- Hora de Fin: " + getElement("endTime").value + "\n"; assumptions += "- Descanso: " + getElement("breakDuration").value + " minutos\n"; assumptions += "- Días Trabajados: " + getElement("daysWorked").value + "\n"; var resultText = "Resultados del Cálculo de Horas de Trabajo:\n\n"; resultText += "Horas Totales Trabajadas: " + totalHours + "\n"; resultText += "Horas Promedio Diarias: " + avgDailyHours + "\n"; resultText += "Horas Totales Netas: " + netHours + "\n"; resultText += "Horas Promedio Diarias Netas: " + avgDailyNetHours + "\n\n"; resultText += assumptions; // Use navigator.clipboard for modern browsers, fallback to execCommand if (navigator.clipboard && navigator.clipboard.writeText) { navigator.clipboard.writeText(resultText).then(function() { alert('Resultados copiados al portapapeles!'); }).catch(function(err) { console.error('Error al copiar: ', err); fallbackCopyTextToClipboard(resultText); }); } else { fallbackCopyTextToClipboard(resultText); } } function fallbackCopyTextToClipboard(text) { var textArea = document.createElement("textarea"); textArea.value = text; textArea.style.position = "fixed"; // Avoid scrolling to bottom textArea.style.left = "-9999px"; textArea.style.top = "-9999px"; document.body.appendChild(textArea); textArea.focus(); textArea.select(); try { var successful = document.execCommand('copy'); var msg = successful ? '¡Resultados copiados!' : 'Error al copiar.'; alert(msg); } catch (err) { console.error('Error en fallbackCopyTextToClipboard: ', err); alert('Error al copiar. Por favor, copia manualmente.'); } document.body.removeChild(textArea); } // Initial calculation on page load document.addEventListener('DOMContentLoaded', function() { calculateWorkHours(); // Set canvas dimensions var canvas = getElement('workHoursChart'); canvas.width = canvas.offsetWidth; canvas.height = 300; // Fixed height for the chart area });

Leave a Comment