public ActionResult PermissionSlipApproval(GuardianApproval guardianApproval)
        {
            GuardianApproval existingGuardianApproval = null;

            try
            {
                if (ModelState.IsValid)
                {
                    AspNetUser user = db.AspNetUsers.Find(guardianApproval.GuardianUserID);

                    if (!User.IsInRole("Teacher") && (User.IsInRole("Guardian") && guardianApproval.GuardianEmail != user.Email))
                    {
                        throw new Exception("Unable to verify guardian for approval");
                    }
                    existingGuardianApproval = db.GuardianApprovals.Where(a => a.PermissionSlipID == guardianApproval.PermissionSlipID && a.StudentID == guardianApproval.StudentID).FirstOrDefault();
                    if (existingGuardianApproval == null)
                    {
                        guardianApproval.CreatedDateTime = DateTime.Now;
                        guardianApproval.Signature       = Convert.FromBase64String(guardianApproval.SignatureData.Split(',')[1]);
                        db.GuardianApprovals.Add(guardianApproval);
                    }
                    else
                    {
                        db.Entry(existingGuardianApproval).State = EntityState.Detached;
                        guardianApproval.Signature       = Convert.FromBase64String(guardianApproval.SignatureData.Split(',')[1]);
                        db.Entry(guardianApproval).State = EntityState.Modified;
                    }
                    db.SaveChanges();

                    return(RedirectToAction("Index", "Home"));
                }
            }
            catch (Exception ex) { ModelState.AddModelError("", ex.Message); }

            if (guardianApproval.ExistingSignatureData != null)
            {
                guardianApproval.ExistingSignature = Convert.FromBase64String(guardianApproval.ExistingSignatureData.Split(',')[1]);
            }
            return(View(guardianApproval));
        }
        public ActionResult PermissionSlipStatus(int PermissionSlipID)
        {
            //TODO

            /*
             * Validate Teacher or School Admin
             * Return a view that shows a list of all students for that permission slip, their approval status
             * Include buttons to:
             *		Send emails to guardians of students with "No Approval" status to give approval
             *		Send specific email to student guardians to give approval
             *		Send Emails to guardians of all students as a reminder of the event
             */

            PermissionSlipStatus               permissionSlipStatus          = new PermissionSlipStatus();
            PermissionSlip                     permissionSlip                = null;
            GuardianApproval                   guardianApproval              = null;
            StudentPermissionSlipStatus        studentPermissionSlip         = null;
            List <StudentPermissionSlipStatus> studentPermissionSlipStatuses = new List <StudentPermissionSlipStatus>();
            string UserID = "";

            try
            {
                if (User.IsInRole("Guardian"))
                {
                    throw new Exception("Unable to provide permission slip status");
                }
                UserID         = User.Identity.GetUserId();
                permissionSlip = db.PermissionSlips.Find(PermissionSlipID);
                if ((permissionSlip.ClassRoom.TeacherUserID != UserID) && User.IsInRole("Teacher"))
                {
                    throw new Exception("Unable to provide permission slip status");
                }
                if (permissionSlip != null)
                {
                    List <Student> students = permissionSlip.ClassRoom.Students.ToList();
                    foreach (Student s in students)
                    {
                        studentPermissionSlip = new StudentPermissionSlipStatus()
                        {
                            StudentID       = s.ID,
                            StudentFullName = s.FullName,
                            Guardians       = s.Guardians.ToList()
                        };

                        guardianApproval = db.GuardianApprovals.Where(g => g.StudentID == s.ID && g.PermissionSlipID == permissionSlip.ID).FirstOrDefault();
                        if (guardianApproval != null)
                        {
                            studentPermissionSlip.Approval = guardianApproval.Approved;
                        }
                        studentPermissionSlipStatuses.Add(studentPermissionSlip);
                    }
                }

                permissionSlipStatus.permissionSlip            = permissionSlip;
                permissionSlipStatus.studentPermissionStatuses = studentPermissionSlipStatuses;
            }
            catch (Exception ex)
            {
                //TODO : Do something with Exception Action
                ModelState.AddModelError("", "Exception occurred processing request for permission slip status:: " + ex.ToString());
                return(RedirectToAction("Index", "Home"));
            }

            return(View(permissionSlipStatus));
        }
        public ActionResult PermissionSlipApproval(int PermissionSlipID, int StudentID)
        {
            PermissionSlip   permissionSlip   = null;
            Student          student          = null;
            AspNetUser       Guardian         = null;
            GuardianApproval guardianApproval = null;
            string           UserID           = "";
            bool             AllowEdit        = true;

            try
            {
                if (!User.IsInRole("Guardian") && !User.IsInRole("Teacher"))
                {
                    throw new Exception("Unable to provide approval for permission slip");
                }
                UserID         = User.Identity.GetUserId();
                permissionSlip = db.PermissionSlips.Find(PermissionSlipID);
                AllowEdit      = permissionSlip.StartDateTime >= DateTime.Now.Date;
                student        = db.Students.Find(StudentID);
                if (User.IsInRole("Guardian"))
                {
                    Guardian = db.AspNetUsers.Where(u => u.Id == UserID).FirstOrDefault();
                    if ((permissionSlip != null) && (student != null) && (Guardian != null))
                    {
                        //Check to make sure Guardian is one of the Student's Guardians
                        if (student.Guardians.Where(g => g.Id == Guardian.Id).FirstOrDefault() == null)
                        {
                            throw new Exception("Unauthorized User");
                        }

                        guardianApproval = db.GuardianApprovals.Where(a => a.PermissionSlipID == PermissionSlipID && a.StudentID == StudentID).FirstOrDefault();
                        if (guardianApproval == null)
                        {
                            guardianApproval = new GuardianApproval()
                            {
                                Name             = permissionSlip.Name,
                                Location         = permissionSlip.Location,
                                StartDateTime    = permissionSlip.StartDateTime,
                                EndDateTime      = permissionSlip.EndDateTime,
                                Cost             = permissionSlip.Cost,
                                RequireChaperone = permissionSlip.RequireChaperone,
                                RequireChaperoneBackgroundCheck = permissionSlip.RequireChaperoneBackgroundCheck,

                                GuardianUserID   = AllowEdit ? UserID : "",
                                GuardianName     = AllowEdit ? Guardian.FullName : "",
                                StudentID        = StudentID,
                                StudentFullName  = student.FullName,
                                PermissionSlipID = PermissionSlipID,
                                PermissionSlip   = permissionSlip,
                                Approved         = false,
                                CanChaperone     = false,
                                DaytimePhone     = Guardian.PhoneNumberConfirmed ? Guardian.PhoneNumber : "",
                                EmergencyPhone   = "",
                                GuardianEmail    = "",
                                SpecialHealthDietaryAccessConsiderations = ""
                            };
                        }
                        else
                        {
                            guardianApproval.StudentFullName  = student.FullName;
                            guardianApproval.Name             = permissionSlip.Name;
                            guardianApproval.Location         = permissionSlip.Location;
                            guardianApproval.StartDateTime    = permissionSlip.StartDateTime;
                            guardianApproval.EndDateTime      = permissionSlip.EndDateTime;
                            guardianApproval.Cost             = permissionSlip.Cost;
                            guardianApproval.RequireChaperone = permissionSlip.RequireChaperone;
                            guardianApproval.RequireChaperoneBackgroundCheck = permissionSlip.RequireChaperoneBackgroundCheck;
                            guardianApproval.ExistingSignature = guardianApproval.Signature;
                            guardianApproval.Signature         = null;
                        }
                    }
                }
                else                 //Teacher
                {
                    AspNetUser Teacher = db.AspNetUsers.Find(UserID);
                    guardianApproval = db.GuardianApprovals.Where(a => a.PermissionSlipID == PermissionSlipID && a.StudentID == StudentID).FirstOrDefault();
                    if (guardianApproval == null)
                    {
                        guardianApproval = new GuardianApproval()
                        {
                            Name             = permissionSlip.Name,
                            Location         = permissionSlip.Location,
                            StartDateTime    = permissionSlip.StartDateTime,
                            EndDateTime      = permissionSlip.EndDateTime,
                            Cost             = permissionSlip.Cost,
                            RequireChaperone = permissionSlip.RequireChaperone,
                            RequireChaperoneBackgroundCheck = permissionSlip.RequireChaperoneBackgroundCheck,
                            GuardianUserID   = AllowEdit ? UserID : "",
                            GuardianName     = AllowEdit ? "Verbal Approval - " + Teacher.FullName : "",
                            StudentID        = StudentID,
                            StudentFullName  = student.FullName,
                            PermissionSlipID = PermissionSlipID,
                            PermissionSlip   = permissionSlip,
                            Approved         = false,
                            CanChaperone     = false,
                            DaytimePhone     = "",
                            EmergencyPhone   = "",
                            GuardianEmail    = "",
                            SpecialHealthDietaryAccessConsiderations = ""
                        };
                    }
                    else
                    {
                        guardianApproval.StudentFullName  = student.FullName;
                        guardianApproval.Name             = permissionSlip.Name;
                        guardianApproval.Location         = permissionSlip.Location;
                        guardianApproval.StartDateTime    = permissionSlip.StartDateTime;
                        guardianApproval.EndDateTime      = permissionSlip.EndDateTime;
                        guardianApproval.Cost             = permissionSlip.Cost;
                        guardianApproval.RequireChaperone = permissionSlip.RequireChaperone;
                        guardianApproval.RequireChaperoneBackgroundCheck = permissionSlip.RequireChaperoneBackgroundCheck;
                        guardianApproval.ExistingSignature = guardianApproval.Signature;
                        guardianApproval.Signature         = null;
                    }
                }
            }
            catch (Exception ex)
            {
                //TODO : Do something with Exception Action
                ModelState.AddModelError("", "Exception occurred processing approval request :: " + ex.ToString());
                return(RedirectToAction("Index", "Home"));
            }

            return(View(guardianApproval));
        }