-->

Labeling checkTypes for biometric attendance

2019-08-25 18:55发布

问题:

I have a table named Attendancelogs where I am saving the records that I fetch from a biometric device, the table structure is;

LogType defines the type of log i.e. Biometric/Manual

CheckType defines the type of entry i.e. I or O

VerifyMode defines the type of punch i.e. Fingerprint/Password

isIgnore is used to exclude an entry from the logs.

Now, what I am trying to do is to write a function called sortFunc(); that will process on the already stored records in the Attendancelogs table. what this is suppose to do is;

  1. Mark the checkType of each employee as I for the first entry, then O for their second entry of the date and so on.

  2. If an employee has a last I at the end of the day, meaning no check out, then the next day's first punch of that employee (with in 12 AM - 7 AM) is considered check out for the previous day (marking as a nighter case for that employee) the rest entries are considered as sequential I and O.

  3. any multiple entries within 10 seconds (or defined time) is ignored and marked CheckType as "Auto Ignored for x seconds"

  4. If an employee is not allowed to use Card/Password then his CheckTypes are marked as Card not allowed or Password not allowed

Here is the function that I wrote;

public static bool inn = true;
public void sortLogs(int machineNum)
{
    DateTime prevDate = DateTime.MinValue;
    DateTime currentDate = DateTime.MinValue;

    DateTime prevDateTime = DateTime.MinValue;
    DateTime currentDateTime = DateTime.MinValue;



    TimeSpan lowerBound = TimeSpan.Zero;
    TimeSpan upperBound = TimeSpan.Zero;

    var time = DateTime.ParseExact("00:00:00", "HH:mm:ss", null).ToString("hh:mm:ss tt", CultureInfo.GetCultureInfo("en-US"));
    lowerBound = Convert.ToDateTime(time).TimeOfDay;

    var time2 = DateTime.ParseExact("07:00:00", "HH:mm:ss", null).ToString("hh:mm:ss tt", CultureInfo.GetCultureInfo("en-US"));
    upperBound = Convert.ToDateTime(time2).TimeOfDay;

    upperBound = new TimeSpan(7, 0, 0);



    var CheckType = "N/S";
    bool isNighter = false;
    List<AttendanceLog> firstDates = new List<AttendanceLog>();



    AttendanceLog lastEmp = new AttendanceLog();
    var empList = db.AttendanceLogs.OrderBy(x => x.EmpID).ThenBy(x => x.DateTime).ToList();

    var countEmps = empList.DistinctBy(p => p.EmpID).Count();
    string[,] array = new string[countEmps, 2];

    var checkDevice = db.DeviceInformations.Where(xy => xy.DeviceID == machineNum && xy.IsActive == 1.ToString()).ToList();

    AttendanceLog firstObj = new AttendanceLog();
    int counter = 0;
    int tempEmp = -1;
    foreach (var emp in empList)
    {
        if (emp.EmpID == 0)
            continue;

        var cardAcceptance = db.Roles.Where(x => x.EmpID == emp.EmpID && x.Card_Acceptance == true).ToList();
        var passwordAcceptance = db.Roles.Where(x => x.EmpID == emp.EmpID && x.Password_Acceptance == true).ToList();
        currentDate = emp.Date;
        currentDateTime = emp.DateTime;

        if (emp.EmpID != tempEmp)
        {
            inn = true;
        }



        if (prevDateTime !=  DateTime.MinValue)
        {
            var seconds = (emp.DateTime - prevDateTime).TotalSeconds;
            var settings = db.settings.Where(xy => xy.Constant_Name == "Entry Delay").FirstOrDefault();
            if (settings.Constant_Value <= 0)
                settings.Constant_Value = 10;
            else
            if (seconds > 0 && seconds < settings.Constant_Value)
            {
                //store prevDateTime in deleted table

                emp.CheckType = "Auto Ignored: " + seconds + " seconds interval.";
              //  prevDateTime = emp.DateTime;
                continue;
            }
        }

        if (passwordAcceptance.Count <= 0)
        {
            if (emp.VerifyMode == "3")
            {
                try
                {
                    emp.CheckType = "Password not allowed";
                    //db.SaveChanges();
                    continue;
                }
                catch (DbEntityValidationException e)
                {
                    foreach (var eve in e.EntityValidationErrors)
                    {
                        foreach (var ve in eve.ValidationErrors)
                        {
                        }
                    }
                    throw;
                }
            }

        }
        if (cardAcceptance.Count <= 0)
        {
            if (emp.VerifyMode == "4")
            {
                try
                {
                    emp.CheckType = "Card not allowed";
                   // db.SaveChanges();
                    continue;
                }
                catch (DbEntityValidationException e)
                {
                    foreach (var eve in e.EntityValidationErrors)
                    {
                        foreach (var ve in eve.ValidationErrors)
                        {
                        }
                    }
                    throw;
                }
            }

        }

        if (counter != countEmps)
        {
            if (emp.EmpID != firstObj.EmpID)
            {
                array[counter, 0] = emp.EmpID.ToString();
                firstObj.EmpID = emp.EmpID;
                firstObj.Date = emp.Date;
                counter++;
            }
        }

        if (currentDate == firstObj.Date)
        {
            //check for entry delay


            //get emp datetime here
            //comapre with the slots
            //if the datetime exsits in between 
            //otherwise store it with boolean flag for the first entry only, the rest should not be flagged
            if (emp.DateTime.TimeOfDay > lowerBound && emp.DateTime.TimeOfDay < upperBound)
            {
                //consider the first check as nighter and then ignore the rest

            }
            else {
                //checks after the upperBound means, no nighter

            }
            if (inn)
            {
                inn = false;
                emp.CheckType = "I";
            }
            else
            {
                inn = true;
                emp.CheckType = "O";
            }
            for (int i = 0; i < array.Length / 2; i++)
            {
                if (array[i, 0] == emp.EmpID.ToString())
                {
                    array[i, 1] = emp.CheckType;
                    break;
                }
            }

            //CheckType = emp.CheckType;
            prevDate = currentDate;
            prevDateTime = currentDateTime;

        }

        else
        {
            if (prevDate != currentDate)
            {
                if (emp.DateTime.TimeOfDay > lowerBound && emp.DateTime.TimeOfDay < upperBound)
                {
                    //consider the first check as nighter and then ignore the rest
                    if (inn)
                    {
                        inn = false;
                        emp.CheckType = "I";
                    }
                    else
                    {
                        inn = true;
                        emp.CheckType = "O";
                    }
                    for (int i = 0; i < array.Length / 2; i++)
                    {
                        if (array[i, 0] == emp.EmpID.ToString())
                        {
                            array[i, 1] = emp.CheckType;
                            break;
                        }
                    }

                    //CheckType = emp.CheckType;
                    prevDate = currentDate;
                    prevDateTime = currentDateTime;
                }
                else
                {
                    //checks after the upperBound means, no nighter
                }
                for (int i = 0; i < array.Length / 2; i++)
                {
                    if (array[i, 0] == emp.EmpID.ToString())
                    {
                        if (array[i, 1] == "I")
                        {
                            emp.CheckType = "O";
                            inn = true;
                        }
                        else
                        {
                            emp.CheckType = "I";
                            inn = false;
                        }
                    }
                }
            }
            else
            {

                if (inn)
                {
                    inn = false;
                    emp.CheckType = "I";
                }
                else
                {
                    inn = true;
                    emp.CheckType = "O";
                }

                for (int i = 0; i < array.Length / 2; i++)
                {
                    if (array[i, 0] == emp.EmpID.ToString())
                    {
                        array[i, 1] = emp.CheckType;
                    }
                }

            }
            prevDate = currentDate;
        }

        tempEmp = emp.EmpID.Value;
    }
    db.SaveChanges();
}

This did run but it messes up the "12 AM to 7 AM" checks and the password checks, i.e. not the accurate results.

As one of the example seen ^ consecutive O should not be there. I have been going crazy over this!