public void AddRecruitedMember(Character newMember, Character recruiterMember)
        {
            IsActive.ThrowIfFalse(ErrorCodes.AccessDenied);
            IsAvailableFreeSlot.ThrowIfFalse(ErrorCodes.CorporationMaxMembersReached);

            var oldCorporation = newMember.GetCorporation();

            //this protects the alliance board member complication and default corp situation
            var role = GetRoleFromSql(newMember);

            role.ThrowIfNotEqual(CorporationRole.NotDefined, ErrorCodes.MemberHasRolesError);

            CorporationManager.IsJoinAllowed(newMember).ThrowIfFalse(ErrorCodes.CorporationChangeTooOften);

            AddMember(newMember, CorporationRole.NotDefined, oldCorporation);
            oldCorporation.RemoveMember(newMember);

            newMember.GetCorporationApplications().DeleteAll();

            _channelManager.LeaveChannel(oldCorporation.ChannelName, newMember);
            _channelManager.JoinChannel(ChannelName, newMember, GetMemberRole(newMember));

            Transaction.Current.OnCommited(() =>
            {
                CorporationManager.InformCorporationMemberTransferred(oldCorporation, this, newMember);

                newMember.GetPlayerRobotFromZone()?.UpdateCorporationOnZone(Eid);
                var info = new Dictionary <string, object>
                {
                    { k.@from, oldCorporation.Eid },
                    { k.to, Eid },
                    { k.characterID, newMember.Id },
                };

                ZoneManager.Value.Zones.ForEach(z => z.UpdateCorporation(CorporationCommand.TransferMember, info));

                CorporationData.RemoveFromCache(oldCorporation.Eid);
                CorporationData.RemoveFromCache(Eid);

                if (_characterProfiles is CachedReadOnlyRepository <int, CharacterProfile> c)
                {
                    c.Remove(newMember.Id);
                }
            });
        }