and new metod to upgrade dailyWage
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using _0_Framework.Application;
|
||||
using _0_Framework.Domain;
|
||||
using CompanyManagment.App.Contracts.Contract;
|
||||
@@ -9,6 +10,14 @@ namespace Company.Domain.ContractAgg;
|
||||
|
||||
public interface IContractRepository : IRepository<long, Contract>
|
||||
{
|
||||
/// <summary>
|
||||
/// دریافت مزد ارتقاء یافته
|
||||
/// </summary>
|
||||
/// <param name="workshopId"></param>
|
||||
/// <param name="employeeId"></param>
|
||||
/// <param name="yearlySalaryId"></param>
|
||||
/// <returns></returns>
|
||||
Task<double> GetManualDailWage(long workshopId, long employeeId, long yearlySalaryId, DateTime contractStart);
|
||||
EditContract GetDetails(long id);
|
||||
EditContract GetContractByStartEnd(DateTime start, DateTime end, long workshopId, long employeeId);
|
||||
|
||||
|
||||
@@ -17,14 +17,14 @@ public interface IYearlySalaryRepository : IRepository<long, YearlySalary>
|
||||
void TestDayliFeeCompute();
|
||||
List<string> GetYears();
|
||||
List<YearlySalaryViewModel> GetYearlySalary();
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// دریافت مزد روزانه بر اساس تاریخ شروع و پایان
|
||||
/// </summary>
|
||||
/// <param name="start"></param>
|
||||
/// <param name="end"></param>
|
||||
/// <returns></returns>
|
||||
Task<double> GetDailyWageByStartEnd(DateTime start, DateTime end);
|
||||
Task<(double dailyWage, long yearlySalaryId)> GetDailyWageByStartEnd(DateTime start, DateTime end);
|
||||
|
||||
MontlywageBunosYearsViewModel GetMontlyBunosYears(TimeSpan weeklyTime, DateTime contractStart,DateTime contractEnd, double daylyWage, string weeklyWorkingTime, int officialholiday, int friday, string totalHoursH, string totalHorsM, string basic, int fridayStartToEnd, double dayliFeeComplete, bool hasRollCall, bool holidaysWorking,string shiftWork);
|
||||
double GetLeavePay(DateTime contractStart, DateTime contractEnd, double daylyWage, double consumableItem, double housingAllowance, double familyAllowance , string weeklyWorkingTime, int officialholiday, int friday, string totalHoursH, string totalHorsM);
|
||||
|
||||
@@ -7,6 +7,14 @@ namespace CompanyManagment.App.Contracts.Contract;
|
||||
|
||||
public interface IContractApplication
|
||||
{
|
||||
/// <summary>
|
||||
/// دریافت مزد ارتقاء یافته
|
||||
/// </summary>
|
||||
/// <param name="workshopId"></param>
|
||||
/// <param name="employeeId"></param>
|
||||
/// <param name="yearlySalaryId"></param>
|
||||
/// <returns></returns>
|
||||
Task<double> GetManualDailWage(long workshopId, long employeeId, long yearlySalaryId, DateTime contractStart);
|
||||
OperationResult Create(CreateContract command);
|
||||
OperationResult CreateNew(createContractModel command);
|
||||
OperationResult Edit(EditContract command);
|
||||
|
||||
@@ -21,7 +21,7 @@ public interface IYearlySalaryApplication
|
||||
/// <param name="start"></param>
|
||||
/// <param name="end"></param>
|
||||
/// <returns></returns>
|
||||
Task<double> GetDailyWageByStartEnd(DateTime start, DateTime end);
|
||||
Task<(double dailyWage, long yearlySalaryId)> GetDailyWageByStartEnd(DateTime start, DateTime end);
|
||||
|
||||
List<YearlySalaryViewModel> Search(YearlySalarySearchModel searchModel);
|
||||
EditYearlySalary GetDetailsBySearchModel(YearlySalarySearchModel searchModel);
|
||||
|
||||
@@ -78,6 +78,11 @@ public class ContractApplication : IContractApplication
|
||||
}
|
||||
|
||||
|
||||
public async Task<double> GetManualDailWage(long workshopId, long employeeId, long yearlySalaryId, DateTime contractStart)
|
||||
{
|
||||
return await _contractRepository.GetManualDailWage(workshopId, employeeId, yearlySalaryId, contractStart);
|
||||
}
|
||||
|
||||
public OperationResult Create(CreateContract command)
|
||||
{
|
||||
var yearlysalaryList = _yearlySalaryRepository.GetYearlySalary();
|
||||
|
||||
@@ -128,7 +128,7 @@ public class YearlySalaryApplication : IYearlySalaryApplication
|
||||
return _yearlySalaryRepository.GetYearlySalary();
|
||||
}
|
||||
|
||||
public async Task<double> GetDailyWageByStartEnd(DateTime start, DateTime end)
|
||||
public async Task<(double dailyWage, long yearlySalaryId)> GetDailyWageByStartEnd(DateTime start, DateTime end)
|
||||
{
|
||||
return await _yearlySalaryRepository.GetDailyWageByStartEnd(start, end);
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
@@ -43,15 +44,34 @@ public class ContractRepository : RepositoryBase<long, Contract>, IContractRepos
|
||||
}
|
||||
|
||||
|
||||
public async Task<double> GetManualDailWage(long workshopId, long employeeId)
|
||||
public async Task<double> GetManualDailWage(long workshopId, long employeeId, long yearlySalaryId, DateTime contractStart)
|
||||
{
|
||||
|
||||
var lastContract = await _context.Contracts
|
||||
.Where(x => x.WorkshopIds == workshopId && x.EmployeeId == employeeId && x.IsActiveString == "true")
|
||||
.Where(x => x.WorkshopIds == workshopId && x.EmployeeId == employeeId && x.IsActiveString == "true" && x.ContarctStart < contractStart)
|
||||
.OrderByDescending(x => x.ContarctStart)
|
||||
.FirstOrDefaultAsync();
|
||||
//اگر قردادی قبل از قرارداد جدید نداشت
|
||||
if (lastContract == null)
|
||||
return 0;
|
||||
//اگر آخرین قرداد مزد دلخواه نداشت
|
||||
if (!lastContract.HasManualDailyWage)
|
||||
return 0;
|
||||
|
||||
var lastContractYearlySalary = await _context.YearlySalaries
|
||||
.FirstOrDefaultAsync(x => x.StartDate <= lastContract.ContarctStart && x.EndDate >= lastContract.ContarctStart);
|
||||
|
||||
//اگر دستمزد آخرین قراداد و قرداد جدید از یک مقادیر سالانه بودن بدون ارتقاء دستمزد دلخواه آخرین قرداد ارسال میشه
|
||||
if (lastContractYearlySalary.id == yearlySalaryId)
|
||||
return lastContract.DailySalaryUnAffected;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -95,7 +95,7 @@ public class YearlySalaryRepository : RepositoryBase<long, YearlySalary>, IYearl
|
||||
/// <param name="start"></param>
|
||||
/// <param name="end"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<double> GetDailyWageByStartEnd(DateTime start, DateTime end)
|
||||
public async Task<(double dailyWage, long yearlySalaryId)> GetDailyWageByStartEnd(DateTime start, DateTime end)
|
||||
{
|
||||
var salary = await _context.YearlySalaries.Where(x => x.StartDate <= start && x.EndDate >= end).Include(x => x.YearlySalaryItemsList).FirstOrDefaultAsync();
|
||||
double dailyWage = 0;
|
||||
@@ -103,9 +103,10 @@ public class YearlySalaryRepository : RepositoryBase<long, YearlySalary>, IYearl
|
||||
{
|
||||
dailyWage = salary
|
||||
.YearlySalaryItemsList.Where(x => x.ItemName == "مزد روزانه").Select(x => x.ItemValue).FirstOrDefault();
|
||||
return (dailyWage, salary.id);
|
||||
}
|
||||
|
||||
return dailyWage;
|
||||
return (dailyWage, 0);
|
||||
|
||||
}
|
||||
//محاسبه حقوق ماهیانه عیدی و پاداش ، سنوات
|
||||
|
||||
@@ -689,7 +689,9 @@
|
||||
<th style="font-size: 10px !important" class="sizeSet sorting_asc_disabled sorting_desc_disabled">پرسنل</th>
|
||||
|
||||
<th style="font-size: 10px !important" class="sizeSet sorting_asc_disabled sorting_asc_disabled">سمت</th>
|
||||
<th style="font-size: 10px !important" class="sizeSet sorting_asc_disabled sorting_asc_disabled"> دستمزد روزانه </th>
|
||||
<th style="font-size: 10px !important" class="sizeSet sorting_asc_disabled sorting_asc_disabled"> دستمزد روزانه </th>
|
||||
|
||||
<th style="display: none;font-size: 10px !important" class="sizeSet sorting_asc_disabled sorting_asc_disabled">نوع قراداد</th>
|
||||
<th style="display: none;font-size: 10px !important" class="sizeSet sorting_asc_disabled sorting_asc_disabled">مدت قرارداد</th>
|
||||
|
||||
<th style="font-size: 10px !important" class="sizeSet sorting_asc_disabled sorting_desc_disabled">تاریخ شروع</th>
|
||||
@@ -765,18 +767,30 @@
|
||||
</td>
|
||||
|
||||
|
||||
<td style="font-family: 'IranSans' !important; font-size: 12px !important; text-align: center; min-width: 70px;direction: ltr">
|
||||
<input type="hidden" name="normalDailyWage" value="0" class="normalDailyWage" />
|
||||
<input type="text" name="dailySalaryUnAffectedStr" disabled="disabled" value="0" class="dayliwage form-control" style="text-align: center; border-radius: 7px; height: 24px;" />
|
||||
<select disabled="disabled" name="dailyWageType" class="selectDailyWageModel" style="background-color: #fafafa;color: rgba(0, 0, 0, 0.6);border: 1px solid #c7c7c7 !important;border-radius: 5px;box-shadow: none;padding:0px 2px 3px">
|
||||
<td style="font-family: 'IranSans' !important; font-size: 12px !important; text-align: center; min-width: 70px;direction: ltr">
|
||||
<input type="hidden" name="normalDailyWage" value="0" class="normalDailyWage" />
|
||||
<input type="hidden" name="upgradedDailyWage" value="0" class="upgradedDailyWage" />
|
||||
<input type="text" name="dailySalaryUnAffectedStr" disabled="disabled" value="0" class="dayliwage form-control" style="text-align: center; border-radius: 7px; height: 24px;" />
|
||||
<select disabled="disabled" name="dailyWageType" class="selectDailyWageModel" style="background-color: #fafafa;color: rgba(0, 0, 0, 0.6);border: 1px solid #c7c7c7 !important;border-radius: 5px;box-shadow: none;padding:0px 2px 3px">
|
||||
<option value="0">انتخاب دستمزد</option>
|
||||
<option value="1">مزد سالانه</option>
|
||||
<option value="2">مزد ارتقاء یافته</option>
|
||||
<option value="3">مزد دلخواه</option>
|
||||
</select>
|
||||
<br/>
|
||||
<span class="errorCompare falseStatusHide" style="color:red; font-size: 10.5px"></span>
|
||||
</td>
|
||||
<br/>
|
||||
<span class="errorCompare falseStatusHide" style="color:red; font-size: 10.5px"></span>
|
||||
</td>
|
||||
<td style="display: none;font-family: 'IranSans' !important; font-size: 12px !important; text-align: center; min-width: 70px;">
|
||||
|
||||
|
||||
<select name="contractType" class="contractType">
|
||||
<option value="موقت">موقت</option>
|
||||
<option value="دائم">دائم</option>
|
||||
<option value="معین">معین</option>
|
||||
</select>
|
||||
|
||||
|
||||
</td>
|
||||
<td style="display: none;font-family: 'IranSans' !important; font-size: 12px !important; text-align: center; min-width: 90px;">
|
||||
|
||||
|
||||
@@ -911,23 +925,29 @@
|
||||
}
|
||||
|
||||
$('#datatable tbody tr').each(function (i) {
|
||||
const chekbox = $(this).find("input[name=selectItem]");
|
||||
const statustrue = $(this).find("input[name=isStatusTrue]");
|
||||
|
||||
if(chekbox.is(":checked") && statustrue.is(":checked")){
|
||||
let input = $(this).find(".dayliwage"); // اینپوت مرتبط با همین سلکت
|
||||
|
||||
let normalDailyWageHidden = $(this).find(".normalDailyWage").val();
|
||||
let upgradedDailyWageHidden = $(this).find(".upgradedDailyWage").val();
|
||||
$(this).find(".errorCompare").addClass("falseStatusHide");
|
||||
$(this).find(".dayliwage").removeClass("erroreManual");
|
||||
|
||||
|
||||
switch(num){
|
||||
|
||||
case 1: input.val(normalDailyWageHidden);input.prop("disabled", true);
|
||||
break;
|
||||
case 2 : input.val(upgradedDailyWageHidden); input.prop("disabled", true);
|
||||
break;
|
||||
case 3 : input.val(normalDailyWageHidden); input.prop("disabled", false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
let input = $(this).find(".dayliwage"); // اینپوت مرتبط با همین سلکت
|
||||
|
||||
let normalDailyWageHidden = $(this).find(".normalDailyWage").val();
|
||||
$(this).find(".errorCompare").addClass("falseStatusHide");
|
||||
$(this).find(".dayliwage").removeClass("erroreManual");
|
||||
switch(num){
|
||||
|
||||
case 1: input.val(normalDailyWageHidden);input.prop("disabled", true);
|
||||
break;
|
||||
case 2 : input.val("0"); input.prop("disabled", true);
|
||||
break;
|
||||
case 3 : input.val(normalDailyWageHidden); input.prop("disabled", false);
|
||||
break;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -991,6 +1011,7 @@
|
||||
let selectedValue = $(this).val(); // مقدار انتخاب شده
|
||||
let input = $(this).closest("td").find(".dayliwage"); // اینپوت مرتبط با همین سلکت
|
||||
let normalDailyWageHidden = $(this).closest("td").find(".normalDailyWage").val();
|
||||
let upgradedDailyWageHidden = $(this).closest("td").find(".upgradedDailyWage").val();
|
||||
$(this).closest("td").find(".errorCompare").addClass("falseStatusHide");
|
||||
input.removeClass("erroreManual");
|
||||
switch(selectedValue){
|
||||
@@ -998,7 +1019,7 @@
|
||||
break;
|
||||
case "1" : input.val(normalDailyWageHidden);input.prop("disabled", true);
|
||||
break;
|
||||
case "2" : input.val("0"); input.prop("disabled", true);
|
||||
case "2" : input.val(upgradedDailyWageHidden); input.prop("disabled", true);
|
||||
break;
|
||||
case "3" : input.val(normalDailyWageHidden); input.prop("disabled", false);
|
||||
break;
|
||||
|
||||
@@ -568,21 +568,32 @@ public class AutoExtensionModel : PageModel
|
||||
//return Partial("Alert", alarm);
|
||||
if (!string.IsNullOrWhiteSpace(contractExistCheck)) contractExist = true;
|
||||
|
||||
|
||||
//تاریخ پایان را پایان ماه شزع قرارداد در نظر میگیریم
|
||||
//زیرا ممکن است تاریخ پایان قراداد در همان سال نباشد
|
||||
var endOfMonthFromStart = ($"{start.ToFarsi().FindeEndOfMonth()}").ToGeorgianDateTime();
|
||||
|
||||
var normaldailyWage = _yearlySalaryApplication.GetDailyWageByStartEnd(start, endOfMonthFromStart).GetAwaiter().GetResult();
|
||||
|
||||
//var contract = _contractApplication.SearchForCheckout()
|
||||
(double dailyWage, long yearlySalaryId) normalDailyWage = (0,0);
|
||||
double upgradedDailyWage =0;
|
||||
if (!contractExist)
|
||||
{
|
||||
normalDailyWage = _yearlySalaryApplication.GetDailyWageByStartEnd(start, endOfMonthFromStart).GetAwaiter().GetResult();
|
||||
|
||||
|
||||
upgradedDailyWage =
|
||||
_contractApplication.GetManualDailWage(workshopId, employeeId, normalDailyWage.yearlySalaryId, start).GetAwaiter().GetResult();
|
||||
if (upgradedDailyWage == 0)
|
||||
upgradedDailyWage = normalDailyWage.dailyWage;
|
||||
}
|
||||
|
||||
return new JsonResult(new
|
||||
{
|
||||
success = true,
|
||||
getWorkDate = getWorkDateHide,
|
||||
errContractExist = contractExist,
|
||||
errLeftValid = leftValid,
|
||||
normalDailyWage = normaldailyWage.ToMoney(),
|
||||
normalDailyWage = normalDailyWage.dailyWage > 0 ? normalDailyWage.dailyWage.ToMoney() : "0",
|
||||
upgradedDailyWage = upgradedDailyWage > 0 ? upgradedDailyWage.ToMoney() : "0",
|
||||
});
|
||||
}
|
||||
|
||||
@@ -5483,7 +5494,7 @@ public class AutoExtensionModel : PageModel
|
||||
double baseYearUnAffected = 0;
|
||||
double baseYearAffected = 0;
|
||||
double dailySalaryAffected = 0;
|
||||
|
||||
|
||||
if (styear >= 1370)
|
||||
{
|
||||
if (leftworkList == null)
|
||||
@@ -5491,14 +5502,14 @@ public class AutoExtensionModel : PageModel
|
||||
|
||||
//var dayliFeeResult = _yearlySalaryRepository.DayliFeeComputing(startDate, contractStartDate,
|
||||
// contractStartDate, command.EmployeeId, command.WorkshopId, leftworkList);
|
||||
|
||||
|
||||
var baseYear = _yearlySalaryRepository.BaseYearCompute(contractStartDate, endDate, command.EmployeeId,
|
||||
command.WorkshopId, leftworkList).Result;
|
||||
dayliFee = (command.DailySalaryUnAffected + baseYear.BaseYearResult).ToMoney();
|
||||
//basic = dayliFeeResult.Basic;
|
||||
|
||||
baseYearUnAffected = baseYear.BaseYearResult;
|
||||
baseYearAffected = baseYear.BaseYearResult;
|
||||
|
||||
baseYearUnAffected = baseYear.BaseYearResult > 0 ? (baseYear.BaseYearResult.ToMoney()).MoneyToDouble() : 0;
|
||||
baseYearAffected = baseYearUnAffected;
|
||||
dailySalaryAffected = command.DailySalaryUnAffected;
|
||||
}
|
||||
|
||||
@@ -5687,20 +5698,22 @@ public class AutoExtensionModel : PageModel
|
||||
//var dividedForOneDay = totalHourses / notHolidaysCount;
|
||||
if (totalHourses < FixHourses)
|
||||
{
|
||||
var DailyFeeNumberType = dayliFee.MoneyToDouble();
|
||||
var dailyStep1 = DailyFeeNumberType / 7.33;
|
||||
//var DailyFeeNumberType = dayliFee.MoneyToDouble();
|
||||
//var dailyStep1 = DailyFeeNumberType / 7.33;
|
||||
var hoursesPerDay = totalHourses / TotalDaysNoFriday;
|
||||
var result = hoursesPerDay * dailyStep1;
|
||||
//var result = hoursesPerDay * dailyStep1;
|
||||
|
||||
dayliFee = result.ToMoney();
|
||||
//dayliFee = result.ToMoney();
|
||||
|
||||
var da = command.DailySalaryUnAffected / 7.33;
|
||||
dailySalaryAffected = hoursesPerDay * da;
|
||||
dailySalaryAffected = da > 0 ? ((hoursesPerDay * da).ToMoney()).MoneyToDouble() : 0 ;
|
||||
var ba = baseYearUnAffected / 7.33;
|
||||
baseYearAffected = hoursesPerDay * ba;
|
||||
baseYearAffected = ba > 0 ? ((hoursesPerDay * ba).ToMoney()).MoneyToDouble() : 0;
|
||||
|
||||
var fullDailysalar = dailySalaryAffected + baseYearAffected;
|
||||
var test = fullDailysalar.ToMoney();
|
||||
var fullDailySalary = dailySalaryAffected + baseYearAffected;
|
||||
dayliFee = fullDailySalary.ToMoney();
|
||||
|
||||
|
||||
|
||||
var HousingAllowonceNumberType = HousingAllowance.MoneyToDouble();
|
||||
var HousingStep1 = HousingAllowonceNumberType / 30; // کمک هزینه خام به ازای روز
|
||||
@@ -5787,12 +5800,21 @@ public class AutoExtensionModel : PageModel
|
||||
|
||||
if (totalHourses < FixHourses)
|
||||
{
|
||||
var dailyFeeNumberType = dayliFee.MoneyToDouble();
|
||||
var dailyStep1 = dailyFeeNumberType / 7.33;
|
||||
//var dailyFeeNumberType = dayliFee.MoneyToDouble();
|
||||
//var dailyStep1 = dailyFeeNumberType / 7.33;
|
||||
var hoursesPerDay = totalHourses / TotalDaysNoFriday;
|
||||
var result = hoursesPerDay * dailyStep1;
|
||||
//var result = hoursesPerDay * dailyStep1;
|
||||
|
||||
//dayliFee = result.ToMoney();
|
||||
|
||||
var da = command.DailySalaryUnAffected / 7.33;
|
||||
dailySalaryAffected = da > 0 ? ((hoursesPerDay * da).ToMoney()).MoneyToDouble() : 0;
|
||||
var ba = baseYearUnAffected / 7.33;
|
||||
baseYearAffected = ba > 0 ? ((hoursesPerDay * ba).ToMoney()).MoneyToDouble() : 0;
|
||||
|
||||
var fullDailySalary = dailySalaryAffected + baseYearAffected;
|
||||
dayliFee = fullDailySalary.ToMoney();
|
||||
|
||||
dayliFee = result.ToMoney();
|
||||
|
||||
//var HousingAllowonceNumberType = HousingAllowance.MoneyToDouble();
|
||||
//var HousingStep1 = HousingAllowonceNumberType / 30;
|
||||
|
||||
@@ -146,7 +146,7 @@ $('#firstCheckBtn').on('click',
|
||||
var workshopId = $('#workshopId').val();
|
||||
|
||||
var normalDailyWage = "0";
|
||||
|
||||
var upgradedDailyWage = "0";
|
||||
var address = $('#wAddress1').val();
|
||||
const checkboxCount = $('#datatable').find("input[type=checkbox]:checked").length;
|
||||
//ERR Response
|
||||
@@ -345,6 +345,7 @@ $('#firstCheckBtn').on('click',
|
||||
errContractExist = response.errContractExist;
|
||||
|
||||
normalDailyWage = response.normalDailyWage;
|
||||
upgradedDailyWage = response.upgradedDailyWage;
|
||||
}
|
||||
},
|
||||
failure: function (response) {
|
||||
@@ -380,6 +381,7 @@ $('#firstCheckBtn').on('click',
|
||||
$(this).addClass("greenColor");
|
||||
$(this).find(".selectDailyWageModel").prop("disabled", false);
|
||||
$(this).find(".normalDailyWage").val(normalDailyWage);
|
||||
$(this).find(".upgradedDailyWage").val(upgradedDailyWage);
|
||||
$(this).find(".sdate").prop("disabled", true);
|
||||
$(this).find(".edate").prop("disabled", true);
|
||||
//$(this).find("input[type=checkbox]").removeAttr("disabled");
|
||||
@@ -571,7 +573,10 @@ $('#startProcess').on('click',
|
||||
|
||||
createContractModel.NormalDailyWage = $(this).find("input[name=normalDailyWage]").val();
|
||||
createContractModel.DailySalaryUnAffectedStr = $(this).find("input[name=dailySalaryUnAffectedStr]").val();
|
||||
|
||||
if (createContractModel.DailySalaryUnAffectedStr == "0") {
|
||||
$(this).find("input[name=dailySalaryUnAffectedStr]").addClass("erroreManual");
|
||||
startCreate = false;
|
||||
}
|
||||
createContarctList.push(createContractModel);
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user