报表
This commit is contained in:
parent
6f7dd4d0d6
commit
ebc686d80d
@ -782,12 +782,12 @@ async def man_info_form(
|
|||||||
"phone": "电话",
|
"phone": "电话",
|
||||||
"work_for": "上家公司"
|
"work_for": "上家公司"
|
||||||
}
|
}
|
||||||
res_data = {
|
res_true_data = {
|
||||||
'data': res_data,
|
'data': res_data,
|
||||||
'level_list': level_list
|
'level_list': level_list
|
||||||
}
|
}
|
||||||
res_msg = {
|
res_msg = {
|
||||||
'data': res_data,
|
'data': res_true_data,
|
||||||
'table_data': table_data
|
'table_data': table_data
|
||||||
}
|
}
|
||||||
return schemas.Msg(code=200, msg='ok', data=res_msg)
|
return schemas.Msg(code=200, msg='ok', data=res_msg)
|
||||||
@ -814,13 +814,14 @@ async def every_stage_form(
|
|||||||
job_id_to_name[job_id] = job_name
|
job_id_to_name[job_id] = job_name
|
||||||
res_job_data = deepcopy({k: v for k, v in job_data.items() if k != 'job_id'})
|
res_job_data = deepcopy({k: v for k, v in job_data.items() if k != 'job_id'})
|
||||||
res_job_data.update({
|
res_job_data.update({
|
||||||
'初筛': 0,
|
'start_num': 0,
|
||||||
'复筛': 0,
|
'screen_num': 0,
|
||||||
'面试': 0,
|
'exam_num': 0,
|
||||||
'offer': 0,
|
'offer_num': 0,
|
||||||
'待入职': 0,
|
'wait_work_num': 0,
|
||||||
'已入职': job_data['now_job_num'],
|
'work_in_num': job_data['now_job_num'],
|
||||||
})
|
})
|
||||||
|
res_job_data['principal'] = res_job_data['principal'][0]['name']
|
||||||
res_msg[job_name] = res_job_data
|
res_msg[job_name] = res_job_data
|
||||||
|
|
||||||
await interview.init()
|
await interview.init()
|
||||||
@ -844,21 +845,42 @@ async def every_stage_form(
|
|||||||
ck_job_name = job_id_to_name[ck_data['job_id']]
|
ck_job_name = job_id_to_name[ck_data['job_id']]
|
||||||
stage = ck_data['interview_stage']
|
stage = ck_data['interview_stage']
|
||||||
if stage == 1:
|
if stage == 1:
|
||||||
res_msg[ck_job_name]['初筛'] += 1
|
res_msg[ck_job_name]['start_num'] += 1
|
||||||
elif stage == 2:
|
elif stage == 2:
|
||||||
res_msg[ck_job_name]['复筛'] += 1
|
res_msg[ck_job_name]['screen_num'] += 1
|
||||||
elif stage == 3:
|
elif stage == 3:
|
||||||
res_msg[ck_job_name]['面试'] += 1
|
res_msg[ck_job_name]['exam_num'] += 1
|
||||||
elif stage == 4:
|
elif stage == 4:
|
||||||
res_msg[ck_job_name]['offer'] += 1
|
res_msg[ck_job_name]['offer_num'] += 1
|
||||||
elif stage == 5:
|
elif stage == 5:
|
||||||
res_msg[ck_job_name]['待入职'] += 1
|
res_msg[ck_job_name]['wait_work_num'] += 1
|
||||||
|
|
||||||
res_data = {
|
res_data = []
|
||||||
'data': res_msg,
|
for k, v in res_msg.items():
|
||||||
|
res_value = deepcopy(v)
|
||||||
|
res_data.append(res_value)
|
||||||
|
level_list = {
|
||||||
|
"job_name": "职位",
|
||||||
|
"job_sector": "部门",
|
||||||
|
"principal": "负责人",
|
||||||
|
"start_time": "招聘开始时间",
|
||||||
|
"job_num": "招聘人数",
|
||||||
|
"start_num": "初筛",
|
||||||
|
"screen_num": "复筛",
|
||||||
|
"exam_num": "面试",
|
||||||
|
"offer_num": "offer",
|
||||||
|
"wait_work_num": "待入职",
|
||||||
|
"work_in_num": "已入职"
|
||||||
|
}
|
||||||
|
res_true_data = {
|
||||||
|
'data': res_data,
|
||||||
|
'level_list': level_list
|
||||||
|
}
|
||||||
|
res_back_data = {
|
||||||
|
'data': res_true_data,
|
||||||
'table_data': table_data
|
'table_data': table_data
|
||||||
}
|
}
|
||||||
return schemas.Msg(code=200, msg='ok', data=res_data)
|
return schemas.Msg(code=200, msg='ok', data=res_back_data)
|
||||||
|
|
||||||
|
|
||||||
# hr工作量报表
|
# hr工作量报表
|
||||||
@ -1021,13 +1043,14 @@ async def stage_success_form(
|
|||||||
job_id_to_name[job_id] = job_name
|
job_id_to_name[job_id] = job_name
|
||||||
res_job_data = deepcopy({k: v for k, v in job_data.items() if k not in ['job_id', 'now_job_num']})
|
res_job_data = deepcopy({k: v for k, v in job_data.items() if k not in ['job_id', 'now_job_num']})
|
||||||
res_job_data.update({
|
res_job_data.update({
|
||||||
'初筛': 0,
|
'start_num': 0,
|
||||||
'复筛': 0,
|
'screen_num': 0,
|
||||||
'面试': 0,
|
'exam_num': 0,
|
||||||
'offer': 0,
|
'offer_num': 0,
|
||||||
'待入职': 0,
|
'wait_work_num': 0,
|
||||||
'已入职': 0
|
'work_in_num': 0
|
||||||
})
|
})
|
||||||
|
res_job_data['principal'] = res_job_data['principal'][0]['name']
|
||||||
res_msg[job_name] = res_job_data
|
res_msg[job_name] = res_job_data
|
||||||
|
|
||||||
await interview.init()
|
await interview.init()
|
||||||
@ -1051,25 +1074,25 @@ async def stage_success_form(
|
|||||||
ck_job_name = job_id_to_name[ck_data['job_id']]
|
ck_job_name = job_id_to_name[ck_data['job_id']]
|
||||||
stage = ck_data['interview_stage']
|
stage = ck_data['interview_stage']
|
||||||
if stage >= 1:
|
if stage >= 1:
|
||||||
res_msg[ck_job_name]['初筛'] += 1
|
res_msg[ck_job_name]['start_num'] += 1
|
||||||
if stage >= 2:
|
if stage >= 2:
|
||||||
res_msg[ck_job_name]['复筛'] += 1
|
res_msg[ck_job_name]['screen_num'] += 1
|
||||||
if stage >= 3:
|
if stage >= 3:
|
||||||
res_msg[ck_job_name]['面试'] += 1
|
res_msg[ck_job_name]['exam_num'] += 1
|
||||||
if stage >= 4:
|
if stage >= 4:
|
||||||
res_msg[ck_job_name]['offer'] += 1
|
res_msg[ck_job_name]['offer_num'] += 1
|
||||||
if stage >= 5:
|
if stage >= 5:
|
||||||
res_msg[ck_job_name]['待入职'] += 1
|
res_msg[ck_job_name]['wait_work_num'] += 1
|
||||||
if stage >= 7:
|
if stage >= 7:
|
||||||
res_msg[ck_job_name]['已入职'] += 1
|
res_msg[ck_job_name]['work_in_num'] += 1
|
||||||
|
|
||||||
for res_name, res_data in res_msg.items():
|
for res_name, res_data in res_msg.items():
|
||||||
chk_num1 = res_data['初筛']
|
chk_num1 = res_data['start_num']
|
||||||
chk_num2 = res_data['复筛']
|
chk_num2 = res_data['screen_num']
|
||||||
chk_num3 = res_data['面试']
|
chk_num3 = res_data['exam_num']
|
||||||
chk_num4 = res_data['offer']
|
chk_num4 = res_data['offer_num']
|
||||||
chk_num5 = res_data['待入职']
|
chk_num5 = res_data['wait_work_num']
|
||||||
chk_num7 = res_data['已入职']
|
chk_num7 = res_data['work_in_num']
|
||||||
if chk_num1 and chk_num2:
|
if chk_num1 and chk_num2:
|
||||||
chance_1 = round(chk_num2 / chk_num1, 2)
|
chance_1 = round(chk_num2 / chk_num1, 2)
|
||||||
else:
|
else:
|
||||||
@ -1091,17 +1114,43 @@ async def stage_success_form(
|
|||||||
else:
|
else:
|
||||||
chance_5 = 0
|
chance_5 = 0
|
||||||
res_msg[res_name].update({
|
res_msg[res_name].update({
|
||||||
'初筛通过率': chance_1,
|
'chance_1': chance_1,
|
||||||
'复筛通过率': chance_2,
|
'chance_2': chance_2,
|
||||||
'面试通过率': chance_3,
|
'chance_3': chance_3,
|
||||||
'offer通过率': chance_4,
|
'chance_4': chance_4,
|
||||||
'待入职通过率': chance_5
|
'chance_5': chance_5
|
||||||
})
|
})
|
||||||
res_data = {
|
res_data1 = []
|
||||||
'data': res_msg,
|
for k, v in res_msg.items():
|
||||||
'table_data': table_data,
|
res_value = deepcopy(v)
|
||||||
|
res_data1.append(res_value)
|
||||||
|
level_list = {
|
||||||
|
"job_name": "职位",
|
||||||
|
"job_sector": "部门",
|
||||||
|
"principal": "负责人",
|
||||||
|
"start_time": "招聘开始时间",
|
||||||
|
"job_num": "招聘人数",
|
||||||
|
"start_num": "初筛",
|
||||||
|
"screen_num": "复筛",
|
||||||
|
"exam_num": "面试",
|
||||||
|
"offer_num": "offer",
|
||||||
|
"wait_work_num": "待入职",
|
||||||
|
"work_in_num": "已入职",
|
||||||
|
"chance_1": "初筛通过率",
|
||||||
|
"chance_2": "复筛通过率",
|
||||||
|
"chance_3": "面试通过率",
|
||||||
|
"chance_4": "offer通过率",
|
||||||
|
"chance_5": "待入职通过率"
|
||||||
}
|
}
|
||||||
return schemas.Msg(code=200, msg='ok', data=res_data)
|
res_true_data = {
|
||||||
|
'data': res_data1,
|
||||||
|
'level_list': level_list
|
||||||
|
}
|
||||||
|
res_back_data = {
|
||||||
|
'data': res_true_data,
|
||||||
|
'table_data': table_data
|
||||||
|
}
|
||||||
|
return schemas.Msg(code=200, msg='ok', data=res_back_data)
|
||||||
|
|
||||||
|
|
||||||
# 招聘漏斗报表
|
# 招聘漏斗报表
|
||||||
@ -1237,11 +1286,28 @@ async def owner_form(
|
|||||||
res_msg[key]['work_num'] = work_num
|
res_msg[key]['work_num'] = work_num
|
||||||
res_msg[key]['offer_chance'] = offer_chance
|
res_msg[key]['offer_chance'] = offer_chance
|
||||||
res_msg[key]['work_chance'] = work_chance
|
res_msg[key]['work_chance'] = work_chance
|
||||||
res_data = {
|
res_data = []
|
||||||
'data': res_msg,
|
for k, v in res_msg.items():
|
||||||
|
v.update({'owner_name': k})
|
||||||
|
res_value = deepcopy(v)
|
||||||
|
res_data.append(res_value)
|
||||||
|
level_list = {
|
||||||
|
"owner_name": "渠道",
|
||||||
|
"count": "总数",
|
||||||
|
"offer_num": "面试通过",
|
||||||
|
"work_num": "入职人数",
|
||||||
|
"offer_chance": "面试通过率",
|
||||||
|
"work_chance": "入职率",
|
||||||
|
}
|
||||||
|
res_true_data = {
|
||||||
|
'data': res_data,
|
||||||
|
'level_list': level_list
|
||||||
|
}
|
||||||
|
res_back_data = {
|
||||||
|
'data': res_true_data,
|
||||||
'table_data': table_data
|
'table_data': table_data
|
||||||
}
|
}
|
||||||
return schemas.Msg(code=200, msg='ok', data=res_data)
|
return schemas.Msg(code=200, msg='ok', data=res_back_data)
|
||||||
|
|
||||||
|
|
||||||
# 渠道效果报表
|
# 渠道效果报表
|
||||||
@ -1306,27 +1372,50 @@ async def owner_effect(
|
|||||||
|
|
||||||
for key, data_list in chk_data.items():
|
for key, data_list in chk_data.items():
|
||||||
count_num = len(data_list)
|
count_num = len(data_list)
|
||||||
star_num = len([1 for i in data_list if i['interview_stage'] >= 1]) # 初筛
|
start_num = len([1 for i in data_list if i['interview_stage'] >= 1]) # 初筛
|
||||||
screen_num = len([1 for i in data_list if i['interview_stage'] >= 2]) # 复筛
|
screen_num = len([1 for i in data_list if i['interview_stage'] >= 2]) # 复筛
|
||||||
exam_num = len([1 for i in data_list if i['interview_stage'] >= 3]) # 面试
|
exam_num = len([1 for i in data_list if i['interview_stage'] >= 3]) # 面试
|
||||||
offer_num = len([1 for i in data_list if i['interview_stage'] >= 4]) # offer
|
offer_num = len([1 for i in data_list if i['interview_stage'] >= 4]) # offer
|
||||||
work_num = len([1 for i in data_list if i['interview_stage'] >= 7]) # 入职
|
work_num = len([1 for i in data_list if i['interview_stage'] >= 7]) # 入职
|
||||||
res_msg[key]['count'] = count_num
|
res_msg[key]['count'] = count_num
|
||||||
res_msg[key]['star_num'] = star_num
|
res_msg[key]['start_num'] = start_num
|
||||||
res_msg[key]['screen_num'] = screen_num
|
res_msg[key]['screen_num'] = screen_num
|
||||||
res_msg[key]['exam_num'] = exam_num
|
res_msg[key]['exam_num'] = exam_num
|
||||||
res_msg[key]['offer_num'] = offer_num
|
res_msg[key]['offer_num'] = offer_num
|
||||||
res_msg[key]['work_num'] = work_num
|
res_msg[key]['work_num'] = work_num
|
||||||
res_msg[key]['year_money'] = 0
|
res_msg[key]['year_money'] = 0
|
||||||
|
res_msg[key]['one_money'] = 0
|
||||||
year = interview.where.get('start_time', '2022').split('-')[0]
|
year = interview.where.get('start_time', '2022').split('-')[0]
|
||||||
owner_info = await crud.owner_info.find_owner_some(db, where={'year': year},
|
owner_info = await crud.owner_info.find_owner_some(db, where={'year': year},
|
||||||
findlist=['owner_name', 'year_money'])
|
findlist=['owner_name', 'year_money'])
|
||||||
for i in owner_info:
|
for i in owner_info:
|
||||||
if i['owner_name'] in res_msg:
|
if i['owner_name'] in res_msg:
|
||||||
res_msg[i['owner_name']]['year_money'] = i['year_money']
|
res_msg[i['owner_name']]['year_money'] = i['year_money']
|
||||||
|
if res_msg[i['owner_name']]['count'] != 0:
|
||||||
|
res_msg[i['owner_name']]['one_money'] = res_msg[i['owner_name']]['year_money'] / res_msg[i['count']][
|
||||||
|
'one_money']
|
||||||
|
res_data = []
|
||||||
|
for k, v in res_msg.items():
|
||||||
|
v.update({'owner_name': k})
|
||||||
|
res_value = deepcopy(v)
|
||||||
|
res_data.append(res_value)
|
||||||
|
level_list = {
|
||||||
|
"owner_name": "渠道",
|
||||||
|
"count": "总数",
|
||||||
|
"start_num": "推荐简历",
|
||||||
|
"screen_num": "有效简历",
|
||||||
|
"exam_num": "到场面试数",
|
||||||
|
"offer_num": "面试通过",
|
||||||
|
"work_num": "入职人数",
|
||||||
|
"year_money": "成本",
|
||||||
|
"one_money": "人均成本",
|
||||||
|
}
|
||||||
|
res_true_msg = {
|
||||||
|
'data': res_data,
|
||||||
|
'level_list': level_list
|
||||||
|
}
|
||||||
res_true_data = {
|
res_true_data = {
|
||||||
'data': res_msg,
|
'data': res_true_msg,
|
||||||
'table_data': table_data
|
'table_data': table_data
|
||||||
}
|
}
|
||||||
return schemas.Msg(code=200, msg='ok', data=res_true_data)
|
return schemas.Msg(code=200, msg='ok', data=res_true_data)
|
||||||
@ -1415,16 +1504,16 @@ async def year_trend_form(
|
|||||||
res_msg = {}
|
res_msg = {}
|
||||||
for i in months:
|
for i in months:
|
||||||
res_msg[str(i)] = {
|
res_msg[str(i)] = {
|
||||||
'简历推荐数': 0,
|
'start_num': 0,
|
||||||
'有效简历数': 0,
|
'ok_num': 0,
|
||||||
'到场面试数': 0,
|
'exam_num': 0,
|
||||||
'面试通过': 0,
|
'exam_pass_num': 0,
|
||||||
'offer发出数': 0,
|
'offer_num': 0,
|
||||||
'入职人数': 0,
|
'work_num': 0,
|
||||||
'转正人数': 0,
|
'work_ok_num': 0,
|
||||||
'离职人数': 0,
|
'out_num': 0,
|
||||||
'主动离职': 0,
|
'out_self_num': 0,
|
||||||
'被动离职': 0
|
'out_must_num': 0
|
||||||
}
|
}
|
||||||
|
|
||||||
for chk_data in data.values():
|
for chk_data in data.values():
|
||||||
@ -1434,30 +1523,52 @@ async def year_trend_form(
|
|||||||
chk_stage = chk_data['interview_stage']
|
chk_stage = chk_data['interview_stage']
|
||||||
count_num = chk_data['value']
|
count_num = chk_data['value']
|
||||||
if chk_stage >= 1:
|
if chk_stage >= 1:
|
||||||
res_msg[chk_date]['简历推荐数'] += 1 * count_num
|
res_msg[chk_date]['start_num'] += 1 * count_num
|
||||||
if chk_stage >= 2:
|
if chk_stage >= 2:
|
||||||
res_msg[chk_date]['有效简历数'] += 1 * count_num
|
res_msg[chk_date]['ok_num'] += 1 * count_num
|
||||||
if chk_stage >= 3:
|
if chk_stage >= 3:
|
||||||
res_msg[chk_date]['到场面试数'] += 1 * count_num
|
res_msg[chk_date]['exam_num'] += 1 * count_num
|
||||||
if chk_stage >= 4:
|
if chk_stage >= 4:
|
||||||
res_msg[chk_date]['面试通过'] += 1 * count_num
|
res_msg[chk_date]['exam_pass_num'] += 1 * count_num
|
||||||
if chk_stage >= 5:
|
if chk_stage >= 5:
|
||||||
res_msg[chk_date]['offer发出数'] += 1 * count_num
|
res_msg[chk_date]['offer_num'] += 1 * count_num
|
||||||
if chk_stage >= 7:
|
if chk_stage >= 7:
|
||||||
res_msg[chk_date]['入职人数'] += 1 * count_num
|
res_msg[chk_date]['work_num'] += 1 * count_num
|
||||||
if chk_stage >= 8:
|
if chk_stage >= 8:
|
||||||
res_msg[chk_date]['转正人数'] += 1 * count_num
|
res_msg[chk_date]['work_ok_num'] += 1 * count_num
|
||||||
if chk_stage == 9:
|
if chk_stage == 9:
|
||||||
res_msg[chk_date]['离职人数'] += 1 * count_num
|
res_msg[chk_date]['out_num'] += 1 * count_num
|
||||||
res_msg[chk_date]['主动离职'] += 1 * count_num
|
res_msg[chk_date]['out_self_num'] += 1 * count_num
|
||||||
if chk_stage == 10:
|
if chk_stage == 10:
|
||||||
res_msg[chk_date]['离职人数'] += 1 * count_num
|
res_msg[chk_date]['out_num'] += 1 * count_num
|
||||||
res_msg[chk_date]['被动离职'] += 1 * count_num
|
res_msg[chk_date]['out_must_num'] += 1 * count_num
|
||||||
res_data = {
|
res_data = []
|
||||||
'data': res_msg,
|
for k, v in res_msg.items():
|
||||||
|
v.update({'time': k})
|
||||||
|
res_v = deepcopy(v)
|
||||||
|
res_data.append(res_v)
|
||||||
|
level_list = {
|
||||||
|
"time": "时间",
|
||||||
|
"start_num": "简历推荐数",
|
||||||
|
"ok_num": "有效简历数",
|
||||||
|
"exam_num": "到场面试数",
|
||||||
|
"exam_pass_num": "面试通过",
|
||||||
|
"offer_num": "offer发出数",
|
||||||
|
"work_num": "入职人数",
|
||||||
|
"work_ok_num": "转正人数",
|
||||||
|
"out_num": "离职人数",
|
||||||
|
"out_self_num": "主动离职",
|
||||||
|
"out_must_num": "被动离职"
|
||||||
|
}
|
||||||
|
res_true_data = {
|
||||||
|
'data': res_data,
|
||||||
|
'level_list': level_list
|
||||||
|
}
|
||||||
|
res_back_data = {
|
||||||
|
'data': res_true_data,
|
||||||
'table_data': table_data
|
'table_data': table_data
|
||||||
}
|
}
|
||||||
return schemas.Msg(code=200, msg='ok', data=res_data)
|
return schemas.Msg(code=200, msg='ok', data=res_back_data)
|
||||||
|
|
||||||
|
|
||||||
# 年度岗位招聘数据报表
|
# 年度岗位招聘数据报表
|
||||||
@ -1548,7 +1659,16 @@ async def year_job_form(
|
|||||||
else:
|
else:
|
||||||
res_data[k]['其他'] = {}
|
res_data[k]['其他'] = {}
|
||||||
res_data[k]['其他'].update({'其他': v1})
|
res_data[k]['其他'].update({'其他': v1})
|
||||||
|
level_list = {
|
||||||
|
"time": "时间",
|
||||||
|
"start_num": "简历推荐数",
|
||||||
|
"ok_num": "有效简历数",
|
||||||
|
"exam_num": "到场面试数",
|
||||||
|
"exam_pass_num": "面试通过",
|
||||||
|
"offer_num": "offer发出数",
|
||||||
|
"work_num": "入职人数",
|
||||||
|
"out_num": "离职人数"
|
||||||
|
}
|
||||||
res_true_data = {
|
res_true_data = {
|
||||||
'data': res_data,
|
'data': res_data,
|
||||||
'table_data': table_data
|
'table_data': table_data
|
||||||
@ -1586,28 +1706,27 @@ async def year_in_out(
|
|||||||
edate = res['edate']
|
edate = res['edate']
|
||||||
months = get_every_months(sdate, edate)
|
months = get_every_months(sdate, edate)
|
||||||
res_msg = {
|
res_msg = {
|
||||||
'入职': {},
|
|
||||||
'离职': {}
|
|
||||||
}
|
}
|
||||||
for i in months:
|
for i in months:
|
||||||
res_msg['入职'][str(i)] = 0
|
res_msg[str(i)] = {}
|
||||||
res_msg['离职'][str(i)] = 0
|
res_msg[str(i)]['入职'] = 0
|
||||||
|
res_msg[str(i)]['离职'] = 0
|
||||||
|
|
||||||
# 入职数据处理
|
# 入职数据处理
|
||||||
for in_data in data_in.values():
|
for in_data in data_in.values():
|
||||||
in_date = datetime.strftime(in_data['date'], '%Y-%m')
|
in_date = datetime.strftime(in_data['date'], '%Y-%m')
|
||||||
if in_date not in res_msg['入职']:
|
if in_date not in res_msg:
|
||||||
continue
|
continue
|
||||||
value = in_data['value']
|
value = in_data['value']
|
||||||
res_msg['入职'][in_date] += value
|
res_msg[in_date]['入职'] += value
|
||||||
|
|
||||||
# 离职数据处理
|
# 离职数据处理
|
||||||
for out_data in data_out.values():
|
for out_data in data_out.values():
|
||||||
out_date = datetime.strftime(out_data['date'], '%Y-%m')
|
out_date = datetime.strftime(out_data['date'], '%Y-%m')
|
||||||
if out_date not in res_msg['离职']:
|
if out_date not in res_msg:
|
||||||
continue
|
continue
|
||||||
value = out_data['value']
|
value = out_data['value']
|
||||||
res_msg['离职'][out_date] += value
|
res_msg[out_date]['离职'] += value
|
||||||
res_data = {
|
res_data = {
|
||||||
'data': res_msg,
|
'data': res_msg,
|
||||||
'table_data': table_data
|
'table_data': table_data
|
||||||
|
Loading…
Reference in New Issue
Block a user