Checkout bug fixed
This commit is contained in:
@@ -262,17 +262,21 @@ public class RollCallRepository : RepositoryBase<long, RollCall>, IRollCallRepos
|
||||
|
||||
}
|
||||
|
||||
//حضور غیاب گروهی از پرسنل برای پرینت گروهی فیش حقوقی غیر رسمی نهایی
|
||||
public List<PersonnelCheckoutDailyRollCallViewModel> GetEmployeeRollCallsForMonth(IEnumerable<long> employeeIds, long workshopId, DateTime start, DateTime end)
|
||||
//حضور غیاب گروهی از پرسنل برای پرینت گروهی فیش حقوقی غیر رسمی نهایی
|
||||
public List<PersonnelCheckoutDailyRollCallViewModel> GetEmployeeRollCallsForMonth(IEnumerable<long> employeeIds, long workshopId, DateTime start, DateTime end)
|
||||
{
|
||||
|
||||
|
||||
if (workshopId == 170)
|
||||
return GetEmployeeRollCallsForMonthForKababMahdi(employeeIds, workshopId, start, end);
|
||||
|
||||
var rollCalls = _context.RollCalls.Where(x =>
|
||||
employeeIds.Contains(x.EmployeeId) && workshopId == x.WorkshopId && x.StartDate != null &&
|
||||
x.EndDate != null && x.RollCallModifyType != RollCallModifyType.Undefined &&
|
||||
x.ShiftDate.Date >= start && x.ShiftDate.Date <= end).ToList();
|
||||
|
||||
var leaves = _context.LeaveList.Where(x =>
|
||||
x.WorkshopId == workshopId && employeeIds.Contains(x.EmployeeId) && x.EndLeave.Date >= start.Date &&
|
||||
x.StartLeave.Date <= end.Date).ToList();
|
||||
|
||||
var year = Convert.ToInt32(start.ToFarsi().Substring(0, 4));
|
||||
var month = Convert.ToInt32(start.ToFarsi().Substring(5, 2));
|
||||
@@ -292,31 +296,51 @@ public class RollCallRepository : RepositoryBase<long, RollCall>, IRollCallRepos
|
||||
var lastDayOfCurrentMonth = nextMonthDate.AddDays(-1);
|
||||
|
||||
int dateRange = (int)(lastDayOfCurrentMonth - firstDayOfCurrentMonth).TotalDays + 1;
|
||||
|
||||
var employeeSettingsList =
|
||||
_context.CustomizeWorkshopEmployeeSettings.AsSplitQuery().Where(x => x.WorkshopId == workshopId).ToList();
|
||||
var holidays = _holidayItemApplication.Search(new HolidayItemSearchModel()
|
||||
{
|
||||
HolidayYear = start.ToFarsiYear()
|
||||
});
|
||||
//all the dates from start to end, to be compared with present days to get absent dates
|
||||
var completeDaysList = Enumerable.Range(0, dateRange).Select(offset => start.AddDays(offset).Date);
|
||||
var completeDaysList = Enumerable.Range(0, dateRange).Select(offset => start.AddDays(offset).Date).ToList();
|
||||
|
||||
|
||||
List<PersonnelCheckoutDailyRollCallViewModel> result = new();
|
||||
foreach (var employeeId in employeeIds)
|
||||
{
|
||||
|
||||
var absentRecords = completeDaysList.Where(x => !rollCalls.Any(y => y.EmployeeId == employeeId && x.Date.Date == y.ShiftDate.Date))
|
||||
.Select(x => new CheckoutDailyRollCallViewModel()
|
||||
var settings = employeeSettingsList.FirstOrDefault(x => x.EmployeeId == employeeId);
|
||||
var worksInFriday = settings.FridayWork != FridayWork.Default;
|
||||
var worksInHolidays = settings.HolidayWork != HolidayWork.Default;
|
||||
var absentRecords = completeDaysList.Where(x =>
|
||||
!rollCalls.Any(y => y.EmployeeId == employeeId && x.Date.Date == y.ShiftDate.Date))
|
||||
.Select(x =>
|
||||
{
|
||||
StartDate1 = null,
|
||||
EndDate1 = null,
|
||||
DateTimeGr = x.Date,
|
||||
DayOfWeek = x.Date.DayOfWeek.ToString(),
|
||||
RollCallDateFa = x.Date.ToFarsi()
|
||||
var leave = leaves.FirstOrDefault(y =>
|
||||
y.EmployeeId == employeeId && y.EndLeave.Date >= x.Date && y.StartLeave.Date <= x.Date);
|
||||
var isHoliday = holidays.Any(y => y.HolidaydateGr == x.Date);
|
||||
var isFriday = x.Date.DayOfWeek == DayOfWeek.Friday;
|
||||
var isNormalWorkingDay = isHoliday == false && isFriday == false;
|
||||
return new CheckoutDailyRollCallViewModel()
|
||||
{
|
||||
StartDate1 = null,
|
||||
EndDate1 = null,
|
||||
DateTimeGr = x.Date,
|
||||
DayOfWeek = x.Date.DayOfWeek.ToString(),
|
||||
RollCallDateFa = x.Date.ToFarsi(),
|
||||
LeaveType = leave != null ? leave.LeaveType : "",
|
||||
IsAbsent = leave == null && (isNormalWorkingDay ||
|
||||
(worksInFriday && x.Date.DayOfWeek == DayOfWeek.Friday) ||
|
||||
(worksInHolidays && isHoliday))
|
||||
};
|
||||
});
|
||||
var presentDays = rollCalls.Where(x => x.EmployeeId == employeeId).GroupBy(x => x.ShiftDate.Date).Select(x =>
|
||||
{
|
||||
var orderedRollcalls = x.OrderBy(y => y.StartDate!.Value);
|
||||
var orderedRollcalls = x.OrderBy(y => y.StartDate!.Value).ToList();
|
||||
return new CheckoutDailyRollCallViewModel()
|
||||
{
|
||||
StartDate1 = orderedRollcalls.FirstOrDefault().StartDate.Value.ToString("HH:mm"),
|
||||
EndDate1 = orderedRollcalls.FirstOrDefault().EndDate.Value.ToString("HH:mm"),
|
||||
StartDate1 = orderedRollcalls.FirstOrDefault()?.StartDate?.ToString("HH:mm"),
|
||||
EndDate1 = orderedRollcalls.FirstOrDefault()?.EndDate?.ToString("HH:mm"),
|
||||
|
||||
StartDate2 = orderedRollcalls.Skip(1).FirstOrDefault()?.StartDate?.ToString("HH:mm") ?? "",
|
||||
EndDate2 = orderedRollcalls.Skip(1).FirstOrDefault()?.EndDate?.ToString("HH:mm") ?? "",
|
||||
@@ -326,7 +350,8 @@ public class RollCallRepository : RepositoryBase<long, RollCall>, IRollCallRepos
|
||||
DayOfWeek = x.Key.DayOfWeek.DayOfWeeKToPersian(),
|
||||
RollCallDateFa = x.Key.Date.ToFarsi(),
|
||||
DateTimeGr = x.Key.Date,
|
||||
IsSliced = x.Count() > 2
|
||||
IsSliced = x.Count() > 2,
|
||||
IsAbsent = false
|
||||
};
|
||||
});
|
||||
presentDays = presentDays.Select(x => new CheckoutDailyRollCallViewModel
|
||||
@@ -340,12 +365,17 @@ public class RollCallRepository : RepositoryBase<long, RollCall>, IRollCallRepos
|
||||
RollCallDateFa = x.RollCallDateFa,
|
||||
DateTimeGr = x.DateTimeGr,
|
||||
IsSliced = x.IsSliced,
|
||||
IsAbsent = false
|
||||
|
||||
});
|
||||
|
||||
List<CheckoutDailyRollCallViewModel> checkoutDailyRollCalls = presentDays.Concat(absentRecords).OrderBy(x => x.DateTimeGr).ToList();
|
||||
|
||||
|
||||
checkoutDailyRollCalls.ForEach(x =>
|
||||
{
|
||||
x.IsFriday = x.DateTimeGr.DayOfWeek == DayOfWeek.Friday;
|
||||
x.IsHoliday = holidays.Any(y => y.HolidaydateGr == x.DateTimeGr);
|
||||
});
|
||||
var resultItem = new PersonnelCheckoutDailyRollCallViewModel()
|
||||
{
|
||||
EmployeeId = employeeId,
|
||||
@@ -1392,5 +1422,278 @@ public class RollCallRepository : RepositoryBase<long, RollCall>, IRollCallRepos
|
||||
return;
|
||||
_context.RollCalls.RemoveRange(rollCalls);
|
||||
}
|
||||
|
||||
public List<PersonnelCheckoutDailyRollCallViewModel> GetEmployeeRollCallsForCustomizeCheckoutTemp(IEnumerable<long> customizeCheckoutIds, long workshopId)
|
||||
{
|
||||
//if (workshopId == 170)
|
||||
// return GetEmployeeRollCallsInDatesForKababMahdi(employeeIds, workshopId, start, end);
|
||||
|
||||
|
||||
var checkoutJoinEmployee = _context.CustomizeCheckoutTemps.Where(x => customizeCheckoutIds.Contains(x.id))
|
||||
.Join(_context.Employees,
|
||||
(customizeCheckout) => customizeCheckout.EmployeeId,
|
||||
(employee) => employee.id,
|
||||
((customizeCheckout, employee) => new { customizeCheckout, employee })).Select(x => new
|
||||
{
|
||||
CustomizeCheckoutId = x.customizeCheckout.id,
|
||||
CheckoutStart = x.customizeCheckout.ContractStart,
|
||||
CheckoutEnd = x.customizeCheckout.ContractEnd,
|
||||
EmployeeId = x.employee.id,
|
||||
|
||||
}).ToList();
|
||||
|
||||
List<PersonnelCheckoutDailyRollCallViewModel> result = new();
|
||||
PersianCalendar pc = new();
|
||||
foreach (var join in checkoutJoinEmployee)
|
||||
{
|
||||
var start = join.CheckoutStart;
|
||||
var end = join.CheckoutEnd;
|
||||
var employeeId = join.EmployeeId;
|
||||
|
||||
var rollCalls = _context.RollCalls.Where(x =>
|
||||
employeeId == x.EmployeeId && workshopId == x.WorkshopId && x.StartDate != null &&
|
||||
x.EndDate != null && x.ShiftDate.Date >= start && x.ShiftDate.Date <= end).ToList();
|
||||
|
||||
var leaves = _context.LeaveList.Where(x =>
|
||||
x.WorkshopId == workshopId && employeeId == x.EmployeeId && x.EndLeave.Date >= start.Date &&
|
||||
x.StartLeave.Date <= end.Date && x.PaidLeaveType == "روزانه").ToList();
|
||||
|
||||
|
||||
var employeeSettingsList =
|
||||
_context.CustomizeWorkshopEmployeeSettings.AsSplitQuery().Where(x => x.WorkshopId == workshopId)
|
||||
.ToList();
|
||||
|
||||
var endOfMonth = start.AddMonthsFa(1, out _).ToGeorgianDateTime().Date.AddTicks(-1);
|
||||
int dateRange = (int)(endOfMonth.Date - start).TotalDays + 1;
|
||||
|
||||
var completeDaysList = Enumerable.Range(0, dateRange).Select(offset => start.AddDays(offset).Date).ToList();
|
||||
var holidays = _holidayItemApplication.Search(new HolidayItemSearchModel()
|
||||
{
|
||||
HolidayYear = start.ToFarsiYear()
|
||||
});
|
||||
|
||||
var settings = employeeSettingsList.FirstOrDefault(x => x.EmployeeId == employeeId);
|
||||
var birthDay = _context.Employees.Where(x => x.id == employeeId).Select(x => x.DateOfBirth).First();
|
||||
var worksInFriday = settings.FridayWork != FridayWork.Default;
|
||||
var worksInHolidays = settings.HolidayWork != HolidayWork.Default;
|
||||
var absentRecords = completeDaysList.Where(x =>
|
||||
!rollCalls.Any(y => y.EmployeeId == employeeId && x.Date.Date == y.ShiftDate.Date))
|
||||
.Select(x =>
|
||||
{
|
||||
var leave = leaves.FirstOrDefault(y =>
|
||||
y.EmployeeId == employeeId && y.EndLeave.Date >= x.Date && y.StartLeave.Date <= x.Date);
|
||||
var isHoliday = holidays.Any(y => y.HolidaydateGr == x.Date);
|
||||
var isFriday = x.Date.DayOfWeek == DayOfWeek.Friday;
|
||||
var isNormalWorkingDay = isHoliday == false && isFriday == false;
|
||||
var isInContractRange = x <= end && x >= start;
|
||||
return new CheckoutDailyRollCallViewModel()
|
||||
{
|
||||
StartDate1 = null,
|
||||
EndDate1 = null,
|
||||
DateTimeGr = x.Date.Date,
|
||||
DayOfWeek = x.Date.DayOfWeek.ToString(),
|
||||
RollCallDateFa = x.Date.ToFarsi(),
|
||||
LeaveType = leave != null ? leave.LeaveType : "",
|
||||
IsAbsent = leave == null && isInContractRange && (isNormalWorkingDay ||
|
||||
(worksInFriday && x.Date.DayOfWeek ==
|
||||
DayOfWeek.Friday) ||
|
||||
(worksInHolidays && isHoliday))
|
||||
};
|
||||
});
|
||||
|
||||
var presentDays = rollCalls.Where(x => x.EmployeeId == employeeId).GroupBy(x => x.ShiftDate.Date).Select(
|
||||
x =>
|
||||
{
|
||||
var orderedRollcalls = x.OrderBy(y => y.ShiftDate).ToList();
|
||||
return new CheckoutDailyRollCallViewModel()
|
||||
{
|
||||
StartDate1 = orderedRollcalls.FirstOrDefault()?.StartDate?.ToString("HH:mm"),
|
||||
EndDate1 = orderedRollcalls.FirstOrDefault()?.EndDate?.ToString("HH:mm"),
|
||||
|
||||
StartDate2 = orderedRollcalls.Skip(1).FirstOrDefault()?.StartDate?.ToString("HH:mm") ?? "",
|
||||
EndDate2 = orderedRollcalls.Skip(1).FirstOrDefault()?.EndDate?.ToString("HH:mm") ?? "",
|
||||
|
||||
TotalhourseSpan =
|
||||
new TimeSpan(x.Where(y => y.EndDate != null)
|
||||
.Sum(y => (y.EndDate - y.StartDate)!.Value.Ticks)),
|
||||
DayOfWeek = x.Key.DayOfWeek.DayOfWeeKToPersian(),
|
||||
RollCallDateFa = x.Key.Date.ToFarsi(),
|
||||
DateTimeGr = x.Key.Date,
|
||||
IsSliced = x.Count() > 2,
|
||||
IsAbsent = false
|
||||
};
|
||||
});
|
||||
presentDays = presentDays.Select(x => new CheckoutDailyRollCallViewModel
|
||||
{
|
||||
StartDate1 = x.StartDate1,
|
||||
EndDate1 = x.EndDate1,
|
||||
EndDate2 = x.EndDate2,
|
||||
StartDate2 = x.StartDate2,
|
||||
TotalWorkingHours = $"{(int)(x.TotalhourseSpan.TotalHours)}:{x.TotalhourseSpan.Minutes.ToString("00")}",
|
||||
DayOfWeek = x.DayOfWeek,
|
||||
RollCallDateFa = x.RollCallDateFa,
|
||||
DateTimeGr = x.DateTimeGr,
|
||||
IsSliced = x.IsSliced,
|
||||
IsAbsent = false
|
||||
|
||||
|
||||
});
|
||||
|
||||
List<CheckoutDailyRollCallViewModel> checkoutDailyRollCalls =
|
||||
presentDays.Concat(absentRecords).OrderBy(x => x.DateTimeGr).ToList();
|
||||
|
||||
checkoutDailyRollCalls.ForEach(x =>
|
||||
{
|
||||
x.IsFriday = x.DateTimeGr.DayOfWeek == DayOfWeek.Friday;
|
||||
x.IsHoliday = holidays.Any(y => y.HolidaydateGr == x.DateTimeGr);
|
||||
x.IsBirthDay = workshopId == 170 && pc.GetMonth(x.DateTimeGr) == pc.GetMonth(birthDay) && pc.GetDayOfMonth(x.DateTimeGr) == pc.GetDayOfMonth(birthDay);
|
||||
});
|
||||
|
||||
var resultItem = new PersonnelCheckoutDailyRollCallViewModel()
|
||||
{
|
||||
EmployeeId = employeeId,
|
||||
WorkshopId = workshopId,
|
||||
DailyRollCalls = checkoutDailyRollCalls
|
||||
};
|
||||
result.Add(resultItem);
|
||||
|
||||
}
|
||||
|
||||
return result;
|
||||
|
||||
}
|
||||
|
||||
//حضور غیاب گروهی از پرسنل برای پرینت گروهی فیش حقوقی غیر رسمی نهایی
|
||||
public List<PersonnelCheckoutDailyRollCallViewModel> GetEmployeeRollCallsForMonthForKababMahdi(IEnumerable<long> employeeIds, long workshopId, DateTime start, DateTime end)
|
||||
{
|
||||
|
||||
|
||||
|
||||
var rollCalls = _context.RollCalls.Where(x =>
|
||||
employeeIds.Contains(x.EmployeeId) && workshopId == x.WorkshopId && x.StartDate != null &&
|
||||
x.EndDate != null && x.RollCallModifyType != RollCallModifyType.Undefined &&
|
||||
x.ShiftDate.Date >= start && x.ShiftDate.Date <= end).ToList();
|
||||
|
||||
var leaves = _context.LeaveList.Where(x =>
|
||||
x.WorkshopId == workshopId && employeeIds.Contains(x.EmployeeId) && x.EndLeave.Date >= start.Date &&
|
||||
x.StartLeave.Date <= end.Date).ToList();
|
||||
|
||||
var employees = _context.Employees.Where(x => employeeIds.Contains(x.id)).Select(x => new { Id = x.id, x.DateOfBirth }).ToList();
|
||||
var year = Convert.ToInt32(start.ToFarsi().Substring(0, 4));
|
||||
var month = Convert.ToInt32(start.ToFarsi().Substring(5, 2));
|
||||
var firstDayOfCurrentMonth = new DateTime(year, month, 1, new PersianCalendar());
|
||||
|
||||
|
||||
if (month == 12)
|
||||
{
|
||||
year += 1;
|
||||
month = 1;
|
||||
}
|
||||
else
|
||||
month += 1;
|
||||
|
||||
var nextMonthDate = new DateTime(year, month, 1, new PersianCalendar());
|
||||
|
||||
var lastDayOfCurrentMonth = nextMonthDate.AddDays(-1);
|
||||
|
||||
int dateRange = (int)(lastDayOfCurrentMonth - firstDayOfCurrentMonth).TotalDays + 1;
|
||||
var employeeSettingsList =
|
||||
_context.CustomizeWorkshopEmployeeSettings.AsSplitQuery().Where(x => x.WorkshopId == workshopId).ToList();
|
||||
var holidays = _holidayItemApplication.Search(new HolidayItemSearchModel()
|
||||
{
|
||||
HolidayYear = start.ToFarsiYear()
|
||||
});
|
||||
//all the dates from start to end, to be compared with present days to get absent dates
|
||||
var completeDaysList = Enumerable.Range(0, dateRange).Select(offset => start.AddDays(offset).Date).ToList();
|
||||
PersianCalendar pc = new();
|
||||
|
||||
List<PersonnelCheckoutDailyRollCallViewModel> result = new();
|
||||
foreach (var employeeId in employeeIds)
|
||||
{
|
||||
var settings = employeeSettingsList.FirstOrDefault(x => x.EmployeeId == employeeId);
|
||||
var worksInFriday = settings.FridayWork != FridayWork.Default;
|
||||
var worksInHolidays = settings.HolidayWork != HolidayWork.Default;
|
||||
var birthDay = employees.First(x => x.Id == employeeId).DateOfBirth;
|
||||
var absentRecords = completeDaysList.Where(x =>
|
||||
!rollCalls.Any(y => y.EmployeeId == employeeId && x.Date.Date == y.ShiftDate.Date))
|
||||
.Select(x =>
|
||||
{
|
||||
var leave = leaves.FirstOrDefault(y =>
|
||||
y.EmployeeId == employeeId && y.EndLeave.Date >= x.Date && y.StartLeave.Date <= x.Date);
|
||||
var isHoliday = holidays.Any(y => y.HolidaydateGr == x.Date);
|
||||
var isFriday = x.Date.DayOfWeek == DayOfWeek.Friday;
|
||||
var isBirthday = pc.GetMonth(x) == pc.GetMonth(birthDay) && pc.GetDayOfMonth(x) == pc.GetDayOfMonth(birthDay);
|
||||
var isNormalWorkingDay = isHoliday == false && isFriday == false;
|
||||
return new CheckoutDailyRollCallViewModel()
|
||||
{
|
||||
StartDate1 = null,
|
||||
EndDate1 = null,
|
||||
DateTimeGr = x.Date,
|
||||
DayOfWeek = x.Date.DayOfWeek.ToString(),
|
||||
RollCallDateFa = x.Date.ToFarsi(),
|
||||
LeaveType = leave != null ? leave.LeaveType : "",
|
||||
IsAbsent = leave == null && (isNormalWorkingDay ||
|
||||
(worksInFriday && x.Date.DayOfWeek == DayOfWeek.Friday) ||
|
||||
(worksInHolidays && isHoliday)),
|
||||
IsBirthDay = isBirthday
|
||||
};
|
||||
});
|
||||
var presentDays = rollCalls.Where(x => x.EmployeeId == employeeId).GroupBy(x => x.ShiftDate.Date).Select(x =>
|
||||
{
|
||||
var orderedRollcalls = x.OrderBy(y => y.StartDate!.Value).ToList();
|
||||
return new CheckoutDailyRollCallViewModel()
|
||||
{
|
||||
StartDate1 = orderedRollcalls.FirstOrDefault()?.StartDate?.ToString("HH:mm"),
|
||||
EndDate1 = orderedRollcalls.FirstOrDefault()?.EndDate?.ToString("HH:mm"),
|
||||
|
||||
StartDate2 = orderedRollcalls.Skip(1).FirstOrDefault()?.StartDate?.ToString("HH:mm") ?? "",
|
||||
EndDate2 = orderedRollcalls.Skip(1).FirstOrDefault()?.EndDate?.ToString("HH:mm") ?? "",
|
||||
|
||||
TotalhourseSpan =
|
||||
new TimeSpan(x.Where(y => y.EndDate != null).Sum(y => (y.EndDate - y.StartDate)!.Value.Ticks)),
|
||||
DayOfWeek = x.Key.DayOfWeek.DayOfWeeKToPersian(),
|
||||
RollCallDateFa = x.Key.Date.ToFarsi(),
|
||||
DateTimeGr = x.Key.Date,
|
||||
IsSliced = x.Count() > 2,
|
||||
IsAbsent = false,
|
||||
IsBirthDay = pc.GetMonth(x.Key) == pc.GetMonth(birthDay) && pc.GetDayOfMonth(x.Key) == pc.GetDayOfMonth(birthDay)
|
||||
};
|
||||
});
|
||||
presentDays = presentDays.Select(x => new CheckoutDailyRollCallViewModel
|
||||
{
|
||||
StartDate1 = x.StartDate1,
|
||||
EndDate1 = x.EndDate1,
|
||||
EndDate2 = x.EndDate2,
|
||||
StartDate2 = x.StartDate2,
|
||||
TotalWorkingHours = $"{(int)(x.TotalhourseSpan.TotalHours)}:{x.TotalhourseSpan.Minutes.ToString("00")}",
|
||||
DayOfWeek = x.DayOfWeek,
|
||||
RollCallDateFa = x.RollCallDateFa,
|
||||
DateTimeGr = x.DateTimeGr,
|
||||
IsSliced = x.IsSliced,
|
||||
IsAbsent = false,
|
||||
IsBirthDay = x.IsBirthDay
|
||||
});
|
||||
|
||||
List<CheckoutDailyRollCallViewModel> checkoutDailyRollCalls = presentDays.Concat(absentRecords).OrderBy(x => x.DateTimeGr).ToList();
|
||||
|
||||
checkoutDailyRollCalls.ForEach(x =>
|
||||
{
|
||||
x.IsFriday = x.DateTimeGr.DayOfWeek == DayOfWeek.Friday;
|
||||
x.IsHoliday = holidays.Any(y => y.HolidaydateGr == x.DateTimeGr);
|
||||
});
|
||||
var resultItem = new PersonnelCheckoutDailyRollCallViewModel()
|
||||
{
|
||||
EmployeeId = employeeId,
|
||||
WorkshopId = workshopId,
|
||||
DailyRollCalls = checkoutDailyRollCalls
|
||||
};
|
||||
result.Add(resultItem);
|
||||
}
|
||||
|
||||
|
||||
return result;
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user