rollcall Rotating on checkout compute started

This commit is contained in:
SamSys
2024-08-17 18:26:33 +03:30
parent 0e6229f681
commit d44141adae
5 changed files with 337 additions and 12 deletions

View File

@@ -1,6 +1,8 @@
using System;
using System.Collections.Generic;
using _0_Framework.Domain;
using CompanyManagment.App.Contracts.Contract;
using CompanyManagment.App.Contracts.RollCall;
using CompanyManagment.App.Contracts.WorkingHoursTemp;
namespace Company.Domain.RollCallAgg;
@@ -9,4 +11,6 @@ public interface IRollCallMandatoryRepository : IRepository<long, RollCall>
{
ComputingViewModel MandatoryCompute(long employeeId, long workshopId, DateTime contractStart, DateTime contractEnd, CreateWorkingHoursTemp command, long leavId);
TimeSpan AfterSubtract(CreateWorkingHoursTemp command, TimeSpan sumOneDaySpan, DateTime creationDate);
List<RotatingShiftViewModel> RotatingShiftCheck(List<GroupedRollCalls> rollCallList);
}

View File

@@ -5,6 +5,7 @@ using System.Text;
using System.Threading.Tasks;
using _0_Framework.Domain;
using CompanyManagment.App.Contracts.RollCall;
using CompanyManagment.App.Contracts.WorkingHoursTemp;
namespace Company.Domain.RollCallAgg
{
@@ -14,5 +15,7 @@ namespace Company.Domain.RollCallAgg
EditRollCall GetById(long id);
List<RollCallViewModel> Search(RollCallSearchModel searchModel);
long Flag(long employeeId, long workshopId);
}
}

View File

@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
namespace CompanyManagment.App.Contracts.RollCall;
@@ -7,4 +8,7 @@ public class GroupedRollCalls
public TimeSpan SumOneDaySpan { get; set; }
public TimeSpan AfterSubtractRestSpan { get; set; }
public DateTime CreationDate { get; set; }
public List<ShiftList> ShiftList { get; set; }
}

View File

@@ -0,0 +1,9 @@
using System;
namespace CompanyManagment.App.Contracts.RollCall;
public class ShiftList
{
public DateTime Start { get; set; }
public DateTime End { get; set; }
}

View File

