public void FillAbsentAttendance(int RollCallID)
        {
            RollCallBusiness RollBO = new RollCallBusiness(this.RollSystemDB);
            var rollCall            = RollBO.GetRollCallByID(RollCallID);

            //Tim nhung study session trong qua khu, chua co log
            var PassStudySessions = rollCall.StudySessions.Where(ses => ses.SessionDate < DateTime.Today &&
                                                                 !rollCall.AttendanceLogs.Any(log => log.LogDate == ses.SessionDate)).ToList();

            //Bat dau ghi log absent toan bo
            foreach (var PassStudySession in PassStudySessions)
            {
                AttendanceLog Log = new AttendanceLog()
                {
                    RollCallID = RollCallID,
                    LogDate    = PassStudySession.GetOriginalDate(),
                    TypeID     = 1
                };

                foreach (var Student in rollCall.Students)
                {
                    StudentAttendance Attendance = new StudentAttendance()
                    {
                        StudentID = Student.StudentID, IsPresent = false
                    };
                    Log.StudentAttendances.Add(Attendance);
                }
                Insert(Log);
            }
        }
        /// <summary>
        /// Lấy thời gian rảnh trong ngày.
        /// Tính cả constrains giáo viên, dùng khi đổi time của session
        /// </summary>
        /// <param name="RollCallID"></param>
        /// <param name="FromDate"></param>
        /// <param name="ToDate"></param>
        /// <returns></returns>
        public List <TimeSpan> FindAvaibleSessionTime(int RollCallID, DateTime SelectedDate)
        {
            RollCallBusiness RollBO = new RollCallBusiness(this.RollSystemDB);
            var rollCall            = RollBO.GetRollCallByID(RollCallID);

            //Tao 1 danh sach cac thoi gian rarnh
            List <TimeSpan> TimeList = AllAvailableTime(rollCall.Subject.NumberOfSlot);

            //Loai tiep nhung slot trong khoang thoi gian dc chon
            foreach (var Session in rollCall.Class.StudySessions.
                     Where(ss => ss.SessionDate == SelectedDate))
            {
                foreach (var Time in TimeList.ToList())
                {
                    if (Time >= Session.StartTime && Time <= Session.EndTime)
                    {
                        TimeList.Remove(Time);
                    }
                }
            }

            foreach (var Session in rollCall.Instructor.StudySessions.
                     Where(ss => ss.SessionDate == SelectedDate))
            {
                foreach (var Time in TimeList.ToList())
                {
                    if (Time >= Session.StartTime && Time <= Session.EndTime)
                    {
                        TimeList.Remove(Time);
                    }
                }
            }

            return(TimeList);
        }
        public List <Instructor> GetInstructorOfRollCall(int RollCallID)
        {
            RollCallBusiness RollBO = new RollCallBusiness();
            var rollCall            = RollBO.GetRollCallByID(RollCallID);

            return(rollCall.Subject.SubjectType.Instructors.ToList());
        }
        public List <AttendanceLog> GetRollCallAttendanceLog(int RollCallID)
        {
            //Lay roll call ra
            if (RollBO == null)
            {
                RollBO = new RollCallBusiness(this.RollSystemDB);
            }
            RollCall RollCall = RollBO.GetRollCallByID(RollCallID);

            //Fill lai gia tri nhung ngay trong qua khu
            FillAbsentAttendance(RollCallID);

            //Lay cac ngay trong roll call
            var Dates = RollCall.AttendanceLogs.OrderBy(roll => roll.LogDate).Select(roll => roll.LogDate).Distinct();
            List <AttendanceLog> AttendanceLogs = new List <AttendanceLog>();

            foreach (DateTime Date in Dates)
            {
                AttendanceLog Log = GetAttendanceLogAtDate(RollCall.RollCallID, Date);
                AttendanceLogs.Add(Log);
            }

            return(AttendanceLogs);
        }
        public void ChangeInstructor(int RollCallID, int InstructorID, String Note, DateTime FromDate, DateTime ToDate)
        {
            RollCallBusiness RollBO = new RollCallBusiness(this.RollSystemDB);
            var rollCall            = RollBO.GetRollCallByID(RollCallID);

            int OldInstructorID = 0;

            foreach (var StudySession in rollCall.StudySessions.ToList())
            {
                if (StudySession.SessionDate >= FromDate && StudySession.SessionDate <= ToDate)
                {
                    OldInstructorID           = StudySession.InstructorID;
                    StudySession.InstructorID = InstructorID;
                    StudySession.SetNote(Note);
                    base.Detach(StudySession);
                    base.Update(StudySession);
                }
            }
        }
