JSFiddle - React, Tailwind, and code Playground

JavaScript

// נתונים גולמיים (מקוצר לצורך הדגמה)
const rawData = `
1	1	1	baruch fridm  	1	3	02/09/2024 20:32			
2	1	1	baruch fridm  	1	3	02/09/2024 21:52			
3	1	2	baruch meizl  	1	0	03/09/2024 01:51			
4	1	3	aron einorn   	1	0	03/09/2024 01:53			
5	1	4	shimon yakob  	1	0	03/09/2024 01:59			
120	1	1	baruch fridm  	2	3	17/09/2024 21:04			
`;

// פונקציה להמרת תאריך ושעה לאובייקט Date
function parseDateTime(dateTimeStr) {
  const [datePart, timePart] = dateTimeStr.split(' ');
  const [day, month, year] = datePart.split('/');
  const [hour, minute] = timePart.split(':');
  return new Date(year, month - 1, day, hour, minute);
}

// פונקציה לחישוב שעות לימוד
function calculateStudyHours(attendanceData) {
  const studyHours = {};

  attendanceData.forEach(record => {
    const name = record.name.trim();
    const dateTime = parseDateTime(record.dateTime);
    const date = dateTime.toDateString();

    if (!studyHours[name]) {
      studyHours[name] = { totalHours: 0, onTimeCount: 0, totalDays: 0, dates: {} };
    }

    if (!studyHours[name].dates[date]) {
      studyHours[name].dates[date] = { startTime: dateTime, endTime: dateTime, duration: 0 };
      studyHours[name].totalDays++;

      // בדיקה אם הגיע לפני 20:45
      if (dateTime.getHours() < 20 || (dateTime.getHours() === 20 && dateTime.getMinutes() <= 45)) {
        studyHours[name].onTimeCount++;
      }
    } else {
      studyHours[name].dates[date].endTime = dateTime;
    }
  });

  // חישוב סך שעות לימוד
  Object.keys(studyHours).forEach(name => {
    Object.values(studyHours[name].dates).forEach(day => {
      let duration = (day.endTime - day.startTime) / (1000 * 60 * 60); // המרה לשעות

      // הורדת רבע שעה אם הגיע בין 21:30 ל-21:45
      const startHour = day.startTime.getHours();
      const startMinute = day.startTime.getMinutes();
      if (startHour === 21 && startMinute >= 30 && startMinute <= 45) {
        duration -= 0.25;
      }

      studyHours[name].totalHours += duration;
    });
  });

  return...