@@ -14,7 +14,7 @@ using CompanyManagment.App.Contracts.RollCall;
using CompanyManagment.App.Contracts.WorkingHoursTemp;
//
namespace CompanyManagment.EFCore.Repository;
public class RollCallMandatoryRepository : RepositoryBase<long, RollCall>, IRollCallMandatoryRepository
@@ -45,10 +45,13 @@ public class RollCallMandatoryRepository : RepositoryBase<long, RollCall>, IRoll
string shift1Minuts = "0";
string overMandatoryHours = "0";
string overMandatoryMinuts = "0";
string shiftOver22Hours = "0";
string shiftOver22Minuts = "0";
double ShiftPayResult = 0;
#endregion
var rollCallResult = _context.RollCalls.Where(x =>
List<RollCallViewModel> 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()
{
@@ -57,13 +60,14 @@ public class RollCallMandatoryRepository : RepositoryBase<long, RollCall>, IRoll
ShiftSpan = (x.EndDate.Value - x.StartDate.Value),
CreationDate = x.CreationDate,
}).ToList();
var groupedRollCall = rollCallResult.GroupBy(x=>x.CreationDate).Select(x => new GroupedRollCalls()
List<GroupedRollCalls> groupedRollCall = rollCallResult.GroupBy(x=>x.StartDate!.Value.Date).Select(x => new GroupedRollCalls()
{
CreationDate = x.Key,
ShiftList = x.Select(s=> new ShiftList() { Start = s.StartDate!.Value, End = s.EndDate!.Value}).ToList(),
SumOneDaySpan = new TimeSpan(x.Sum(shift => shift.ShiftSpan.Ticks)),
}).ToList();
//*****کسر ساعاعت استراحت پرسنل از ساعت کار
var rollCallSubtractSpan = groupedRollCall.Select(x => new GroupedRollCalls()
List<GroupedRollCalls> rollCallSubtractSpan = groupedRollCall.Select(x => new GroupedRollCalls()
{
CreationDate = x.CreationDate,
AfterSubtractRestSpan = AfterSubtract(command,x.SumOneDaySpan,x.CreationDate),
@@ -129,7 +133,7 @@ public class RollCallMandatoryRepository : RepositoryBase<long, RollCall>, IRoll
#endregion
//***********************************//
//ToTalHourse Employe eWorked
var totalHourses = (sumSpans.TotalMinutes) / 60;
double totalHourses = (sumSpans.TotalMinutes) / 60;
int totalHolidaysAndNotH = (int)sumSpans.TotalHours;
int totalHolidaysAndNotM = (int)(sumSpans.TotalMinutes % 60);
//***********************************//
@@ -336,8 +340,65 @@ public class RollCallMandatoryRepository : RepositoryBase<long, RollCall>, IRoll
}
#endregion
//******نوبت کاری****
#region RotatingShiftCheck
List<RotatingShiftViewModel> rotatingResultList = RotatingShiftCheck(groupedRollCall);
var moriningCount = rotatingResultList.Count(x => x.IsMorningShift);
var eveningCount = rotatingResultList.Count(x => x.IsEveningShift);
var nightCount = rotatingResultList.Count(x => x.IsNightShift);
var RotatingfaName = new List<string>();
if (moriningCount > 0)
RotatingfaName.Add("صبح");
if (eveningCount > 0)
RotatingfaName.Add("عصر");
if (nightCount > 0)
RotatingfaName.Add("شب");
var rotatingFaResult = "";
if (RotatingfaName.Count > 1)
{
shiftOver22Hours = "0";
shiftOver22Minuts = "0";
for (var rotateNumber = 0; rotateNumber < RotatingfaName.Count; rotateNumber++)
{
if (rotateNumber == 0)
rotatingFaResult = $"{RotatingfaName[rotateNumber]}";
if (rotateNumber == 1)
rotatingFaResult += $" و {RotatingfaName[rotateNumber]}";
if (rotateNumber == 2)
rotatingFaResult += $" و {RotatingfaName[rotateNumber]}";
}
}
else if (RotatingfaName.Count <= 1)
{
rotatingFaResult = "نوبت کاری ندارد";
}
#endregion
#region ShiftPayPercent
if (rotatingFaResult != "نوبت کاری ندارد" || rotatingFaResult != "")
{
var TotalDays = (command.ContractEndGr - command.ContractStartGr).TotalDays + 1;
var DailyFeeNumberType = dayliFee.MoneyToDouble();
if (rotatingFaResult == "صبح و عصر")
{
var shiftPyaPercent = DailyFeeNumberType * 10 / 100;
ShiftPayResult = shiftPyaPercent * TotalDays;
}
else if (rotatingFaResult == "صبح و عصر و شب")
{
var shiftPyaPercent = DailyFeeNumberType * 15 / 100;
ShiftPayResult = shiftPyaPercent * TotalDays;
}
else if (rotatingFaResult == "صبح و شب" || rotatingFaResult == "عصر و شب")
{
var shiftPyaPercent = DailyFeeNumberType * 22.5 / 100;
ShiftPayResult = shiftPyaPercent * TotalDays;
}
}
#endregion
#region Result
var res = new ComputingViewModel()
@@ -349,8 +410,8 @@ public class RollCallMandatoryRepository : RepositoryBase<long, RollCall>, IRoll
TotalHoursesM = totalHolidaysAndNotM.ToString(),
OverTimeWorkH = overMandatoryHours,
OverTimeWorkM = overMandatoryMinuts,
//OverNightWorkH = shiftOver22Hours,
//OverNightWorkM = shiftOver22Minuts,
OverNightWorkH = shiftOver22Hours,
OverNightWorkM = shiftOver22Minuts,
ComplexNumberOfWorkingDays = "0",
SalaryCompute = dayliFee,
SumTime44 = SumWorkeTime,
@@ -359,9 +420,9 @@ public class RollCallMandatoryRepository : RepositoryBase<long, RollCall>, IRoll
FamilyAllowance = familyAllowance,
OfficialHoliday = holiday,
weeklyTime = weeklyTime,
//RotatingResultList = rotatingResultList,
//RotatingStatus = rotatingFaResult,
//ShiftPay = ShiftPayResult,
RotatingResultList = rotatingResultList,
RotatingStatus = rotatingFaResult,
ShiftPay = ShiftPayResult,
Basic = basic,
FridayStartToEnd = fridays,
TotalHolidayAndNotH = totalHolidaysAndNotH.ToString(),
@@ -491,4 +552,248 @@ public class RollCallMandatoryRepository : RepositoryBase<long, RollCall>, IRoll
return result;
}
}
public List<RotatingShiftViewModel> RotatingShiftCheck(List<GroupedRollCalls> rollCallList)
{
List<RotatingShiftViewModel> finalResult = new List<RotatingShiftViewModel>();
var nullDateTme = new DateTime(0001, 01, 01);
foreach (var item in rollCallList)
{
#region Entityes
var midNight24 = new DateTime(item.CreationDate.Year, item.CreationDate.Month, item.CreationDate.Day, 0, 0, 0).AddDays(1);
var morningWorkingTime = new TimeSpan();
var eveningWorkingTime = new TimeSpan();
var nightWorkingTime = new TimeSpan();
DateTime morningStart = new DateTime(item.CreationDate.Year,item.CreationDate.Month,item.CreationDate.Day,6,0,0);
DateTime morningEnd = new DateTime(item.CreationDate.Year, item.CreationDate.Month, item.CreationDate.Day, 14, 0, 0);
DateTime eveningStart = morningEnd;
DateTime eveningEnd = new DateTime(item.CreationDate.Year, item.CreationDate.Month, item.CreationDate.Day, 22, 0, 0);
DateTime nightStart = eveningEnd;
DateTime nightEnd = morningStart;
DateTime nightEndNextday = nightEnd.AddDays(1);
DateTime morningEndNextday = morningEnd.AddDays(1);
DateTime eveningEndNextday = eveningEnd.AddDays(1);
#endregion
foreach (var shift in item.ShiftList)
{
#region fix 24 Hourse
if (shift.End.Date >= shift.Start.Date && shift.End.TimeOfDay >= shift.Start.TimeOfDay)
{
nightWorkingTime = new TimeSpan(8, 0, 0);
morningWorkingTime = new TimeSpan(8, 0, 0);
eveningWorkingTime = new TimeSpan(8, 0, 0);
}
#endregion
#region morning enter 14 <- 6
else if (shift.Start >= morningStart // 14<---<6
&& shift.End <= morningEnd)
{
morningWorkingTime = (shift.End - shift.Start);
}
else if (shift.Start >= morningStart && shift.Start < morningEnd // 22<---14---6
&& shift.End > eveningStart && shift.End <= eveningEnd)
{
morningWorkingTime = (morningEnd - shift.Start);
eveningWorkingTime = (shift.End - eveningStart);
}else if (shift.Start >= morningStart && shift.Start < morningEnd// // 6<---22---14---6
&& shift.End > eveningEnd && shift.End <= nightEndNextday)
{
morningWorkingTime = (morningEnd - shift.Start);
eveningWorkingTime = new TimeSpan(8, 0, 0);
nightWorkingTime = (shift.End - eveningEnd);
}else if (shift.Start >= morningStart // 14<---6<---22---14---6
&& shift.Start < morningEnd
&& shift.End > nightEndNextday && shift.End <= morningEndNextday)
{
morningWorkingTime = (morningEnd - shift.Start);
eveningWorkingTime = new TimeSpan(8, 0, 0);
nightWorkingTime = new TimeSpan(8, 0, 0);
TimeSpan nextDayMorningSpan = (shift.End - nightEndNextday);
morningWorkingTime = morningWorkingTime.Add(nextDayMorningSpan);
}
else if (shift.Start >= morningStart // 14<---6<---22---14---6
&& shift.Start < morningEnd
&& shift.End > nightEndNextday && shift.End > morningEndNextday)
{
morningWorkingTime = (morningEnd - shift.Start);
eveningWorkingTime = new TimeSpan(8, 0, 0);
nightWorkingTime = new TimeSpan(8, 0, 0);
TimeSpan nextDayEveningSpan = (shift.End - nightEndNextday);
morningWorkingTime = morningWorkingTime.Add(new TimeSpan(8, 0, 0));
}
#endregion
#region evening enter 22 <- 14
if (shift.Start >= eveningStart // 22<---<14
&& shift.End <= eveningEnd)
{
eveningWorkingTime = (eveningEnd - eveningStart);
}
else if (shift.Start >= eveningStart && shift.Start < eveningEnd // 6<---22---14
&& shift.End > nightStart && shift.End <= nightEndNextday)
{
eveningWorkingTime = (eveningEnd - shift.Start);
nightWorkingTime = (shift.End - eveningEnd);
}
else if (shift.Start >= eveningStart && shift.Start < eveningEnd// // 14<---6---22---14
&& shift.End > nightEndNextday && shift.End <= morningEndNextday)
{
eveningWorkingTime = (eveningEnd - shift.Start);
nightWorkingTime = new TimeSpan(8, 0, 0);
morningWorkingTime = (shift.End - morningEndNextday);
}
else if (shift.Start >= eveningStart // 22<---14<---6---22---14
&& shift.Start < eveningEnd
&& shift.End > morningEndNextday && shift.End <= eveningEndNextday)
{
eveningWorkingTime = (morningEnd - shift.Start);
nightWorkingTime = new TimeSpan(8, 0, 0);
morningWorkingTime = new TimeSpan(8, 0, 0);
TimeSpan nextDayEveningSpan = (shift.End - morningEndNextday);
eveningWorkingTime = eveningWorkingTime.Add(nextDayEveningSpan);
}
#endregion
#region night enter 6 <- 22
if (shift.Start >= nightStart // 6<---<22
&& shift.End <= nightEndNextday)
{
nightWorkingTime = (shift.End - shift.Start);
}
else if (shift.Start >= nightStart && shift.Start < nightEndNextday // 14<---6---22
&& shift.End > nightEndNextday && shift.End <= morningEndNextday)
{
nightWorkingTime = (nightEndNextday - shift.Start);
morningWorkingTime = (shift.End - nightEndNextday);
}
else if (shift.Start >= nightStart && shift.Start < nightEndNextday// // 22<---14---6---22
&& shift.End > morningEndNextday && shift.End <= eveningEndNextday)
{
nightWorkingTime = (nightEndNextday - shift.Start); ;
morningWorkingTime = new TimeSpan(8, 0, 0);
eveningWorkingTime = (shift.End - morningEndNextday);
}
else if (shift.Start >= nightStart // 6<---22<---14---6---22
&& shift.Start < nightEndNextday
&& shift.End > eveningEndNextday)
{
nightWorkingTime = (nightEndNextday - shift.Start);
morningWorkingTime = new TimeSpan(8, 0, 0);
eveningWorkingTime = new TimeSpan(8, 0, 0);
TimeSpan nextDayNightSpan = (shift.End - eveningEndNextday);
nightWorkingTime = nightWorkingTime.Add(nextDayNightSpan);
}
#endregion
#region Result
var result = new RotatingShiftViewModel();
result.MorningWorkSpan = morningWorkingTime;
result.EveningWorkSpan = eveningWorkingTime;
result.NightWorkSpan = nightWorkingTime;
var nullWorkspan = new TimeSpan(0, 0, 0);
var totalTime = result.TotalWorkingTime.Add(result.MorningWorkSpan);
totalTime = totalTime.Add(result.EveningWorkSpan);
totalTime = totalTime.Add(result.NightWorkSpan);
result.TotalWorkingTime = totalTime;
var morningH = (int)result.MorningWorkSpan.TotalHours;
var morningM = result.MorningWorkSpan.Minutes % 60;
var morningMS = "00";
if (morningM < 10 && morningM > 0)
morningMS = $"0{morningM}";
if (morningM > 10)
morningMS = $"{morningM}";
result.MorningString = $"0{morningH}:{morningMS}";
var eveningH = (int)result.EveningWorkSpan.TotalHours;
var eveningM = result.EveningWorkSpan.Minutes % 60;
var eveningMS = "00";
if (eveningM < 10 && eveningM > 0)
eveningMS = $"0{eveningM}";
if (eveningM > 10)
eveningMS = $"{eveningM}";
result.EveningString = $"0{eveningH}:{eveningMS}";
var nightH = (int)result.NightWorkSpan.TotalHours;
var nightM = result.NightWorkSpan.Minutes % 60;
var nightMS = "00";
if (nightM < 10 && nightM > 0)
nightMS = $"0{nightM}";
if (nightM > 10)
nightMS = $"{nightM}";
result.NightString = $"0{nightH}:{nightMS}";
if (result.MorningWorkSpan > result.EveningWorkSpan
|| result.MorningWorkSpan == result.EveningWorkSpan) // if morning bigerThan evening or equal
{
if (result.MorningWorkSpan != nullWorkspan)
{
result.IsMorningShift = true;
result.IsNightShift = false;
result.IsEveningShift = false;
result.RotatingShiftStatus = "صبح";
}
if (result.MorningWorkSpan < result.NightWorkSpan
|| result.MorningWorkSpan == result.NightWorkSpan) // if night bigerThan morning or equal
if (result.NightWorkSpan != nullWorkspan)
{
result.IsMorningShift = false;
result.IsNightShift = true;
result.IsEveningShift = false;
result.RotatingShiftStatus = "شب";
}
}
else if (result.MorningWorkSpan < result.EveningWorkSpan) // if evening bigerThan morning
{
if (result.EveningWorkSpan != nullWorkspan)
{
result.IsEveningShift = true;
result.IsMorningShift = false;
result.IsNightShift = false;
result.RotatingShiftStatus = "عصر";
}
if (result.EveningWorkSpan < result.NightWorkSpan
|| result.EveningWorkSpan == result.NightWorkSpan) // if night bigerThan evening or equal
if (result.NightWorkSpan != nullWorkspan)
{
result.IsMorningShift = false;
result.IsEveningShift = false;
result.IsNightShift = true;
result.RotatingShiftStatus = "شب";
}
}
finalResult.Add(result);
#endregion
}
}
return finalResult;
}
}