diff --git a/Company.Domain/RollCallAgg/IRollCallMandatoryRepository.cs b/Company.Domain/RollCallAgg/IRollCallMandatoryRepository.cs index 897b4ff7..654545d5 100644 --- a/Company.Domain/RollCallAgg/IRollCallMandatoryRepository.cs +++ b/Company.Domain/RollCallAgg/IRollCallMandatoryRepository.cs @@ -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 { ComputingViewModel MandatoryCompute(long employeeId, long workshopId, DateTime contractStart, DateTime contractEnd, CreateWorkingHoursTemp command, long leavId); TimeSpan AfterSubtract(CreateWorkingHoursTemp command, TimeSpan sumOneDaySpan, DateTime creationDate); + + List RotatingShiftCheck(List rollCallList); } \ No newline at end of file diff --git a/Company.Domain/RollCallAgg/IRollCallRepository.cs b/Company.Domain/RollCallAgg/IRollCallRepository.cs index b6e3c6e7..42ff6bc4 100644 --- a/Company.Domain/RollCallAgg/IRollCallRepository.cs +++ b/Company.Domain/RollCallAgg/IRollCallRepository.cs @@ -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 Search(RollCallSearchModel searchModel); long Flag(long employeeId, long workshopId); + + } } diff --git a/CompanyManagment.App.Contracts/RollCall/GroupedRollCalls.cs b/CompanyManagment.App.Contracts/RollCall/GroupedRollCalls.cs index 90a2e52f..b2b11a84 100644 --- a/CompanyManagment.App.Contracts/RollCall/GroupedRollCalls.cs +++ b/CompanyManagment.App.Contracts/RollCall/GroupedRollCalls.cs @@ -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 { get; set; } + } \ No newline at end of file diff --git a/CompanyManagment.App.Contracts/RollCall/ShiftList.cs b/CompanyManagment.App.Contracts/RollCall/ShiftList.cs new file mode 100644 index 00000000..d1a20eb0 --- /dev/null +++ b/CompanyManagment.App.Contracts/RollCall/ShiftList.cs @@ -0,0 +1,9 @@ +using System; + +namespace CompanyManagment.App.Contracts.RollCall; + +public class ShiftList +{ + public DateTime Start { get; set; } + public DateTime End { get; set; } +} \ No newline at end of file diff --git a/CompanyManagment.EFCore/Repository/RollCallMandatoryRepository.cs b/CompanyManagment.EFCore/Repository/RollCallMandatoryRepository.cs index 438d63a8..227ff41d 100644 --- a/CompanyManagment.EFCore/Repository/RollCallMandatoryRepository.cs +++ b/CompanyManagment.EFCore/Repository/RollCallMandatoryRepository.cs @@ -14,7 +14,7 @@ using CompanyManagment.App.Contracts.RollCall; using CompanyManagment.App.Contracts.WorkingHoursTemp; - +// namespace CompanyManagment.EFCore.Repository; public class RollCallMandatoryRepository : RepositoryBase, IRollCallMandatoryRepository @@ -45,10 +45,13 @@ public class RollCallMandatoryRepository : RepositoryBase, 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 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, IRoll ShiftSpan = (x.EndDate.Value - x.StartDate.Value), CreationDate = x.CreationDate, }).ToList(); - var groupedRollCall = rollCallResult.GroupBy(x=>x.CreationDate).Select(x => new GroupedRollCalls() + List 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 rollCallSubtractSpan = groupedRollCall.Select(x => new GroupedRollCalls() { CreationDate = x.CreationDate, AfterSubtractRestSpan = AfterSubtract(command,x.SumOneDaySpan,x.CreationDate), @@ -129,7 +133,7 @@ public class RollCallMandatoryRepository : RepositoryBase, 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, IRoll } #endregion + //******نوبت کاری**** + #region RotatingShiftCheck + List 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(); + 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, 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, 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, IRoll return result; } -} \ No newline at end of file + public List RotatingShiftCheck(List rollCallList) + { + List finalResult = new List(); + 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; + + } + + +} +