add new metods in workFlow to CreateChekout

This commit is contained in:
SamSys
2025-06-25 04:48:12 +03:30
parent b5afc9eef0
commit f0547828a6
3 changed files with 401 additions and 211 deletions

View File

@@ -703,10 +703,10 @@ public class IndexModel : PageModel
DateTime lastMonthEnd = ($"{DateTime.Now.ToFarsi().Substring(0, 8)}01").ToGeorgianDateTime().AddDays(-1);
if (lastMonthEnd == endSearch)
{
var countWorkFlowCut = (await _workFlowApplication.GetCountCutRollCallByBgService(WorkshopId));
var countWorkFlowAbsent = (await _workFlowApplication.GetAbsentRollCallWorkFlows(WorkshopId)).Count();
var countWorkFlowLunchBreak = (await _workFlowApplication.GetEmployeesWithoutLunchBreak(WorkshopId)).Count();
var countUndefinedRollCalls = (await _workFlowApplication.GetUndefinedRollCalls(WorkshopId)).Count();
var countWorkFlowCut = await _workFlowApplication.CountCutByBgServiceLastMonth(WorkshopId);
var countWorkFlowAbsent = await _workFlowApplication.CountAbsentRollCallLastMonth(WorkshopId);
var countWorkFlowLunchBreak = await _workFlowApplication.CountEmployeesWithoutLunchBreakLastMonth(WorkshopId);
var countUndefinedRollCalls = await _workFlowApplication.CountUndefinedLastMonth(WorkshopId);
hasWorkFlow = countWorkFlowCut > 0 || countWorkFlowAbsent > 0 || countWorkFlowLunchBreak > 0 ||
countUndefinedRollCalls > 0;

View File

@@ -36,6 +36,40 @@ public interface IWorkFlowApplication
Task<List<DailyRollCallWorkFlowViewModel>> GetUndefinedRollCalls(long workshopId);
#region CountWorkFlowForCheckout
/// <summary>
/// شمارنده کات شده توسط سیستم کارپوشه
/// برای ایجاد تصفیه حساب
/// </summary>
/// <param name="workshopId"></param>
/// <returns></returns>
Task<int> CountCutByBgServiceLastMonth(long workshopId);
/// <summary>
/// شمارنده غیبت کارپوشه
/// برای ایجاد تصفیه حساب
/// </summary>
/// <param name="workshopId"></param>
/// <returns></returns>
Task<int> CountAbsentRollCallLastMonth(long workshopId);
/// <summary>
/// شمارنده عدم ثبت استراحت کارپوشه
/// برای ایجاد تصفیه حساب
/// </summary>
/// <param name="workshopId"></param>
/// <returns></returns>
Task<int> CountEmployeesWithoutLunchBreakLastMonth(long workshopId);
/// <summary>
/// شمارنده ثبت نامشخص کارپوشه
/// برای ایجاد تصفیه حساب
/// </summary>
/// <param name="workshopId"></param>
/// <returns></returns>
Task<int> CountUndefinedLastMonth(long workshopId);
#endregion
Task<List<DailyRollCallConfirmedWithoutLunchBreakViewModel>> GetEmployeesWithoutLunchBreak(long workshopId);
Task<List<(long Id, string Name)>> GetEmployeesWithoutGroup(long workshopId);

View File

@@ -65,10 +65,10 @@ public class WorkFlowApplication : IWorkFlowApplication
return op.Succcedded();
}
public async Task<int> GetCountAllWorkFlows(long workshopId,long accountId)
public async Task<int> GetCountAllWorkFlows(long workshopId, long accountId)
{
int count = 0;
count += await GetAllWorkFlowCount(workshopId,accountId);
count += await GetAllWorkFlowCount(workshopId, accountId);
return count;
}
public Task<int> GetRollCallAbsentsWorkFlows(long workshopId)
@@ -86,14 +86,14 @@ public class WorkFlowApplication : IWorkFlowApplication
public async Task<int> GetAllWorkFlowCount(long workshopId,long accountId)
public async Task<int> GetAllWorkFlowCount(long workshopId, long accountId)
{
var count = 0;
// RollCall
count += await GetAllRollCallCount(workshopId);
count += await GetAllEmployeeDocuments(workshopId,accountId );
count += await GetAllEmployeeDocuments(workshopId, accountId);
// Employee Documents
@@ -193,7 +193,7 @@ public class WorkFlowApplication : IWorkFlowApplication
FilterWithOffset(workshopId, date,ref newItem);
FilterWithOffset(workshopId, date, ref newItem);
newItem.DayOfWeekFa = newItem.DateTime.DayOfWeek.DayOfWeeKToPersian();
@@ -201,9 +201,9 @@ public class WorkFlowApplication : IWorkFlowApplication
return newItem;
}
private void FilterWithOffset(long workshopId, DateTime date,ref DailyRollCallWorkFlowViewModel dailyRollCall)
private void FilterWithOffset(long workshopId, DateTime date, ref DailyRollCallWorkFlowViewModel dailyRollCall)
{
if(date.Date == DateTime.Now.Date.AddDays(-1))
if (date.Date == DateTime.Now.Date.AddDays(-1))
{
foreach (var item in dailyRollCall.RollCallWorkFlowPerDayViewModels.ToList())
{
@@ -464,6 +464,162 @@ public class WorkFlowApplication : IWorkFlowApplication
.OrderBy(x => x.DateTime).ToList();
}
#region CountForCreateCheckout
public async Task<int> CountCutByBgServiceLastMonth(long workshopId)
{
DateTime lastMonthEnd = ($"{DateTime.Now.ToFarsi().Substring(0, 8)}01").ToGeorgianDateTime().AddDays(-1);
var now = lastMonthEnd;
var twoMonthsAgo = ($"{lastMonthEnd.ToFarsi().Substring(0, 8)}01").ToGeorgianDateTime();
var lastCheckouts = _checkoutACL.GetLastCheckoutsByWorkshopIdForWorkFlow(workshopId, twoMonthsAgo, now);
var rollCalls = _rollCallACL.GetRollCallWorkFlowsCutByBgService(workshopId, twoMonthsAgo, now.AddDays(-1).Date);
var activeEmployees = _rollCallACL.GetActiveWorkshopRollCallEmployees(workshopId, twoMonthsAgo, now);
return rollCalls.Select(x => new DailyRollCallWorkFlowViewModel()
{
DateTime = x.DateTime,
DateTimeFa = x.DateTimeFa,
RollCallWorkFlowPerDayViewModels = x.RollCallWorkFlowPerDayViewModels
.Where(y => !lastCheckouts.Any(z => z.EmployeeId == y.EmployeeId && z.CheckoutStart.Date <= x.DateTime.Date &&
z.CheckoutEnd.Date >= x.DateTime.Date) && activeEmployees.Any(z => z.EmployeeId == y.EmployeeId && x.DateTime.Date >= z.startActive &&
x.DateTime.Date <= z.endActive))
.ToList(),
DayOfWeekFa = x.DateTime.DayOfWeek.DayOfWeeKToPersian()
}).Where(y => y.RollCallWorkFlowPerDayViewModels != null && y.RollCallWorkFlowPerDayViewModels.Any())
.OrderBy(x => x.DateTime).Count();
}
/// <summary>
/// لیست غیبت ها
/// </summary>
public async Task<int> CountAbsentRollCallLastMonth(long workshopId)
{
DateTime lastMonthEnd = ($"{DateTime.Now.ToFarsi().Substring(0, 8)}01").ToGeorgianDateTime().AddDays(-1);
var now = lastMonthEnd;
var twoMonthsAgo = ($"{lastMonthEnd.ToFarsi().Substring(0, 8)}01").ToGeorgianDateTime();
var lastCheckouts = _checkoutACL.GetLastCheckoutsByWorkshopIdForWorkFlow(workshopId, twoMonthsAgo, now);
var absences = _rollCallACL.GetAbsentRollCallWorkFlows(workshopId, twoMonthsAgo, now.AddDays(-1).Date);
var activeEmployees = _rollCallACL.GetActiveWorkshopRollCallEmployees(workshopId, twoMonthsAgo, now);
var confirmedAbssences = await GetConfirmAbsencesBy(workshopId, twoMonthsAgo,
now);
var groupedConfirmedAbssencesByDate = confirmedAbssences.GroupBy(x => x.AbsenceDate.Date).ToList();
List<DailyRollCallWorkFlowViewModel> result = new();
//iterating day by day in absences
foreach (var item in absences)
{
var allAbsencesInDate = item.RollCallWorkFlowPerDayViewModels;
var confirmedAbssencesInDate = groupedConfirmedAbssencesByDate.FirstOrDefault(x => x.Key == item.DateTime.Date);
//set the date of new item
var newItem = new DailyRollCallWorkFlowViewModel()
{
DateTime = item.DateTime,
DateTimeFa = item.DateTime.ToFarsi()
};
//dont count absences before the last checkout
allAbsencesInDate = allAbsencesInDate.Where(x => !lastCheckouts.Any(y =>
x.EmployeeId == y.EmployeeId && y.CheckoutStart <= item.DateTime.Date && y.CheckoutEnd >= item.DateTime.Date) && activeEmployees.Any(y =>
item.DateTime.Date >= y.startActive && item.DateTime.Date <= y.endActive)).ToList();
if (confirmedAbssencesInDate != null)
{
newItem.RollCallWorkFlowPerDayViewModels = allAbsencesInDate
.Where(x => confirmedAbssencesInDate.All(y => x.EmployeeId != y.EmployeeId))
.ToList();
}
else
{
newItem.RollCallWorkFlowPerDayViewModels = allAbsencesInDate.ToList();
}
newItem.DayOfWeekFa = newItem.DateTime.DayOfWeek.DayOfWeeKToPersian();
FilterWithOffset(workshopId, item.DateTime, ref newItem);
if (newItem.RollCallWorkFlowPerDayViewModels.Count > 0)
result.Add(newItem);
}
return result.OrderByDescending(x => x.DateTime).Count();
}
public async Task<int> CountEmployeesWithoutLunchBreakLastMonth(long workshopId)
{
DateTime lastMonthEnd = ($"{DateTime.Now.ToFarsi().Substring(0, 8)}01").ToGeorgianDateTime().AddDays(-1);
var now = lastMonthEnd;
var twoMonthsAgo = ($"{lastMonthEnd.ToFarsi().Substring(0, 8)}01").ToGeorgianDateTime();
var lastCheckouts = _checkoutACL.GetLastCheckoutsByWorkshopIdForWorkFlow(workshopId, twoMonthsAgo, now);
var notSlicedRollCalls = _rollCallACL.GetNotSlicedRollCallsByWorkshopId(workshopId, twoMonthsAgo, now.AddDays(-1).Date);
var employeesWithoutBreakTime = _customizedWorkshopSettingsACL.GetEmployeesWithoutBreakTime(workshopId);
notSlicedRollCalls = notSlicedRollCalls
.Where(x => !lastCheckouts.Any(y => y.EmployeeId == x.EmployeeId && y.CheckoutStart.Date <= x.RollCallDate.Date && y.CheckoutEnd.Date >= x.RollCallDate.Date)).ToList();
var employeeWithoutBreakTimeAndNotSliced = notSlicedRollCalls
.Join(employeesWithoutBreakTime, x => x.EmployeeId,
y => y.EmployeeId, (x, y) =>
new { y.EmployeeId, x.EmployeeName, x.RollCallId, x.RollCallDate }).ToList();
var entites = _rollCallConfirmedWithoutLunchBreakRepository.GetByWorkshopId(workshopId, twoMonthsAgo, now).ToList();
return employeeWithoutBreakTimeAndNotSliced.Where(x => !entites.Any(y => y.RollCallId == x.RollCallId))
.GroupBy(x => x.RollCallDate.Date).OrderBy(x => x.Key).Select(x => new DailyRollCallConfirmedWithoutLunchBreakViewModel
{
DateGr = x.Key.Date,
DateFa = x.Key.Date.ToFarsi(),
DayOfWeekFa = x.Key.DayOfWeek.DayOfWeeKToPersian(),
RollCallConfirmedWithoutLunchList = x.Select(y => new RollCallConfirmedWithoutLunchBreakViewModel
{
EmployeeId = y.EmployeeId,
EmployeeName = y.EmployeeName,
RollCallId = y.RollCallId,
}).ToList()
}).Count();
}
public async Task<int> CountUndefinedLastMonth(long workshopId)
{
DateTime lastMonthEnd = ($"{DateTime.Now.ToFarsi().Substring(0, 8)}01").ToGeorgianDateTime().AddDays(-1);
var now = lastMonthEnd;
var twoMonthsAgo = ($"{lastMonthEnd.ToFarsi().Substring(0, 8)}01").ToGeorgianDateTime();
var lastCheckouts = _checkoutACL.GetLastCheckoutsByWorkshopIdForWorkFlow(workshopId, twoMonthsAgo, now);
List<DailyRollCallWorkFlowViewModel> rollCalls = _rollCallACL.GetUndefinedRollCalls(workshopId, twoMonthsAgo, now.AddDays(-1).Date);
var activeEmployees = _rollCallACL.GetActiveWorkshopRollCallEmployees(workshopId, twoMonthsAgo, now);
return rollCalls.Select(x => new DailyRollCallWorkFlowViewModel()
{
DateTime = x.DateTime,
DateTimeFa = x.DateTimeFa,
RollCallWorkFlowPerDayViewModels = x.RollCallWorkFlowPerDayViewModels
.Where(y =>
!lastCheckouts.Any(z => z.EmployeeId == y.EmployeeId && z.CheckoutStart.Date <= x.DateTime.Date &&
z.CheckoutEnd.Date >= x.DateTime.Date) &&
activeEmployees.Any(z => z.EmployeeId == y.EmployeeId && x.DateTime.Date >= z.startActive &&
x.DateTime.Date <= z.endActive))
.ToList(),
DayOfWeekFa = x.DateTime.DayOfWeek.DayOfWeeKToPersian()
}).Where(y => y.RollCallWorkFlowPerDayViewModels != null && y.RollCallWorkFlowPerDayViewModels.Any()).OrderBy(x => x.DateTime).Count();
}
#endregion
/// <summary>
/// لیست غیبت ها
/// </summary>
@@ -520,7 +676,7 @@ public class WorkFlowApplication : IWorkFlowApplication
}
newItem.DayOfWeekFa = newItem.DateTime.DayOfWeek.DayOfWeeKToPersian();
FilterWithOffset(workshopId,item.DateTime,ref newItem);
FilterWithOffset(workshopId, item.DateTime, ref newItem);
if (newItem.RollCallWorkFlowPerDayViewModels.Count > 0)
result.Add(newItem);