I'm working on this software for a gym that has overlapping times for schedules, if the time is greater than 35 minutes between the end time of a class and the start time of the class, that time is dropped.
Example: I work from 8:00am to 9:00am, 8:30am to 9:30am, 10:10am to 11:10am. Anything over a 35min gap is considered a different shift.
I have this working on pay reports at this point only per employee.
The problem is that they would like to mass check-in everyone on holidays and my brain is going a bit crazy trying to figure out how to do arrays and loops on individual employee IDs, figuring out the overlap, dropping the >35min and inserting that shift into the check_ins table.
I've isolated the workers for the given holiday at this point and have the shifts they're scheduled for, I have a total number of employee IDs in an array and a total number of schedules in an array.
anyone have an idea how this might be most easily implemented without me drinking myself stupid? (If a gym ever asks you to write scheduling software, RUN!)
Thanks!
Edit: The holiday pay conditions are as variable as the friggin wind, so no help there.
My code for a single employee:
//init our arrays
$timeStart = array();
$timeEnd = array();
$x = 0;
$maxInterval = new DateTime('00:35');
$classIDArray = array();
do {
//Get our start times for Monday
$p = new DateTime($row_GetMonSchedule2['Start_time']);
$q = new DateTime($row_GetMonSchedule2['End_time']);
$timeStart[$x] = $p->format('H:i');
$timeEnd[$x] = $q->format('H:i');
//Get Class IDs
$classIDArray[$x] = $row_GetMonSchedule2['Class_ID'];
$totalEndTimes = count($timeEnd);
$x++;
} while ($row_GetMonSchedule2 = mysql_fetch_assoc($GetMonSchedule2));
//echo $totalRows_GetMonSchedule2;
//Now let's check the durations and make our shifts
//echo "Class ID Array: "; print_r($classIDArray);
$x = 0;
$s = 1;
do {
///First Time Start
if ($x == 0) {
$TimeDayStart = $timeStart[$x];
}
if ($x < $totalEndTimes) {
///Last Time End
$TimeDayEnd = $timeEnd[$x];
}
$x++; $s++;
} while ($x < $totalEndTimes);
$x = 0;
$s = 1;
/////Get Durations
$interval = array();
do {
if ($x == 0) {
//The very first end time
//First end time of the first time block
$firstEndTime = new DateTime($timeEnd[$x]);
$startTime = new DateTime($timeStart[$s]);
$timeDiff = $startTime->diff($firstEndTime);
$interval[$x] = $timeDiff->format('%H:%i');
} else {
//We don't need the last record because there isn't anything to calculate it aginst, so increase $x by one
if ($x + 1 > $totalEndTimes) {
} else {
$endTime = new DateTime($timeEnd[$x]);
$startTime = new DateTime($timeStart[$s]);
$timeDiff = $endTime->diff($startTime);
$interval[$x] = $timeDiff->format('%H:%i');
}
}
$x++; $s++;
} while ($x < $totalEndTimes);
//Let's try to break this up into shifts now...
$x =0;
$y =0;
$zz = 1;
$s = 1;
$timeBreak =0;
$durCount = count($interval) - 1;
$BreakStartTimes = array();
$BreakEndTimes = array();
$xx3 = 0;
$yy3 = 0;
//Setup table
do {
if ($x == 0) {
//echo $timeStart[$x]." - ";
$BreakStartTimes[$yy3] = $timeStart[$x];
$yy3++;
if (new DateTime($interval[$x]) > new DateTime('00:35')) {
//echo $timeEnd[$x]." ";
$BreakEndTimes[$xx3] = $timeEnd[$x];
$xx3++;
$timeBreak = 1;
//echo "Time Break";
}
}
if (new DateTime($interval[$x]) > new DateTime('00:35') && $timeBreak != 1) {
//echo $timeEnd[$x]." ";
$BreakEndTimes[$xx3] = $timeEnd[$x];
$xx3++;
$timeBreak = 1;
//echo "Time Break";
}
if ($timeBreak == 1 && $x + 1 < $totalEndTimes) {
//echo $timeStart[$s]." - ";
$BreakStartTimes[$yy3] = $timeStart[$s];
$yy3++;
$timeBreak = 0;
}
$x++; $s++;
} while ($x < $totalEndTimes);
if (empty($BreakEndTimes)) {
//echo "empty";
$ttt = count($timeEnd) - 1;
//echo $ttt;
}
Like some commenters have said before me, nesting some loops should do the trick. Try writing it down in pseudo code and fill in the details from there.
Example:
//connect to database
$conn = new mysqli("host","user","pass","db");
// check for connection error
if ($mysqli->connect_error)
{
die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
}
//query for all employees working the holiday
// I might be way off with the query seeing as I don't know the complexity
$sql = "SELECT e.ID, count(s.Start_Time) FROM employee e, schedule s
WHERE count(s.Start_Time) >= 1 AND e.ID = s.Employee_ID
AND s.Start_Time >= '2013-12-24 00:00:00.0000'
AND s.End_Time <= '2014-01-02 00:00:00.0000'
GROUP BY e.ID;";
//get the result from database like you do already
//then do the loop
for each employee
{
execute the code you have for the current employee
}
do clean up or other tasks after the loop is done
Now this is pretty easy to start expanding and hopefully give an idea you can build on.