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;