Как получить посещаемость сотрудника, если он не выходит из системы в определенную дату

Я ищу основную логику посещаемости. Что я сделал до сих пор, так это то, что сотрудники могут нажимать на кнопки двух разных типов и отмечать себя как "Вход", "Выход из системы" (статус 1 и 2) с помощью одной кнопки, а "Разрыв", "Перерыв" (статус 3 и 4) с помощью другой. кнопка.

Теперь, когда я вычисляю общее количество часов регистрации сотрудника и общее количество часов перерыва для конкретной даты, я делаю что-то вроде ниже.

  1. Сначала выполните цикл по дате начала и дате окончания, для которого я хочу увидеть рабочее время.
  2. Теперь, прежде всего, проверьте, вошел ли сотрудник в конкретную дату, найдя запись статуса 1 этой даты.
  3. Если сотрудник вошел в эту дату, я получаю все записи о посещаемости за эту дату.
  4. Теперь я перебираю записи о посещаемости за эту дату и складываю разницу во времени, начиная с первого статуса 1 (т. Е. Входа в систему) до следующего статуса и со следующего статуса (который может быть либо перерывом в начале 3, либо выходом из системы 2) до следующего статуса (который может быть или сломаться над 4 или войти 1).

Это работает хорошо, и мои расчеты рабочего времени идут хорошо.

Однако есть одна логическая часть, которую я не могу понять, т.е. если сотрудник не выходит из системы в тот же день, за который я выбрал записи, то промежуток времени от последнего входа в систему или перерыва до выхода из системы не рассчитывается, Поскольку окончательное состояние выхода из системы не совпадает с той датой, за которую я получил записи.

Итак, мне нужна помощь в понимании любых предложений, как это можно сделать и как я могу рассчитать рабочее время, если статус выхода сотрудника падает на другую дату, чем дата входа в систему.

Заранее спасибо.

Вот код

public function getEmployeeAttendance($company_uid , $emp_uid)
{
    for($m=1; $m<=12; $m++)
    {
        $mon = strtotime(date('Y-' . $m . '-00'));

        $first = date("Y-m-01", $mon); // First Date Of cuRRENT mONTH
        $last = date("Y-m-t", $mon); // Last Date Of cuRRENT mONTH
        $date[] = range_date($first, $last);
    }

    $atten = array();

    //echo "<pre>";

    foreach($date as $dt)
    {
        foreach($dt as $d)
        {
           // A function to check if there was a status 1 on this date
            $myAttendance = $this->Attendance_Model->myAttendance($company_uid , $emp_uid, $d);

            # If Employee Signed In on This Date (i.e. Status was 1)
            if(count($myAttendance) >0)
            {
                # Calculate Working Hours
                $attenRec = $this->Attendance_Model->getAttendanceRecords($company_uid , $emp_uid, $d);

                $signInHrs = 0;
                $breakHrs = 0;
                $workingHrs = 0;

                for($i=0; $i<count($attenRec); $i++)
                {
                   // Get this record's status                      
                    $status = $attenRec[$i]['status'];

                   // Get next record's status
                    if(!empty($attenRec[$i + 1]))
                    {
                        if($status == '1' || $status == '4')    // Sign In or Break Over
                        {                               
                            $thisTime = strtotime($attenRec[$i]['atten_time']);
                            $nextTime = strtotime($attenRec[$i + 1]['atten_time']);
                            $diff = round(($nextTime - $thisTime) / 3600, 2);
                            $signInHrs += $diff;
                        }                           

                        if($status == '3')  // Break Start
                        {                               
                            $thisTime = strtotime($attenRec[$i]['atten_time']);
                            $nextTime = strtotime($attenRec[$i + 1]['atten_time']);
                            $diff = round(($nextTime - $thisTime) / 3600, 2);
                            $signInHrs += $diff;

                            $breakHrs += $diff;
                        }

                    }

                }

                $onlySignInHrs = floor($signInHrs);
                $remainingSignInHrs = $signInHrs - $onlySignInHrs;
                $signInMinutes = round($remainingSignInHrs * 60);

                $myAttendance['signInHrs'] = $onlySignInHrs . " Hrs : " . $signInMinutes . " Min";

                $onlyBreakHrs = floor($breakHrs);
                $remainingBreakHrs = $breakHrs - $onlyBreakHrs;
                $breakMinutes = round($remainingBreakHrs * 60);

                $myAttendance['breakHrs'] = $onlyBreakHrs . " Hrs : " . $breakMinutes . " Min";

                $workingHrs = $signInHrs - $breakHrs;
                $onlyWorkingHrs = floor($workingHrs);
                $remainingWorkingHrs = $workingHrs - $onlyWorkingHrs;
                $workingMinutes = round($remainingWorkingHrs * 60);

                $myAttendance['workingHrs'] = $onlyWorkingHrs . " Hrs : " . $workingMinutes . " Min";
            }

            # Save This Date's Attendance
            $atten[] = $myAttendance;

        }

    }

    return $atten;
}

0 ответов

Другие вопросы по тегам