Exemplo n.º 6
0
        private static FaceRecognizer CreateRollCallRecognizer(int RollCallID)
        {
            //Tu rollcall ID, tao face recognizer, train
            //FaceRecognizer FaceRec = new LBPHFaceRecognizer(1, 8, 8, 8, 75);
            FaceRecognizer FaceRec = new FisherFaceRecognizer(80, RECOGNIZER_THREEHOLD);

            List <int> StudentIDs = new List <int>();
            List <Image <Gray, byte> > StudentImages = new List <Image <Gray, byte> >();

            RollCallBusiness RollBO = new RollCallBusiness();
            //Load danh sach student cua roll call
            RollCall RollCall = RollBO.GetRollCallByID(RollCallID);

            foreach (var Student in RollCall.Students)
            {
                foreach (var Image in Student.StudentImages)
                {
                    try
                    {
                        //Load ID va anh de train cho bo recognizer
                        String             TrainingImagePath = TRAINING_FOLDER_PATH + "/" + Image.ImageLink;
                        Image <Gray, byte> TrainingImage     = new Image <Gray, byte>(TrainingImagePath);
                        StudentIDs.Add(Image.StudentID);
                        TrainingImage._EqualizeHist();
                        StudentImages.Add(TrainingImage);
                    }
                    catch
                    {
                    }
                }
            }

            if (StudentImages.Count == 0 || StudentIDs.Count == 0)
            {
                return(null);
            }
            FaceRec.Train(StudentImages.ToArray(), StudentIDs.ToArray());

            return(FaceRec);
        }
        public bool Insert(StudySession Session)
        {
            RollCallBusiness RollBO = new RollCallBusiness();
            var rollCall            = RollBO.GetRollCallByID(Session.RollCallID);

            int NumberOfSlot = rollCall.Subject.NumberOfSlot;

            //Set thoi gian
            Session.EndTime = Session.StartTime.
                              Add(TimeSpan.FromMinutes(90 * NumberOfSlot)).
                              Add(TimeSpan.FromMinutes(15 * (NumberOfSlot - 1)));

            var SameTimeSessions = base.GetList().Where(
                s => (Session.StartTime >= s.StartTime && Session.StartTime <= s.EndTime) ||
                (Session.EndTime >= s.StartTime && Session.EndTime <= s.EndTime)).
                                   Where(s => Session.SessionDate == s.SessionDate && Session.SessionID != s.SessionID);

            var SameTimeSesion = SameTimeSessions.FirstOrDefault(s => s.InstructorID == Session.InstructorID);

            //Xet tiep xem gio doi co trung. (Xet trung gio, trung giao vien hoac trung lop
            if (SameTimeSesion != null)
            {
                //Bao la giao vien da day
                String Request = String.Format("Request: {0} teach class {1} at {2} - {3} on {4}",
                                               Session.Instructor.Fullname, Session.Class.ClassName,
                                               Session.StartTime.ToString(@"hh\:mm"),
                                               Session.EndTime.ToString(@"hh\:mm"),
                                               Session.SessionDate.ToString("dd-MM-yyyy"));

                String Error = String.Format("Error: Instructor {0} is teaching class {1} at {2} - {3} on {4}.",
                                             SameTimeSesion.Instructor.Fullname, SameTimeSesion.Class.ClassName,
                                             SameTimeSesion.StartTime.ToString(@"hh\:mm"),
                                             SameTimeSesion.EndTime.ToString(@"hh\:mm"),
                                             SameTimeSesion.SessionDate.ToString("dd-MM-yyyy"));
                throw new Exception(Request + "\n" + Error);
            }
            else
            {
                SameTimeSesion = SameTimeSessions.FirstOrDefault(s => s.ClassID == Session.ClassID);
                if (SameTimeSesion != null)
                {
                    String Request = String.Format("Request: Class {0} learn {1} at {2} - {3} on {4}",
                                                   Session.Class.ClassName, Session.RollCall.Subject.FullName,
                                                   Session.StartTime.ToString(@"hh\:mm"),
                                                   Session.EndTime.ToString(@"hh\:mm"),
                                                   Session.SessionDate.ToString("dd-MM-yyyy"));

                    //Bao la lop nay da hoc
                    String Error = String.Format("Error: Class {0} is learning {1} at {2} - {3} on {4}",
                                                 SameTimeSesion.Class.ClassName, SameTimeSesion.RollCall.Subject.FullName,
                                                 SameTimeSesion.StartTime.ToString(@"hh\:mm"),
                                                 SameTimeSesion.EndTime.ToString(@"hh\:mm"),
                                                 SameTimeSesion.SessionDate.ToString("dd-MM-yyyy"));
                    throw new Exception(Request + "\n" + Error);
                }
                else
                {
                    return(base.Insert(Session));
                }
            }
        }
        public AttendanceLog WriteAttendanceAutoLog(int RollCallID, List <RecognizerResult> RecognizerResults)
        {
            if (RecognizerResults.Count == 0)
            {
                return(null);
            }

            //Tim xem da co log auto cho hom nay chua
            AttendanceLog Log      = GetAttendanceLogAtDate(RollCallID, DateTime.Today, 1);
            bool          LogExist = true;

            if (Log == null)
            {
                Log = new AttendanceLog()
                {
                    RollCallID = RollCallID,
                    LogDate    = DateTime.Today,
                    TypeID     = 1
                };

                LogExist = false;
            }

            //Dua danh sach nhan vao, loc ra ID nhung sinh vien co mat
            HashSet <int> StudentIDs = new HashSet <int>();

            foreach (var result in RecognizerResults)
            {
                foreach (var face in result.FaceList)
                {
                    //ID phai khac -1, moi tinh la nhan duoc
                    if (face.StudentID != -1)
                    {
                        StudentIDs.Add(face.StudentID);
                    }
                }

                //Save hinh cho log, neu hinh da trung thi ko save
                if (!Log.LogImages.Any(image => image.ImageLink.Equals(result.ImageLink)))
                {
                    LogImage LogImg = new LogImage()
                    {
                        ImageLink = result.ImageLink
                    };
                    Log.LogImages.Add(LogImg);
                }
            }

            //Lay toan bo student cua roll call
            RollCallBusiness RollBO             = new RollCallBusiness(this.RollSystemDB);
            RollCall         rollCall           = RollBO.GetRollCallByID(RollCallID);
            List <int>       RollCallStudentIDs = rollCall.Students.Select(s => s.StudentID).ToList();

            foreach (int StudentID in RollCallStudentIDs)
            {
                //Neu student chua co trong log thi add vao
                if (!Log.StudentAttendances.Any(attendace => attendace.StudentID == StudentID))
                {
                    StudentAttendance Attendance = new StudentAttendance()
                    {
                        StudentID = StudentID,
                    };
                    //Xem co ten trong list cac id da nhan dc hay ko
                    if (StudentIDs.Contains(StudentID))
                    {
                        Attendance.IsPresent = true;
                    }
                    else
                    {
                        Attendance.IsPresent = false;
                    }
                    Log.StudentAttendances.Add(Attendance);
                }
                else
                {
                    StudentAttendance Attendance = Log.StudentAttendances.SingleOrDefault(attendance => attendance.StudentID == StudentID);
                    if (StudentIDs.Contains(StudentID))
                    {
                        Attendance.IsPresent = true;
                    }
                    //Ko chuyen tu true sang false, vi moi lan diem danh co the thieu nguoi
                }
            }

            //Neu log chua co thi them vao, da co thi edit lai
            if (LogExist)
            {
                Update(Log);
            }
            else
            {
                Insert(Log);
            }
            //Tra Log ra de show
            return(Log);
        }
        private ExcelWorksheet CreateDetailWorksheet(int StudentID, int RollCallID)
        {
            RollCallBusiness RollBO = new RollCallBusiness();

            var rollCall = RollBO.GetRollCallByID(RollCallID);

            StudentBusiness StuBO = new StudentBusiness();

            var student = StuBO.GetStudentByID(StudentID);

            AttendanceBusiness   AttenBO      = new AttendanceBusiness();
            List <AttendanceLog> RollCallLogs = AttenBO.GetRollCallAttendanceLog(RollCallID);
            var StudentAttendances            = student.StudentAttendances.Where(sa => sa.AttendanceLog.RollCallID == RollCallID &&
                                                                                 RollCallLogs.Select(r => r.LogID).Contains(sa.LogID))
                                                .OrderBy(sa => sa.AttendanceLog.LogDate).ToList();

            ExcelWorksheet DetailWorkSheet = new ExcelPackage().
                                             Workbook.Worksheets.Add(rollCall.Subject.ShortName + "_" + rollCall.BeginDate.ToString("dd-MM-yyyy"));

            int    Absent     = StudentAttendances.Count(sa => !sa.IsPresent);
            double AbsentRate = (double)Absent / rollCall.StudySessions.Count * 100;

            DetailWorkSheet.Cells["A:XFD"].Style.Font.Name = "Arial";
            DetailWorkSheet.Cells["C2"].Value           = "Attendance Report Detail";
            DetailWorkSheet.Cells["C2"].Style.Font.Size = 18;
            DetailWorkSheet.Cells["C2"].Style.Font.Bold = true;

            //student detail
            DetailWorkSheet.Cells["C3"].Value = "Subject";
            DetailWorkSheet.Cells["C4"].Value = "Date";
            DetailWorkSheet.Cells["C5"].Value = "Instructor";
            DetailWorkSheet.Cells["C6"].Value = "Total Session";
            DetailWorkSheet.Cells["C7"].Value = "Completed Session";
            DetailWorkSheet.Cells["C8"].Value = "Absent";
            DetailWorkSheet.Cells["C9"].Value = "Absent Rate";

            DetailWorkSheet.Cells["C3:C9"].Style.Font.Size = 12;
            DetailWorkSheet.Cells["C3:C9"].Style.Font.Bold = true;

            DetailWorkSheet.Cells["D3"].Value = rollCall.Subject.FullName;
            DetailWorkSheet.Cells["D4"].Value = "From " + rollCall.BeginDate.ToString("dd-MM-yyyy") + " to " + rollCall.EndDate.ToString("dd-MM-yyyy");
            DetailWorkSheet.Cells["D5"].Value = rollCall.Instructor.Fullname;
            DetailWorkSheet.Cells["D6"].Value = rollCall.Subject.NumberOfSession;
            DetailWorkSheet.Cells["D7"].Value = StudentAttendances.Count();
            DetailWorkSheet.Cells["D8"].Value = Absent;
            DetailWorkSheet.Cells["D9"].Value = String.Format("{0:0}%", AbsentRate);

            DetailWorkSheet.Cells["D6:D9"].Style.HorizontalAlignment = ExcelHorizontalAlignment.Left;

            //title table
            DetailWorkSheet.Cells["B11"].Value = "No.";
            DetailWorkSheet.Cells["C11"].Value = "Date";
            DetailWorkSheet.Cells["D11"].Value = "Present";
            DetailWorkSheet.Cells["E11"].Value = "Note";
            DetailWorkSheet.Cells["B11:E11"].Style.Font.Size = 12;
            DetailWorkSheet.Cells["B11:E11"].Style.Font.Bold = true;


            for (int i = 0; i < StudentAttendances.Count(); i++)
            {
                int RowIndex = 12 + i;
                DetailWorkSheet.Cells["B" + RowIndex].Value = i + 1;
                DetailWorkSheet.Cells["C" + RowIndex].Value = StudentAttendances.ElementAt(i).AttendanceLog.LogDate.ToString("dd-MM-yyyy");
                if (StudentAttendances.ElementAt(i).IsPresent)
                {
                    DetailWorkSheet.Cells["D" + RowIndex].Value = "Present";
                }
                else
                {
                    DetailWorkSheet.Cells["D" + RowIndex].Value           = "Absent";
                    DetailWorkSheet.Cells["D" + RowIndex].Style.Font.Bold = true;
                }
                DetailWorkSheet.Cells["E" + RowIndex].Value = StudentAttendances.ElementAt(i).Note;
            }
            //set border table
            for (int column = 2; column <= 5; column++)
            {
                for (int row = 11; row <= 11 + StudentAttendances.Count(); row++)
                {
                    DetailWorkSheet.Cells[row, column].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.Black);
                }
            }
            //set height , width
            DetailWorkSheet.Cells["C2:D2"].Merge = true;
            DetailWorkSheet.Cells["C2:D2"].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
            DetailWorkSheet.Column(2).Width = 5;
            DetailWorkSheet.Column(3).Width = 30;
            DetailWorkSheet.Column(4).Width = 30;
            DetailWorkSheet.Column(5).Width = 20;
            return(DetailWorkSheet);
        }