public JsonResult LoadingGradeItems(Guid studentId)
        {
            List<GradeItemModel> gradeItemModels;

            try
            {
                using (var context = new TobyDBContext())
                {
                    gradeItemModels = context.GradeItemModels.Where(g => g.StudentId == studentId).ToList();
                }

                return Json(gradeItemModels.Select(g => new
                {
                    item_id = g.Id,
                    grade = g.Grades,
                    exam_name = g.ExamName,
                    exam_date = g.ExamDate.ToString("MM/dd/yyyy")
                }));
            }
            catch
            {
                this.Response.StatusCode = 500;

                return Json(null);
            }
        }
        public JsonResult SavedEvent(string eventTitle, string startTime, string endTime, bool isAllDay, bool isFixed)
        {
            try
            {
                if (Session["student"] == null)
                {
                    return Json(false);
                }

                EventModel eventModel = new EventModel
                {
                    EndTime = DateTime.Parse(endTime),
                    StartTime = DateTime.Parse(startTime),
                    EventTitle = eventTitle,
                    IsAllDay = isAllDay,
                    IsFixed = isFixed,
                    Color = isFixed ? "green" : "red"
                };
                Guid id = Guid.Parse((string)Session["student"]);
                using (var context = new TobyDBContext())
                {
                    eventModel.StudentId = id;
                    context.EventModels.Add(eventModel);
                    context.SaveChanges();
                }
                return Json(eventModel.Id);
            }
            catch { return Json(false); }
        }
        public JsonResult LoadingEventSource()
        {
            List<EventModel> eventModels;
            Guid id = Guid.Parse((string)Session["student"]);

            try
            {
                using (var context = new TobyDBContext())
                {
                    if (Session["student"] != null)
                    {
                        eventModels = context.EventModels.Where(eventModel => eventModel.StudentId == id).ToList();
                    }
                    else
                    {
                        return Json(null);
                    }
                }
                return Json(eventModels.Select(models => new
                    {
                        id = models.Id.ToString(),
                        title = models.EventTitle,
                        start = models.StartTime.ToString("s"),
                        end = models.EndTime.ToString("s"),
                        allDay = models.IsAllDay,
                        isFixed = models.IsFixed,
                        backgroundColor = models.Color,
                        teacherId = models.TeacherId,
                        worktypeId = models.WorkTypeId
                    }).ToArray(), JsonRequestBehavior.AllowGet);
            }
            catch { return Json(null); }
        }
        //
        // GET: /Payment/

        public ActionResult PaymentList()
        {
            List<TobyClassLookupTable> tobyClassModels;

            try
            {
                using (var context = new TobyDBContext())
                {
                    tobyClassModels = context.TobyClassLookupTable.ToList();
                }

                return View(tobyClassModels);
            }
            catch
            {
                this.Response.StatusCode = 500;
                return PartialView("Error");
            }
        }
        public JsonResult LoadingPaymentList(string dateLimit, int condition = 0)
        {
            List<PaymentModel> paymentModels;
            DateTime currentDate = DateTime.Now.Date;
            DateTime pastDataLimit = new DateTime();
            try
            {
                if (dateLimit != null && !DateTime.TryParse(dateLimit, out pastDataLimit))
                {
                    throw new Exception();
                }

                using (var context = new TobyDBContext())
                {
                    paymentModels = context.PaymentModels.Where(p => condition != 0 ? (condition == 1 ? p.PaymentDate != null
                        && p.PaymentDate >= pastDataLimit
                        : (p.PaymentDeadLine < currentDate && p.PaymentDate == null)) : true).OrderBy(p => p.PaymentDeadLine)
                        .Include(p => p.Students).ToList();
                }

                return Json(paymentModels.Select(payment => new
                    {
                        _id = payment.Id,
                        payment_name = payment.PaymentName,
                        payment = payment.Payment,
                        student_name = String.Format("{0}({1})", payment.Students.Name, payment.Students.EnglishName),
                        payment_date = payment.PaymentDate.HasValue ? payment.PaymentDate.Value.ToString("MM/dd/yyyy") : null,
                        deadline = payment.PaymentDeadLine.HasValue ? payment.PaymentDeadLine.Value.ToString("MM/dd/yyyy") : null,
                        class_id = payment.Students.TobyClassId
                    }).ToArray());
            }
            catch
            {
                this.Response.StatusCode = 500;
                return Json(null);
            }
        }
        public JsonResult SaveGradeItem(string examName, string scoreAmount, string examDate, Guid studentId)
        {
            decimal scroe;
            DateTime date;
            GradeItemModel gradeItem = new GradeItemModel { ExamName = examName, StudentId = studentId };

            try
            {
                if (!Decimal.TryParse(scoreAmount, out scroe) || !DateTime.TryParse(examDate, out date))
                {
                    throw new Exception();
                }

                gradeItem.Grades = scroe;
                gradeItem.ExamDate = date;

                using (var context = new TobyDBContext())
                {
                    context.GradeItemModels.Add(gradeItem);
                    context.SaveChanges();
                }

                return Json(new
                {
                    item_id = gradeItem.Id,
                    grade = gradeItem.Grades,
                    exam_name = gradeItem.ExamName,
                    exam_date = gradeItem.ExamDate.ToString("MM/dd/yyyy")
                });
            }
            catch
            {
                this.Response.StatusCode = 500;

                return Json(null);
            }
        }
 public void DeleteGradeItem(Guid id)
 {
     try
     {
         using (var context = new TobyDBContext())
         {
             context.GradeItemModels.Delete(g => g.Id == id);
         }
     }
     catch
     {
         this.Response.StatusCode = 500;
     }
 }
 public void UpdatedPayment(string registerTime, string dealineTime, string paymentAmount, string paymentName, string paymentId)
 {
     Guid id;
     DateTime deadline, payDate = DateTime.MaxValue;
     decimal payment;
     try
     {
         using (var context = new TobyDBContext())
         {
             if (!Guid.TryParse(paymentId, out id) || !decimal.TryParse(paymentAmount, out payment)
                 || !DateTime.TryParse(dealineTime, out deadline) || ( registerTime != "" 
                 && !DateTime.TryParse(registerTime, out payDate)))
             {
                 throw new Exception();
             }
             context.PaymentModels.Update(p => p.Id == id, model => new PaymentModel
                 {
                     Payment = payment,
                     PaymentDeadLine = deadline,
                     PaymentName = paymentName,
                     PaymentDate = registerTime != "" ? payDate : new Nullable<DateTime>()
                 });
         }
     }
     catch { }
 }
        public JsonResult LoadingLaborHourStatisticsList(string dateRange)
        {
            List<EventModel> eventModels;
            Dictionary<Guid, Dictionary<string, List<EventModel>>> eventModelDic = new Dictionary<Guid,Dictionary<string,List<EventModel>>>();
            Dictionary<int, string> workTypeDic = new Dictionary<int, string>();
            Dictionary<Guid, string> teacherDic;
            DateTime dateTimeStart, dateTimeEnd;

            try
            {
                using (var context = new TobyDBContext())
                {
                    if(!DateTime.TryParse(dateRange, out dateTimeStart))
                    {
                        throw new Exception();
                    }
                    dateTimeStart = new DateTime(dateTimeStart.Year, dateTimeStart.Month, 1);
                    dateTimeEnd = dateTimeStart.AddMonths(1).AddDays(-1);
                    eventModels = context.EventModels.Where(e => e.TeacherId != null
                        && (e.StartTime >= dateTimeStart && e.EndTime <= dateTimeEnd)).Include(e=> e.Teacher).ToList();
                    eventModelDic = context.TeacherModels.ToDictionary(key=> key.Id, v => new Dictionary<string, List<EventModel>>());
                    workTypeDic = context.WorkTypeLookupTable.ToDictionary(key=> key.Id, v => v.TypeName);
                    teacherDic = context.TeacherModels.ToDictionary(key=> key.Id, v => String.Format("{0}({1})", v.Name, v.EnglishName));
                }

                foreach (EventModel model in eventModels)
                {
                    if (eventModelDic.ContainsKey(model.TeacherId.Value))
                    {
                        var typeName = "NoType";
                        if(workTypeDic.ContainsKey(model.WorkTypeId.GetValueOrDefault()))
                        {
                            typeName = workTypeDic[model.WorkTypeId.GetValueOrDefault()];
                        }

                        if (!eventModelDic[model.TeacherId.Value].ContainsKey(typeName))
                        {
                            eventModelDic[model.TeacherId.Value].Add(typeName, new List<EventModel>());
                        }

                        eventModelDic[model.TeacherId.Value][typeName].Add(model);
                    }
                    else
                    {
                        throw new Exception();
                    }
                    
                }

                return Json(eventModelDic.Select(e => new
                    {
                        teacher_name = teacherDic[e.Key],
                        type_array = e.Value.Select(v => new
                        {
                            type_name = v.Key,
                            labor_hour = v.Value.Sum(h=> h.EndTime.Subtract(h.StartTime).TotalHours)
                        }).ToArray()

                    }).ToArray());
            }
            catch
            {
                this.Response.StatusCode = 500;

                return Json(null);
            }
        }
        private void AutoGeneratedFixedEvents()
        {
            Mapper.Reset();
            Mapper.CreateMap<EventModel, EventModel>().ForMember(dest => dest.Id, opt => opt.Ignore());
            List<EventModel> events;
            EventModel eventModel;
            List<StudentModel> students;
            DateTime currentDate = DateTime.Today, startTime, endTime;

            using (var context = new TobyDBContext())
            {
                students = context.StudentModels.ToList();
                students.ForEach(student =>
                {
                    events = context.EventModels.Where(models => models.IsFixed && models.StudentId == student.Id && models.StartTime < currentDate).ToList();
                    foreach (EventModel model in events)
                    {
                        startTime = model.StartTime.AddDays(7);
                        endTime = model.EndTime.AddDays(7);
                        if (!CheckEventIsExist(startTime, endTime, model.StudentId))
                        {
                            context.EventModels.Attach(model);
                            eventModel = Mapper.Map<EventModel, EventModel>(model);
                            eventModel.StartTime = startTime;
                            eventModel.EndTime = endTime;
                            eventModel.Color = "green";
                            context.EventModels.Add(eventModel);
                            model.IsFixed = false;
                            model.Color = "red";
                        }
                    }
                });
                context.SaveChanges();
            }

        }
 public void DeletedEvent(Guid id)
 {
     try
     {
         using (var context = new TobyDBContext())
         {
             context.EventModels.Delete(events => events.Id == id);
         }
     }
     catch { }
 }
 public void UpdatedTitle(Guid id, Guid teacherId, int workTypeId, string eventTitle, string theColor, bool isFixed)
 {
     try
     {
         using (var context = new TobyDBContext())
         {
             context.EventModels.Update(events => events.Id == id, eventTitles => new EventModel
             {
                 EventTitle = eventTitle,
                 Color = theColor,
                 IsFixed = isFixed,
                 TeacherId = teacherId,
                 WorkTypeId = workTypeId
             });
         }
     }
     catch { }
 }
 public void UpdatedEvent(Guid id, string startTime, string endTime, bool isAllDay)
 {
     try
     {
         using (var context = new TobyDBContext())
         {
             context.EventModels.Update(events => events.Id == id, eventTitles => new EventModel
             {
                 StartTime = DateTime.Parse(startTime),
                 EndTime = DateTime.Parse(endTime),
                 IsAllDay = isAllDay
             });
         }
     }
     catch { }
 }
        public JsonResult SearchStudent(string studentName)
        {
            StudentModel student;

            try
            {
                using (var context = new TobyDBContext())
                {
                    if (studentName != null && studentName != "")
                    {
                        student = context.StudentModels.Where(students => students.Name == studentName
                            || students.EnglishName == studentName).First();

                    }
                    else
                    {
                        throw new Exception();
                    }
                }

                return Json(new
                {
                    student_id = student.Id,
                    student_name = String.Format("{0}({1})", student.Name, student.EnglishName)
                });
            }
            catch
            {
                this.Response.StatusCode = 500;

                return Json(null);
            }
        }
        public JsonResult GetChartData(Guid id)
        {
            List<GradeItemModel> gradeItems;
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            try
            {
                using (var context = new TobyDBContext())
                {
                    gradeItems = context.GradeItemModels.Where(g => g.StudentId == id).OrderBy(g => g.ExamDate).ToList();
                }

                return Json(gradeItems.Select(g => new object[4] { 
                  GetJavascriptTimestamp(g.ExamDate), decimal.ToInt32(g.Grades), 
                    g.ExamName, g.Grades.ToString()
                }).ToArray());
            }
            catch
            {
                this.Response.StatusCode = 500;

                return Json(null);
            }
        }
        public ActionResult GetDutyWorks(string dutyDate, string teacherId)
        {
            DateTime date;
            Guid id = Guid.Empty;
            List<EventModel> eventModels;

            try
            {
                if (!DateTime.TryParse(dutyDate, out date) || !Guid.TryParse(teacherId, out id))
                {
                    throw new Exception();
                }

                using (var context = new TobyDBContext())
                {
                    eventModels = (from eventModel in context.EventModels
                                   where eventModel.TeacherId == id && EntityFunctions.DiffDays(eventModel.StartTime, date) == 0
                                   select eventModel).Include(m => m.Student).Include(m => m.Teacher)
                                   .OrderBy(m => m.StudentId).ToList();
                }

                return PartialView("DutyWorks", eventModels);
            }
            catch
            {
                return PartialView("Error");
            }
        }
        private void InitializeDB()
        {
            Database.SetInitializer(new DbContextInitializer());

            using (var context = new TobyDBContext())
            {
                context.Database.CreateIfNotExists();
            }

        }
        public JsonResult SearchStudents(string studentName)
        {
            StudentModel student;

            try
            {
                using (var context = new TobyDBContext())
                {
                    if (studentName != null && studentName != "")
                    {
                        student = context.StudentModels.Where(students => students.Name == studentName
                            || students.EnglishName == studentName).First();

                    }
                    else
                    {
                        throw new Exception();
                    }
                }

                Session["student"] = student.Id.ToString();

                return Json(student.Id);
            }
            catch
            {
                return Json(false);
            }
        }
 private bool CheckEventIsExist(DateTime start, DateTime end, Guid studentId)
 {
     List<EventModel> eventModels;
     using (var context = new TobyDBContext())
     {
         eventModels = context.EventModels.Where(events =>
                    events.StudentId == studentId &&
             ((start > events.StartTime && start < events.EndTime)
             || (end > events.StartTime && end < events.EndTime)
             || (start <= events.StartTime && end >= events.EndTime))
                    ).ToList();
     }
     if (eventModels != null && eventModels.Count != 0)
     {
         return true;
     }
     return false;
 }
        public JsonResult GeneratedFixedEvents()
        {
            Mapper.Reset();
            Mapper.CreateMap<EventModel, EventModel>().ForMember(dest => dest.Id, opt => opt.Ignore());
            List<EventModel> events;
            EventModel eventModel;
            DateTime startTime, endTime;
            try
            {
                if (Session["student"] != null)
                {
                    using (var context = new TobyDBContext())
                    {
                        Guid id = Guid.Parse((string)Session["student"]);
                        events = context.EventModels.Where(models => models.IsFixed && models.StudentId == id).ToList();
                        foreach (EventModel model in events)
                        {
                            startTime = model.StartTime.AddDays(7);
                            endTime = model.EndTime.AddDays(7);
                            if (!CheckEventIsExist(startTime, endTime, model.StudentId))
                            {
                                context.EventModels.Attach(model);
                                eventModel = Mapper.Map<EventModel, EventModel>(model);
                                eventModel.StartTime = startTime;
                                eventModel.EndTime = endTime;
                                eventModel.Color = "green";
                                context.EventModels.Add(eventModel);
                                model.IsFixed = false;
                                model.Color = "red";
                            }
                        }
                        context.SaveChanges();
                    }
                }
                else
                {
                    return Json(false);
                }

                return Json(true);
            }
            catch
            {
                return Json(false);
            }
        }
        public JsonResult SavedEvents(EventJsonModel jsonModel)
        {
            DateTime start, end, temp;
            EventModel eventModel;

            try
            {
                if (jsonModel.studentIds == null)
                {
                    throw new Exception();
                }

                if (DateTime.TryParse(jsonModel.startTime, out start) && DateTime.TryParse(jsonModel.endTime, out end))
                {
                    if (start > end)
                    {
                        temp = start;
                        start = end;
                        end = temp;
                    }
                }
                else
                {
                    throw new Exception();
                }

                using (var context = new TobyDBContext())
                {
                    jsonModel.studentIds.ForEach(id =>
                        {
                            eventModel = new EventModel
                            {
                                EventTitle = jsonModel.eventTile,
                                StartTime = start,
                                EndTime = end,
                                StudentId = id,
                                TeacherId = jsonModel.teacherId,
                                WorkTypeId = jsonModel.workTypeId,
                                Color = "red",
                                IsFixed = false,
                                IsAllDay = false
                            };
                            context.EventModels.Add(eventModel);
                        });

                    context.SaveChanges();
                }

                return Json(true);
            }
            catch
            {
                return Json(false);
            }
        }
        public ActionResult GetDispatchedStudents(string startTime, string endTime)
        {
            DateTime start, end, temp;
            List<StudentViewModel> studentModels;
            List<EventModel> eventModels;
            List<StudentModel> students;
            try
            {
                if (DateTime.TryParse(startTime, out start) && DateTime.TryParse(endTime, out end))
                {
                    if (start > end)
                    {
                        temp = start;
                        start = end;
                        end = temp;
                    }
                }
                else
                {
                    return PartialView("Error");
                }

                using (var context = new TobyDBContext())
                {
                    students = context.StudentModels.OrderBy(s=> s.TobyClassId).ToList();

                    eventModels = context.EventModels.Where(events =>
                        (start > events.StartTime && start < events.EndTime)
                        || (end > events.StartTime && end < events.EndTime)
                        || (start <= events.StartTime && end >= events.EndTime)).ToList();
                    studentModels = new List<StudentViewModel>();
                    students.ForEach(student =>
                    {
                        var name = String.Format("{0}({1})", student.Name, student.EnglishName);
                        if (!eventModels.Any(studentId => student.Id == studentId.StudentId))
                        {
                            studentModels.Add(new StudentViewModel { StudentId = student.Id.ToString(), StudentName = name });
                        }
                    });
                }
                return PartialView("DispatchedStudent", studentModels);
            }
            catch
            {
                return PartialView("Error");
            }
        }
        public ActionResult EditedPayment(string paymentId)
        {
            PaymentModel paymentModel;
            Guid id;
            try
            {
                using (var context = new TobyDBContext())
                {
                    if (!Guid.TryParse(paymentId, out id))
                    {
                        throw new Exception();
                    }

                    paymentModel = context.PaymentModels.Where(p => p.Id == id).Single();
                }

                return PartialView("EditedPayment", paymentModel);
            }
            catch
            {
                this.Response.StatusCode = 500;
                return PartialView("Error");
            }
        }
        public JsonResult RemovedStudent(string studentId)
        {
            Guid id;
            try
            {
                if (studentId == null || studentId == "" || !Guid.TryParse(studentId, out id))
                {
                    throw new Exception();
                }

                using (var context = new TobyDBContext())
                {
                    context.StudentModels.Delete(student => student.Id == id);
                }

                return Json(true);
            }
            catch
            {
                return Json(false);
            }
        }
        public ActionResult GetStudentsByClassId(int classId)
        {
            List<StudentModel> studentModels;
            try
            {
                using (var context = new TobyDBContext())
                {
                    studentModels = context.StudentModels.Where(s => s.TobyClassId == classId).ToList();
                }

                return PartialView("SelectedStudents", studentModels.Select(s => new StudentViewModel
                {
                    StudentId = s.Id.ToString(),
                    StudentName = String.Format("{0}({1})", s.Name, s.EnglishName)
                }).ToList());
            }
            catch
            {
                this.Response.StatusCode = 500;

                return PartialView("Error");
            }
        }
        public JsonResult GetTeacherList()
        {
            List<TeacherModel> teachers;
            try
            {
                using (var context = new TobyDBContext())
                {
                    teachers = context.TeacherModels.ToList();
                }

                return Json(teachers.Select(models => new
                {
                    id = models.Id,
                    name = String.Format("{0}({1})",
                        models.Name, models.EnglishName)
                }));
            }
            catch
            {
                this.Response.StatusCode = 500;

                return Json(null);
            }
        }
        public void DeletedPayment(string paymentId)
        {
            Guid id;
            try
            {
                using (var context = new TobyDBContext())
                {
                    if (!Guid.TryParse(paymentId, out id))
                    {
                        throw new Exception();
                    }

                    context.PaymentModels.Delete(p => p.Id == id);
                }
            }
            catch { }
        }
        public JsonResult GetWorkTypeList()
        {
            List<WorkTypeLookupTable> workTyepList;
            try
            {
                using (var context = new TobyDBContext())
                {
                    workTyepList = context.WorkTypeLookupTable.ToList();
                }

                return Json(workTyepList.Select(models => new
                {
                    type_id = models.Id,
                    type_name = models.TypeName
                }));
            }
            catch
            {
                this.Response.StatusCode = 500;

                return Json(null);
            }
        }
        public JsonResult SavedNewPayment(string dealineTime, string paymentAmount, string paymentName, List<string> studentIds)
        {
            Guid studentId;
            DateTime deadline;
            decimal payment;
            PaymentModel paymentModel = new PaymentModel();
            PaymentJson paymentJson;
            List<PaymentJson> paymentJsonList = new List<PaymentJson>();

            try
            {
                using (var context = new TobyDBContext())
                {
                    if (studentIds != null && studentIds.Count != 0)
                    {
                        studentIds.ForEach(id =>
                            {
                                paymentModel = new PaymentModel { PaymentName = paymentName };
                                paymentJson = new PaymentJson { payment_name = paymentName };

                                if (decimal.TryParse(paymentAmount, out payment) && DateTime.TryParse(dealineTime, out deadline)
                                    && Guid.TryParse(id, out studentId))
                                {
                                    paymentModel.Payment = payment;
                                    paymentModel.PaymentDeadLine = deadline;
                                    paymentModel.StudentId = studentId;

                                    var student = context.StudentModels.Where(s => s.Id == studentId).Single();
                                    paymentJson.deadline = deadline.ToString("MM/dd/yyyy");
                                    paymentJson.payment = paymentAmount;
                                    paymentJson.student_name = string.Format("{0}({1})", student.Name, student.EnglishName);
                                    paymentJson.class_id = student.TobyClassId.GetValueOrDefault().ToString();
                                }
                                else
                                {
                                    throw new Exception();
                                }

                                context.PaymentModels.Add(paymentModel);
                                context.SaveChanges();
                                paymentJson._id = paymentModel.Id.ToString();
                                paymentJsonList.Add(paymentJson);
                            });
                    }
                    else
                    {
                        throw new Exception();
                    }
                }

                return Json(paymentJsonList.ToArray());
            }
            catch
            {
                this.Response.StatusCode = 500;

                return Json(null);
            }
        }
        public void UpdateGradeItem(string examName, decimal scoreAmount, string examDate, Guid itemId)
        {
            DateTime date;
            try
            {
                if (!DateTime.TryParse(examDate, out date))
                {
                    throw new Exception();
                }

                using (var context = new TobyDBContext())
                {
                    context.GradeItemModels.Update(g => g.Id == itemId, item => new GradeItemModel
                    {
                        Grades = scoreAmount,
                        ExamName = examName,
                        ExamDate = date
                    });
                }
            }
            catch
            {
                this.Response.StatusCode = 500;
            }
        }