public async Task ResentInviatationAsync(string organisationId, string userId, string email, string webUrl)
        {
            using var context = Context();
            if (!context.OrganisationUserMenuFeature.Any(u => u.OrganisationId == organisationId && u.UserId == userId && u.MenuFeatureId == (int)MenuFeatureEnum.ManageOrganisactionSetting))
            {
                throw new Exception("You don't have permission to invite user");
            }
            var inviteUser = context.OrganisationInvitingUser.FirstOrDefault(u => u.OrganisationId == organisationId && u.Email == email.ToLower());

            if (inviteUser == null)
            {
                throw new Exception("Invite user does't exist");
            }
            inviteUser.ExpireToken = CurrentCambodiaTime.AddDays(2);
            inviteUser.Token       = Guid.NewGuid().ToString();
            context.SaveChanges();
            webUrl += "/Identity/Account/Invite?token=" + inviteUser.Token;
            await emailService.SendEmailAsync(inviteUser.Email, "Invitation to Invoice Account", $"You've been invited to join: {inviteUser.Organisation.DisplayName} <a href='{webUrl}'>clicking here</a>.", true);
        }
        public async Task InviteUserAsync(OrganisationUser organisationUser, string organisationId, string userId, string webUrl)
        {
            using var context = Context();
            if (string.IsNullOrEmpty(organisationUser.User.Email))
            {
                throw new Exception("Email is require");
            }
            if (string.IsNullOrEmpty(organisationUser.User.FirstName))
            {
                throw new Exception("First name is require");
            }
            if (string.IsNullOrEmpty(organisationUser.User.LastName))
            {
                throw new Exception("Last name is require");
            }
            if (string.IsNullOrEmpty(organisationUser.User.Name))
            {
                throw new Exception("Display name is require");
            }
            if (!context.OrganisationUserMenuFeature.Any(u => u.OrganisationId == organisationId && u.UserId == userId && u.MenuFeatureId == (int)MenuFeatureEnum.ManageOrganisactionSetting))
            {
                throw new Exception("You don't have permission to invite user");
            }
            if (context.OrganisationUser.Any(u => u.OrganisationId == organisationId && u.User.Email.ToLower() == organisationUser.User.Email.ToLower()))
            {
                throw new Exception("User already invited");
            }
            if (context.OrganisationInvitingUser.Any(u => u.OrganisationId == organisationId && u.Email == organisationUser.User.Email.ToLower()))
            {
                throw new Exception("User already invited");
            }
            var newInviteUser = new Dal.Models.OrganisationInvitingUser {
                DisplayName    = organisationUser.User.Name,
                Email          = organisationUser.User.Email.ToLower(),
                FirstName      = organisationUser.User.FirstName,
                LastName       = organisationUser.User.LastName,
                OrganisationId = organisationId,
                RoleName       = organisationUser.RoleName,
                ExpireToken    = CurrentCambodiaTime.AddDays(2),
                Token          = Guid.NewGuid().ToString(),
            };

            if (!organisationUser.IsAdministrator)
            {
                foreach (var m in organisationUser.MenuFeatures)
                {
                    if (m.IsCheck)
                    {
                        context.OrganisationInvitingUserMenuFeature.Add(new Dal.Models.OrganisationInvitingUserMenuFeature
                        {
                            Email          = organisationUser.User.Email.ToLower(),
                            MenuFeatureId  = m.Id,
                            OrganisationId = organisationId
                        });
                    }
                }
            }
            else
            {
                foreach (var m in organisationUser.MenuFeatures)
                {
                    context.OrganisationInvitingUserMenuFeature.Add(new Dal.Models.OrganisationInvitingUserMenuFeature
                    {
                        Email          = organisationUser.User.Email.ToLower(),
                        MenuFeatureId  = m.Id,
                        OrganisationId = organisationId
                    });
                }
            }
            var organisation = context.Organisation.FirstOrDefault(u => u.Id == organisationId);

            context.OrganisationInvitingUser.Add(newInviteUser);
            context.SaveChanges();
            webUrl += "/Identity/Account/Invite?token=" + newInviteUser.Token;
            await emailService.SendEmailAsync(organisationUser.User.Email, "Invitation to Invoice Account", $"You've been invited to join: {organisation.DisplayName} <a href='{webUrl}'>clicking here</a>.", true);
        }