public JsonResult Create(Funcionario funcionario, String UserName, String Password, String email)
        {
            try
            {
                ModelState.Remove("UserId");
                if (ModelState.IsValid)
                {

                    // Tentativa de registrar o usuário
                    if (UserName != null)
                    {
                        /* Criamos a Roles para a função do usuario( caso ela já não exista) */

                        String strRole = Enum.GetValues(typeof(funcao)).GetValue(funcionario.funcao - 1).ToString();
                        if (!Roles.RoleExists(strRole))
                        {
                            Roles.CreateRole(strRole);
                        }

                        MembershipUser User = Membership.GetUser(UserName);
                        /* Se o usuario não existe, eu crio ele e vinculo a role. */
                        if (User == null)
                        {
                            MembershipCreateStatus createStatus;
                            MembershipUser membershipUserCreated = Membership.CreateUser(UserName, Password, email, null, null, true, null, out createStatus);

                            if (createStatus == MembershipCreateStatus.Success)
                            {
                                if (!Roles.IsUserInRole(UserName, strRole))
                                {
                                    Roles.AddUserToRole(UserName, strRole);
                                }
                                /*FormsAuthentication.SetAuthCookie(UserName, false );*/
                                funcionario.UserId = Guid.Parse(membershipUserCreated.ProviderUserKey.ToString());
                            }
                            else
                            {
                                return Json(new { Success = 0, ex = new Exception(AccountController.ErrorCodeToString(createStatus)).Message.ToString() });
                            }
                        }
                        else
                        {
                            MembershipUser currentUser = Membership.GetUser(UserName);

                            Array funcoes = Enum.GetValues(typeof(funcao));

                            for (int i = 0; i < funcoes.Length; i++)
                            {
                                if (Roles.IsUserInRole(UserName, funcoes.GetValue(i).ToString()))
                                {
                                    Roles.RemoveUserFromRole(UserName, funcoes.GetValue(i).ToString());
                                }
                            }

                            if (!Roles.IsUserInRole(UserName, strRole))
                            {
                                Roles.AddUserToRole(UserName, strRole);
                            }

                        }
                    }

                    using (var db = new ClinicaEntities())
                    {

                        // Se o código do Funcionario é maior que zero, entendemos que existe registro para tal.
                        // Então nós "atualizaremos" ele.
                        if (funcionario.FuncionarioId > 0)
                        {
                            #region Tratamento dos Telefones
                            var selFuncionarioTelefone = db.FuncionarioTelefone.Where(p => p.FuncionarioId == funcionario.FuncionarioId);

                            foreach (FuncionarioTelefone pt in selFuncionarioTelefone)
                            {
                                db.FuncionarioTelefone.Remove(pt);
                            }

                            foreach (FuncionarioTelefone pt in funcionario.FuncionarioTelefone)
                            {
                                db.FuncionarioTelefone.Add(pt);
                            }
                            #endregion

                            /* O funcionario somente possuirá funcionalidades quando for "Médico". */

                            var selFuncionarioEspecialidade = db.FuncionarioEspecialidade.Where(p => p.FuncionarioId == funcionario.FuncionarioId);

                            foreach (FuncionarioEspecialidade pt in selFuncionarioEspecialidade)
                            {
                                db.FuncionarioEspecialidade.Remove(pt);
                            }

                            if (funcionario.funcao == 3)
                            {
                                #region Tratamento das Especialidades
                                foreach (FuncionarioEspecialidade pt in funcionario.FuncionarioEspecialidade)
                                {

                                    db.FuncionarioEspecialidade.Add(pt);
                                }

                                #endregion
                            }
                            else
                            {
                                funcionario.FuncionarioEspecialidade = null;
                            }
                            db.Entry(funcionario).State = EntityState.Modified;

                        }
                        //Perform Save
                        else
                        {
                            db.Funcionario.Add(funcionario);
                        }

                        db.SaveChanges();

                    }

                    return Json(new { Success = 1, SalesID = funcionario.FuncionarioId, ex = "" });
                }
                else
                {
                    ValidateModel(funcionario);
                }
            }
            catch (Exception ex)
            {

                if (ex.InnerException != null)
                {
                    return Json(new { Success = 0, ex = ex.InnerException.ToString() });
                }
                else
                {
                    return Json(new { Success = 0, ex = ex.Message.ToString() });
                }
            }
            return Json(new { Success = 0, ex = new Exception("Unable to save").Message.ToString() });
        }
        public ActionResult Edit(int id, Funcionario funcionario)
        {
            ViewBag.Title = tituloCadastro;
            try
            {
                ClinicaEntities db = new ClinicaEntities();
                try
                {
                    db.Entry(funcionario).State = System.Data.EntityState.Modified;
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
                finally
                {
                    db.Dispose();
                }

            }
            catch (Exception e)
            {
                ViewBag.Error = e;
                return View("Error");
            }
        }
 private static void CarregarAssociacoes(ClinicaEntities db, Funcionario func)
 {
     db.Entry(func).Collection("FuncionarioTelefone").Load();
     db.Entry(func).Collection("FuncionarioEspecialidade").Load();
     db.Entry(func).Reference("aspnet_Users").Load();
     db.Entry(func.aspnet_Users).Reference("aspnet_Membership").Load();
 }
        public ActionResult Delete(int id, Funcionario funcionario)
        {
            ViewBag.Title = tituloCadastro;
            try
            {
                using (var db = new ClinicaEntities())
                {
                    Funcionario funcionarioDeleted = db.Funcionario.Find(id);
                    db.Funcionario.Remove(funcionarioDeleted);

                    db.SaveChanges();

                    if (funcionarioDeleted.UserId != null)
                    {
                        MembershipUser msuAux = Membership.GetUser(((object)funcionarioDeleted.UserId));
                        if (msuAux != null)
                        {
                            Membership.DeleteUser(msuAux.UserName);
                        }

                    }
                }
                return RedirectToAction("Index");
            }
            catch (Exception e)
            {
                ViewBag.Error = e;
                return View("Error");
            }
        }