public AssociationTravelAgency SaveTravelAgency(AssociationTravelAgency agency)
        {
            if (!Roles.IsUserInRole(RoleName.StaffUser))
                throw new SecurityException();

            using (var db = new LomsContext())
            {
                db.Connection.Open();

                using (var transaction = db.Connection.BeginTransaction())
                {
                    db.AssociationTravelAgencies.ApplyChanges(agency);
                    db.SaveChanges();

                    var managerRole = (from r in db.AssociationUserTravelAgencyRoles
                                       where r.AgencyId == agency.Id && r.RoleId == (int)TravelAgencyRole.Manager
                                       select r).SingleOrDefault();

                    if (agency.ManagerId == 0)
                    {
                        if (managerRole != null)
                        {
                            //make current manager supervisor
                            managerRole.Role = TravelAgencyRole.Supervisor;
                            db.AssociationUserTravelAgencyRoles.ApplyChanges(managerRole);
                            db.SaveChanges();
                        }
                    }
                    else
                    {
                        bool createNewRole = false;
                        if (managerRole != null && managerRole.UserId != agency.ManagerId)
                        {
                            //make current manager supervisor
                            managerRole.Role = TravelAgencyRole.Supervisor;
                            db.AssociationUserTravelAgencyRoles.ApplyChanges(managerRole);

                            var userRole = db.AssociationUserTravelAgencyRoles.SingleOrDefault(r => r.UserId == agency.ManagerId);
                            if (userRole != null)
                            {
                                db.AssociationUserTravelAgencyRoles.DeleteObject(userRole);
                                db.SaveChanges();
                            }

                            createNewRole = true;
                        }
                        else if (managerRole == null)
                            createNewRole = true;

                        if (createNewRole)
                        {
                            managerRole = new AssociationUserTravelAgencyRole()
                            {
                                UserId = agency.ManagerId.Value,
                                AgencyId = agency.Id,
                                Role = TravelAgencyRole.Manager,
                                Status = TravelAgencyStatus.Accepted
                            };

                            db.AssociationUserTravelAgencyRoles.ApplyChanges(managerRole);
                            db.SaveChanges();

                            var emailProvider = db.AssociationEmails.FirstOrDefault(e => e.AssociationId == CurrentAssociationId);
                            if (emailProvider != null)
                            {
                                var association = db.Associations.FirstOrDefault(a => a.Id == CurrentAssociationId);
                                var user = db.AssociationUsers.SingleOrDefault(u => u.Id == managerRole.UserId);

                                var uri = HttpContext.Current.Request.Url;

                                string baseUrl = String.Format("{0}://{1}:{2}", uri.Scheme, uri.Host ?? "80", uri.Port);
                                string contactUsLink = Path.Combine(baseUrl + "/#Contact");

                                var emailTemplate = new EmailTemplate("ExistingTravelAgentIsAddedAsTravelManager");
                                emailTemplate["UserName"] = user.FullName.ToUpper();
                                emailTemplate["TravelAgencyName"] = agency.Name.ToUpper();
                                emailTemplate["AssociationName"] = association.Name.ToUpper();
                                emailTemplate["ContactUsLink"] = contactUsLink;

                                var avBody = AlternateView.CreateAlternateViewFromString(emailTemplate.Html, null, MediaTypeNames.Text.Html);
                                emailProvider.SendMail(user.Email, association.Name.ToUpper() + " Travel Agency Manager", emailTemplate.Txt, null, avBody, true);
                            }
                        }
                    }
                    transaction.Commit();
                }
            }

            using (var db = new LomsContext())
            {
                agency = db.AssociationTravelAgencies.IncludeAll("Country", "State", "State.Country", "Suburb", "Suburb.Country", "Suburb.State", "Suburb.State.Country", "Manager")
                          .SingleOrDefault(a => a.Id == agency.Id);
            }

            return agency;
        }
        public AssociationUser SaveAssociationUser(AssociationUser user)
        {
            try
            {
                string email = user.Email != null ? user.Email.ToLower().Trim() : null;

                using (var db = new LomsContext())
                {
                    db.Connection.Open();

                    using (var transaction = db.Connection.BeginTransaction())
                    {
                        if (!string.IsNullOrWhiteSpace(email))
                        {
                            //check id user with such email existed already
                            var existedUser = (from u in db.AssociationUsers
                                               where u.AssociationId == CurrentAssociationId && u.Email == email && (user.Id == 0 || u.Id != user.Id)
                                               select u).SingleOrDefault();

                            if (existedUser != null)
                            {
                                user.AddError("Email", "User with such email is already registered!");
                                return user;
                            }

                            user.Email = email;
                        }
                        else
                            user.Email = null;


                        user.AssociationId = CurrentAssociationId;
                        user.CreatedTime = user.LastUpdatedTime = DateTime.UtcNow;

                        db.AssociationUsers.ApplyChanges(user);
                        db.SaveChanges();

                        if (!string.IsNullOrWhiteSpace(user.Email))
                        {
                            AssociationUserActivation activation = new AssociationUserActivation();
                            activation.UserId = user.Id;
                            activation.Guid = Guid.NewGuid();
                            activation.ExpiryTime = DateTime.UtcNow.AddDays(7.0);  //expiry
                            db.AssociationUserActivations.ApplyChanges(activation);
                            db.SaveChanges();

                            var emailProvider = db.AssociationEmails.FirstOrDefault(e => e.AssociationId == CurrentAssociationId);
                            if (emailProvider != null)
                            {
                                var association = db.Associations.FirstOrDefault(a => a.Id == CurrentAssociationId);

                                var uri = HttpContext.Current.Request.Url;
                                string baseUrl = String.Format("{0}://{1}:{2}", uri.Scheme, uri.Host ?? "80", uri.Port);
                                string activtionLink = Path.Combine(baseUrl + string.Format("/#Activation/{0}", activation.Guid.ToString("D")));
                                string contactUsLink = Path.Combine(baseUrl + "/#Contact");
                                string termAndConditionsLink = Path.Combine(baseUrl + "/terms");

                                var emailTemplate = new EmailTemplate("StaffAdminAddsNewManagedProfileWithEmail");

                                emailTemplate["UserName"] = user.FullName.ToUpper();
                                emailTemplate["AssociationName"] = association.Name.ToUpper();

                                emailTemplate["ActivationLink"] = activtionLink;
                                emailTemplate["ContactUsLink"] = contactUsLink;
                                emailTemplate["TermAndConditionLink"] = termAndConditionsLink;

                                var avBody = AlternateView.CreateAlternateViewFromString(emailTemplate.Html, null, MediaTypeNames.Text.Html);
                                emailProvider.SendMail(user.Email, association.Name + " Account activation", emailTemplate.Txt, null, avBody, true);
                            }
                        }

                        transaction.Commit();
                    }
                }
                using (var db = new LomsContext())
                {
                    var entity = db.AssociationUsers.IncludeAll("Country").Single(u => u.Id == user.Id);
                    return entity;
                }
            }
            catch (Exception ex)
            {
                StringBuilder builder = new StringBuilder();
                builder.AppendLine(ex.Message);
                if (ex.InnerException != null)
                {
                    builder.AppendLine(ex.InnerException.Message);
                    if (ex.InnerException.InnerException != null)
                        builder.AppendLine(ex.InnerException.InnerException.Message);
                }
                user.AddError("Error", builder.ToString());
                return user;
            }

        }