Checkout bug fixed

This commit is contained in:
SamSys
2025-02-22 05:28:35 +03:30
parent 1607bdb060
commit ffd9abd8d2
21 changed files with 1278 additions and 500 deletions

View File

@@ -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;
}
}