From c81da3e7874c09e13babd2f90dfdc742f36c60b7 Mon Sep 17 00:00:00 2001 From: SamSys Date: Sat, 31 May 2025 21:05:01 +0330 Subject: [PATCH 1/2] started --- .../IRollCallMandatoryRepository.cs | 14 +++- .../Repository/RollCallMandatoryRepository.cs | 55 +++++++++++++++- .../Repository/YearlySalaryRepository.cs | 65 ++++++++++++++++++- 3 files changed, 130 insertions(+), 4 deletions(-) diff --git a/Company.Domain/RollCallAgg/IRollCallMandatoryRepository.cs b/Company.Domain/RollCallAgg/IRollCallMandatoryRepository.cs index d6014c3d..2f131c5a 100644 --- a/Company.Domain/RollCallAgg/IRollCallMandatoryRepository.cs +++ b/Company.Domain/RollCallAgg/IRollCallMandatoryRepository.cs @@ -16,7 +16,19 @@ namespace Company.Domain.RollCallAgg; public interface IRollCallMandatoryRepository : IRepository { ComputingViewModel MandatoryCompute(long employeeId, long workshopId, DateTime contractStart, DateTime contractEnd, CreateWorkingHoursTemp command, bool holidayWorking, bool isStaticCheckout); - TimeSpan AfterSubtract(CreateWorkingHoursTemp command, TimeSpan sumOneDaySpan, DateTime creationDate); + + /// + /// محاسبه ساعات کارکرد پرسنل در صورت داشتن حضور غیاب + /// + /// + /// + /// + /// + /// + (bool hasRollCall, TimeSpan sumOfSpan) GetRollCallWorkingSpan(long employeeId, long workshopId, + DateTime contractStart, DateTime contractEnd); + + TimeSpan AfterSubtract(CreateWorkingHoursTemp command, TimeSpan sumOneDaySpan, DateTime creationDate); List RotatingShiftCheck(List rollCallList); diff --git a/CompanyManagment.EFCore/Repository/RollCallMandatoryRepository.cs b/CompanyManagment.EFCore/Repository/RollCallMandatoryRepository.cs index e8ba94f1..3fd4fac8 100644 --- a/CompanyManagment.EFCore/Repository/RollCallMandatoryRepository.cs +++ b/CompanyManagment.EFCore/Repository/RollCallMandatoryRepository.cs @@ -33,6 +33,7 @@ using CompanyManagment.App.Contracts.Reward.Enums; using static System.Runtime.InteropServices.JavaScript.JSType; using static Microsoft.EntityFrameworkCore.DbLoggerCategory.Database; using Company.Domain.HolidayItemAgg; +using Company.Domain.RollCallEmployeeAgg; using PersianTools.Core; @@ -49,6 +50,7 @@ public class RollCallMandatoryRepository : RepositoryBase, IRoll private readonly TestDbContext _testDbContext; + public RollCallMandatoryRepository(CompanyContext context, IYearlySalaryRepository yearlySalaryRepository, ILeftWorkRepository leftWorkRepository, ILeaveRepository leaveRepository, IHolidayItemRepository holidayItemRepository, TestDbContext testDbContext) : base(context) { @@ -58,7 +60,8 @@ public class RollCallMandatoryRepository : RepositoryBase, IRoll _leaveRepository = leaveRepository; _holidayItemRepository = holidayItemRepository; _testDbContext = testDbContext; - } + + } #region OfficialChckout public ComputingViewModel MandatoryCompute(long employeeId, long workshopId, DateTime contractStart, @@ -724,6 +727,55 @@ public class RollCallMandatoryRepository : RepositoryBase, IRoll return res; } + + /// + /// محاسبه ساعات کارکرد پرسنل در صورت داشتن حضور غیاب + /// + /// + /// + /// + /// + /// + public (bool hasRollCall, TimeSpan sumOfSpan) GetRollCallWorkingSpan(long employeeId, long workshopId, + DateTime contractStart, DateTime contractEnd) + { + //bool hasRollcall = + // _rollCallEmployeeRepository.HasRollCallRecord(employeeId, workshopId, contractStart, contractEnd); + //if (!hasRollcall) + // return (false, new TimeSpan()); + List rollCallResult; + List groupedRollCall; + + + rollCallResult = _context.RollCalls.Where(x => + x.EmployeeId == employeeId && x.WorkshopId == workshopId && x.StartDate.Value.Date >= contractStart.Date && + x.StartDate.Value.Date <= contractEnd.Date && x.EndDate != null).Select(x => new RollCallViewModel() + { + StartDate = x.StartDate, + EndDate = x.EndDate, + ShiftSpan = (x.EndDate.Value - x.StartDate.Value), + CreationDate = x.ShiftDate, + BreakTimeSpan = x.BreakTimeSpan + }).ToList(); + + groupedRollCall = rollCallResult.GroupBy(x => x.CreationDate.Date).Select(x => new GroupedRollCalls() + { + CreationDate = x.Key, + ShiftList = x.Select(s => new ShiftList() { Start = s.StartDate!.Value, End = s.EndDate!.Value }).ToList(), + HasFriday = x.Any(s => s.StartDate != null && s.EndDate != null && (s.StartDate.Value.DayOfWeek == DayOfWeek.Friday || s.EndDate.Value!.DayOfWeek == DayOfWeek.Friday)), + SumOneDaySpan = new TimeSpan(x.Sum(shift => shift.ShiftSpan.Ticks)) - CalculateBreakTime(x.First().BreakTimeSpan, + new TimeSpan(x.Sum(shift => shift.ShiftSpan.Ticks))), + + BreakTime = CalculateBreakTime(x.First().BreakTimeSpan, new TimeSpan(x.Sum(shift => shift.ShiftSpan.Ticks))), + + }).OrderBy(x => x.CreationDate).ToList(); + + + TimeSpan sumSpans = new TimeSpan(groupedRollCall.Sum(x => x.SumOneDaySpan.Ticks)); + return (true, sumSpans); + } + + public async Task RotatingShiftReport(long workshopId, long employeeId, DateTime contractStart, DateTime contractEnd, string shiftwork, bool hasRollCall, CreateWorkingHoursTemp command, bool holidayWorking) { List rollCallResult = new List(); @@ -2263,6 +2315,7 @@ public class RollCallMandatoryRepository : RepositoryBase, IRoll #endregion + #region CustomizeCheckout /// diff --git a/CompanyManagment.EFCore/Repository/YearlySalaryRepository.cs b/CompanyManagment.EFCore/Repository/YearlySalaryRepository.cs index e1a3a393..bc8889e2 100644 --- a/CompanyManagment.EFCore/Repository/YearlySalaryRepository.cs +++ b/CompanyManagment.EFCore/Repository/YearlySalaryRepository.cs @@ -8,10 +8,13 @@ using _0_Framework.Application; using _0_Framework.InfraStructure; using Company.Domain.LeftWorkAgg; using Company.Domain.MandatoryHoursAgg; +using Company.Domain.RollCallAgg; +using Company.Domain.RollCallEmployeeAgg; using Company.Domain.YearlySalaryAgg; using CompanyManagment.App.Contracts.Checkout; using CompanyManagment.App.Contracts.Holiday; using CompanyManagment.App.Contracts.LeftWork; +using CompanyManagment.App.Contracts.RollCall; using CompanyManagment.App.Contracts.YearlySalary; using CompanyManagment.EFCore.Migrations; using Microsoft.AspNetCore.Mvc.RazorPages; @@ -27,13 +30,16 @@ public class YearlySalaryRepository : RepositoryBase, IYearl private readonly CompanyContext _context; private readonly ILeftWorkRepository _leftWorkRepository; private readonly IMandatoryHoursRepository _mandatoryHoursRepository; + private readonly IRollCallEmployeeRepository _rollCallEmployeeRepository; - public YearlySalaryRepository(CompanyContext context, ILeftWorkRepository leftWorkRepository, IMandatoryHoursRepository mandatoryHoursRepository) : base(context) + + public YearlySalaryRepository(CompanyContext context, ILeftWorkRepository leftWorkRepository, IMandatoryHoursRepository mandatoryHoursRepository, IRollCallEmployeeRepository rollCallEmployeeRepository) : base(context) { _context = context; _leftWorkRepository = leftWorkRepository; _mandatoryHoursRepository = mandatoryHoursRepository; + _rollCallEmployeeRepository = rollCallEmployeeRepository; } // لیست سال های برای دراپ دان #region GetYearsToDropDown @@ -2229,7 +2235,12 @@ public class YearlySalaryRepository : RepositoryBase, IYearl return result; } - + private static TimeSpan CalculateBreakTime(TimeSpan breakTimeSpan, TimeSpan sumOneDaySpan) + { + if (breakTimeSpan * 2 >= sumOneDaySpan) + return new TimeSpan(); + return breakTimeSpan; ; + } public List LeftWorkCantoleaveList(DateTime startDate, DateTime endDate, long workshopId, long employeeId, bool hasleft, DateTime leftWorkDate, int fridayStartToEnd, int officialHoliday, string totalHoursH, string totalHorsM, DateTime separationStartDate) { // {مقدار ساعت مجاز مرخصی در برای یک روز{کامل @@ -2238,6 +2249,7 @@ public class YearlySalaryRepository : RepositoryBase, IYearl var allContractsBetween = _context.Contracts.AsSplitQuery().Include(x => x.WorkingHoursList) .Where(x => x.WorkshopIds == workshopId && x.EmployeeId == employeeId && x.ContractEnd >= startDate && x.ContarctStart <= endDate).ToList(); + int mandatoryDays = 0; double allCanToLeave = 0; double canToLeave = 0; @@ -2247,11 +2259,14 @@ public class YearlySalaryRepository : RepositoryBase, IYearl contractCounter += 1; var m = _mandatoryHoursRepository.GetMondatoryDays(contract.ContarctStart, contract.ContractEnd); + var workinghoursH = contract.WorkingHoursList.Select(x => x.TotalHoursesH).FirstOrDefault(); var workinghoursM = contract.WorkingHoursList.Select(x => x.TotalHoursesM).FirstOrDefault(); workinghoursM = string.IsNullOrWhiteSpace(workinghoursM) ? "0" : workinghoursM; var workingHoursHDouble = Convert.ToDouble(workinghoursH); var workingHoursMDouble = Convert.ToDouble(workinghoursM); + + if (workingHoursMDouble > 0) { //تبیدل دقیه به اعشار @@ -2259,6 +2274,52 @@ public class YearlySalaryRepository : RepositoryBase, IYearl } //کل ساعت کار پرسنل در این ماه var totalWorkingHours = workingHoursHDouble + workingHoursMDouble; + + #region RollCallSpan + + var contractTotallDays = Convert.ToInt32((contract.ContractEnd - contract.ContarctStart).TotalDays + 1); + if (contractTotallDays <= 31) + { + var hasRollCall = _rollCallEmployeeRepository.HasRollCallRecord(employeeId, workshopId, + contract.ContarctStart.Date, contract.ContractEnd.Date); + if (hasRollCall) + { + List rollCallResult; + List groupedRollCall; + + + rollCallResult = _context.RollCalls.Where(x => + x.EmployeeId == employeeId && x.WorkshopId == workshopId && x.StartDate.Value.Date >= contract.ContarctStart.Date && + x.StartDate.Value.Date <= contract.ContractEnd.Date && x.EndDate != null).Select(x => new RollCallViewModel() + { + StartDate = x.StartDate, + EndDate = x.EndDate, + ShiftSpan = (x.EndDate.Value - x.StartDate.Value), + CreationDate = x.ShiftDate, + BreakTimeSpan = x.BreakTimeSpan + }).ToList(); + + groupedRollCall = rollCallResult.GroupBy(x => x.CreationDate.Date).Select(x => new GroupedRollCalls() + { + CreationDate = x.Key, + ShiftList = x.Select(s => new ShiftList() { Start = s.StartDate!.Value, End = s.EndDate!.Value }).ToList(), + HasFriday = x.Any(s => s.StartDate != null && s.EndDate != null && (s.StartDate.Value.DayOfWeek == DayOfWeek.Friday || s.EndDate.Value!.DayOfWeek == DayOfWeek.Friday)), + SumOneDaySpan = new TimeSpan(x.Sum(shift => shift.ShiftSpan.Ticks)) - CalculateBreakTime(x.First().BreakTimeSpan, + new TimeSpan(x.Sum(shift => shift.ShiftSpan.Ticks))), + + + + }).OrderBy(x => x.CreationDate).ToList(); + + + TimeSpan sumSpans = new TimeSpan(groupedRollCall.Sum(x => x.SumOneDaySpan.Ticks)); + totalWorkingHours = sumSpans.TotalMinutes / 60; + } + + + } + + #endregion // میانگین ساعت کارکرد پرسنل در روز var workingHoursePerDay = totalWorkingHours / m.MoandatoryDays; From 2208834a0ef9eb8bc521b0137f2b6fc906d24b2d Mon Sep 17 00:00:00 2001 From: SamSys Date: Mon, 2 Jun 2025 13:33:21 +0330 Subject: [PATCH 2/2] refactor LeavePayMetotds --- .../Repository/YearlySalaryRepository.cs | 98 ++++++++++++------- 1 file changed, 64 insertions(+), 34 deletions(-) diff --git a/CompanyManagment.EFCore/Repository/YearlySalaryRepository.cs b/CompanyManagment.EFCore/Repository/YearlySalaryRepository.cs index bc8889e2..6187a5ec 100644 --- a/CompanyManagment.EFCore/Repository/YearlySalaryRepository.cs +++ b/CompanyManagment.EFCore/Repository/YearlySalaryRepository.cs @@ -2241,6 +2241,50 @@ public class YearlySalaryRepository : RepositoryBase, IYearl return new TimeSpan(); return breakTimeSpan; ; } + + private (bool hasRollCall, double WorkingTotalHours) GetTotalWorkingHoursIfHasRollCall(long employeeId,long workshopId, DateTime contractStart, DateTime contractEnd) + { + bool hasRollCall = _rollCallEmployeeRepository.HasRollCallRecord(employeeId, workshopId, + contractStart, contractEnd); + double totalWorkingHours = 0; + if (!hasRollCall) + return (false, 0); + + List rollCallResult; + List groupedRollCall; + + + rollCallResult = _context.RollCalls.Where(x => + x.EmployeeId == employeeId && x.WorkshopId == workshopId && x.StartDate.Value.Date >= contractStart && + x.StartDate.Value.Date <= contractEnd && x.EndDate != null).Select(x => new RollCallViewModel() + { + StartDate = x.StartDate, + EndDate = x.EndDate, + ShiftSpan = (x.EndDate.Value - x.StartDate.Value), + CreationDate = x.ShiftDate, + BreakTimeSpan = x.BreakTimeSpan + }).ToList(); + + groupedRollCall = rollCallResult.GroupBy(x => x.CreationDate.Date).Select(x => new GroupedRollCalls() + { + CreationDate = x.Key, + ShiftList = x.Select(s => new ShiftList() { Start = s.StartDate!.Value, End = s.EndDate!.Value }).ToList(), + HasFriday = x.Any(s => s.StartDate != null && s.EndDate != null && (s.StartDate.Value.DayOfWeek == DayOfWeek.Friday || s.EndDate.Value!.DayOfWeek == DayOfWeek.Friday)), + SumOneDaySpan = new TimeSpan(x.Sum(shift => shift.ShiftSpan.Ticks)) - CalculateBreakTime(x.First().BreakTimeSpan, + new TimeSpan(x.Sum(shift => shift.ShiftSpan.Ticks))), + + + + }).OrderBy(x => x.CreationDate).ToList(); + + + TimeSpan sumSpans = new TimeSpan(groupedRollCall.Sum(x => x.SumOneDaySpan.Ticks)); + totalWorkingHours = sumSpans.TotalMinutes / 60; + + return (true, totalWorkingHours); + + + } public List LeftWorkCantoleaveList(DateTime startDate, DateTime endDate, long workshopId, long employeeId, bool hasleft, DateTime leftWorkDate, int fridayStartToEnd, int officialHoliday, string totalHoursH, string totalHorsM, DateTime separationStartDate) { // {مقدار ساعت مجاز مرخصی در برای یک روز{کامل @@ -2280,43 +2324,13 @@ public class YearlySalaryRepository : RepositoryBase, IYearl var contractTotallDays = Convert.ToInt32((contract.ContractEnd - contract.ContarctStart).TotalDays + 1); if (contractTotallDays <= 31) { - var hasRollCall = _rollCallEmployeeRepository.HasRollCallRecord(employeeId, workshopId, + + var rollCallTotalHoures = GetTotalWorkingHoursIfHasRollCall(employeeId, workshopId, contract.ContarctStart.Date, contract.ContractEnd.Date); - if (hasRollCall) + if (rollCallTotalHoures.hasRollCall) { - List rollCallResult; - List groupedRollCall; - - - rollCallResult = _context.RollCalls.Where(x => - x.EmployeeId == employeeId && x.WorkshopId == workshopId && x.StartDate.Value.Date >= contract.ContarctStart.Date && - x.StartDate.Value.Date <= contract.ContractEnd.Date && x.EndDate != null).Select(x => new RollCallViewModel() - { - StartDate = x.StartDate, - EndDate = x.EndDate, - ShiftSpan = (x.EndDate.Value - x.StartDate.Value), - CreationDate = x.ShiftDate, - BreakTimeSpan = x.BreakTimeSpan - }).ToList(); - - groupedRollCall = rollCallResult.GroupBy(x => x.CreationDate.Date).Select(x => new GroupedRollCalls() - { - CreationDate = x.Key, - ShiftList = x.Select(s => new ShiftList() { Start = s.StartDate!.Value, End = s.EndDate!.Value }).ToList(), - HasFriday = x.Any(s => s.StartDate != null && s.EndDate != null && (s.StartDate.Value.DayOfWeek == DayOfWeek.Friday || s.EndDate.Value!.DayOfWeek == DayOfWeek.Friday)), - SumOneDaySpan = new TimeSpan(x.Sum(shift => shift.ShiftSpan.Ticks)) - CalculateBreakTime(x.First().BreakTimeSpan, - new TimeSpan(x.Sum(shift => shift.ShiftSpan.Ticks))), - - - - }).OrderBy(x => x.CreationDate).ToList(); - - - TimeSpan sumSpans = new TimeSpan(groupedRollCall.Sum(x => x.SumOneDaySpan.Ticks)); - totalWorkingHours = sumSpans.TotalMinutes / 60; + totalWorkingHours = rollCallTotalHoures.WorkingTotalHours; } - - } #endregion @@ -2814,6 +2828,22 @@ public class YearlySalaryRepository : RepositoryBase, IYearl } //کل ساعت کار پرسنل در این قرارداد var totalWorkingHours = workingHoursHDouble + workingHoursMDouble; + + #region RollCallSpan + + var contractTotallDays = Convert.ToInt32((contract.ContractEnd - contract.ContarctStart).TotalDays + 1); + if (contractTotallDays <= 31) + { + + var rollCallTotalHoures = GetTotalWorkingHoursIfHasRollCall(employeeId, workshopId, + contract.ContarctStart.Date, contract.ContractEnd.Date); + if (rollCallTotalHoures.hasRollCall) + { + totalWorkingHours = rollCallTotalHoures.WorkingTotalHours; + } + } + + #endregion // میانگین ساعت کارکرد پرسنل در روز var workingHoursePerDay = totalWorkingHours / m.MoandatoryDays;