public AssociationUserTravelAgencyRole SaveTravelAgencySupervisor(int managerId, AssociationUserTravelAgencyRole supervisorRole)
        {
            using (var db = new LomsContext())
            {

                AssociationEmail emailProvider;

                if (supervisorRole.UserId == 0)
                {
                    var user = (from u in db.AssociationUsers
                                where u.AssociationId == CurrentAssociationId && u.Email == supervisorRole.UserEmail
                                select u)
                                .SingleOrDefault();

                    if (user == null || !user.HasOnlineAccess)
                    {
                        supervisorRole.Errors.AddError("UserEmail", "User is not registered!");
                        return supervisorRole;
                    }
                    else if (!user.IsTravelAgency)
                    {
                        supervisorRole.Errors.AddError("UserEmail", "User is not a travel agent!");
                        return supervisorRole;
                    }
                    else
                    {
                        var currenntRole = (from r in db.AssociationUserTravelAgencyRoles
                                            where r.UserId == user.Id
                                            select r).SingleOrDefault();

                        if (currenntRole != null)
                        {
                            if (currenntRole.AgencyId != supervisorRole.AgencyId)
                            {
                                supervisorRole.Errors.AddError("UserEmail", "User is a travel agent in another travel agency!");
                                return supervisorRole;
                            }
                            else if (currenntRole.AgencyId == supervisorRole.AgencyId &&
                                    (currenntRole.Role == TravelAgencyRole.Manager || currenntRole.Role == TravelAgencyRole.SupervisorAsManager || currenntRole.Role == TravelAgencyRole.Supervisor))
                            {
                                supervisorRole.Errors.AddError("UserEmail", "User is a existing travel team supervisor!");
                                return supervisorRole;
                            }
                            else
                            {
                                //upgrade
                                currenntRole.Role = supervisorRole.Role;
                                db.AssociationUserTravelAgencyRoles.ApplyChanges(supervisorRole);
                                db.SaveChanges();

                                //send upgrade email
                                emailProvider = (from e in db.AssociationEmails
                                                 where e.AssociationId == CurrentAssociationId
                                                 select e)
                                                    .FirstOrDefault();

                                if (emailProvider != null)
                                {
                                    var association = (from a in db.Associations
                                                       where a.Id == CurrentAssociationId
                                                       select a)
                                                     .SingleOrDefault();

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

                                    var txtContent = MailTemplateHelper.GetTravelAgentIsUpgradedToTravelSupervisorTxtContent(association.Name.ToUpper(), user.FullName.ToUpper(), contactUsLink, "TRAVEL AGENCY");
                                    var htmlContent = MailTemplateHelper.GetTravelAgentIsUpgradedToTravelSupervisorHtmlContent(association.Name.ToUpper(), user.FullName.ToUpper(), contactUsLink, "TRAVEL AGENCY");
                                    var avBody = AlternateView.CreateAlternateViewFromString(htmlContent, null, MediaTypeNames.Text.Html);

                                    emailProvider.SendMail(user.Email, association.Name.ToUpper() + " Supervisor Upgrade", txtContent, null, avBody, true);
                                }

                                return currenntRole;
                            }
                        }
                    }

                    supervisorRole.UserId = user.Id;
                    supervisorRole.Status = TravelAgencyStatus.Pending;
                    db.AssociationUserTravelAgencyRoles.ApplyChanges(supervisorRole);

                    //start activation process
                    var activation = new AssociationUserTravelAgencyRoleActivation();
                    activation.UserId = user.Id;
                    activation.AgencyId = supervisorRole.AgencyId;
                    activation.Guid = Guid.NewGuid();
                    activation.ExpiryTime = DateTime.UtcNow.AddDays(7.0);
                    db.AssociationUserTravelAgencyRoleActivations.ApplyChanges(activation);
                    db.SaveChanges();

                    //send activation email
                    emailProvider = (from e in db.AssociationEmails
                                     where e.AssociationId == CurrentAssociationId
                                     select e)
                                        .FirstOrDefault();

                    if (emailProvider != null)
                    {
                        var association = (from a in db.Associations
                                           where a.Id == CurrentAssociationId
                                           select a)
                                         .SingleOrDefault();

                        var manager = (from u in db.AssociationUsers
                                       where u.Id == managerId
                                       select u)
                                        .SingleOrDefault();


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

                        var txtContent = MailTemplateHelper.GetTravelAgentIsAddedAsTravelSupervisorTxtContent(association.Name.ToUpper(), user.FullName.ToUpper(), activtionLink, contactUsLink, "TRAVEL AGENCY", "Group", manager.FullName, manager.Email, termAndConditionsLink);
                        var htmlContent = MailTemplateHelper.GetTravelAgentIsAddedAsTravelSupervisorHtmlContent(association.Name.ToUpper(), user.FullName.ToUpper(), activtionLink, contactUsLink, "TRAVEL AGENCY", "Group", manager.FullName, manager.Email, termAndConditionsLink);
                        var avBody = AlternateView.CreateAlternateViewFromString(htmlContent, null, MediaTypeNames.Text.Html);

                        emailProvider.SendMail(user.Email, association.Name.ToUpper() + " Supervisor Add", txtContent, null, avBody, true);
                    }


                    supervisorRole.UserFirstName = user.FirstName;
                    supervisorRole.UserLastName = user.LastName;
                    return supervisorRole;
                }
                else
                {
                    //only role can be changed
                    db.AssociationUserTravelAgencyRoles.ApplyChanges(supervisorRole);
                    db.SaveChanges();
                    return supervisorRole;
                }
            }
        }
     public bool Equals(AssociationUserTravelAgencyRoleActivation other)
     {
         if (ReferenceEquals(null, other)) return false;
         if (ReferenceEquals(this, other)) return true;
 		if (other.UserId == 0 && UserId == 0)
 			return false;
 		else
 			return other.UserId == UserId;
     }