This commit is contained in:
SamSys
2025-05-31 21:05:01 +03:30
parent d8c0471878
commit c81da3e787
3 changed files with 130 additions and 4 deletions

View File

@@ -16,7 +16,19 @@ namespace Company.Domain.RollCallAgg;
public interface IRollCallMandatoryRepository : IRepository<long, RollCall>
{
ComputingViewModel MandatoryCompute(long employeeId, long workshopId, DateTime contractStart, DateTime contractEnd, CreateWorkingHoursTemp command, bool holidayWorking, bool isStaticCheckout);
TimeSpan AfterSubtract(CreateWorkingHoursTemp command, TimeSpan sumOneDaySpan, DateTime creationDate);
/// <summary>
/// محاسبه ساعات کارکرد پرسنل در صورت داشتن حضور غیاب
/// </summary>
/// <param name="employeeId"></param>
/// <param name="workshopId"></param>
/// <param name="contractStart"></param>
/// <param name="contractEnd"></param>
/// <returns></returns>
(bool hasRollCall, TimeSpan sumOfSpan) GetRollCallWorkingSpan(long employeeId, long workshopId,
DateTime contractStart, DateTime contractEnd);
TimeSpan AfterSubtract(CreateWorkingHoursTemp command, TimeSpan sumOneDaySpan, DateTime creationDate);
List<RotatingShiftViewModel> RotatingShiftCheck(List<GroupedRollCalls> rollCallList);

View File

@@ -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<long, RollCall>, 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<long, RollCall>, 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<long, RollCall>, IRoll
return res;
}
/// <summary>
/// محاسبه ساعات کارکرد پرسنل در صورت داشتن حضور غیاب
/// </summary>
/// <param name="employeeId"></param>
/// <param name="workshopId"></param>
/// <param name="contractStart"></param>
/// <param name="contractEnd"></param>
/// <returns></returns>
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<RollCallViewModel> rollCallResult;
List<GroupedRollCalls> 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<ComputingViewModel> RotatingShiftReport(long workshopId, long employeeId, DateTime contractStart, DateTime contractEnd, string shiftwork, bool hasRollCall, CreateWorkingHoursTemp command, bool holidayWorking)
{
List<RollCallViewModel> rollCallResult = new List<RollCallViewModel>();
@@ -2263,6 +2315,7 @@ public class RollCallMandatoryRepository : RepositoryBase<long, RollCall>, IRoll
#endregion
#region CustomizeCheckout
/// <summary>

View File

@@ -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<long, YearlySalary>, 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<long, YearlySalary>, IYearl
return result;
}
private static TimeSpan CalculateBreakTime(TimeSpan breakTimeSpan, TimeSpan sumOneDaySpan)
{
if (breakTimeSpan * 2 >= sumOneDaySpan)
return new TimeSpan();
return breakTimeSpan; ;
}
public List<ContractsCanToLeave> 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<long, YearlySalary>, 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<long, YearlySalary>, 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<long, YearlySalary>, 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<RollCallViewModel> rollCallResult;
List<GroupedRollCalls> 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;